Для AI-агентов: markdown этой страницы — /docs-content/entities/tasks/checklist-actions/tree.md индекс документации — /llms.txt
Сохранить чек-лист задачи
POST /v1/tasks/:taskId/checklist/tree
Сохраняет весь чек-лист задачи одним вызовом: переданный плоский массив пунктов заменяет текущий чек-лист. Поля пунктов пишутся в верхнем регистре.
Параметры
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
ПараметрtaskId (path) |
Типnumber | Обяз.да | ОписаниеID задачи, целое положительное число. Список: GET /v1/tasks |
Поля запроса (body)
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
Полеitems |
Типarray | Обяз.да | ОписаниеВсе пункты чек-листа одним плоским массивом. Пункт, которого нет в массиве, удаляется. Пустой массив удаляет весь чек-лист. Порядок пунктов с одним родителем в массиве задаёт их sortIndex |
Полеitems[].ID |
Типnumber | Обяз.нет | ОписаниеID существующего пункта. Список: GET /v1/tasks/:taskId/checklist. С ID пункт сохраняется под прежним ID. Без него пункт создаётся заново с новым ID, а прежний удаляется |
Полеitems[].NODE_ID |
Типstring | Обяз.нет | ОписаниеКлюч пункта внутри запроса, например root-1. На него ссылаются подпункты в PARENT_NODE_ID, под ним пункт приходит в ответе. Задавайте каждому пункту свой NODE_ID: из нескольких новых пунктов без него сохраняется только последний, остальные пропадают без ошибки |
Полеitems[].PARENT_NODE_ID |
Типstring | number | Обяз.нет | ОписаниеNODE_ID родительского пункта. 0 или без поля — пункт верхнего уровня, его TITLE становится названием чек-листа |
Полеitems[].TITLE |
Типstring | Обяз.да | ОписаниеТекст пункта. Нужен каждому пункту, в том числе пункту с ID |
Полеitems[].IS_COMPLETE |
Типboolean | Обяз.нет | Описаниеtrue — пункт выполнен. Без поля новый пункт сохраняется невыполненным. Строка "Y" вместо true сохраняет пункт невыполненным, ошибки при этом нет |
Полеitems[].IS_IMPORTANT |
Типboolean | Обяз.нет | Описаниеtrue — пункт важный. Без поля — false: у пункта с ID прежняя отметка важности снимается |
Полеparameters |
Типobject | Обяз.нет | ОписаниеДополнительные параметры сохранения. На результат не влияют |
Примеры
curl — личный ключ
curl -X POST "https://vibecode.bitrix24.tech/v1/tasks/4218/checklist/tree" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "NODE_ID": "root-1", "PARENT_NODE_ID": 0, "TITLE": "Подготовка к запуску", "IS_COMPLETE": false, "IS_IMPORTANT": false },
{ "NODE_ID": "child-1", "PARENT_NODE_ID": "root-1", "TITLE": "Проверить сборку", "IS_COMPLETE": false, "IS_IMPORTANT": true },
{ "NODE_ID": "child-2", "PARENT_NODE_ID": "root-1", "TITLE": "Обновить описание", "IS_COMPLETE": false, "IS_IMPORTANT": false }
]
}'
curl — OAuth-приложение
curl -X POST "https://vibecode.bitrix24.tech/v1/tasks/4218/checklist/tree" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "NODE_ID": "root-1", "PARENT_NODE_ID": 0, "TITLE": "Подготовка к запуску", "IS_COMPLETE": false, "IS_IMPORTANT": false },
{ "NODE_ID": "child-1", "PARENT_NODE_ID": "root-1", "TITLE": "Проверить сборку", "IS_COMPLETE": false, "IS_IMPORTANT": true },
{ "NODE_ID": "child-2", "PARENT_NODE_ID": "root-1", "TITLE": "Обновить описание", "IS_COMPLETE": false, "IS_IMPORTANT": false }
]
}'
JavaScript — личный ключ
const res = await fetch('https://vibecode.bitrix24.tech/v1/tasks/4218/checklist/tree', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
items: [
{ NODE_ID: 'root-1', PARENT_NODE_ID: 0, TITLE: 'Подготовка к запуску', IS_COMPLETE: false, IS_IMPORTANT: false },
{ NODE_ID: 'child-1', PARENT_NODE_ID: 'root-1', TITLE: 'Проверить сборку', IS_COMPLETE: false, IS_IMPORTANT: true },
{ NODE_ID: 'child-2', PARENT_NODE_ID: 'root-1', TITLE: 'Обновить описание', IS_COMPLETE: false, IS_IMPORTANT: false },
],
}),
})
const { data } = await res.json()
const saved = data?.checkListItem?.traversedItems ?? {}
for (const [nodeId, item] of Object.entries(saved)) {
console.log(nodeId, '→ ID пункта', item.id)
}
JavaScript — OAuth-приложение
const res = await fetch('https://vibecode.bitrix24.tech/v1/tasks/4218/checklist/tree', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
items: [
{ NODE_ID: 'root-1', PARENT_NODE_ID: 0, TITLE: 'Подготовка к запуску', IS_COMPLETE: false, IS_IMPORTANT: false },
{ NODE_ID: 'child-1', PARENT_NODE_ID: 'root-1', TITLE: 'Проверить сборку', IS_COMPLETE: false, IS_IMPORTANT: true },
{ NODE_ID: 'child-2', PARENT_NODE_ID: 'root-1', TITLE: 'Обновить описание', IS_COMPLETE: false, IS_IMPORTANT: false },
],
}),
})
const { data } = await res.json()
const saved = data?.checkListItem?.traversedItems ?? {}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
Полеsuccess |
Типboolean | Описаниеtrue, если запрос выполнен |
Полеdata.checkListItem |
Типobject | null | ОписаниеСохранённый чек-лист. null, если передан пустой items |
Полеdata.checkListItem.traversedItems |
Типobject | ОписаниеСохранённые пункты. Ключ — NODE_ID пункта из запроса, у пункта без NODE_ID — "0" |
Полеdata.checkListItem.traversedItems.<NODE_ID>.id |
Типnumber | ОписаниеID пункта. Пункт без ID в запросе получает новый ID |
Полеdata.checkListItem.traversedItems.<NODE_ID>.copiedId |
Типnumber | null | ОписаниеID пункта-оригинала, если пункт скопирован. Метод возвращает null |
Полеdata.checkListItem.traversedItems.<NODE_ID>.entityId |
Типnumber | ОписаниеID задачи из пути |
Полеdata.checkListItem.traversedItems.<NODE_ID>.userId |
Типnumber | ОписаниеID сотрудника, от имени которого сделан вызов |
Полеdata.checkListItem.traversedItems.<NODE_ID>.createdBy |
Типnumber | null | ОписаниеID автора пункта. У пункта, сохранённого по ID, — null, автора такого пункта отдаёт GET /v1/tasks/:taskId/checklist |
Полеdata.checkListItem.traversedItems.<NODE_ID>.parentId |
Типnumber | ОписаниеID родительского пункта. 0 — пункт верхнего уровня |
Полеdata.checkListItem.traversedItems.<NODE_ID>.title |
Типstring | ОписаниеТекст пункта |
Полеdata.checkListItem.traversedItems.<NODE_ID>.sortIndex |
Типnumber | ОписаниеМесто пункта среди пунктов с тем же родителем: чем меньше число, тем выше пункт |
Полеdata.checkListItem.traversedItems.<NODE_ID>.displaySortIndex |
Типstring | ОписаниеНомер пункта для показа. Метод возвращает пустую строку |
Полеdata.checkListItem.traversedItems.<NODE_ID>.isComplete |
Типboolean | ОписаниеВыполнен ли пункт |
Полеdata.checkListItem.traversedItems.<NODE_ID>.isImportant |
Типboolean | ОписаниеВажный ли пункт |
Полеdata.checkListItem.traversedItems.<NODE_ID>.completedCount |
Типnumber | ОписаниеЧисло выполненных подпунктов. Метод возвращает 0, даже если подпункт выполнен |
Полеdata.checkListItem.traversedItems.<NODE_ID>.members |
Типarray | ОписаниеУчастники пункта. Без участников — пустой массив |
Полеdata.checkListItem.traversedItems.<NODE_ID>.attachments |
Типarray | object | ОписаниеВложения пункта. Без вложений — пустой массив |
Полеdata.checkListItem.traversedItems.<NODE_ID>.nodeId |
Типstring | null | ОписаниеNODE_ID пункта из запроса. У пункта без NODE_ID — null |
Полеdata.checkListItem.taskId |
Типnull | ОписаниеВсегда null. ID задачи — в entityId пунктов |
Пример ответа
Чек-лист сохранён:
{
"success": true,
"data": {
"checkListItem": {
"traversedItems": {
"root-1": {
"id": 268,
"copiedId": null,
"entityId": 4218,
"userId": 1295,
"createdBy": 1295,
"parentId": 0,
"title": "Подготовка к запуску",
"sortIndex": 0,
"displaySortIndex": "",
"isComplete": false,
"isImportant": false,
"completedCount": 0,
"members": [],
"attachments": [],
"nodeId": "root-1"
},
"child-1": {
"id": 270,
"copiedId": null,
"entityId": 4218,
"userId": 1295,
"createdBy": 1295,
"parentId": 268,
"title": "Проверить сборку",
"sortIndex": 0,
"displaySortIndex": "",
"isComplete": false,
"isImportant": true,
"completedCount": 0,
"members": [],
"attachments": [],
"nodeId": "child-1"
},
"child-2": {
"id": 272,
"copiedId": null,
"entityId": 4218,
"userId": 1295,
"createdBy": 1295,
"parentId": 268,
"title": "Обновить описание",
"sortIndex": 1,
"displaySortIndex": "",
"isComplete": false,
"isImportant": false,
"completedCount": 0,
"members": [],
"attachments": [],
"nodeId": "child-2"
}
},
"taskId": null
}
}
}
Передан пустой items, чек-лист задачи удалён:
{
"success": true,
"data": {
"checkListItem": null
}
}
Пример ответа при ошибке
422 — у нового пункта нет TITLE:
{
"success": false,
"error": {
"code": "BITRIX_ERROR",
"message": "Указано некорректное значение [] для поля [TITLE] в элементе [, ]",
"b24Code": "0"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| HTTP400 | КодINVALID_PARAMS |
ОписаниеtaskId — не целое положительное число. Сообщение taskId must be a positive integer |
| HTTP400 | КодINVALID_PARAMS |
ОписаниеТело — не JSON-объект, например массив. Сообщение JSON object body is required |
| HTTP400 | КодINVALID_PARAMS |
ОписаниеНет поля items, или items — не массив. Сообщение items must be an array |
| HTTP400 | КодINVALID_PARAMS |
Описаниеparameters — не объект. Сообщение parameters must be an object |
| HTTP401 | КодMISSING_API_KEY |
ОписаниеНе передан X-Api-Key |
| HTTP401 | КодTOKEN_MISSING |
ОписаниеУ ключа нет токенов Битрикс24 |
| HTTP403 | КодSCOPE_DENIED |
ОписаниеУ ключа нет скоупа task |
| HTTP403 | КодWRITE_BLOCKED_READONLY_KEY |
ОписаниеКлюч в режиме «только чтение». В error.details.switchUrl — адрес раздела, где режим меняется |
| HTTP415 | КодFST_ERR_CTP_INVALID_MEDIA_TYPE |
ОписаниеТело с Content-Type, который API не разбирает, например application/xml |
| HTTP422 | КодBITRIX_ERROR |
ОписаниеУ пункта нет TITLE, в том числе у пункта с ID. Сообщение на русском портале — Указано некорректное значение [] для поля [TITLE] в элементе [283, ], где 283 — ID пункта. У нового пункта место ID в сообщении пустое: [, ] |
| HTTP422 | КодBITRIX_ERROR |
ОписаниеСотрудник, от имени которого идёт вызов, не имеет доступа к задаче. Тот же ответ этот сотрудник получает на taskId несуществующей задачи. Сообщение на русском портале — Доступ к задаче запрещен, на портале .com — Access to task was denied. Спецификация API объявляет на этот случай 404 TASK_NOT_FOUND, но на проверенных порталах приходит этот ответ |
| HTTP429 | КодRATE_LIMITED |
ОписаниеПревышена частота запросов. Действующий потолок — в заголовке x-ratelimit-limit |
Полный список общих ошибок API — Ошибки.
Известные особенности
Ошибка не откатывает уже сохранённое. Ответ 422 не значит, что чек-лист остался прежним. Запрос с новым названием пункта с ID и новым пунктом без TITLE возвращает 422, а название пункта всё равно меняется. Пункты, которых не было в запросе, при этом не удаляются. После ошибки проверяйте итог через GET /v1/tasks/:taskId/checklist.
Несуществующий taskId не всегда даёт ошибку. Ответ зависит от сотрудника, от имени которого идёт вызов: одному приходит 422 BITRIX_ERROR, другому — 200. Во втором случае пункты сохраняются с entityId, равным переданному taskId, и не видны ни в одной задаче. Перед сохранением проверьте задачу через GET /v1/tasks/:id.