
## List time-tracking entries

`GET /v1/tasks/:taskId/time`

Returns all time-tracking entries of a specific task, sorted by `id` (newest first).

## Parameters

| Parameter | Type | Required | Default | Description |
|----------|-----|:-----:|-----------|---------|
| `taskId` (path) | number | yes | — | Task ID |
| `limit` (query) | number | | `50` | Page size |
| `offset` (query) | number | | `0` | Skip N entries |

## Examples

### curl — personal key

```bash
curl "https://vibecode.bitrix24.com/v1/tasks/289/time" \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth application

```bash
curl "https://vibecode.bitrix24.com/v1/tasks/289/time" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/tasks/289/time', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})

const { success, data, meta } = await res.json()
const totalSeconds = data.reduce((sum, r) => sum + Number(r.seconds), 0)
console.log(`Total for the task: ${totalSeconds / 60} min`)
```

### JavaScript — OAuth application

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/tasks/289/time', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

const { success, data, meta } = await res.json()
```

## Response fields

| Field | Type | Description |
|------|-----|---------|
| `success` | boolean | Always `true` on success |
| `data` | array | Array of time-tracking entries |
| `data[].id` | string | Entry identifier |
| `data[].taskId` | string | Parent task ID |
| `data[].userId` | string | Author. Profile: `GET /v1/users/:userId` |
| `data[].seconds` | string | Duration in seconds |
| `data[].minutes` | string | Duration in minutes (derived from `seconds`) |
| `data[].commentText` | string | Comment for the entry |
| `data[].source` | string | Source: `2` — REST API |
| `data[].createdDate` | datetime | When the entry was created |
| `data[].dateStart` | datetime | Start of the tracked interval (filled automatically) |
| `data[].dateStop` | datetime | End of the tracked interval (filled automatically) |
| `meta.total` | number | Total number of time-tracking entries for the task |

## Response example

```json
{
  "success": true,
  "data": [
    {
      "id": "163",
      "taskId": "289",
      "userId": "1",
      "commentText": "Draft preparation",
      "seconds": "1800",
      "minutes": "30",
      "source": "2",
      "createdDate": "2026-05-13T16:15:43+00:00",
      "dateStart": "2026-05-13T17:15:43+00:00",
      "dateStop": "2026-05-13T17:15:43+00:00"
    },
    {
      "id": "161",
      "taskId": "289",
      "userId": "1",
      "commentText": "",
      "seconds": "600",
      "minutes": "10",
      "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"
    }
  ],
  "meta": {
    "total": 2
  }
}
```

## Error response example

403 — no scope:

```json
{
  "success": false,
  "error": {
    "code": "SCOPE_DENIED",
    "message": "This endpoint requires 'task' scope"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|-----|---------|
| 403 | `SCOPE_DENIED` | The API key lacks the `task` scope |
| 401 | `TOKEN_MISSING` | The API key has no configured tokens |
| 422 | `BITRIX_ERROR` | Bitrix24 returned an error while reading — e.g. the parent task is missing or deleted |

Full list of common API errors — [Errors](/docs/errors).

## Known specifics

**Descending sort by `id`.** The most recently added entries are returned first. `limit` and `offset` work on top of this sort.

## See also

- [Get an entry](./get.md) — a single entry by `id`
- [Add an entry](./create.md) — create a new entry
- [Update an entry](./update.md) — change the duration or comment
- [Delete an entry](./delete.md) — remove an entry
- [Tasks](/docs/entities/tasks) — parent entity
