Для 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 — личный ключ

Terminal
curl "https://vibecode.bitrix24.tech/v1/tasks/289/comments?limit=20&sort=id:desc" \
  -H "X-Api-Key: YOUR_API_KEY"

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

Terminal
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 — личный ключ

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-приложение

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_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

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

JSON
{
  "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 не положительное целое:

JSON
{
  "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: мы отдаём то, что узнали, и называем это, вместо того чтобы уронить работающий запрос или выдать молчание за ответ.

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