For AI agents: markdown of this page — /docs-content-en/entities/tasks/time/global-list.md documentation index — /llms.txt
List entries across the whole Bitrix24 account
GET /v1/task-time
Returns time-tracking entries from all tasks in the Bitrix24 account in a single request, with filtering by employee, period and task. Use it when the list of tasks is not known in advance — for example, for an employee's monthly time report.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
ParameteruserId (query) |
Typenumber | Default— | DescriptionEmployee identifier. List: GET /v1/users. If omitted, the response includes entries for all employees the key owner can access |
Parameterfrom (query) |
Typestring | Default— | DescriptionLower bound of the period, inclusive, by the createdDate field. Accepts ISO 8601 2026-05-01T00:00:00+00:00 and a plain date 2026-05-01 |
Parameterto (query) |
Typestring | Default— | DescriptionUpper bound of the period, inclusive, by the createdDate field. Same format as from. A plain date covers the whole day |
ParametertaskId (query) |
Typenumber | Default— | DescriptionNarrow the result set to a single task, on top of userId, from and to. Identifier: GET /v1/tasks |
Parameterlimit (query) |
Typenumber | Default50 |
DescriptionPage size, from 1 to 500. A value above 500 is clamped to 500 |
Parameteroffset (query) |
Typenumber | Default0 |
DescriptionOffset within the result set. Must be a multiple of limit |
Pagination. A single call returns up to 500 entries. With a limit above 50, Vibecode assembles the window server-side and returns it in full. The offset value must be a multiple of limit — 0, limit, 2 × limit, and so on, otherwise 400 INVALID_OFFSET is returned. meta.hasMore indicates whether more entries exist beyond the window.
Filter format. The generic filter envelope is not supported. Use the named query parameters userId, taskId, from, and to. Any bracket key filter[...], a non-empty filter value, a JSON form including filter={}, or a repeated filter parameter returns 400 UNSUPPORTED_FILTER. A single empty filter= parameter means no filter and preserves status 200.
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/task-time?userId=1&from=2026-05-01&to=2026-05-31" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/task-time?userId=1&from=2026-05-01&to=2026-05-31" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const url = 'https://vibecode.bitrix24.com/v1/task-time?userId=1&from=2026-05-01&to=2026-05-31'
const res = await fetch(url, {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data, meta } = await res.json()
const totalSeconds = data.reduce((sum, r) => sum + r.seconds, 0)
console.log(`For the period: ${totalSeconds / 3600} h, ${meta.total} entries`)
JavaScript — OAuth application
const url = 'https://vibecode.bitrix24.com/v1/task-time?userId=1&from=2026-05-01&to=2026-05-31'
const res = await fetch(url, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data, meta } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata |
Typearray | DescriptionArray of time-tracking entries |
Fielddata[].id |
Typenumber | DescriptionEntry identifier |
Fielddata[].taskId |
Typenumber | DescriptionParent task identifier. Card: GET /v1/tasks/:id |
Fielddata[].userId |
Typenumber | DescriptionEntry author. Profile: GET /v1/users/:userId |
Fielddata[].seconds |
Typenumber | DescriptionDuration in seconds |
Fielddata[].minutes |
Typenumber | DescriptionDuration in minutes, derived from seconds |
Fielddata[].commentText |
Typestring | DescriptionComment for the entry. An empty comment is returned as "" |
Fielddata[].source |
Typestring | DescriptionSource: 2 — REST API |
Fielddata[].createdDate |
Typedatetime | DescriptionWhen the entry was created |
Fielddata[].dateStart |
Typedatetime | DescriptionStart of the tracked interval, filled automatically |
Fielddata[].dateStop |
Typedatetime | DescriptionEnd of the tracked interval, filled automatically |
Fieldmeta.total |
Typenumber | DescriptionTotal number of entries matching the filter |
Fieldmeta.limit |
Typenumber | DescriptionApplied page size |
Fieldmeta.offset |
Typenumber | DescriptionApplied offset |
Fieldmeta.hasMore |
Typeboolean | DescriptionWhether there are more entries beyond the current window |
Response example
{
"success": true,
"data": [
{
"id": 161,
"taskId": 3881,
"userId": 1,
"commentText": "Code review",
"seconds": 900,
"minutes": 15,
"source": "2",
"createdDate": "2026-05-13T16:15:41+00:00",
"dateStart": "2026-05-13T17:15:41+00:00",
"dateStop": "2026-05-13T17:15:41+00:00"
},
{
"id": 159,
"taskId": 3867,
"userId": 1,
"commentText": "Build check",
"seconds": 600,
"minutes": 10,
"source": "2",
"createdDate": "2026-05-06T10:46:12+00:00",
"dateStart": "2026-05-06T11:46:12+00:00",
"dateStop": "2026-05-06T11:46:12+00:00"
},
{
"id": 157,
"taskId": 289,
"userId": 1,
"commentText": "Draft preparation",
"seconds": 1800,
"minutes": 30,
"source": "2",
"createdDate": "2026-05-06T10:45:47+00:00",
"dateStart": "2026-05-06T11:45:47+00:00",
"dateStop": "2026-05-06T11:45:47+00:00"
}
],
"meta": {
"total": 3,
"limit": 50,
"offset": 0,
"hasMore": false
}
}
Error response example
400 — userId is not a positive integer:
{
"success": false,
"error": {
"code": "INVALID_USER_ID",
"message": "userId must be a positive integer"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| HTTP400 | CodeINVALID_USER_ID |
DescriptionuserId is not a positive integer |
| HTTP400 | CodeINVALID_TASK_ID |
DescriptiontaskId is not a positive integer |
| HTTP400 | CodeINVALID_PARAMS |
Descriptionfrom or to cannot be parsed as a date — YYYY-MM-DD and ISO 8601 are accepted |
| HTTP400 | CodeINVALID_OFFSET |
Descriptionoffset is not a multiple of limit — pagination requires the values 0, limit, 2 × limit, and so on |
| HTTP400 | CodeUNSUPPORTED_FILTER |
DescriptionAn unsupported filter was provided; use userId, taskId, from, and to |
| HTTP403 | CodeSCOPE_DENIED |
DescriptionThe API key lacks the task scope |
| HTTP401 | CodeTOKEN_MISSING |
DescriptionThe API key has no configured tokens |
Full list of common API errors — Errors.
Known specifics
Sorted newest to oldest. The most recently added entries are returned first. limit and offset work on top of this sort.
A malformed date is refused up front. A from or to value that cannot be parsed as a date answers 400 INVALID_PARAMS before Bitrix24 is called. It used to be dropped in silence and the whole range came back with status 200, so a typo in a date read as either "nothing in that period" or a full dump. An empty value (?from=) still means "no filter".
An offset past the end of the result set. A request whose offset exceeds the number of entries returns an empty array, and meta.total in that response echoes the offset. Detect the end of the listing by meta.hasMore being false, not by comparing offset with meta.total.