[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Ftask-comments":3,"docs-tabs-entities\u002Ftask-comments":6},{"content":4,"lastmod":5},"# Комментарии задач\n\nКомментарии — вложенный ресурс задачи. У каждого комментария есть автор, текст и время создания. Базовый путь — `\u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`. Все операции требуют существующей задачи (`:taskId`) на портале.\n\nБитрикс24 API: `tasks.task.chat.message.*`, `task.commentitem.*`\nСкоуп: `task`\n\n## Операции\n\n- [Создать комментарий](.\u002Ftask-comments\u002Fcreate.md) — `POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`\n- [Список комментариев](.\u002Ftask-comments\u002Flist.md) — `GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`\n- [Получить комментарий](.\u002Ftask-comments\u002Fget.md) — `GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002F:id`\n- [Обновить комментарий](.\u002Ftask-comments\u002Fupdate.md) — `PATCH \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002F:id`\n- [Удалить комментарий](.\u002Ftask-comments\u002Fdelete.md) — `DELETE \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002F:id`\n- [Пакет операций](.\u002Ftask-comments\u002Fcomments-batch.md) — `POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002Fbatch`\n\n## Ключевые поля\n\n| Поле | Описание |\n|------|---------|\n| `id` | Идентификатор комментария |\n| `taskId` | ID родительской задачи (берётся из пути URL) |\n| `authorId` | Автор. Список сотрудников: `GET \u002Fv1\u002Fusers` |\n| `message` | Текст комментария, до 65 535 символов. Поддерживает BB-код `[USER=ID]Имя[\u002FUSER]`, `[B]...[\u002FB]`, `[QUOTE]...[\u002FQUOTE]` и другие |\n| `createdAt` | Дата и время создания, UTC ISO 8601 |\n\n## Что нужно знать перед работой\n\n1. **У задачи две карточки.** В Битрикс24 параллельно живут две версии карточки задачи: «новая» (на базе чата) и «старая» (с блоком комментариев внутри самой карточки). Вызов одинаковый, но под капотом API сам выбирает рабочий путь в зависимости от того, как настроен портал. Различия видны только в PATCH\u002FDELETE — см. ниже.\n2. **PATCH и DELETE на новой карточке возвращают 410 GONE.** На новой карточке Битрикс24 нет публичного API обновления \u002F удаления комментариев — он отправляет только новые сообщения. На порталах со старой карточкой обновление и удаление продолжают работать без изменений. API возвращает `410 GONE` с текстом и подсказкой, если попал на новую карточку, и `200`\u002F`204` — на старой.\n3. **POST возвращает реальный `id` сообщения.** На новой карточке после отправки комментария API выполняет дополнительный поиск по чату задачи и возвращает фактический идентификатор. В редком случае (OAuth-приложение + несколько одинаковых сообщений подряд в одном чате) `id` может прийти как `null` — тогда найдите комментарий через `GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`.\n4. **Системные сообщения не возвращаются.** Чат задачи содержит уведомления типа «задача поставлена», «срок изменён» — `GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments` их пропускает. В списке только пользовательские комментарии.\n5. **`meta.total` — оценка.** Метод чата не возвращает общее количество, поэтому API считает по факту. Если в текущей странице меньше элементов, чем `limit`, то `total` равен числу элементов, иначе — `+1`. Опирайтесь на `meta.hasMore` для пагинации.\n6. **Плоский путь `\u002Fv1\u002Ftask-comments` не существует.** Все операции — только в виде `\u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002F...`. Вызов без префикса вернёт `400 WRONG_PATH` с подсказкой.\n\n## Типичный сценарий\n\n1. Найти задачу: [`GET \u002Fv1\u002Ftasks`](.\u002Ftasks\u002Flist.md) или прямой ID из создания задачи.\n2. Добавить комментарий: [`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`](.\u002Ftask-comments\u002Fcreate.md) с `message`.\n3. Показать обсуждение: [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`](.\u002Ftask-comments\u002Flist.md) — поддерживает `limit`, сортировку по `id`, фильтр на старой карточке.\n4. Если нужно массовое добавление — [`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002Fbatch`](.\u002Ftask-comments\u002Fcomments-batch.md) (до 50 сообщений).\n\n## Лимиты\n\n| Лимит | Значение |\n|-------|----------|\n| Максимум символов в `message` | 65 535 |\n| Максимум элементов в одном batch-вызове | 50 |\n| Размер страницы `limit` | до 200 |\n| Rate limit | общий для API — см. [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) |\n\n## Смотрите также\n\n- [Задачи](.\u002Ftasks.md) — родительская сущность\n- [Учёт времени задач](.\u002Ftasks\u002Ftime.md) — другой вложенный ресурс задачи\n- [Сотрудники](\u002Fdocs\u002Fentities\u002Fusers) — источник `authorId`\n- [Batch-запросы](\u002Fdocs\u002Fbatch) — массовые операции через универсальный `POST \u002Fv1\u002Fbatch`\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","2026-07-01",{"task-comments\u002Fcreate.md":7,"task-comments\u002Flist.md":8,"task-comments\u002Fget.md":9,"task-comments\u002Fupdate.md":10,"task-comments\u002Fdelete.md":11,"task-comments\u002Fcomments-batch.md":12},"\n## Создать комментарий\n\n`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`\n\nДобавляет комментарий к задаче. На новой карточке задачи сообщение отправляется в чат, на старой — попадает в блок комментариев в самой карточке.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | number | да | ID задачи |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `message` | string | ★ | Текст комментария, до 65 535 символов. Поддерживает BB-код (`[USER=ID]Имя[\u002FUSER]`, `[B]...[\u002FB]`, `[QUOTE]...[\u002FQUOTE]`) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"message\": \"Добавил черновик отчёта — посмотри, пожалуйста.\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"message\": \"Добавил черновик отчёта — посмотри, пожалуйста.\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    message: 'Добавил черновик отчёта — посмотри, пожалуйста.',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('ID нового комментария:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments', {\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    message: 'Добавил черновик отчёта — посмотри, пожалуйста.',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | number \\| null | Идентификатор нового комментария. На новой карточке возвращается id чат-сообщения, в редком случае может быть `null` — см. «Известные особенности» |\n\n## Пример ответа\n\nHTTP 201 Created:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 36559\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — пустой или отсутствующий `message`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"`message` is required and must be a string\"\n  }\n}\n```\n\n404 — задача не существует или недоступна:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"TASK_NOT_FOUND\",\n    \"message\": \"Bitrix24 did not create the comment (returned false). Task 99999999 may not exist or may not be accessible.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` не положительное целое |\n| 400 | `INVALID_PARAMS` | Поле `message` отсутствует или не является строкой |\n| 400 | `INVALID_PARAMS` | `message` превышает лимит длины |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `task` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n| 404 | `TASK_NOT_FOUND` | Задача `taskId` не существует или недоступна ключу — Битрикс24 не создал комментарий |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**`data.id` изредка бывает `null` при успехе (`success: true`).** На новой карточке задачи комментарий уходит в чат (`tasks.task.chat.message.send`), а id восстанавливается отдельным поиском по последним сообщениям чата. Если восстановить id не удалось (сообщение не нашлось в окне поиска), комментарий **уже создан**, но ответ возвращает `id: null` — это не ошибка, повторный запрос создаст дубликат. Если же Битрикс24 в принципе не создал комментарий (задача не существует или недоступна), это отдельный случай — API возвращает `404 TASK_NOT_FOUND`, а не `201` с `id: null`.\n\n## Смотрите также\n\n- [Список комментариев](.\u002Flist.md) — найти добавленный комментарий\n- [Получить комментарий](.\u002Fget.md) — прочитать по `id`\n- [Пакет операций](.\u002Fcomments-batch.md) — добавить несколько комментариев одним запросом\n- [Задачи](\u002Fdocs\u002Fentities\u002Ftasks) — родительская сущность\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Список комментариев\n\n`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`\n\nВозвращает комментарии конкретной задачи. На новой карточке задачи список читается из чата (системные сообщения отфильтрованы); на старой — из блока комментариев в самой карточке.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `taskId` (path) | number | да | — | ID родительской задачи |\n| `limit` (query) | number | | `50` | Размер страницы (до 200) |\n| `sort` (query) | string | | `id:desc` | Сортировка: `id:asc` или `id:desc` |\n| `filter` (query) | object | | — | Фильтр для старой карточки. Передаётся как JSON: `?filter={\"AUTHOR_ID\":1}`. На новой карточке передача параметра переключает чтение в режим старой карточки |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments?limit=20&sort=id:desc\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments?limit=20&sort=id:desc\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst url = 'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments?limit=20&sort=id:desc'\nconst res = await fetch(url, {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Получено ${data.length} комментариев`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst url = 'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments?limit=20&sort=id:desc'\nconst res = await fetch(url, {\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 | Массив комментариев |\n| `data[].id` | number | Идентификатор комментария |\n| `data[].taskId` | number | ID родительской задачи |\n| `data[].authorId` | number | Автор. Профиль: `GET \u002Fv1\u002Fusers\u002F:authorId` |\n| `data[].message` | string | Текст комментария (поддерживает BB-код) |\n| `data[].createdAt` | datetime | Дата создания (UTC ISO 8601) |\n| `meta.total` | number | Оценка количества комментариев |\n| `meta.hasMore` | boolean | Есть ли ещё комментарии за пределами `limit` |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 36559,\n      \"taskId\": 289,\n      \"authorId\": 1,\n      \"message\": \"Добавил черновик отчёта в комментарии — посмотри, пожалуйста.\",\n      \"createdAt\": \"2026-05-13T12:30:58.000Z\"\n    },\n    {\n      \"id\": 36557,\n      \"taskId\": 289,\n      \"authorId\": 79,\n      \"message\": \"[USER=99]Зуля[\u002FUSER], готово, спасибо.\",\n      \"createdAt\": \"2026-05-12T15:11:04.000Z\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 2,\n    \"hasMore\": false\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — `taskId` не положительное целое:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"taskId must be a positive integer\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` некорректен (не целое положительное число) |\n| 400 | `INVALID_SORT_FIELD` | Сортировка по неподдерживаемому полю или направлению. Поддерживаются `ID`, `AUTHOR_ID`, `AUTHOR_NAME`, `AUTHOR_EMAIL`, `POST_DATE` с направлением `asc` или `desc` |\n| 400 | `INVALID_FILTER` | Параметр `filter` не является корректным JSON |\n| 400 | `UNKNOWN_FILTER_FIELD` | Фильтр по неподдерживаемому полю. Поддерживаются `ID`, `AUTHOR_ID`, `AUTHOR_NAME`, `POST_DATE` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `task` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Пустая страница при `meta.hasMore: true`.** Системные уведомления (постановка задачи, смена срока, назначение исполнителя) отфильтровываются на стороне API. Если их много в текущем срезе, `data` может прийти пустым при `meta.hasMore: true` — запросите следующую страницу или увеличьте `limit`.\n\n## Смотрите также\n\n- [Получить комментарий](.\u002Fget.md) — одна запись по `id`\n- [Создать комментарий](.\u002Fcreate.md) — добавить новый\n- [Пакет операций](.\u002Fcomments-batch.md) — добавить несколько за один вызов\n- [Задачи](\u002Fdocs\u002Fentities\u002Ftasks) — родительская сущность\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Получить комментарий\n\n`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002F:id`\n\nВозвращает один комментарий задачи по его идентификатору. Работает и для комментариев из чата новой карточки, и для записей в блоке комментариев старой карточки.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | number | да | ID задачи |\n| `id` (path) | number | да | ID комментария (из `GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments` или ответа `POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002F36559\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002F36559\" \\\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\u002Ftasks\u002F289\u002Fcomments\u002F36559', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log(data.message)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002F36559', {\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| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | number | Идентификатор комментария |\n| `data.taskId` | number | ID родительской задачи |\n| `data.authorId` | number | Автор. Профиль: `GET \u002Fv1\u002Fusers\u002F:authorId` |\n| `data.message` | string | Текст комментария (поддерживает BB-код) |\n| `data.createdAt` | datetime | Дата создания (UTC ISO 8601) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 36559,\n    \"taskId\": 289,\n    \"authorId\": 1,\n    \"message\": \"Добавил черновик отчёта в комментарии — посмотри, пожалуйста.\",\n    \"createdAt\": \"2026-05-13T12:30:58.000Z\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — комментарий не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"Comment not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` или `id` не являются положительными целыми числами |\n| 404 | `NOT_FOUND` | Комментарий с таким `id` не найден ни в чате, ни в блоке комментариев старой карточки |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `task` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Двухступенчатый поиск.** На новой карточке API сначала ищет комментарий среди последних 200 сообщений чата задачи. Если совпадения нет — например, комментарий старше 200 последних или относится к старой карточке — запрос автоматически идёт по старому пути чтения. Это прозрачно для клиента: формат ответа одинаковый.\n\n## Смотрите также\n\n- [Список комментариев](.\u002Flist.md) — получить ID нужного комментария\n- [Создать комментарий](.\u002Fcreate.md) — добавить новый\n- [Обновить комментарий](.\u002Fupdate.md) — изменить текст\n- [Удалить комментарий](.\u002Fdelete.md) — снять комментарий\n- [Задачи](\u002Fdocs\u002Fentities\u002Ftasks) — родительская сущность\n","\n## Обновить комментарий\n\n`PATCH \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002F:id`\n\nИзменяет текст существующего комментария задачи. Доступно только на порталах со старой карточкой задачи: на новой карточке метод возвращает `410 GONE` с пояснением.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | number | да | ID задачи |\n| `id` (path) | number | да | ID комментария |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `message` | string | ★ | Новый текст комментария, до 65 535 символов |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002F36559\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"message\": \"Уточнил формулировку в комментарии.\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002F36559\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"message\": \"Уточнил формулировку в комментарии.\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002F36559', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    message: 'Уточнил формулировку в комментарии.',\n  }),\n})\n\nconst { success, data, error } = await res.json()\nif (res.status === 410) console.log('Новая карточка — обновление недоступно:', error.message)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002F36559', {\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    message: 'Уточнил формулировку в комментарии.',\n  }),\n})\n\nconst { success, data, error } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | `true` при успешном обновлении на старой карточке |\n| `data.id` | number | Идентификатор обновлённого комментария |\n\n## Пример ответа\n\nСтарая карточка — обновление применилось:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 36559\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n410 — новая карточка задачи (метод недоступен):\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"GONE\",\n    \"message\": \"Bitrix24 disabled update\u002Fdelete for task comments in the new task card. To remove a comment, delete the source task or ask a portal admin to remove the message via the chat UI.\",\n    \"hint\": \"Verified against apidocs.bitrix24.ru on 2026-05-09 — the modern task-chat API accepts only new messages, no edit or delete.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` или `id` не являются положительными целыми |\n| 410 | `GONE` | Задача создана на новой карточке — обновление комментария на стороне Битрикс24 недоступно |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `task` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Альтернатива для новой карточки.** Способов программно изменить отправленный комментарий нет. Если содержимое критично — удалите задачу целиком ([`DELETE \u002Fv1\u002Ftasks\u002F:id`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fdelete)) и создайте новую, либо попросите администратора портала удалить сообщение через интерфейс чата.\n\n## Смотрите также\n\n- [Получить комментарий](.\u002Fget.md) — прочитать текущий текст\n- [Создать комментарий](.\u002Fcreate.md) — добавить новый\n- [Удалить комментарий](.\u002Fdelete.md) — снять комментарий (тот же контракт по карточкам)\n- [Задачи](\u002Fdocs\u002Fentities\u002Ftasks) — родительская сущность\n","\n## Удалить комментарий\n\n`DELETE \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002F:id`\n\nУдаляет комментарий задачи. Доступно только на порталах со старой карточкой задачи: на новой карточке метод возвращает `410 GONE`. Восстановить удалённый комментарий через API нельзя.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | number | да | ID задачи |\n| `id` (path) | number | да | ID комментария |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002F36559\" \\\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\u002Ftasks\u002F289\u002Fcomments\u002F36559\" \\\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\u002Ftasks\u002F289\u002Fcomments\u002F36559', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Комментарий удалён')\n} else if (res.status === 410) {\n  const { error } = await res.json()\n  console.log('Новая карточка — удаление недоступно:', error.message)\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002F36559', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n```\n\n## Ответ\n\nПри успешном удалении на старой карточке возвращается HTTP-статус `204 No Content` с пустым телом — признак успеха проверяется по статусу. На новой карточке вместо `204` приходит `410 GONE` с JSON-телом (см. ниже).\n\n## Пример ответа\n\nСтарая карточка:\n\n```\nHTTP\u002F1.1 204 No Content\n```\n\n## Пример ответа при ошибке\n\n410 — новая карточка задачи (метод недоступен):\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"GONE\",\n    \"message\": \"Bitrix24 disabled update\u002Fdelete for task comments in the new task card. To remove a comment, delete the source task or ask a portal admin to remove the message via the chat UI.\",\n    \"hint\": \"Verified against apidocs.bitrix24.ru on 2026-05-09 — the modern task-chat API accepts only new messages, no edit or delete.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` или `id` не являются положительными целыми |\n| 410 | `GONE` | Задача создана на новой карточке — удаление комментария на стороне Битрикс24 недоступно |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `task` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Альтернатива для новой карточки.** Способов программно удалить отправленный комментарий нет. Если содержимое нужно скрыть — удалите задачу целиком ([`DELETE \u002Fv1\u002Ftasks\u002F:id`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fdelete)), либо попросите администратора портала удалить сообщение через интерфейс чата.\n\n## Смотрите также\n\n- [Список комментариев](.\u002Flist.md) — найти комментарий перед удалением\n- [Получить комментарий](.\u002Fget.md) — проверить текст перед удалением\n- [Обновить комментарий](.\u002Fupdate.md) — изменение (тот же контракт по карточкам)\n- [Задачи](\u002Fdocs\u002Fentities\u002Ftasks) — родительская сущность\n","\n## Пакет операций над комментариями\n\n`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments\u002Fbatch`\n\nМассовое создание, обновление или удаление комментариев одной задачи. До 50 элементов за вызов. Каждый элемент обрабатывается независимо — ошибка одного не отменяет остальные.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | number | да | ID задачи |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `action` | string | ★ | Тип операции: `create`, `update` или `delete` |\n| `items` | array | при `create` \u002F `update` | Список элементов (до 50). Для `create`: `[{ message: string }]`. Для `update`: `[{ id: number, message: string }]` |\n| `ids` | number[] | при `delete` | Идентификаторы комментариев для удаления (до 50) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002Fbatch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"action\": \"create\",\n    \"items\": [\n      { \"message\": \"Шаг 1: подготовил черновик.\" },\n      { \"message\": \"Шаг 2: отправил на ревью.\" }\n    ]\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002Fbatch\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"action\": \"create\",\n    \"items\": [\n      { \"message\": \"Шаг 1: подготовил черновик.\" },\n      { \"message\": \"Шаг 2: отправил на ревью.\" }\n    ]\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002Fbatch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    action: 'create',\n    items: [\n      { message: 'Шаг 1: подготовил черновик.' },\n      { message: 'Шаг 2: отправил на ревью.' },\n    ],\n  }),\n})\n\nconst { success, data } = await res.json()\ndata.forEach((item) => {\n  if (item.success) console.log(`#${item.index} → id=${item.id}`)\n  else console.log(`#${item.index} → ошибка: ${item.error}`)\n})\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftasks\u002F289\u002Fcomments\u002Fbatch', {\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    action: 'create',\n    items: [\n      { message: 'Шаг 1: подготовил черновик.' },\n      { message: 'Шаг 2: отправил на ревью.' },\n    ],\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` — даже если все элементы упали, верхний уровень success. Смотрите статус каждого в `data[i]` |\n| `data` | array | Массив результатов в том же порядке, что и `items` \u002F `ids` запроса |\n| `data[].index` | number | Индекс элемента (0-based) |\n| `data[].success` | boolean | Результат конкретной операции |\n| `data[].id` | number \\| null | ID комментария при `create` \u002F `update`. Изредка `null` при `success: true` — комментарий создан, но id не восстановился (см. [`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fcomments`](.\u002Fcreate.md) «Известные особенности»). Если Битрикс24 вообще не создал комментарий (задача не существует\u002Fнедоступна) — это отдельный случай, `success: false` + `error: TASK_NOT_FOUND`, id не возвращается |\n| `data[].error` | string | Код ошибки для упавшего элемента (`GONE`, `BATCH_ITEM_VALIDATION`, `BITRIX_ERROR`, `INVALID_PARAMS`, `TASK_NOT_FOUND`) |\n| `data[].message` | string | Текст ошибки для упавшего элемента |\n\n## Пример ответа\n\n`action: create` на новой карточке — обе записи попали в чат задачи:\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    { \"index\": 0, \"success\": true, \"id\": 36571 },\n    { \"index\": 1, \"success\": true, \"id\": 36573 }\n  ]\n}\n```\n\n`action: update` на новой карточке — каждая попытка обновления превращается в `GONE` (метод недоступен):\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"index\": 0,\n      \"success\": false,\n      \"error\": \"GONE\",\n      \"message\": \"Bitrix24 disabled update\u002Fdelete for task comments in the new task card. To remove a comment, delete the source task or ask a portal admin to remove the message via the chat UI.\"\n    }\n  ]\n}\n```\n\n## Пример ответа при ошибке\n\n400 — некорректное значение `action`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_BATCH_ACTION\",\n    \"message\": \"Action must be one of: create, update, delete\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` не положительное целое |\n| 400 | `INVALID_BATCH_ACTION` | `action` не равен `create`, `update` или `delete` |\n| 400 | `BATCH_ITEM_VALIDATION` | `items` (или `ids` при `delete`) пустой или не массив |\n| 400 | `BATCH_LIMIT_EXCEEDED` | В одном запросе передано более 50 элементов |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `task` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nОшибки отдельных элементов приходят внутри `data[i].error`:\n\n| Код | Описание |\n|-----|----------|\n| `GONE` | Только для `update` \u002F `delete` на новой карточке — операция недоступна на стороне Битрикс24 |\n| `BATCH_ITEM_VALIDATION` | Элемент не прошёл валидацию (например, нет `id` или `message`, неверный тип) |\n| `INVALID_PARAMS` | `message` отсутствует или превышает лимит длины |\n| `BITRIX_ERROR` | Битрикс24 вернул ошибку для конкретного элемента (текст в `message`) |\n| `TASK_NOT_FOUND` | Только для `create` — задача `taskId` не существует или недоступна ключу, комментарий не создан |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Верхний `success` всегда `true`, если запрос прошёл валидацию.** Несколько упавших элементов внутри не превращают весь ответ в ошибку — это сделано специально, чтобы клиент мог обработать частичный результат. Перед использованием результата всегда проверяйте `data[i].success` для каждого элемента.\n\n**`GONE` приходит для каждого элемента отдельно.** На новой карточке `update` \u002F `delete` каждого элемента возвращает `GONE`, но общий ответ остаётся `200 success` — весь пакет не отклоняется. В смешанных сценариях часть элементов на старой карточке проходит, часть на новой возвращает `GONE`.\n\n**`create` различает «не создано» и «создано, id неизвестен».** Если задача не существует\u002Fнедоступна — элемент падает с `TASK_NOT_FOUND` (`success: false`, `id` отсутствует). Если же комментарий реально создан (ушёл в чат задачи), но система не смогла подтвердить его id поиском по последним сообщениям — элемент остаётся `success: true` с `id: null`; повторный вызов создаст дубликат, а не восстановит прежний id.\n\n## Смотрите также\n\n- [Создать комментарий](.\u002Fcreate.md) — одиночный POST\n- [Обновить комментарий](.\u002Fupdate.md) — одиночный PATCH (тот же контракт по карточкам)\n- [Удалить комментарий](.\u002Fdelete.md) — одиночный DELETE\n- [Универсальный batch](\u002Fdocs\u002Fbatch) — объединение разных entity-операций в один HTTP-вызов\n- [Задачи](\u002Fdocs\u002Fentities\u002Ftasks) — родительская сущность\n"]