Для AI-агентов: markdown этой страницы — /docs-content/entities/task-comments/list.md индекс документации — /llms.txt
Список комментариев
GET /v1/tasks/:taskId/comments
Возвращает комментарии конкретной задачи. На новой карточке задачи список читается из чата, системные сообщения отфильтрованы. На старой — из блока комментариев в самой карточке.
Комментарии, оставленные до перехода портала на новую карточку, в чат не переезжают, поэтому у задачи с чатом часть комментариев может лежать в старом хранилище. Если чат прочитан до конца и не дал ни одного комментария, список дочитывает старое хранилище и отвечает из него; если чат при этом дочитать не удалось, старое хранилище всё равно читается, а чат в meta.sources не попадает. meta.sources называет хранилища, содержимое которых ответ узнал, а полноту прочитанного показывает meta.truncated: по паре этих полей видно, значит ли пустой data «комментариев нет» или «узнали только про одно из двух хранилищ».
Параметры
| Параметр | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|
ПараметрtaskId (path) |
Типnumber | Обяз.да | По умолч.— | ОписаниеID родительской задачи |
Параметрlimit (query) |
Типnumber | Обяз. | По умолч.50 |
ОписаниеРазмер страницы (до 200) |
Параметрoffset (query) |
Типnumber | Обяз. | По умолч.0 |
ОписаниеСколько подошедших комментариев пропустить перед выдачей. Учитывается на всех путях чтения, включая ответ из старого хранилища; раньше на запросе без filter и с сортировкой по ID игнорировался — та же страница приходила при любом offset, — а ответ из старого хранилища приходил тем куском, который Битрикс24 отдал одним вызовом |
Параметрsort (query) |
Типstring | Обяз. | По умолч.id:desc |
ОписаниеСортировка: поле ID, AUTHOR_ID или POST_DATE и направление asc либо desc — ?sort=post_date:desc. Имя поля регистронезависимо; принимаются и camelCase-имена id, authorId, authorName, createdAt, authorEmail. Сортировка по AUTHOR_NAME и AUTHOR_EMAIL принимается только на старой карточке, на новой возвращает 400 UNSUPPORTED_SORT_FIELD |
Параметрfilter (query) |
Типobject | Обяз. | По умолч.— | ОписаниеФильтр по полям ID, AUTHOR_ID, POST_DATE. Принимаются и camelCase-имена id, authorId, authorName, createdAt. Передаётся как JSON: ?filter={"AUTHOR_ID":1}. Перед именем поля допустим префикс !, >, >=, < или <= — ?filter={">=POST_DATE":"2026-05-01T00:00:00Z"}. Значение для POST_DATE — дата ISO 8601 в UTC, несколько полей объединяются по «и». Фильтр по AUTHOR_NAME принимается только на старой карточке, на новой возвращает 400 UNSUPPORTED_FILTER_FIELD ⚠️ Фильтр передаётся ЦЕЛИКОМ в одной форме — либо скобочной, либо одним объектом JSON. Смешанный конверт (?filter[NAME]=x&filter=) и скобочное условие глубже двух уровней отклоняются с 400 INVALID_FILTER: при разборе строки запроса половина условий теряется безвозвратно. Пустое значение ?filter= означает «без фильтра». |
Примеры
curl — личный ключ
curl "https://vibecode.bitrix24.tech/v1/tasks/289/comments?limit=20&sort=id:desc" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth-приложение
curl "https://vibecode.bitrix24.tech/v1/tasks/289/comments?limit=20&sort=id:desc" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — личный ключ
const url = 'https://vibecode.bitrix24.tech/v1/tasks/289/comments?limit=20&sort=id:desc'
const res = await fetch(url, {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data, meta } = await res.json()
console.log(`Получено ${data.length} комментариев`)
JavaScript — OAuth-приложение
const url = 'https://vibecode.bitrix24.tech/v1/tasks/289/comments?limit=20&sort=id:desc'
const res = await fetch(url, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data, meta } = await res.json()
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
Полеsuccess |
Типboolean | ОписаниеВсегда true при успехе |
Полеdata |
Типarray | ОписаниеМассив комментариев |
Полеdata[].id |
Типnumber | ОписаниеИдентификатор комментария |
Полеdata[].taskId |
Типnumber | ОписаниеID родительской задачи |
Полеdata[].authorId |
Типnumber | ОписаниеАвтор. Профиль: GET /v1/users/:authorId |
Полеdata[].message |
Типstring | ОписаниеТекст комментария (поддерживает BB-код) |
Полеdata[].createdAt |
Типdatetime | ОписаниеДата создания (UTC ISO 8601) |
Полеdata[].attachments |
Типarray | ОписаниеПриложенные файлы. Ключ присутствует всегда, без файлов — пустой список. Элемент: fileId, downloadUrl, а также name и size, когда Битрикс24 их отдал. Скачивание — Скачать вложение |
Полеmeta.total |
Типnumber | ОписаниеКоличество комментариев. На новой карточке при запросе с filter, сортировкой не по ID или ненулевым offset — точное число подошедших в пределах просмотренного окна. На запросе без них — точное число, когда meta.hasMore: false; на полной странице комментариев — оценка «не меньше», равная data.length + 1. В ответе из старого хранилища это счётчик, который вернул сам Битрикс24 на ЭТОТ вызов (с учётом filter, если он задан); своего счётчика он может и не вернуть — тогда число вырождается в количество строк единственной полученной страницы. Счётчиком по всей задаче оно не является ни в том, ни в другом случае: за раз это хранилище отдаёт не больше 50 записей и постраничной навигации не даёт. Превышать длину data оно может, дотянуться дальше одного вызова — нет. Читайте его вместе с meta.truncated |
Полеmeta.hasMore |
Типboolean | ОписаниеЕсть ли ещё комментарии за пределами limit — в том наборе, до которого ответ дотянулся. На обходе чата этот набор — ТОЛЬКО чат: домиграционные комментарии старого хранилища в него не входят, поэтому hasMore: false там означает конец чата, а не конец комментариев задачи. В ответе из старого хранилища набор ограничен ОДНИМ вызовом task.commentitem.getlist (не больше 50 записей, навигации нет): hasMore: false значит «в полученной странице больше нечего листать», а не «комментарии кончились». ⚠️ Поэтому условием выхода из пагинации держите ТРОЙКУ: листайте, пока hasMore: true; ответ полон, только когда рядом НЕТ meta.truncated И meta.sources равен ["chat", "legacy"] |
Полеmeta.truncated |
Типboolean | ОписаниеПриходит только со значением true: прочитанное неполно, часть комментариев осталась за границей того, до чего дотянулся ответ. Его присылают ОБА пути, и смысл meta.total рядом с ним разный. Обход чата (новая карточка) остановился раньше конца истории — просмотрено предельное окно, обход оборвался либо часть истории скрыта тарифом портала; там meta.total считает только попавшие внутрь. Чаще всего это запрос с filter или сортировкой не по ID, но в тот же обход попадает и обычный запрос, когда страница системных уведомлений оставляет срез коротким. Старое хранилище вернуло полную страницу: task.commentitem.getlist зовётся один раз и постраничной навигации не даёт, поэтому заполненная страница — единственный доступный признак того, что за ней может быть ещё; там meta.total — то, что вернул Битрикс24 на ЭТОТ вызов, а если своего счётчика он не дал, то просто число строк полученной страницы; счётчиком по всей задаче оно не является. Непрочитанное хранилище этим флагом НЕ сообщается — про него говорит meta.sources, не называя его. Отсутствие поля значит лишь, что ПРОЧИТАННЫЕ хранилища прочитаны целиком, — полноту ответа оно само по себе не удостоверяет: полон ответ при наборе ["chat", "legacy"] И без этого поля. ⚠️ У задачи с чатом старое хранилище дочитывается, только если чат не дал НИ ОДНОГО комментария, поэтому ответ с ["chat"] может не содержать домиграционных комментариев, лежащих в старом хранилище |
Полеmeta.sources |
Типarray | ОписаниеХранилища, содержимое которых узнал этот ответ: ["chat"] — только чат задачи, ["legacy"] — только старое хранилище, ["chat", "legacy"] — оба, [] — ни одного. Хранилище попадает в список, если отдало комментарии либо было прочитано до конца и оказалось пустым. Не попадает то, про которое ответ не узнал ничего: оно отказало, метода нет или обход оборвался, не собрав ни одного комментария. ⚠️ Отсутствие хранилища — НЕ этот случай: если чат задаче не выделен, чат-комментариев нет по построению, знание о них полное, и chat в списке есть. Доказательством служит только свежая проверка: в пределах пятиминутного кэша тот же ответ честно скажет ["legacy"], потому что за это время чат мог появиться. ⚠️ Попадание в список НЕ значит «прочитано целиком»: чат попадает в sources и вместе с truncated: true, если обход оборвался, собрав хотя бы один комментарий. Полноту прочитанного meta.sources не описывает, это говорит meta.truncated |
Пример ответа
{
"success": true,
"data": [
{
"id": 36559,
"taskId": 289,
"authorId": 1,
"message": "Добавил черновик отчёта в комментарии — посмотри, пожалуйста.",
"createdAt": "2026-05-13T12:30:58.000Z",
"attachments": []
},
{
"id": 36557,
"taskId": 289,
"authorId": 79,
"message": "[USER=99]Зуля[/USER], готово, спасибо.",
"createdAt": "2026-05-12T15:11:04.000Z",
"attachments": []
}
],
"meta": {
"total": 2,
"hasMore": false,
"sources": ["chat"]
}
}
Пример комментария с непустым attachments — Получить комментарий.
Пример ответа при ошибке
400 — taskId не положительное целое:
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "taskId must be a positive integer"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| HTTP400 | КодINVALID_PARAMS |
ОписаниеtaskId некорректен (не целое положительное число) |
| HTTP400 | КодINVALID_SORT_FIELD |
ОписаниеСортировка по неподдерживаемому полю или направлению. Поддерживаются ID, AUTHOR_ID, AUTHOR_NAME, AUTHOR_EMAIL, POST_DATE и их camelCase-имена, с направлением asc или desc. На новой карточке AUTHOR_NAME и AUTHOR_EMAIL отвечают UNSUPPORTED_SORT_FIELD |
| HTTP400 | КодUNSUPPORTED_SORT_FIELD |
ОписаниеТолько новая карточка: сортировка по AUTHOR_NAME или AUTHOR_EMAIL. Отсортируйте по ID, AUTHOR_ID или POST_DATE |
| HTTP400 | КодINVALID_FILTER |
ОписаниеПараметр filter не является корректным JSON либо называет одно поле дважды в разных написаниях имени или знака равенства, например {"AUTHOR_ID":1,"authorId":2} или {"AUTHOR_ID":1,"=authorId":2}. Только новая карточка: filter — скаляр или пустой массив вместо объекта (0, false, "", []), значение поля ID или AUTHOR_ID не число, значение POST_DATE не разбирается как дата, либо значение поля — объект или массив вместо скаляра. Непустой массив или непустая строка в filter дают UNKNOWN_FILTER_FIELD — их индексы разбираются как имена полей. Также отклоняется неоднозначный конверт: скобочная форма и JSON в одном запросе (в любом порядке) либо скобочное условие глубже двух уровней — половина условий при разборе теряется безвозвратно, поэтому запрос отклоняется, а не выполняется частично. |
| HTTP400 | КодUNKNOWN_FILTER_FIELD |
ОписаниеФильтр по неподдерживаемому полю. Поддерживаются ID, AUTHOR_ID, AUTHOR_NAME, POST_DATE и их camelCase-имена. На новой карточке AUTHOR_NAME отвечает UNSUPPORTED_FILTER_FIELD |
| HTTP400 | КодUNSUPPORTED_FILTER_FIELD |
ОписаниеТолько новая карточка: фильтр по AUTHOR_NAME. Отфильтруйте по ID, AUTHOR_ID или POST_DATE, идентификатор сотрудника по имени — GET /v1/users |
| HTTP422 | КодBITRIX_ERROR |
ОписаниеЗадачи с таким taskId нет. Текст ошибки приходит от Битрикс24 дословно, в поле b24Code — ERROR_CORE |
| HTTP403 | КодSCOPE_DENIED |
ОписаниеAPI-ключ не имеет скоупа task |
| HTTP401 | КодTOKEN_MISSING |
ОписаниеAPI-ключ не имеет настроенных токенов |
Полный список общих ошибок API — Ошибки.
Известные особенности
Окно просмотра при фильтрации. На новой карточке запрос с filter или сортировкой не по ID просматривает до 2000 самых новых сообщений чата задачи, включая системные уведомления, и отбирает подошедшие комментарии из них. Если история задачи длиннее или ограничена тарифом портала, приходит meta.truncated: true: за границей окна остались комментарии, которых нет в ответе, а meta.total считает только попавшие в окно. Это не признак следующей страницы — offset окно не сдвинет. Сузьте выборку фильтром по POST_DATE или AUTHOR_ID. По той же причине ?sort=post_date:asc на такой задаче вернёт самые старые комментарии в пределах окна, а не самые старые в задаче.
Фильтр и сортировка по автору — через AUTHOR_ID. Поля AUTHOR_NAME и AUTHOR_EMAIL принимаются на старой карточке и возвращают 400 на новой, поэтому запрос по имени автора работает не на каждом портале. Чтобы выборка не зависела от того, как настроен портал, найдите сотрудника через GET /v1/users и фильтруйте или сортируйте по AUTHOR_ID.
Список читает чат, если он у задачи есть. Когда у задачи есть чат, ответ собирается из его сообщений. Комментарии, написанные до перехода портала на новую карточку, в чат не переносились, поэтому, когда в чате нет ни одного своего комментария, список читает блок комментариев старой карточки и отвечает из него — прочитанные хранилища называет meta.sources. Получение по идентификатору и скачивание вложения смотрят оба хранилища, но находку НЕ гарантируют: просмотр идёт чат-первым, а идентификаторы чата и старой карточки лежат в разных пространствах и пересекаются по числу, поэтому на задаче с обоими хранилищами тот же номер может совпасть с чужим комментарием чата — и до старой карточки запрос не дойдёт. Разбор — «Совпадение номера ничего не значит» в Скачивание вложения; надёжный id берите из ответа по тому же хранилищу, а не из другого места. Если известен id — берите Получить комментарий, не полагайтесь на список.
Системные уведомления и конец списка. Системные уведомления о постановке задачи, смене срока и назначении исполнителя отфильтровываются на стороне API. Если срез состоит только из них, сервис дочитывает историю задачи дальше, а не отдаёт пустую страницу с приглашением листать: meta.hasMore: false и meta.total: 0 означают, что в прочитанном источнике комментариев действительно нет — то есть системными уведомлениями пустой ответ не объясняется. Действительно ли их нет у задачи, говорит meta.sources — окончательный ответ даёт только набор ["chat", "legacy"], см. следующую особенность. Раньше на такой задаче приходило {"data": [], "total": 1, "hasMore": true} при любом offset — цикл while (hasMore) offset += limit не завершался никогда. Ведите пагинацию по meta.hasMore и содержимому data.
Пустой data читается по meta.sources вместе с meta.truncated. Окончательное «комментариев у задачи нет» даёт набор ["chat", "legacy"] без meta.truncated: содержимое обоих хранилищ известно, и оба пусты. Тот же набор с truncated: true означает, что прочитано не всё — в том числе когда старое хранилище вернуло полную страницу и за ней могут быть ещё комментарии. Любой другой набор означает, что часть хранилищ не читалась, и пустой data про них не говорит ничего. ["legacy"] — чат не ответил: он отказал (нет права im, метод недоступен), форму его ответа не удалось разобрать либо обход оборвался. Задача, которой чат НЕ выделен, даёт этот набор только в пределах пятиминутного кэша (там отсутствие чата неотличимо от неразобранной формы); на СВЕЖЕЙ проверке её чат-хранилище доказанно пусто, и ответ несёт полный набор. ["chat"] — старое хранилище не читалось: чат отдал хотя бы один комментарий, и тогда дочитывание не запускается вовсе, либо оно не удалось. [] — не ответило ни одно. Ответ во всех случаях остаётся 200: мы отдаём то, что узнали, и называем это, вместо того чтобы уронить работающий запрос или выдать молчание за ответ.