[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Ftimelines":3,"docs-tabs-entities\u002Ftimelines":6},{"content":4,"lastmod":5},"# Комментарии таймлайна\n\nУправление комментариями таймлайна CRM: запись заметок оператора, истории переговоров и прочего контекста к сделкам, лидам, контактам, компаниям и другим сущностям. Каждый комментарий привязан к конкретной записи CRM через пару `entityType` + `entityId`.\n\nБитрикс24 API: `crm.timeline.comment.*`\nСкоуп: `crm`\n\n## Операции\n\n- [Добавить комментарий](.\u002Ftimelines\u002Fcreate.md) — `POST \u002Fv1\u002Ftimelines`\n- [Список комментариев](.\u002Ftimelines\u002Flist.md) — `GET \u002Fv1\u002Ftimelines`\n- [Получить комментарий](.\u002Ftimelines\u002Fget.md) — `GET \u002Fv1\u002Ftimelines\u002F:id`\n- [Обновить комментарий](.\u002Ftimelines\u002Fupdate.md) — `PATCH \u002Fv1\u002Ftimelines\u002F:id`\n- [Удалить комментарий](.\u002Ftimelines\u002Fdelete.md) — `DELETE \u002Fv1\u002Ftimelines\u002F:id`\n- [Поиск комментариев](.\u002Ftimelines\u002Fsearch.md) — `POST \u002Fv1\u002Ftimelines\u002Fsearch`\n- [Поля комментария](.\u002Ftimelines\u002Ffields.md) — `GET \u002Fv1\u002Ftimelines\u002Ffields`\n\n## Закрепление, привязки, заметки\n\nОперации Bitrix24 семейств `crm.timeline.item.*`, `crm.timeline.bindings.*`, `crm.timeline.note.*` универсальны — работают с любым элементом таймлайна по `id + ownerTypeId + ownerId`. Поэтому к комментариям применимы те же действия, что и к лог-записям. Ниже — копии 8 эндпоинтов из раздела [`\u002Fv1\u002Ftimeline-logs`](\u002Fdocs\u002Ftimeline-logs), смонтированные на корне `\u002Fv1\u002Ftimelines`:\n\n| Метод | Путь | B24-метод | Назначение |\n|------|------|-----------|------------|\n| POST | `\u002Fv1\u002Ftimelines\u002F:id\u002Fpin` | `crm.timeline.item.pin` | Закрепить комментарий поверх таймлайна |\n| POST | `\u002Fv1\u002Ftimelines\u002F:id\u002Funpin` | `crm.timeline.item.unpin` | Снять закрепление |\n| POST | `\u002Fv1\u002Ftimelines\u002F:id\u002Fbind` | `crm.timeline.bindings.bind` | Дополнительно привязать комментарий к другой сущности (например, контакту) |\n| POST | `\u002Fv1\u002Ftimelines\u002F:id\u002Funbind` | `crm.timeline.bindings.unbind` | Снять одну из привязок |\n| GET | `\u002Fv1\u002Ftimelines\u002F:id\u002Fbindings` | `crm.timeline.bindings.list` | Получить все привязки комментария |\n| POST | `\u002Fv1\u002Ftimelines\u002F:id\u002Fnote` | `crm.timeline.note.save` | Сохранить заметку (текстовое примечание) на комментарии |\n| GET | `\u002Fv1\u002Ftimelines\u002F:id\u002Fnote` | `crm.timeline.note.get` | Прочитать заметку |\n| DELETE | `\u002Fv1\u002Ftimelines\u002F:id\u002Fnote` | `crm.timeline.note.delete` | Удалить заметку |\n\nПолные сигнатуры запросов \u002F ответов и примеры — в зеркале раздела [`\u002Fv1\u002Ftimeline-logs`](\u002Fdocs\u002Ftimeline-logs): [pins](\u002Fdocs\u002Ftimeline-logs\u002Fpins), [bindings](\u002Fdocs\u002Ftimeline-logs\u002Fbindings), [notes](\u002Fdocs\u002Ftimeline-logs\u002Fnotes). Тело запроса, формат ответа и коды ошибок идентичны — отличается только префикс пути.\n\n## Ключевые поля\n\n| Поле | Описание |\n|------|---------|\n| `entityType` | Тип родительской записи CRM: `deal`, `lead`, `contact`, `company` или `DYNAMIC_\u003CentityTypeId>` для смарт-процессов (например `DYNAMIC_174`). Обязателен при создании и в фильтре |\n| `entityId` | ID родительской записи. Источник зависит от типа: `GET \u002Fv1\u002Fdeals`, `GET \u002Fv1\u002Fleads`, `GET \u002Fv1\u002Fcontacts`, `GET \u002Fv1\u002Fcompanies`, `GET \u002Fv1\u002Fitems\u002F:entityTypeId` (элементы смарт-процессов). Обязателен при создании и в фильтре |\n| `comment` | Текст комментария. Обязателен при создании |\n| `authorId` | ID автора. Данные пользователя по ID: `GET \u002Fv1\u002Fusers\u002F:id` |\n| `createdAt` | Дата создания (только чтение) |\n\nПолный список полей — [`GET \u002Fv1\u002Ftimelines\u002Ffields`](.\u002Ftimelines\u002Ffields.md).\n\n## Что нужно знать перед работой\n\n1. **Фильтр по `entityType` + `entityId` обязателен.** Список комментариев выбирается только в контексте конкретной родительской записи — глобального списка «всех комментариев портала» нет. Запрос без этих полей возвращает `400 MISSING_REQUIRED_FILTER`.\n2. **Для создания нужно 3 поля:** `entityType`, `entityId`, `comment`. Автор проставляется по владельцу API-ключа, дата — сервером.\n3. **Комментарий обновляется по `id`**, а `entityType` и `entityId` фиксируются при создании и после обновлению не подлежат.\n4. **Значения `entityType` — строковые идентификаторы CRM-типов.** Числовые коды CRM (`entityTypeId`) для `entityType` не подходят: они возвращают `BITRIX_ERROR Access denied.`. Используйте `deal`, `lead`, `contact`, `company` или `DYNAMIC_\u003CentityTypeId>` для смарт-процессов (например, `DYNAMIC_174` для смарт-процесса с `entityTypeId: 174` из [`GET \u002Fv1\u002Fsmart-processes`](\u002Fdocs\u002Fentities\u002Fsmart-processes\u002Flist)). В ответе API `entityType` возвращается в нижнем регистре (`dynamic_174`).\n\n## Типичный сценарий\n\n1. Найти родительскую запись: [`GET \u002Fv1\u002Fdeals`](\u002Fdocs\u002Fentities\u002Fdeals\u002Flist), [`GET \u002Fv1\u002Fleads`](\u002Fdocs\u002Fentities\u002Fleads\u002Flist), [`GET \u002Fv1\u002Fcontacts`](\u002Fdocs\u002Fentities\u002Fcontacts), [`GET \u002Fv1\u002Fcompanies`](\u002Fdocs\u002Fentities\u002Fcompanies) или [`GET \u002Fv1\u002Fitems\u002F:entityTypeId`](\u002Fdocs\u002Fentities\u002Fitems\u002Flist) для элементов смарт-процессов.\n2. Посмотреть её комментарии: [`GET \u002Fv1\u002Ftimelines?filter[entityType]=deal&filter[entityId]=741`](.\u002Ftimelines\u002Flist.md).\n3. Добавить новый комментарий: [`POST \u002Fv1\u002Ftimelines`](.\u002Ftimelines\u002Fcreate.md).\n4. При необходимости изменить текст: [`PATCH \u002Fv1\u002Ftimelines\u002F:id`](.\u002Ftimelines\u002Fupdate.md), удалить: [`DELETE \u002Fv1\u002Ftimelines\u002F:id`](.\u002Ftimelines\u002Fdelete.md).\n\n## Лимиты\n\n| Лимит | Значение |\n|-------|----------|\n| Максимум записей на запрос | 5000 (`limit ≤ 5000`) |\n| Авто-пагинация | включается при `limit > 50` |\n| `offset` на больших выборках | рекомендуется `limit ≤ 500` при `offset ≥ 2500` |\n| Batch-запросы | до 50 операций в [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| Rate limit | общий для Vibe API — см. [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) |\n\n## Смотрите также\n\n- [Сделки](.\u002Fdeals.md), [Лиды](.\u002Fleads.md), [Контакты](.\u002Fcontacts.md), [Компании](.\u002Fcompanies.md) — типичные родительские сущности\n- [Логи таймлайна](\u002Fdocs\u002Ftimeline-logs) — чтение полной истории активности записи CRM (включает не только комментарии, но и системные события)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch) — массовые операции\n- [Справочник сущностей](\u002Fdocs\u002Fentities-index)\n","2026-06-29",{"timelines\u002Fcreate.md":7,"timelines\u002Flist.md":8,"timelines\u002Fget.md":9,"timelines\u002Fupdate.md":10,"timelines\u002Fdelete.md":11,"timelines\u002Fsearch.md":12,"timelines\u002Ffields.md":13},"\n## Добавить комментарий\n\n`POST \u002Fv1\u002Ftimelines`\n\nСоздаёт новый комментарий таймлайна, привязанный к записи CRM. Используется для фиксации заметок по сделкам, лидам, контактам и компаниям.\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| **`entityType`** | string | да | Тип родительской записи CRM: `deal`, `lead`, `contact`, `company` или `DYNAMIC_\u003CentityTypeId>` для смарт-процессов (например, `DYNAMIC_174` для смарт-процесса с `entityTypeId: 174` из [`GET \u002Fv1\u002Fsmart-processes`](\u002Fdocs\u002Fentities\u002Fsmart-processes\u002Flist)) |\n| **`entityId`** | number | да | ID родительской записи. Источник зависит от типа: `GET \u002Fv1\u002Fdeals`, `GET \u002Fv1\u002Fleads`, `GET \u002Fv1\u002Fcontacts`, `GET \u002Fv1\u002Fcompanies`, `GET \u002Fv1\u002Fitems\u002F:entityTypeId` (элементы смарт-процессов) |\n| **`comment`** | string | да | Текст комментария. Пустая строка отклоняется ошибкой `BITRIX_ERROR Empty comment message` |\n| `FILES` | array | нет | Вложения к комментарию. Каждый элемент — массив из двух строк `[имяФайла, base64Содержимое]`. Тип поля в схеме Битрикс24 — `attached_diskfile` |\n\nПри создании через API автор (`authorId`) проставляется по владельцу API-ключа, дата создания (`createdAt`) — сервером.\n\n**Прикрепление файлов.** Поле `FILES` — массив пар `[имяФайла, base64Содержимое]`, по одной паре на файл. Содержимое файла передаётся как строка в кодировке base64, файл загружается на Диск Битрикс24 и привязывается к комментарию.\n\nПри чтении комментария ([`GET \u002Fv1\u002Ftimelines\u002F:id`](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fget)) прикреплённые файлы возвращаются в поле `FILES` — объект, где ключ это ID файла на Диске, а значение содержит метаданные:\n\n```json\n\"FILES\": {\n  \"9317\": {\n    \"id\": 9317,\n    \"name\": \"report.pdf\",\n    \"size\": 11,\n    \"type\": \"file\",\n    \"urlDownload\": \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fdisk\u002FdownloadFile\u002F9317\u002F?filename=report.pdf\"\n  }\n}\n```\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"entityType\": \"deal\",\n    \"entityId\": 741,\n    \"comment\": \"Первый контакт: клиент заинтересовался предложением\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"entityType\": \"deal\",\n    \"entityId\": 741,\n    \"comment\": \"Первый контакт: клиент заинтересовался предложением\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    entityType: 'deal',\n    entityId: 741,\n    comment: 'Первый контакт: клиент заинтересовался предложением',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Comment ID:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    entityType: 'deal',\n    entityId: 741,\n    comment: 'Первый контакт: клиент заинтересовался предложением',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n### curl — комментарий с файлом\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"entityType\": \"deal\",\n    \"entityId\": 741,\n    \"comment\": \"Отчёт во вложении\",\n    \"FILES\": [[\"report.pdf\", \"JVBERi0xLjQKJ...\"]]\n  }'\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | ID созданного комментария |\n| `entityType` | string | Тип родительской записи |\n| `entityId` | number | ID родительской записи |\n| `comment` | string | Текст комментария |\n| `authorId` | number | ID автора — при создании через API соответствует владельцу ключа |\n| `createdAt` | datetime | Дата создания (ISO 8601, UTC) |\n| `FILES` | object | Прикреплённые файлы — только если были переданы. Ключ — ID файла на Диске, значение — метаданные: `name`, `size`, `type`, `urlDownload` |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 66303,\n    \"entityId\": 741,\n    \"entityType\": \"deal\",\n    \"comment\": \"Первый контакт: клиент заинтересовался предложением\",\n    \"authorId\": 1,\n    \"createdAt\": \"2026-04-24T12:34:05.000Z\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — не передан обязательный `comment`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Empty comment message\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_FILES_SHAPE` | Поле `FILES` передано не массивом пар `[[имяФайла, base64Содержимое]]` |\n| 422 | `BITRIX_ERROR` | Нарушение требований: пустой `comment`, неверный `entityType` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список комментариев](\u002Fdocs\u002Fentities\u002Ftimelines\u002Flist) — проверка созданных комментариев\n- [Обновить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fupdate) — изменение текста\n- [Удалить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fdelete)\n- [Поля комментария](\u002Fdocs\u002Fentities\u002Ftimelines\u002Ffields) — полный список полей\n- [Batch](\u002Fdocs\u002Fbatch) — массовое создание комментариев\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Список комментариев\n\n`GET \u002Fv1\u002Ftimelines`\n\nВозвращает комментарии таймлайна, привязанные к конкретной записи CRM. Фильтр по `entityType` и `entityId` обязателен — без них запрос возвращает `400 MISSING_REQUIRED_FILTER`.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `filter[entityType]` | string | да | — | Тип родительской записи CRM: `deal`, `lead`, `contact`, `company` или `DYNAMIC_\u003CentityTypeId>` для смарт-процессов (например, `DYNAMIC_174`) |\n| `filter[entityId]` | number | да | — | ID родительской записи. Источник зависит от типа: `GET \u002Fv1\u002Fdeals`, `GET \u002Fv1\u002Fleads`, `GET \u002Fv1\u002Fcontacts`, `GET \u002Fv1\u002Fcompanies`, `GET \u002Fv1\u002Fitems\u002F:entityTypeId` (элементы смарт-процессов) |\n| `limit` | number | нет | `50` | Количество записей (до 5000). При `limit > 50` Вайбкод автоматически запрашивает несколько страниц у Битрикс24 |\n| `offset` | number | нет | `0` | Пропустить N записей. При `offset > 0` рекомендуется `limit ≤ 500` |\n| `select` | string | нет | — | Выборка полей: `?select=id,comment,authorId` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines?filter[entityType]=deal&filter[entityId]=741\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines?filter[entityType]=deal&filter[entityId]=741\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines?filter[entityType]=deal&filter[entityId]=741', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Найдено ${meta.total} комментариев`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines?filter[entityType]=deal&filter[entityId]=741', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив комментариев (все поля — см. [Поля комментария](\u002Fdocs\u002Fentities\u002Ftimelines\u002Ffields)) |\n| `meta.total` | number | Общее количество записей, соответствующих фильтру |\n| `meta.hasMore` | boolean | Есть ли ещё записи за пределами `limit` |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 66309,\n      \"entityId\": 741,\n      \"entityType\": \"deal\",\n      \"comment\": \"Первый контакт: клиент заинтересовался предложением\",\n      \"authorId\": 1,\n      \"createdAt\": \"2026-04-24T12:39:28.000Z\"\n    },\n    {\n      \"id\": 66311,\n      \"entityId\": 741,\n      \"entityType\": \"deal\",\n      \"comment\": \"Уточнение: клиент готов подписать договор на следующей неделе\",\n      \"authorId\": 1,\n      \"createdAt\": \"2026-04-24T12:39:30.000Z\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 2,\n    \"hasMore\": false\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не передан обязательный фильтр:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_REQUIRED_FILTER\",\n    \"message\": \"GET \u002Fv1\u002Ftimelines requires filter fields: entityType, entityId. Example: GET \u002Fv1\u002Ftimelines?filter[entityType]=...&filter[entityId]=...\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_REQUIRED_FILTER` | Не переданы обязательные `filter[entityType]` и `filter[entityId]` |\n| 422 | `BITRIX_ERROR` | Неверное значение `entityType` (например, числовой код CRM вместо строки) |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**`entityType` — строка.** Используйте строковые идентификаторы CRM-типов: `deal`, `lead`, `contact`, `company`. Для смарт-процессов — `DYNAMIC_\u003CentityTypeId>` (например, `DYNAMIC_174`). В ответе значение приходит в нижнем регистре (`dynamic_174`). Числовые коды CRM в `entityType` не работают — возвращается `422 BITRIX_ERROR Access denied.`.\n\n**Фильтрация только по `entityType` + `entityId`.** Битрикс24 игнорирует любые дополнительные поля в фильтре (`authorId`, `comment`, диапазоны `>=createdAt` и т. п.) — ответ возвращается тот же, что и без них. Если нужен отбор по автору или тексту — получите все комментарии записи и отфильтруйте на стороне клиента.\n\n**Порядок результатов — по `id` ASC.** Список возвращается в порядке создания: самые ранние комментарии первыми. Если нужен обратный порядок — переверните массив на клиенте (`data.reverse()`). Параметры сортировки (`order[...]`, `sort=`) для этого эндпоинта не применяются.\n\n**Авто-пагинация.** При `limit > 50` Вайбкод автоматически запрашивает несколько страниц у Битрикс24 и возвращает все записи в одном ответе.\n\n## Смотрите также\n\n- [Получить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fget) — получение одной записи по ID\n- [Добавить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fcreate) — создание нового\n- [Поля комментария](\u002Fdocs\u002Fentities\u002Ftimelines\u002Ffields) — полный список полей\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Entity API](\u002Fdocs\u002Fentity-api) — select, пагинация\n- [Batch](\u002Fdocs\u002Fbatch) — объединение нескольких list-запросов\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Получить комментарий\n\n`GET \u002Fv1\u002Ftimelines\u002F:id`\n\nВозвращает один комментарий таймлайна по его ID.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | ID комментария. Получить список ID — [`GET \u002Fv1\u002Ftimelines`](\u002Fdocs\u002Fentities\u002Ftimelines\u002Flist) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Комментарий:', data.comment)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\nОбъект комментария со всеми полями — см. [Поля комментария](\u002Fdocs\u002Fentities\u002Ftimelines\u002Ffields).\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 66303,\n    \"entityId\": 575,\n    \"entityType\": \"deal\",\n    \"comment\": \"Первый контакт: клиент заинтересовался предложением\",\n    \"authorId\": 1,\n    \"createdAt\": \"2026-04-24T12:34:05.000Z\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — комментарий не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Not found.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 422 | `BITRIX_ERROR` | Комментарий с указанным ID не существует |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список комментариев](\u002Fdocs\u002Fentities\u002Ftimelines\u002Flist) — поиск с фильтрами\n- [Обновить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fupdate) — изменение текста\n- [Удалить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fdelete)\n- [Поля комментария](\u002Fdocs\u002Fentities\u002Ftimelines\u002Ffields) — полный список полей\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Обновить комментарий\n\n`PATCH \u002Fv1\u002Ftimelines\u002F:id`\n\nИзменяет текст существующего комментария таймлайна. Передайте только поле `comment` — остальные поля (`entityType`, `entityId`, `authorId`, `createdAt`) фиксируются при создании и через API не изменяются.\n\n## Часто обновляемые поля\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `comment` | string | Новый текст комментария |\n\nПолный список полей — [`GET \u002Fv1\u002Ftimelines\u002Ffields`](\u002Fdocs\u002Fentities\u002Ftimelines\u002Ffields).\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"comment\": \"Уточнение: клиент готов подписать договор на следующей неделе\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"comment\": \"Уточнение: клиент готов подписать договор на следующей неделе\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    comment: 'Уточнение: клиент готов подписать договор на следующей неделе',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    comment: 'Уточнение: клиент готов подписать договор на следующей неделе',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | object | Обновлённый объект комментария — все поля, см. [Поля комментария](\u002Fdocs\u002Fentities\u002Ftimelines\u002Ffields) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 66303,\n    \"entityId\": 741,\n    \"entityType\": \"deal\",\n    \"comment\": \"Уточнение: клиент готов подписать договор на следующей неделе\",\n    \"authorId\": 1,\n    \"createdAt\": \"2026-04-24T12:34:05.000Z\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — комментарий не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Комментарий с указанным ID не существует |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Получить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fget) — текущее значение комментария\n- [Добавить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fcreate) — создание нового\n- [Удалить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fdelete)\n- [Batch](\u002Fdocs\u002Fbatch) — массовое обновление комментариев\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Удалить комментарий\n\n`DELETE \u002Fv1\u002Ftimelines\u002F:id`\n\nУдаляет комментарий таймлайна по ID. Восстановить удалённый комментарий через API нельзя — при необходимости создавайте новый.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | ID комментария |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Комментарий удалён')\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002F66303', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Удалено')\n}\n```\n\n## Ответ\n\nПри успешном удалении возвращается HTTP-статус `204 No Content` с пустым телом — признак успеха проверяется по статусу.\n\n## Пример ответа\n\n```\nHTTP\u002F1.1 204 No Content\n```\n\n## Пример ответа при ошибке\n\n404 — комментарий не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Элемент не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Комментарий не найден (или уже удалён) |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список комментариев](\u002Fdocs\u002Fentities\u002Ftimelines\u002Flist) — найти ID перед удалением\n- [Batch](\u002Fdocs\u002Fbatch) — массовое удаление\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Поиск комментариев\n\n`POST \u002Fv1\u002Ftimelines\u002Fsearch`\n\nПоиск комментариев таймлайна с фильтром через тело запроса — единый интерфейс с остальными сущностями. Фильтр по `entityType` и `entityId` обязателен: без них запрос возвращает `400 MISSING_REQUIRED_FILTER`. Для простой выборки в контексте одной записи подойдёт и [`GET \u002Fv1\u002Ftimelines`](\u002Fdocs\u002Fentities\u002Ftimelines\u002Flist) с фильтром в параметрах запроса.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `filter.entityType` | string | да | — | Тип родительской записи CRM: `deal`, `lead`, `contact`, `company` или `DYNAMIC_\u003CentityTypeId>` для смарт-процессов (например, `DYNAMIC_174`). Значение `entityTypeId` — из [`GET \u002Fv1\u002Fsmart-processes`](\u002Fdocs\u002Fentities\u002Fsmart-processes\u002Flist) |\n| `filter.entityId` | number | да | — | ID родительской записи. Источник зависит от типа: `GET \u002Fv1\u002Fdeals`, `GET \u002Fv1\u002Fleads`, `GET \u002Fv1\u002Fcontacts`, `GET \u002Fv1\u002Fcompanies`, `GET \u002Fv1\u002Fitems\u002F:entityTypeId` (элементы смарт-процессов) |\n| `limit` | number | нет | `50` | Количество записей (до 5000) |\n| `offset` | number | нет | `0` | Пропустить N записей |\n| `select` | string[] | нет | — | Выборка полей: `[\"id\", \"comment\", \"authorId\"]` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"entityType\": \"deal\", \"entityId\": 575 },\n    \"select\": [\"id\", \"comment\", \"authorId\"],\n    \"limit\": 3\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"entityType\": \"deal\", \"entityId\": 575 },\n    \"select\": [\"id\", \"comment\", \"authorId\"],\n    \"limit\": 3\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    filter: { entityType: 'deal', entityId: 575 },\n    select: ['id', 'comment', 'authorId'],\n    limit: 3,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Найдено ${meta.total} комментариев`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    filter: { entityType: 'deal', entityId: 575 },\n    select: ['id', 'comment', 'authorId'],\n    limit: 3,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив комментариев (все поля — см. [Поля комментария](\u002Fdocs\u002Fentities\u002Ftimelines\u002Ffields)) |\n| `meta.total` | number | Общее количество записей, соответствующих фильтру |\n| `meta.hasMore` | boolean | Есть ли ещё записи за пределами `limit` |\n| `meta.durationMs` | number | Время обработки запроса на стороне сервера, миллисекунды |\n\n## Пример ответа\n\nВ запросе передан `select`, поэтому в ответе только выбранные поля.\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 67119,\n      \"comment\": \"Первый контакт: клиент заинтересовался предложением\",\n      \"authorId\": 1\n    },\n    {\n      \"id\": 67121,\n      \"comment\": \"Уточнение: клиент готов подписать договор на следующей неделе\",\n      \"authorId\": 1\n    }\n  ],\n  \"meta\": {\n    \"total\": 2,\n    \"hasMore\": false,\n    \"durationMs\": 1208\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не передан обязательный фильтр:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_REQUIRED_FILTER\",\n    \"message\": \"POST \u002Fv1\u002Ftimelines\u002Fsearch requires filter fields: entityType, entityId. Example body: { \\\"filter\\\": {\\\"entityType\\\":\\\"...\\\",\\\"entityId\\\":\\\"...\\\"} }\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_REQUIRED_FILTER` | Не переданы обязательные `filter.entityType` и `filter.entityId` |\n| 422 | `BITRIX_ERROR` | Неверное значение `entityType` (например, числовой код CRM вместо строки) |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Фильтрация только по `entityType` + `entityId`.** Битрикс24 игнорирует любые дополнительные поля в фильтре (`authorId`, `comment`, диапазоны по `createdAt` и прочее) — ответ возвращается тот же, что и без них. Если нужен отбор по автору или тексту — получите все комментарии записи и отфильтруйте на стороне клиента.\n\n**Порядок результатов — по возрастанию `id`.** Список возвращается в порядке создания: самые ранние комментарии первыми. Параметры сортировки (`order`, `sort`) для этого эндпоинта не применяются.\n\n## Смотрите также\n\n- [Список комментариев](\u002Fdocs\u002Fentities\u002Ftimelines\u002Flist)\n- [Получить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fget)\n- [Поля комментария](\u002Fdocs\u002Fentities\u002Ftimelines\u002Ffields)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Поля комментария\n\n`GET \u002Fv1\u002Ftimelines\u002Ffields`\n\nВозвращает схему полей комментария таймлайна.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Поля:', Object.keys(data.fields))\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimelines\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Битрикс24 | Тип | RO | Описание |\n|------|----------|-----|:--:|---------|\n| `id` | `ID` | number | да | ID комментария |\n| `entityType` | `ENTITY_TYPE` | string | | Тип родительской записи CRM: `deal`, `lead`, `contact`, `company` или `DYNAMIC_\u003CentityTypeId>` для смарт-процессов (например, `DYNAMIC_174`). В ответе приходит в нижнем регистре (`dynamic_174`). Задаётся только при создании |\n| `entityId` | `ENTITY_ID` | number | | ID родительской записи. Задаётся только при создании. Источник: `GET \u002Fv1\u002Fdeals`, `GET \u002Fv1\u002Fleads`, `GET \u002Fv1\u002Fcontacts`, `GET \u002Fv1\u002Fcompanies`, `GET \u002Fv1\u002Fitems\u002F:entityTypeId` (элементы смарт-процессов) |\n| `comment` | `COMMENT` | string | | Текст комментария. Обязателен при создании |\n| `authorId` | `AUTHOR_ID` | number | да | ID автора комментария. Данные пользователя по ID: `GET \u002Fv1\u002Fusers\u002F:id` |\n| `createdAt` | `CREATED` | datetime | да | Дата создания, ISO 8601 в UTC |\n| `FILES` | `FILES` | attached_diskfile | | Вложения. На запись — массив пар `[[имяФайла, base64Содержимое]]`, на чтение — объект, где ключ это ID файла на Диске. Подробнее: [Добавить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fcreate) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"fields\": {\n      \"id\": { \"type\": \"number\", \"readonly\": true },\n      \"entityType\": { \"type\": \"string\", \"readonly\": false },\n      \"entityId\": { \"type\": \"number\", \"readonly\": false },\n      \"comment\": { \"type\": \"string\", \"readonly\": false },\n      \"authorId\": { \"type\": \"number\", \"readonly\": false },\n      \"createdAt\": { \"type\": \"datetime\", \"readonly\": true },\n      \"FILES\": { \"type\": \"attached_diskfile\", \"readonly\": false }\n    }\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет скоупа:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'crm' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Добавить комментарий](\u002Fdocs\u002Fentities\u002Ftimelines\u002Fcreate) — какие поля передавать\n- [Список комментариев](\u002Fdocs\u002Fentities\u002Ftimelines\u002Flist) — фильтрация по полям\n- [Entity API](\u002Fdocs\u002Fentity-api) — select для выборки нужных полей\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n"]