API Documentation
Timers ¶
Timers ¶
Timer is an object belonging to a Time Entry.
Timer represents one time tracking sessions (on a time entry) and keeps track when a session was started and when it was stopped.
Timer object gets created when a person starts a timer.
Creating a Timer is possible (on API) providing either time_entry_id or service_id in parameters.
-
When providing time_entry_id, a Timer object will be related to provided Time Entry.
-
When providing service_id, new Time Entry belonging to provided Service will be created and a Timer will belong to it.
You can find out more about Timers in our [Help documentation] (https://help.productive.io/en/articles/3903111-timer)
Supported filter params
-
time_entry_id
-
person_id
-
started_at (date)
-
stopped_at (date)
Supported sort params
-
started_at
-
stopped_at
GET /api/v2/timers
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
"data": [
{
"id": "9",
"type": "timers",
"attributes": {
"person_id": 8778,
"started_at": "2025-08-02T05:19:35.000+02:00",
"stopped_at": null,
"total_time": 0
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2149"
}
},
"time_entry": {
"meta": {
"included": false
}
}
}
},
{
"id": "10",
"type": "timers",
"attributes": {
"person_id": 8778,
"started_at": "2025-08-02T05:19:35.000+02:00",
"stopped_at": null,
"total_time": 0
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2149"
}
},
"time_entry": {
"meta": {
"included": false
}
}
}
}
],
"links": {
"first": "http://api-test.productive.io/api/v2/timers?page%5Bnumber%5D=1&page%5Bsize%5D=30",
"last": "http://api-test.productive.io/api/v2/timers?page%5Bnumber%5D=1&page%5Bsize%5D=30"
},
"meta": {
"current_page": 1,
"total_pages": 1,
"total_count": 2,
"page_size": 30,
"max_page_size": 200
}
}
Get timersGET/api/v2/timers
GET /api/v2/timers/11
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
"data": {
"id": "11",
"type": "timers",
"attributes": {
"person_id": 8783,
"started_at": "2025-08-02T05:19:35.000+02:00",
"stopped_at": null,
"total_time": 0
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2150"
}
},
"time_entry": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}
POST /api/v2/timers
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
"data": {
"type": "timers",
"attributes": {},
"relationships": {
"time_entry": {
"data": {
"type": "time_entries",
"id": "364"
}
}
}
}
}
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
"data": {
"id": "12",
"type": "timers",
"attributes": {
"person_id": 8785,
"started_at": "2025-08-02T06:19:35.000+02:00",
"stopped_at": null,
"total_time": 0
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2151"
}
},
"time_entry": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}
POST /api/v2/timers
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
"data": {
"type": "timers",
"attributes": {
"service_id": "1294"
},
"relationships": {}
}
}
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
"data": {
"id": "13",
"type": "timers",
"attributes": {
"person_id": 8787,
"started_at": "2025-08-02T06:19:35.000+02:00",
"stopped_at": null,
"total_time": 0
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2152"
}
},
"time_entry": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}
POST /api/v2/timers
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
"data": {
"type": "timers",
"attributes": {
"service_id": "1296"
},
"relationships": {
"time_entry": {
"data": {
"type": "time_entries",
"id": "366"
}
}
}
}
}
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
"data": {
"id": "14",
"type": "timers",
"attributes": {
"person_id": 8789,
"started_at": "2025-08-02T06:19:36.000+02:00",
"stopped_at": null,
"total_time": 0
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2153"
}
},
"time_entry": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}
POST /api/v2/timers
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
"data": {
"type": "timers",
"attributes": {},
"relationships": {
"time_entry": {
"data": {
"type": "time_entries",
"id": ""
}
}
}
}
}
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
"errors": [
{
"status": "422",
"code": "invalid_attribute",
"title": "Invalid Attribute",
"detail": "attribute is invalid",
"source": {
"pointer": "data/attributes/service"
}
}
]
}
Create an timerPOST/api/v2/timers
- time_entry_id
number
(optional) Example: 1required if service_id not provided
- service_id: `1` (number, optional) - required if time_entry_id not provided
string
(required)
PATCH /api/v2/timers/16/stop
Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
"data": {
"id": "16",
"type": "timers",
"attributes": {
"person_id": 8795,
"started_at": "2025-08-02T05:19:36.000+02:00",
"stopped_at": "2025-08-02T06:19:36.000+02:00",
"total_time": 60
},
"relationships": {
"organization": {
"data": {
"type": "organizations",
"id": "2156"
}
},
"time_entry": {
"meta": {
"included": false
}
}
}
},
"meta": {}
}
Generated by aglio on 02 Aug 2025