[{"data":1,"prerenderedAt":11},["ShallowReactive",2],{"docs-entities\u002Ftasks\u002Fresults-v3":3,"docs-tabs-entities\u002Ftasks\u002Fresults-v3":6},{"content":4,"lastmod":5},"# Task results: REST 3.0\n\nA task result is text that records the outcome of the work on a task. The methods in this subsection add a result, turn a message from the task chat into a result, change the result text, and delete the result.\n\nBitrix24 API: `tasks.task.result.add`, `tasks.task.result.addfromchatmessage`, `tasks.task.result.update`, `tasks.task.result.delete`\nScope: `task`\n\n## Operations\n\n- [Add a task result](.\u002Fresults-v3-create.md) — `POST \u002Fv1\u002Ftask-results`\n- [Create a task result from a chat message](.\u002Fresults-v3-from-chat-message.md) — `POST \u002Fv1\u002Ftask-results\u002Ffrom-chat-message`\n- [Update a task result](.\u002Fresults-v3-update.md) — `PATCH \u002Fv1\u002Ftask-results\u002F:id`\n- [Delete a task result](.\u002Fresults-v3-delete.md) — `DELETE \u002Fv1\u002Ftask-results\u002F:id`\n\n## Key fields\n\nThe add, create-from-message, and update methods return the result in `data.item`. The full set of fields is in the \"Response fields\" table on the [Add a task result](.\u002Fresults-v3-create.md) page.\n\n| Field | Description |\n|------|----------|\n| `id` | Result ID. Required to update and delete the result |\n| `taskId` | Task ID. List: [`GET \u002Fv1\u002Ftasks`](\u002Fdocs\u002Fentities\u002Ftasks\u002Flist) |\n| `text` | Result text |\n| `authorId` | Result author ID. List: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers\u002Flist) |\n| `status` | Result status. A new result has `open` |\n| `messageId` | ID of the chat message the result was created from. A result added as text has `null` |\n\n## What to know before you start\n\n1. **These methods cannot read results.** The list of a task's results comes from [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fresults`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults) in the legacy REST. It returns the same result in a different shape: the author is in `createdBy`, not `authorId`, and the status is the number `0`, not the string `open`.\n2. **Deletion does not check whether the result exists.** For an `id` that does not exist on the Bitrix24 account, and for a repeated deletion, the response is the same as on success: `200` with `\"result\": true`. To confirm a deletion, check the task's result list.\n3. **Updating a nonexistent result returns `403`, not `404`.** The code is `BITRIX_ACCESS_DENIED`, the same as for an access denial.\n4. **The same message can become a result more than once.** Each call with the same `messageId` adds a new result with the same text to the task.\n5. **A read-only key changes nothing.** All four methods return `403 WRITE_BLOCKED_READONLY_KEY` to such a key.\n\n## Typical scenario\n\n1. Find the task: [`GET \u002Fv1\u002Ftasks`](\u002Fdocs\u002Fentities\u002Ftasks\u002Flist).\n2. Add a result as text: [`POST \u002Fv1\u002Ftask-results`](.\u002Fresults-v3-create.md) — or turn a message from the task chat into a result: [`POST \u002Fv1\u002Ftask-results\u002Ffrom-chat-message`](.\u002Fresults-v3-from-chat-message.md).\n3. Refine the text: [`PATCH \u002Fv1\u002Ftask-results\u002F:id`](.\u002Fresults-v3-update.md).\n4. Delete an unneeded result: [`DELETE \u002Fv1\u002Ftask-results\u002F:id`](.\u002Fresults-v3-delete.md).\n\n## Limits\n\n| Limit | Value |\n|-------|----------|\n| Records per call | One result |\n| Request rate | General API limits — [Limits and optimization](\u002Fdocs\u002Foptimization) |\n\n## See also\n\n- [Tasks](\u002Fdocs\u002Fentities\u002Ftasks)\n- [Task results: legacy REST](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults)\n- [Task chat](\u002Fdocs\u002Fentities\u002Ftasks\u002Fchat)\n","2026-10-16",{"results-v3-create.md":7,"results-v3-from-chat-message.md":8,"results-v3-update.md":9,"results-v3-delete.md":10},"## Add a task result\n\n`POST \u002Fv1\u002Ftask-results`\n\nAdds a result to a task — text that sums up the work on it. One result per call.\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|----------|\n| `fields` | object | yes | Result fields |\n| `fields.taskId` | number | yes | Task ID. List: [`GET \u002Fv1\u002Ftasks`](\u002Fdocs\u002Fentities\u002Ftasks\u002Flist). Number only: the method returns `400` for the string `\"4205\"` |\n| `fields.text` | string | yes | Result text. The method returns `400` for an empty string |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"fields\": {\n      \"taskId\": 4205,\n      \"text\": \"Quarterly report approved\"\n    }\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"fields\": {\n      \"taskId\": 4205,\n      \"text\": \"Quarterly report approved\"\n    }\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    fields: {\n      taskId: 4205,\n      text: 'Quarterly report approved',\n    },\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Result ID:', data.item.id)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results', {\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    fields: {\n      taskId: 4205,\n      text: 'Quarterly report approved',\n    },\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|----------|\n| `success` | boolean | `true` if the result was added |\n| `data` | object | Wrapper with the created result |\n| `data.item` | object | Created result |\n| `data.item.id` | number | Result ID. Needed to [update](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-update) and [delete](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-delete) the result |\n| `data.item.taskId` | number | Task ID |\n| `data.item.text` | string | Result text |\n| `data.item.authorId` | number | ID of the employee who added the result. List: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers\u002Flist) |\n| `data.item.createdAt` | string | Creation date and time in ISO 8601 format with a time zone offset, for example `2026-10-16T09:44:55+00:00` |\n| `data.item.updatedAt` | string | Date and time of the last change, in the same format |\n| `data.item.status` | string | Result status. A new result has `open` |\n| `data.item.fileIds` | null | Result files. A result without files has `null` |\n| `data.item.rights` | object | Permissions on the result |\n| `data.item.rights.edit` | boolean | `true` — the result text can be changed |\n| `data.item.rights.remove` | boolean | `true` — the result can be deleted |\n| `data.item.messageId` | null | ID of the chat message the result was created from. A result added by this method has `null` |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"item\": {\n      \"id\": 21,\n      \"taskId\": 4205,\n      \"text\": \"Quarterly report approved\",\n      \"authorId\": 1295,\n      \"createdAt\": \"2026-10-16T09:44:55+00:00\",\n      \"updatedAt\": \"2026-10-16T09:44:55+00:00\",\n      \"status\": \"open\",\n      \"fileIds\": null,\n      \"rights\": {\n        \"edit\": true,\n        \"remove\": true\n      },\n      \"messageId\": null\n    }\n  }\n}\n```\n\n## Error response example\n\n400 — there is no task with this `taskId`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"Error validating request object.\",\n    \"validation\": [\n      {\n        \"message\": \"Task not found\"\n      }\n    ]\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|----------|\n| 400 | `INVALID_PARAMS` | The body is not a JSON object or has no `fields` object. Message: `fields must be an object` |\n| 400 | `INVALID_PARAMS` | There is no task with this `taskId`. `error.validation` contains `Task not found` |\n| 400 | `INVALID_PARAMS` | `taskId` was passed as a string, or `text` is an empty string. The reason is in `error.validation` |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\n| 401 | `TOKEN_MISSING` | The key has no Bitrix24 tokens |\n| 403 | `BITRIX_ACCESS_DENIED` | No permission to add results to this task |\n| 403 | `SCOPE_DENIED` | The key has no `task` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is in read-only mode. `error.details.switchUrl` contains the URL of the section where the mode is changed |\n| 415 | `FST_ERR_CTP_INVALID_MEDIA_TYPE` | A non-empty body with a `Content-Type` other than `application\u002Fjson` |\n| 422 | `BITRIX_ERROR` | `fields` has no `taskId` or `text`. The missing fields are listed in `error.validation` |\n| 429 | `RATE_LIMITED` | Request rate exceeded. The effective cap is in the `x-ratelimit-limit` header |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [Task results: REST 3.0](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3)\n- [Create a task result from a chat message](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-from-chat-message)\n- [Update a task result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-update)\n- [Delete a task result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-delete)\n- [Task results: legacy REST](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults)\n","## Create a task result from a chat message\n\n`POST \u002Fv1\u002Ftask-results\u002Ffrom-chat-message`\n\nTurns a message from a task's chat into a result of that task: the method takes the result text from the message and determines the task from the chat where the message was posted.\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|----------|\n| `fields` | object | yes | Object with the message ID |\n| `fields.messageId` | number | yes | ID of a message in the task chat. List: [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fchat\u002Fmessages`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fchat). Number only: for the string `\"43121\"` the method returns `400` |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002Ffrom-chat-message\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"fields\": {\n      \"messageId\": 43121\n    }\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002Ffrom-chat-message\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"fields\": {\n      \"messageId\": 43121\n    }\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002Ffrom-chat-message', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    fields: {\n      messageId: 43121,\n    },\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Result ID:', data.item.id, 'task:', data.item.taskId)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002Ffrom-chat-message', {\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    fields: {\n      messageId: 43121,\n    },\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|----------|\n| `success` | boolean | `true` if the result was created |\n| `data` | object | Wrapper with the created result |\n| `data.item` | object | The created result |\n| `data.item.id` | number | Result ID. Needed to [update](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-update) and [delete](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-delete) the result |\n| `data.item.taskId` | number | ID of the task whose chat the message belongs to |\n| `data.item.text` | string | Result text — the text of the message |\n| `data.item.authorId` | number | ID of the result author. List: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers\u002Flist) |\n| `data.item.createdAt` | string | Creation date and time in ISO 8601 format with a time zone offset |\n| `data.item.updatedAt` | string | Date and time of the last change, in the same format |\n| `data.item.status` | string | Result status. A new result has `open` |\n| `data.item.fileIds` | null | Result files. A result without files has `null` |\n| `data.item.rights` | object | Permissions on the result |\n| `data.item.rights.edit` | boolean | `true` — the result text can be changed |\n| `data.item.rights.remove` | boolean | `true` — the result can be deleted |\n| `data.item.messageId` | number | ID of the message the result was created from |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"item\": {\n      \"id\": 23,\n      \"taskId\": 4205,\n      \"text\": \"The report is ready, the files are in the project folder\",\n      \"authorId\": 1295,\n      \"createdAt\": \"2026-10-16T09:44:58+00:00\",\n      \"updatedAt\": \"2026-10-16T09:44:58+00:00\",\n      \"status\": \"open\",\n      \"fileIds\": null,\n      \"rights\": {\n        \"edit\": true,\n        \"remove\": true\n      },\n      \"messageId\": 43121\n    }\n  }\n}\n```\n\n## Error response example\n\n403 — the message was not posted in a task chat:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ACCESS_DENIED\",\n    \"message\": \"Access denied\",\n    \"hint\": \"Bitrix24 reports an access-rights refusal for tasks.task.result.addfromchatmessage, not a scope error. The Bitrix24 user this call runs as lacks access; ask a portal admin to grant it, or call under a user who has it.\",\n    \"cause\": \"b24_permission\",\n    \"method\": \"tasks.task.result.addfromchatmessage\",\n    \"fix\": {\n      \"action\": \"grant_b24_rights\",\n      \"via\": \"portal_admin\"\n    }\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|----------|\n| 400 | `INVALID_PARAMS` | The body is not a JSON object or has no `fields` object. Message: `fields must be an object` |\n| 400 | `INVALID_PARAMS` | `messageId` is passed as a string. The reason is in `error.validation` |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\n| 401 | `TOKEN_MISSING` | The key has no Bitrix24 tokens |\n| 403 | `BITRIX_ACCESS_DENIED` | No message with this `messageId` exists, or it was not posted in a task chat |\n| 403 | `SCOPE_DENIED` | The key has no `task` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is in read-only mode. `error.details.switchUrl` contains the URL of the section where the mode is changed |\n| 415 | `FST_ERR_CTP_INVALID_MEDIA_TYPE` | A non-empty body with a `Content-Type` other than `application\u002Fjson` |\n| 422 | `BITRIX_ERROR` | `fields` has no `messageId`. The missing field is named in `error.validation` |\n| 429 | `RATE_LIMITED` | Request rate exceeded. The effective cap is in the `x-ratelimit-limit` header |\n\nThe full list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**A repeated call creates another result.** Each request with the same `messageId` adds a new result with the same text to the task. Results already created are listed by [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fresults`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults).\n\n## See also\n\n- [Task results: REST 3.0](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3)\n- [Add a task result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-create)\n- [Update a task result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-update)\n- [Delete a task result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-delete)\n- [Task results: legacy REST](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults)\n- [Task chat](\u002Fdocs\u002Fentities\u002Ftasks\u002Fchat)\n","## Update a task result\n\n`PATCH \u002Fv1\u002Ftask-results\u002F:id`\n\nReplaces the text of a task result. The author, the task and the creation date of the result stay unchanged.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|----------|\n| `id` (path) | number | yes | Result ID, a positive integer. Take it from `data.item.id` in the response to [adding a result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-create) or [creating one from a message](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-from-chat-message). List: [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fresults`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults) |\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|----------|\n| `fields` | object | yes | Result fields to change |\n| `fields.text` | string | yes | New result text. An empty string gets a `422` response |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002F21\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"fields\": {\n      \"text\": \"Quarterly report approved by the sales team\"\n    }\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002F21\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"fields\": {\n      \"text\": \"Quarterly report approved by the sales team\"\n    }\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002F21', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    fields: {\n      text: 'Quarterly report approved by the sales team',\n    },\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Updated:', data.item.updatedAt)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002F21', {\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    fields: {\n      text: 'Quarterly report approved by the sales team',\n    },\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|----------|\n| `success` | boolean | `true` if the text was changed |\n| `data` | object | Wrapper with the updated result |\n| `data.item` | object | The result after the change |\n| `data.item.id` | number | Result ID |\n| `data.item.taskId` | number | Task ID |\n| `data.item.text` | string | New result text |\n| `data.item.authorId` | number | ID of the result author. List: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers\u002Flist) |\n| `data.item.createdAt` | string | Creation date and time in ISO 8601 format with a time zone offset |\n| `data.item.updatedAt` | string | Date and time of this change, in the same format |\n| `data.item.status` | string | Result status, for example `open` |\n| `data.item.fileIds` | null | Result files. A result without files has `null` |\n| `data.item.rights` | object | Permissions on the result |\n| `data.item.rights.edit` | boolean | `true` — the result text can be changed |\n| `data.item.rights.remove` | boolean | `true` — the result can be deleted |\n| `data.item.messageId` | number \\| null | ID of the chat message if the result was created [from a message](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-from-chat-message). Otherwise `null` |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"item\": {\n      \"id\": 21,\n      \"taskId\": 4205,\n      \"text\": \"Quarterly report approved by the sales team\",\n      \"authorId\": 1295,\n      \"createdAt\": \"2026-10-16T09:44:55+00:00\",\n      \"updatedAt\": \"2026-10-16T09:44:57+00:00\",\n      \"status\": \"open\",\n      \"fileIds\": null,\n      \"rights\": {\n        \"edit\": true,\n        \"remove\": true\n      },\n      \"messageId\": null\n    }\n  }\n}\n```\n\n## Error response example\n\n403 — no result with this `id`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ACCESS_DENIED\",\n    \"message\": \"Access denied\",\n    \"hint\": \"Bitrix24 reports an access-rights refusal for tasks.task.result.update, not a scope error. The Bitrix24 user this call runs as lacks access; ask a portal admin to grant it, or call under a user who has it.\",\n    \"cause\": \"b24_permission\",\n    \"method\": \"tasks.task.result.update\",\n    \"fix\": {\n      \"action\": \"grant_b24_rights\",\n      \"via\": \"portal_admin\"\n    }\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|----------|\n| 400 | `INVALID_PARAMS` | `id` is not a positive integer. Message: `id must be a positive safe integer` |\n| 400 | `INVALID_PARAMS` | The body is not a JSON object or has no `fields` object. Message: `fields must be an object` |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\n| 401 | `TOKEN_MISSING` | The key has no Bitrix24 tokens |\n| 403 | `BITRIX_ACCESS_DENIED` | No result with this `id`, including one already deleted. The same code is returned when access to the result is denied |\n| 403 | `SCOPE_DENIED` | The key has no `task` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is in read-only mode. `error.details.switchUrl` contains the URL of the section where the mode is changed |\n| 415 | `FST_ERR_CTP_INVALID_MEDIA_TYPE` | A non-empty body with a `Content-Type` other than `application\u002Fjson` |\n| 422 | `BITRIX_ERROR` | `fields` has no `text`, or `text` is an empty string. The reason is in `error.validation` |\n| 429 | `RATE_LIMITED` | Request rate exceeded. The effective cap is in the `x-ratelimit-limit` header |\n\nFull list of common API errors: [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [Task results: REST 3.0](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3)\n- [Add a task result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-create)\n- [Create a task result from a chat message](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-from-chat-message)\n- [Delete a task result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-delete)\n- [Task results: legacy REST](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults)\n","## Delete a task result\n\n`DELETE \u002Fv1\u002Ftask-results\u002F:id`\n\nDeletes a task result by its ID. A deleted result cannot be restored via the API — add a new one if needed.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|----------|\n| `id` (path) | number | yes | Result ID, a positive integer. Take it from `data.item.id` in the response of [adding a result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-create) or [creating one from a message](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-from-chat-message). List: [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fresults`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002F21\" \\\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\u002Ftask-results\u002F21\" \\\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\u002Ftask-results\u002F21', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Request accepted:', success)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Ftask-results\u002F21', {\n  method: 'DELETE',\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## Response fields\n\nThe response comes with code `200` and a JSON body, not `204` with an empty body as with [deleting a task](\u002Fdocs\u002Fentities\u002Ftasks\u002Fdelete).\n\n| Field | Type | Description |\n|------|-----|----------|\n| `success` | boolean | `true` if the request was accepted |\n| `data` | object | Wrapper with the deletion outcome |\n| `data.result` | boolean | `true`, including for an `id` that does not exist in the Bitrix24 account and for a repeated deletion. To see whether the result was deleted, check the list [`GET \u002Fv1\u002Ftasks\u002F:taskId\u002Fresults`](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults) |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"result\": true\n  }\n}\n```\n\n## Error response example\n\n400 — `id` is not a positive integer:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"id must be a positive safe integer\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|----------|\n| 400 | `INVALID_PARAMS` | `id` is not a positive integer. Message: `id must be a positive safe integer` |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\n| 401 | `TOKEN_MISSING` | The key has no Bitrix24 tokens |\n| 403 | `BITRIX_ACCESS_DENIED` | No permission to delete this result |\n| 403 | `SCOPE_DENIED` | The key has no `task` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is in read-only mode. `error.details.switchUrl` contains the URL of the section where the mode is changed |\n| 422 | `BITRIX_ERROR` | Bitrix24 rejected the call. The text is in `error.message` |\n| 429 | `RATE_LIMITED` | Request rate exceeded. The effective cap is in the `x-ratelimit-limit` header |\n\nThe full list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [Task results: REST 3.0](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3)\n- [Add task result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-create)\n- [Create task result from chat message](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-from-chat-message)\n- [Update task result](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults-v3-update)\n- [Task results: legacy REST](\u002Fdocs\u002Fentities\u002Ftasks\u002Fresults)\n",1794739436648]