# List workday comments

> **Method rollout — update `timeman 26.600.0`.** Not available on every account. The Vibecode team also controls release of these new reads; they are off by default. Before enablement or on an account without the new method, the API returns `422 METHOD_NOT_YET_AVAILABLE`. Detect the rollout by the error code, not by the status: other Bitrix24 refusals arrive with the same 422 status and the `BITRIX_ERROR` code. Existing report and workday reads keep working.

`GET /v1/workday/records/:recordId/comments`

Reads published workday comments from the Feed and the Daily report page. Get the object ID from the [workday history](/docs/workday/records).

**Scope:** `timeman`

## Parameters

| Parameter | Type | Required | Description |
|---|---|---|---|
| `recordId (path)` | integer | yes | Positive integer ID up to 9007199254740991 from the [workday history](/docs/workday/records) |
| `limit (query)` | integer | no | Page size: 1–50, default 50 |
| `offset (query)` | integer | no | Offset: 0–999999999, default 0; cannot be combined with page |
| `page (query)` | integer | no | Page number from 1; cannot be combined with offset. The derived offset must not exceed 999999999 |

## Examples

### curl — personal key

```bash
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://vibecode.bitrix24.com/v1/workday/records/79/comments?limit=50&offset=0"
```

### curl — OAuth application

```bash
curl -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  "https://vibecode.bitrix24.com/v1/workday/records/79/comments?limit=50&offset=0"
```

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/workday/records/79/comments?limit=50&offset=0', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})
const body = await res.json()
if (!res.ok) throw new Error(`${body.error?.code ?? res.status}: ${body.error?.message ?? res.statusText}`)
console.log(body.data, body.meta)
```

### JavaScript — OAuth application

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/workday/records/79/comments?limit=50&offset=0', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})
const body = await res.json()
if (!res.ok) throw new Error(`${body.error?.code ?? res.status}: ${body.error?.message ?? res.statusText}`)
console.log(body.data, body.meta)
```

## Response fields

| Field | Type | Description |
|---|---|---|
| `success` | boolean | `true` on success |
| `data` | array | Comments on the requested page; an empty array is valid |
| `data[].id` | integer \| null | Comment ID; positive when not `null` |
| `data[].recordId` | integer | ID from the [workday history](/docs/workday/records), equal to the ID in the request path |
| `data[].authorId` | integer \| null | Bitrix24 [user ID](/docs/entities/users/get); 0 is allowed |
| `data[].text` | string \| null | Original BBCode, including `[USER=…]` and `[DISK FILE ID=…]` |
| `data[].textPlain` | string \| null | Text without BBCode or HTML |
| `data[].createdAt` | string \| null | DATE_ATOM date with the server time zone retained |
| `meta.limit` | integer | Applied page size |
| `meta.offset` | integer | Applied offset |
| `meta.hasMore` | boolean | The page is full, so more comments may exist |
| `meta.nextOffset` | integer \| null | Next offset when the page is full; otherwise `null` |

## Response example

```json
{
  "success": true,
  "data": [{
    "id": 1,
    "recordId": 79,
    "authorId": 7,
    "text": "[USER=7]Alex[/USER] [DISK FILE ID=4]",
    "textPlain": "Alex",
    "createdAt": "2026-11-11T10:00:00+00:00"
  }],
  "meta": { "limit": 50, "offset": 0, "hasMore": false, "nextOffset": null }
}
```

## Error response example

502 — the account returned malformed comment data:

```json
{
  "success": false,
  "error": {
    "code": "BITRIX_UNAVAILABLE",
    "message": "Bitrix24 returned an unexpected comment response."
  }
}
```

## Errors

| HTTP | Code | Reason |
|---|---|---|
| 400 | `INVALID_PARAMS` | Invalid ID, pagination, unknown or repeated parameters |
| 409 | `TIMEMAN_MODULE_NOT_ENABLED` | Time Management tool is disabled |
| 422 | `METHOD_NOT_YET_AVAILABLE` | New reads are not enabled in Vibecode or the method is unavailable on the account |
| 422 | `BITRIX_ERROR` | Other Bitrix24 refusals; details are in message |
| 502 | `BITRIX_UNAVAILABLE` | The account is unavailable or returned a malformed response; no partial results |
| 401 | `MISSING_API_KEY` | X-Api-Key is missing |
| 401 | `INVALID_API_KEY` | The API key is not recognized |
| 401 | `KEY_EXPIRED` | The API key has expired |
| 401 | `TOKEN_MISSING` | No Bitrix24 credentials |
| 402 | `ACCOUNT_FROZEN` | The account balance is frozen |
| 403 | `SCOPE_DENIED` | The key lacks the timeman scope |
| 403 | `BITRIX_ACCESS_DENIED` | No permission to access the object |
| 429 | `RATE_LIMITED` | The route request rate limit is exceeded |
| 429 | `RATE_LIMITED` | The Bitrix24 account request limit is exceeded |
| 500 | `INTERNAL_ERROR` | Unexpected internal error |

For common API errors, see [Errors](/docs/errors).

## Known specifics

Comments are sorted by ascending ID. Pass `meta.nextOffset` as `offset` while `meta.hasMore` is `true`. A full page means that more comments may exist: one final empty request may be needed after the last full page. No total count is invented.

Arbitrary `filter` and `select`, unknown parameters and repeated parameters are refused. Service messages are excluded.

`READONLY` keys are supported. Personal keys read with the webhook owner's permissions; application keys use the Bitrix24 credential user's permissions. You can read your own objects and those of employees whose working time you may view. An inaccessible or nonexistent object returns 403 for the whole request.

The configured rate limit is 30 requests per minute per key and user pair. The effective limit is reported in `x-ratelimit-limit`.

## See also

- [Work reports](/docs/workday/work-reports)
- [Workday history](/docs/workday/records)
