[{"data":1,"prerenderedAt":14},["ShallowReactive",2],{"docs-entities\u002Ftasks\u002Fchecklist":3,"docs-tabs-entities\u002Ftasks\u002Fchecklist":6},{"content":4,"lastmod":5},"# Task checklist\n\nTask checklist items are a nested resource of a task. Each item has a title, a completion status, an importance flag, a sort order, members, and (optionally) a parent item for nested checklists. The base path is `\u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`. Every operation is addressed by the task identifier `:taskId`.\n\nBitrix24 API: `task.checklistitem.*`\nScope: `task`\n\n> **Why a separate resource.** The `CHECKLIST` field is not accepted in the body of `POST \u002Fv1\u002Ftasks` — a checklist cannot be created together with the task. Saving the whole checklist, reordering items, and adding members and attachments are done with [checklist actions](.\u002Fchecklist-actions.md).\n\n## Operations\n\n- [List items](.\u002Fchecklist\u002Flist.md) — `GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`\n- [Get an item](.\u002Fchecklist\u002Fget.md) — `GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId`\n- [Add an item](.\u002Fchecklist\u002Fcreate.md) — `POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`\n- [Update an item](.\u002Fchecklist\u002Fupdate.md) — `PATCH \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId`\n- [Delete an item](.\u002Fchecklist\u002Fdelete.md) — `DELETE \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId`\n- [Mark complete](.\u002Fchecklist\u002Fcomplete.md) — `POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId\u002Fcomplete`\n- [Reopen](.\u002Fchecklist\u002Frenew.md) — `POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId\u002Frenew`\n\n## Item fields\n\n| Field | Type | Read-only | Description |\n|------|-----|:---:|---------|\n| `title` | string | | Item text. **Required on creation.** If `parentId = 0`, `title` becomes the name of the new checklist |\n| `sortIndex` | integer | | Sort index. The smaller the value, the higher the item appears in the list |\n| `isComplete` | boolean \u002F `Y`,`N` | | Completion status. Accepts `true`\u002F`false` or `\"Y\"`\u002F`\"N\"` on write. Returned as `\"Y\"`\u002F`\"N\"` |\n| `isImportant` | boolean \u002F `Y`,`N` | | Importance flag. Same format as `isComplete` |\n| `parentId` | integer | | ID of the parent item for nested checklists. **`0` creates a new checklist** in the task |\n| `members` | object (request) \u002F array (response) | | Item members — the write and read shapes differ, see \"Known specifics\" below |\n| `id` | string | yes | Item ID |\n| `taskId` | string | yes | Parent task ID |\n| `createdBy` | string | yes | Item author |\n| `toggledBy` | string | yes | Who last changed the completion status |\n| `toggledDate` | string | yes | When the status was last changed |\n| `attachments` | array \u002F object | yes | Item attachments: an empty array or an object keyed by attachment ID. Added with [checklist actions](.\u002Fchecklist-actions.md) |\n\n## Known specifics\n\n- **A missing task returns `404 TASK_NOT_FOUND`.** When Bitrix24 reports `TASK_NOT_FOUND_OR_NOT_ACCESSIBLE`, every route in this family maps it to this code. Scope refusals and throttling keep their own status. Some Bitrix24 write operations return success without checking the task, so successfully updating, completing, reopening or deleting an item does not confirm that the task or item exists.\n- **Case and types in the response.** Responses arrive in camelCase (`id`, `taskId`, `sortIndex`, `isComplete`). Bitrix24 serializes numeric values as **strings** (`\"id\": \"477\"`, `\"sortIndex\": \"2\"`) — convert via `Number(value)` for arithmetic. The `isComplete` \u002F `isImportant` flags are the strings `\"Y\"` \u002F `\"N\"`, not booleans.\n- **`members` has different shapes on write and read.** When creating or updating an item, `members` is an object of the form `{ \"\u003CuserId>\": { \"type\": \"A\" | \"U\" } }` (`A` — participant, `U` — observer, employee list — [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers)). In the response (list, get) `members` is an **array** of enriched member objects: `[{ \"id\", \"type\", \"name\", \"personalPhoto\", \"personalGender\", \"image\", \"isCollaber\" }]`. Code that reads members from a response must not expect the request shape.\n- **An item without an explicit `parentId` can land inside an existing checklist automatically.** If the task already has a checklist container (an item with `parentId: 0`), Bitrix24 assigns that container as the parent of items created without an explicit `parentId`, instead of leaving them at the top level.\n\n## Typical scenario\n\n1. Create a task: [`POST \u002Fv1\u002Ftasks`](..\u002Ftasks\u002Fcreate.md).\n2. (Optional) create a checklist container: [`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`](.\u002Fchecklist\u002Fcreate.md) with `parentId: 0`.\n3. Add items: [`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`](.\u002Fchecklist\u002Fcreate.md) (one at a time).\n4. Mark an item complete: [`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId\u002Fcomplete`](.\u002Fchecklist\u002Fcomplete.md).\n5. Check progress: [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`](.\u002Fchecklist\u002Flist.md).\n\n## Limits\n\n| Limit | Value |\n|-------|-------|\n| Items per call | Create, update, delete, mark complete and reopen — one item. To save the whole checklist in one call, see [Save a task checklist](.\u002Fchecklist-actions\u002Ftree.md) |\n| Request body size | 1 MiB |\n| Request rate | Common API limits — [Limits and optimization](\u002Fdocs\u002Foptimization) |\n\n## See also\n\n- [Checklist actions and task file](.\u002Fchecklist-actions.md)\n- [Tasks](..\u002Ftasks.md)\n- [Time tracking](.\u002Ftime.md)\n- [Task comments](\u002Fdocs\u002Fentities\u002Ftask-comments)\n- [Employees](\u002Fdocs\u002Fentities\u002Fusers)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","2026-11-12",{"checklist\u002Flist.md":7,"checklist\u002Fget.md":8,"checklist\u002Fcreate.md":9,"checklist\u002Fupdate.md":10,"checklist\u002Fdelete.md":11,"checklist\u002Fcomplete.md":12,"checklist\u002Frenew.md":13},"## List checklist items\n\n`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`\n\nReturns all items of a task's checklist, including nested (child) items.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | integer | yes | Task ID. List: [`GET \u002Fv1\u002Ftasks`](\u002Fdocs\u002Fentities\u002Ftasks\u002Flist) |\n| `sort` (query) | string | no | Sorting in the `field:direction` format, for example `sortIndex:asc`. Fields: `id`, `parentId`, `createdBy`, `title`, `sortIndex`, `isComplete`, `isImportant`, `toggledBy`, `toggledDate`. Direction: `asc` or `desc` (default `asc`). Without the parameter, items are ordered by `sortIndex` ascending, as with `sortIndex:asc` |\n| `start` (query) | integer | no | Accepted but does not shift the result: any value returns every checklist item. Must be a non-negative integer, otherwise `400 INVALID_PARAMS` |\n\n**Pagination.** There is no paging: all checklist items come in one response, and `meta.total` equals the number of elements in `data`.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist?sort=sortIndex:asc\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist?sort=sortIndex:asc\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\n  \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist?sort=sortIndex:asc\",\n  { headers: { \"X-Api-Key\": \"YOUR_API_KEY\" } }\n);\nconst { data } = await res.json();\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\n  \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist?sort=sortIndex:asc\",\n  {\n    headers: {\n      \"X-Api-Key\": \"YOUR_APP_KEY\",\n      \"Authorization\": \"Bearer USER_SESSION_TOKEN\",\n    },\n  }\n);\nconst { data } = await res.json();\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data` | array | Array of checklist items |\n| `data[].id` | string | Item ID |\n| `data[].taskId` | string | Parent task ID |\n| `data[].parentId` | integer \u002F string | ID of the parent item from the same list. `0` — a top-level item (itself a checklist) |\n| `data[].title` | string | Item text |\n| `data[].sortIndex` | string | Sort index |\n| `data[].isComplete` | string | Completion status — `\"Y\"` \u002F `\"N\"` |\n| `data[].isImportant` | string | Importance flag — `\"Y\"` \u002F `\"N\"` |\n| `data[].createdBy` | string | ID of the item author. Employee list: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers\u002Flist) |\n| `data[].toggledBy` | string \\| null | ID of the employee who last changed the completion status. Employee list: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers\u002Flist) |\n| `data[].toggledDate` | string | When the status was last changed. An empty string if never changed |\n| `data[].members` | array | Item members — objects `{ id, type, name, personalPhoto, personalGender, image, isCollaber }`. `id` — the employee ID from [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers\u002Flist) |\n| `data[].attachments` | array \\| object | Item attachments. Without attachments — an empty array. With attachments — an object keyed by attachment ID, each value an object with the fields `attachmentId`, `name`, `size`, `fileId` (the Drive file ID), `downloadUrl`, `viewUrl` |\n| `meta.total` | number | Total number of items in the result set |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": \"211\",\n      \"taskId\": \"3943\",\n      \"parentId\": 0,\n      \"createdBy\": \"1317\",\n      \"title\": \"Documents\",\n      \"sortIndex\": \"1\",\n      \"isComplete\": \"N\",\n      \"isImportant\": \"N\",\n      \"toggledBy\": null,\n      \"toggledDate\": \"\",\n      \"members\": [],\n      \"attachments\": []\n    },\n    {\n      \"id\": \"213\",\n      \"taskId\": \"3943\",\n      \"parentId\": \"211\",\n      \"createdBy\": \"1317\",\n      \"title\": \"Collect and check documents\",\n      \"sortIndex\": \"100\",\n      \"isComplete\": \"N\",\n      \"isImportant\": \"Y\",\n      \"toggledBy\": null,\n      \"toggledDate\": \"\",\n      \"members\": [\n        {\n          \"id\": \"1317\",\n          \"type\": \"A\",\n          \"name\": \"Jane Doe\",\n          \"personalPhoto\": \"35959\",\n          \"personalGender\": \"\",\n          \"image\": \"https:\u002F\u002Fexample.bitrix24.com\u002F...\",\n          \"isCollaber\": false\n        }\n      ],\n      \"attachments\": []\n    }\n  ],\n  \"meta\": { \"total\": 2 }\n}\n```\n\n## Error response example\n\n`404` — Bitrix24 reported that the task does not exist or is not accessible:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"TASK_NOT_FOUND\",\n    \"message\": \"Task not found or not accessible.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` is not a positive integer, the sort field is unknown, or `start` is not a non-negative integer |\n| 404 | `TASK_NOT_FOUND` | Bitrix24 reported `TASK_NOT_FOUND_OR_NOT_ACCESSIBLE`: the task is missing or not accessible to the key |\n| 422 | `BITRIX_ERROR` | Any other Bitrix24 error without a more specific error code |\n| 429 | `RATE_LIMITED` | Bitrix24 throttled the request. Respect the `Retry-After` header |\n| 403 | `SCOPE_DENIED` | The API key lacks the `task` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n| 400 | `UNSUPPORTED_FILTER` | A `filter` parameter was passed, and this endpoint has none. The error text names what to use instead |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n- **An existing task without items returns `200` with an empty array.**\n\n- **`parentId: 0` — a top-level item that is itself a checklist.** Child items reference its `id` via their own `parentId`.\n- **Numeric values and flags are strings.** `id`, `taskId`, `sortIndex` arrive as strings. `isComplete` \u002F `isImportant` are the strings `\"Y\"`\u002F`\"N\"`, not booleans.\n\n## See also\n\n- [Get an item](.\u002Fget.md)\n- [Add an item](.\u002Fcreate.md)\n- [Save a task checklist](\u002Fdocs\u002Fentities\u002Ftasks\u002Fchecklist-actions\u002Ftree)\n- [Tasks](\u002Fdocs\u002Fentities\u002Ftasks)\n","## Get a checklist item\n\n`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId`\n\nReturns a single checklist item by ID.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | integer | yes | Task ID |\n| `itemId` (path) | integer | yes | Checklist item ID. List of items — [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`](.\u002Flist.md) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\n  \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\",\n  { headers: { \"X-Api-Key\": \"YOUR_API_KEY\" } }\n);\nconst { data } = await res.json();\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\n  \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\",\n  {\n    headers: {\n      \"X-Api-Key\": \"YOUR_APP_KEY\",\n      \"Authorization\": \"Bearer USER_SESSION_TOKEN\",\n    },\n  }\n);\nconst { data } = await res.json();\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data` | object | The checklist item. Its fields are in the `data.*` rows below |\n| `data.id` | string | Item ID |\n| `data.taskId` | string | Parent task ID |\n| `data.parentId` | integer \u002F string | Parent item ID. `0` — a top-level item |\n| `data.title` | string | Item text |\n| `data.sortIndex` | string | Sort index |\n| `data.isComplete` | string | Completion status — `\"Y\"` \u002F `\"N\"` |\n| `data.isImportant` | string | Importance flag — `\"Y\"` \u002F `\"N\"` |\n| `data.createdBy` | string | Item author |\n| `data.toggledBy` | string \\| null | Who last changed the completion status |\n| `data.toggledDate` | string | When the status was last changed. An empty string if never changed |\n| `data.members` | array | Item members — objects `{ id, type, name, personalPhoto, personalGender, image, isCollaber }` |\n| `data.attachments` | array \\| object | Item attachments. An empty array if there are none. Otherwise, an object keyed by attachment ID; each value is an object with the fields `attachmentId`, `name`, `size`, `fileId` (the Drive file ID), `downloadUrl`, and `viewUrl` |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"213\",\n    \"taskId\": \"3943\",\n    \"parentId\": \"211\",\n    \"createdBy\": \"1317\",\n    \"title\": \"Collect and check documents\",\n    \"sortIndex\": \"100\",\n    \"isComplete\": \"N\",\n    \"isImportant\": \"Y\",\n    \"toggledBy\": null,\n    \"toggledDate\": \"\",\n    \"members\": [\n      {\n        \"id\": \"1317\",\n        \"type\": \"A\",\n        \"name\": \"Jane Doe\",\n        \"personalPhoto\": \"35959\",\n        \"personalGender\": \"\",\n        \"image\": \"https:\u002F\u002Fexample.bitrix24.com\u002F...\",\n        \"isCollaber\": false\n      }\n    ],\n    \"attachments\": []\n  }\n}\n```\n\n## Error response example\n\n`404` — the item does not exist or is not accessible:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"Checklist item not found\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` or `itemId` is not a positive integer |\n| 404 | `NOT_FOUND` | The item with the given `itemId` was deleted, never existed, or is not accessible to the key |\n| 404 | `TASK_NOT_FOUND` | Bitrix24 reported that the parent task is missing or not accessible to the key |\n| 403 | `SCOPE_DENIED` | The API key lacks the `task` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n- **A missing item returns `404 NOT_FOUND`.** Requests for a nonexistent or deleted `itemId` previously returned `422 BITRIX_ERROR` with the message from an internal Bitrix24 exception (`ITEM_NOT_FOUND_OR_NOT_ACCESSIBLE`). The response now matches those of the other task routes.\n\n## See also\n\n- [List items](.\u002Flist.md)\n- [Update an item](.\u002Fupdate.md)\n- [Tasks](\u002Fdocs\u002Fentities\u002Ftasks)\n","## Add a checklist item\n\n`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`\n\nAdds an item to a task's checklist. `title` is required. Returns the `id` of the new item.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | integer | yes | Task ID |\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|---------|\n| `title` | string | yes | Item text. With `parentId: 0`, this becomes the name of the new checklist |\n| `sortIndex` | integer | no | Sort index. The smaller the value, the higher the item appears in the list |\n| `isImportant` | boolean \u002F `Y`,`N` | no | Importance flag |\n| `isComplete` | boolean \u002F `Y`,`N` | no | Completion status at creation |\n| `parentId` | integer | no | Parent item ID. `0` creates a new checklist container in the task |\n| `members` | object | no | Item members: `{ \"\u003CuserId>\": { \"type\": \"A\" \\| \"U\" } }`. `A` — participant, `U` — observer. Employee list — [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Collect and check documents\",\n    \"sortIndex\": 100,\n    \"isImportant\": true\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Collect and check documents\",\n    \"sortIndex\": 100,\n    \"isImportant\": true\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\", {\n  method: \"POST\",\n  headers: {\n    \"X-Api-Key\": \"YOUR_API_KEY\",\n    \"Content-Type\": \"application\u002Fjson\",\n  },\n  body: JSON.stringify({\n    title: \"Collect and check documents\",\n    sortIndex: 100,\n    isImportant: true,\n  }),\n});\nconst { data } = await res.json();\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\", {\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    title: \"Collect and check documents\",\n    sortIndex: 100,\n    isImportant: true,\n  }),\n});\nconst { data } = await res.json();\n```\n\nTo create a **new checklist** (a top-level container), pass `parentId: 0` — in this case `title` becomes the name of the checklist:\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"title\": \"Documents\", \"parentId\": 0 }'\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.id` | number | ID of the new item |\n\n## Response example\n\n```json\n{ \"success\": true, \"data\": { \"id\": 221 } }\n```\n\n## Error response example\n\n`400` — the required `title` was not provided:\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"INVALID_PARAMS\", \"message\": \"`title` is required\" }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `title` is missing, `taskId` is not a positive integer, an unknown `members` shape, or a negative `parentId` |\n| 404 | `TASK_NOT_FOUND` | The `taskId` task does not exist or is not accessible to the key — Vibecode checks the parent task with a separate call before adding an item |\n| 403 | `SCOPE_DENIED` | The API key lacks the `task` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is in read-only mode. Open the path from `error.details.switchUrl`: a personal key points to `\u002Fkeys`, an application key with a card to `\u002Fapplications`, a standalone OAuth key to `\u002Fapps`, and a management key to `\u002Fmanagement-keys`. Switch it to read and write there |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n- **`parentId: 0` creates a new checklist container**, not a regular item — `title` becomes the container's name in this case.\n- **An item without an explicit `parentId` can land inside an existing checklist.** If the task already has a container (`parentId: 0`), Bitrix24 assigns new items to it instead of leaving them at the top level — create a container explicitly via `parentId: 0` if you need an independent one.\n- **`members` on write is an object keyed by `userId`**, not an array. The response shape (in `GET`) differs — see [\"List items\"](.\u002Flist.md).\n\n## See also\n\n- [List items](.\u002Flist.md)\n- [Update an item](.\u002Fupdate.md)\n- [Employees](\u002Fdocs\u002Fentities\u002Fusers)\n- [Tasks](\u002Fdocs\u002Fentities\u002Ftasks)\n","## Update a checklist item\n\n`PATCH \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId`\n\nPartial update of a checklist item — pass only the fields you want to change.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | integer | yes | Task ID. List: [`GET \u002Fv1\u002Ftasks`](\u002Fdocs\u002Fentities\u002Ftasks\u002Flist) |\n| `itemId` (path) | integer | yes | Checklist item ID. List: [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fchecklist\u002Flist) |\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|---------|\n| `title` | string | no | Item text |\n| `sortIndex` | integer | no | Sort index |\n| `isComplete` | boolean \u002F `Y`,`N` | no | Completion status |\n| `isImportant` | boolean \u002F `Y`,`N` | no | Importance flag |\n| `parentId` | integer | no | Parent item ID. The value `0` starts a new checklist |\n| `members` | object | no | Item members: `{ \"\u003CuserId>\": { \"type\": \"A\" \\| \"U\" } }`, where `A` is a participant and `U` is an observer. Replaces the current list entirely: to keep the current members, pass them together with the new ones |\n\nAt least one of the fields above is required.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"title\": \"Collect and check documents\", \"isImportant\": true }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"title\": \"Collect and check documents\", \"isImportant\": true }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\", {\n  method: \"PATCH\",\n  headers: {\n    \"X-Api-Key\": \"YOUR_API_KEY\",\n    \"Content-Type\": \"application\u002Fjson\",\n  },\n  body: JSON.stringify({ title: \"Collect and check documents\", isImportant: true }),\n});\nconst { data } = await res.json();\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\", {\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({ title: \"Collect and check documents\", isImportant: true }),\n});\nconst { data } = await res.json();\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.id` | number | ID of the updated item |\n\n## Response example\n\n```json\n{ \"success\": true, \"data\": { \"id\": 213 } }\n```\n\n## Error response example\n\n`400` — an empty request body:\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"INVALID_PARAMS\", \"message\": \"No updatable fields provided\" }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Empty body, `taskId`\u002F`itemId` is not a positive integer, an unknown `members` shape, or a field type violation |\n| 404 | `NOT_FOUND` | The item with the given `itemId` does not exist or is not accessible to the key |\n| 403 | `SCOPE_DENIED` | The API key lacks the `task` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is in read-only mode. Open the path from `error.details.switchUrl`: a personal key points to `\u002Fkeys`, an application key with a card to `\u002Fapplications`, a standalone OAuth key to `\u002Fapps`, and a management key to `\u002Fmanagement-keys`. Switch it to read and write there |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n- **A nonexistent `taskId` returns `200`.** When no task with that identifier exists, the response is successful and echoes the given `itemId`, but nothing is updated. A `404` is returned only for a missing item inside an existing task. To check the task, call [\"Get a task\"](..\u002Fget.md).\n\n## See also\n\n- [Get an item](.\u002Fget.md)\n- [List items](.\u002Flist.md)\n- [Mark complete](.\u002Fcomplete.md)\n- [Tasks](\u002Fdocs\u002Fentities\u002Ftasks)\n","## Delete a checklist item\n\n`DELETE \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId`\n\nDeletes a checklist item. A deleted item cannot be restored via the API — create a new one if needed.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | integer | yes | Task ID. List: [`GET \u002Fv1\u002Ftasks`](\u002Fdocs\u002Fentities\u002Ftasks\u002Flist) |\n| `itemId` (path) | integer | yes | Checklist item ID. List: [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fchecklist\u002Flist) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\", {\n  method: \"DELETE\",\n  headers: { \"X-Api-Key\": \"YOUR_API_KEY\" },\n});\nif (res.status === 204) {\n  console.log(\"Deleted\");\n}\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\", {\n  method: \"DELETE\",\n  headers: {\n    \"X-Api-Key\": \"YOUR_APP_KEY\",\n    \"Authorization\": \"Bearer USER_SESSION_TOKEN\",\n  },\n});\nif (res.status === 204) {\n  console.log(\"Deleted\");\n}\n```\n\n## Response\n\nOn success, the response is HTTP status `204 No Content` with an empty body. Success is indicated by the status code, not the body.\n\n## Response example\n\n```\nHTTP\u002F1.1 204 No Content\n```\n\n## Error response example\n\n`400` — invalid `itemId`:\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"INVALID_PARAMS\", \"message\": \"taskId and itemId must be positive integers\" }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` or `itemId` is not a positive integer |\n| 403 | `SCOPE_DENIED` | The API key lacks the `task` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is in read-only mode. Open the path from `error.details.switchUrl`: a personal key points to `\u002Fkeys`, an application key with a card to `\u002Fapplications`, a standalone OAuth key to `\u002Fapps`, and a management key to `\u002Fmanagement-keys`. Switch it to read and write there |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n- **Deleting a nonexistent item also returns `204`.** The response does not distinguish a deleted item from an `itemId` that never existed, and deleting the same item again returns `204` too. The same `204` is returned when the task `taskId` itself does not exist. To make sure the item existed, read it before deleting via [\"Get an item\"](.\u002Fget.md) — that endpoint returns `404` both for a missing item and for a missing task.\n\n## See also\n\n- [List items](.\u002Flist.md)\n- [Get an item](.\u002Fget.md)\n- [Add an item](.\u002Fcreate.md)\n- [Tasks](\u002Fdocs\u002Fentities\u002Ftasks)\n","## Mark an item complete\n\n`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId\u002Fcomplete`\n\nMarks a checklist item as complete. Equivalent to [`PATCH`](.\u002Fupdate.md) with the body `{ \"isComplete\": true }`, but doesn't require passing the other fields.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | integer | yes | Task ID. List: [`GET \u002Fv1\u002Ftasks`](\u002Fdocs\u002Fentities\u002Ftasks\u002Flist) |\n| `itemId` (path) | integer | yes | Checklist item ID. List: [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fchecklist\u002Flist) |\n\nNo request body is required.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\u002Fcomplete\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\u002Fcomplete\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\u002Fcomplete\", {\n  method: \"POST\",\n  headers: { \"X-Api-Key\": \"YOUR_API_KEY\" },\n});\nconst { data } = await res.json();\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\u002Fcomplete\", {\n  method: \"POST\",\n  headers: {\n    \"X-Api-Key\": \"YOUR_APP_KEY\",\n    \"Authorization\": \"Bearer USER_SESSION_TOKEN\",\n  },\n});\nconst { data } = await res.json();\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.id` | number | Item ID |\n| `data.isComplete` | string | Always `\"Y\"` after a successful call |\n\n## Response example\n\n```json\n{ \"success\": true, \"data\": { \"id\": 213, \"isComplete\": \"Y\" } }\n```\n\n## Error response example\n\n`400` — invalid `itemId`:\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"INVALID_PARAMS\", \"message\": \"taskId and itemId must be positive integers\" }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` or `itemId` is not a positive integer |\n| 403 | `SCOPE_DENIED` | The API key lacks the `task` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is in read-only mode. Open the path from `error.details.switchUrl`: a personal key points to `\u002Fkeys`, an application key with a card to `\u002Fapplications`, a standalone OAuth key to `\u002Fapps`, and a management key to `\u002Fmanagement-keys`. Switch it to read and write there |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n- **A nonexistent `itemId` and a nonexistent `taskId` both return `200`.** The response echoes the given `itemId` with `isComplete: \"Y\"` even when no such item exists — and even when the task itself is missing. A success status confirms neither that the item exists nor that it was marked complete. To verify, call [\"Get an item\"](.\u002Fget.md), which returns `404` both for a missing item and for a missing task.\n- **A refusal for a missing item has not been measured here.** The route maps a Bitrix24 \"item not found\" refusal to `404 NOT_FOUND`, as the neighbouring checklist methods do, but on a live Bitrix24 account this method never produced that refusal — the probe answered `200`, and in the tests the refusal is reproduced only with a mock. That is why `404` is not listed in the errors above.\n\n## See also\n\n- [Reopen](.\u002Frenew.md)\n- [Update an item](.\u002Fupdate.md)\n- [List items](.\u002Flist.md)\n- [Tasks](\u002Fdocs\u002Fentities\u002Ftasks)\n","## Reopen an item\n\n`POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist\u002F:itemId\u002Frenew`\n\nClears the completion status of a checklist item. Equivalent to [`PATCH`](.\u002Fupdate.md) with the body `{ \"isComplete\": false }`, but doesn't require passing the other fields.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `taskId` (path) | integer | yes | Task ID. List: [`GET \u002Fv1\u002Ftasks`](\u002Fdocs\u002Fentities\u002Ftasks\u002Flist) |\n| `itemId` (path) | integer | yes | Checklist item ID. List: [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchecklist`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fchecklist\u002Flist) |\n\nNo request body is required.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\u002Frenew\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\u002Frenew\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\u002Frenew\", {\n  method: \"POST\",\n  headers: { \"X-Api-Key\": \"YOUR_API_KEY\" },\n});\nconst { data } = await res.json();\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftasks\u002F3943\u002Fchecklist\u002F213\u002Frenew\", {\n  method: \"POST\",\n  headers: {\n    \"X-Api-Key\": \"YOUR_APP_KEY\",\n    \"Authorization\": \"Bearer USER_SESSION_TOKEN\",\n  },\n});\nconst { data } = await res.json();\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.id` | number | Item ID |\n| `data.isComplete` | string | Always `\"N\"` after a successful call |\n\n## Response example\n\n```json\n{ \"success\": true, \"data\": { \"id\": 213, \"isComplete\": \"N\" } }\n```\n\n## Error response example\n\n`400` — invalid `itemId`:\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"INVALID_PARAMS\", \"message\": \"taskId and itemId must be positive integers\" }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | `taskId` or `itemId` is not a positive integer |\n| 403 | `SCOPE_DENIED` | The API key lacks the `task` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is in read-only mode. Open the path from `error.details.switchUrl`: a personal key points to `\u002Fkeys`, an application key with a card to `\u002Fapplications`, a standalone OAuth key to `\u002Fapps`, and a management key to `\u002Fmanagement-keys`. Switch it to read and write there |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n- **A nonexistent `itemId` and a nonexistent `taskId` both return `200`.** The response echoes the given `itemId` with `isComplete: \"N\"` even when no such item exists — and even when the task itself is missing. A success status confirms neither that the item exists nor that it was reopened. To check whether the item exists, call [\"Get an item\"](.\u002Fget.md), which returns `404` both for a missing item and for a missing task.\n- **A missing-item error has not been observed for this method.** The route maps a Bitrix24 \"item not found\" error to `404 NOT_FOUND`, as the other checklist methods do, but on a live Bitrix24 account this method never returned that error — the probe returned `200`, and the tests reproduce the error only with a mock. That is why `404` is not listed in the errors above.\n\n## See also\n\n- [Mark complete](.\u002Fcomplete.md)\n- [Update an item](.\u002Fupdate.md)\n- [List items](.\u002Flist.md)\n- [Tasks](\u002Fdocs\u002Fentities\u002Ftasks)\n",1794739429930]