## Список дневных отчётов

`GET /v1/workday/daily-reports`

Возвращает дневные отчёты сотрудника с постраничной выдачей.

Требуется скоуп `timeman` и право владельца учётных данных в Битрикс24 читать учёт рабочего времени сотрудника `userId`. Ключ READONLY может читать отчёты.

## Параметры

| Параметр | Тип | Обяз. | По умолч. | Описание |
|----------|-----|:-----:|-----------|----------|
| `userId` (query) | integer | да | — | ID сотрудника, чьи отчёты нужны. Список: [`GET /v1/users`](/docs/entities/users/list) |
| `recordId` (query) | integer | нет | — | ID записи рабочего времени — вернуть только отчёт по ней. Если записи нет, у неё нет отчёта сотрудника или это запись другого сотрудника, `data` придёт пустым массивом. Список: [`GET /v1/workday/records`](/docs/workday/records) |
| `withAi` (query) | boolean | нет | `false` | `true` или `1` — добавить к каждому отчёту отчёт, который для той же записи составил AI или робот: его тип придёт в `type`, текст — в `reportExtended`. Читаются сохранённые отчёты, новые не создаются. Запись без отчёта сотрудника в список не попадает, даже если отчёт AI или робота есть |
| `limit` (query) | integer | нет | `50` | Сколько отчётов вернуть, от 1 до 50 |
| `offset` (query) | integer | нет | `0` | Сколько отчётов пропустить. Нельзя передавать вместе с `page` |
| `page` (query) | integer | нет | `1` | Номер страницы размером `limit`. Нельзя передавать вместе с `offset` |
| `order` (query) | string | нет | `{"id":"desc"}` | Сортировка — JSON-объект с направлениями `asc` или `desc`, например `{"id":"asc"}`, в адресе — в URL-кодировке: `order=%7B%22id%22%3A%22asc%22%7D`. Порядок задаёт только `id`: другие поля, в том числе неизвестные, принимаются без отказа и порядок не меняют |
| `select` (query) | string | нет | — | Поля отчёта через запятую, например `report,timestamp`. `id` приходит всегда, даже если его нет в списке. Список — [Поля отчёта](/docs/workday/daily-reports/fields) |

## Примеры

### curl — личный ключ

```bash
curl "https://vibecode.bitrix24.tech/v1/workday/daily-reports?userId=101" \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth-приложение

```bash
curl "https://vibecode.bitrix24.tech/v1/workday/daily-reports?userId=101" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — личный ключ

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/workday/daily-reports?userId=101', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})
const { data, meta } = await res.json()
```

### JavaScript — OAuth-приложение

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/workday/daily-reports?userId=101', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})
const { data, meta } = await res.json()
```

## Поля ответа

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | `true` при успешном запросе |
| `data` | array | Массив дневных отчётов. Подробнее о полях — [Поля отчёта](/docs/workday/daily-reports/fields) |
| `data[].id` | integer | ID дневного отчёта |
| `data[].recordId` | integer | ID записи рабочего времени. Список: [`GET /v1/workday/records`](/docs/workday/records) |
| `data[].userId` | integer | ID сотрудника, чей это отчёт. Список: [`GET /v1/users`](/docs/entities/users/list) |
| `data[].type` | string | Тип отчёта: `REPORT` — отчёт сотрудника. С `withAi=true` — `AI_REPORT` или `ROBOT_REPORT`, если для записи есть отчёт AI или робота. `id`, `report`, `reportPlain` и `timestamp` при этом остаются от отчёта сотрудника |
| `data[].report` | string | Текст отчёта сотрудника в разметке BB-кода |
| `data[].reportPlain` | string | Текст отчёта без разметки |
| `data[].timestamp` | string \| null | Время последнего сохранения отчёта |
| `data[].reportExtended` | string \| null | Текст отчёта AI или робота. Приходит с `withAi=true`, если такой отчёт есть, иначе `null` |
| `meta.limit` | integer | Размер страницы |
| `meta.offset` | integer | Сколько отчётов пропущено |
| `meta.hasMore` | boolean | `true`, когда на странице `limit` отчётов и за ней могут быть ещё |

## Пример ответа

```json
{
  "success": true,
  "data": [
    {
      "id": 379,
      "recordId": 185,
      "userId": 101,
      "type": "REPORT",
      "report": "[b]Done:[/b] daily summary",
      "reportPlain": "Done: daily summary",
      "timestamp": "2026-10-07T08:19:18.000Z",
      "reportExtended": null
    },
    {
      "id": 377,
      "recordId": 183,
      "userId": 101,
      "type": "REPORT",
      "report": "Daily summary for autofill check",
      "reportPlain": "Daily summary for autofill check",
      "timestamp": "2026-10-07T06:56:12.000Z",
      "reportExtended": null
    }
  ],
  "meta": {
    "limit": 50,
    "offset": 0,
    "hasMore": false
  }
}
```

## Пример ответа при ошибке

400 — не передан `userId`:

```json
{
  "success": false,
  "error": {
    "code": "INVALID_PARAMS",
    "message": "Expected a positive integer"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 400 | `WORKDAY_REPORT_LIMIT_EXCEEDED` | `limit` больше 50 |
| 400 | `INVALID_PARAMS` | Не передан `userId`; в `userId`, `recordId`, `limit` или `page` не положительное целое число; в `offset` не целое неотрицательное число; переданы одновременно `offset` и `page`; в `withAi` не `true`, `false`, `1` или `0`; `order` не JSON-объект или направление не `asc` и не `desc`; неизвестное поле в `select`; неизвестный параметр или один параметр передан дважды |
| 403 | `BITRIX_ACCESS_DENIED` | У владельца учётных данных нет права читать учёт рабочего времени сотрудника `userId`. Отказ приходит и когда `userId` — ID самого владельца учётных данных |
| 409 | `TIMEMAN_MODULE_NOT_ENABLED` | Учёт рабочего времени недоступен на портале |
| 422 | `BITRIX_ERROR` | Битрикс24 отказал в операции |
| 502 | `BITRIX_UNAVAILABLE` | Битрикс24 недоступен или вернул ответ неожиданной формы |
| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |
| 401 | `TOKEN_MISSING` | Ключ приложения передан без токена сессии в `Authorization: Bearer` |
| 401 | `INVALID_SESSION` | Токен сессии неверный или истёк |
| 403 | `SCOPE_DENIED` | У ключа нет скоупа `timeman` |
| 429 | `RATE_LIMITED` | Превышен лимит чтения отчётов — 30 запросов в минуту на пару ключ–пользователь. Действующее значение — в заголовке `x-ratelimit-limit`, потолок делится между репликами. Или превышен общий лимит запросов |

Полный список общих ошибок API — [Ошибки](/docs/errors).

## Смотрите также

- [Получить дневной отчёт](/docs/workday/daily-reports/get)
- [Сохранить дневной отчёт](/docs/workday/daily-reports/save)
- [Поля отчёта](/docs/workday/daily-reports/fields)
- [История рабочего дня](/docs/workday/records)
- [Дневные отчёты](/docs/workday/daily-reports)
- [Рабочий день](/docs/workday)
