[{"data":1,"prerenderedAt":7},["ShallowReactive",2],{"docs-entities\u002Fdeals\u002Fproducts-delete":3,"docs-tabs-entities\u002Fdeals\u002Fproducts-delete":6},{"content":4,"lastmod":5},"## Delete a product from a deal\n\n`DELETE \u002Fv1\u002Fdeals\u002F:id\u002Fproducts\u002F:rowId`\n\nDeletes a single product row from a deal by row ID. A deleted row 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 | Deal ID. List: [`GET \u002Fv1\u002Fdeals`](\u002Fdocs\u002Fentities\u002Fdeals\u002Flist) |\n| `rowId` (path) | number | yes | Product row ID, not the catalog `productId`. List: [`GET \u002Fv1\u002Fdeals\u002F:id\u002Fproducts`](\u002Fdocs\u002Fentities\u002Fdeals\u002Fproducts-get) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fdeals\u002F8821\u002Fproducts\u002F2383\" \\\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\u002Fdeals\u002F8821\u002Fproducts\u002F2383\" \\\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\u002Fdeals\u002F8821\u002Fproducts\u002F2383', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Product removed from the deal')\n}\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fdeals\u002F8821\u002Fproducts\u002F2383', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Deleted')\n}\n```\n\n## Response\n\nOn success, the endpoint returns `204 No Content` with an empty body — check the HTTP status to confirm success.\n\n## Response example\n\n```\nHTTP\u002F1.1 204 No Content\n```\n\n## Error response example\n\n404 — no product row with this `rowId`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Item not found\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_ROW_ID` | `rowId` in the path is not a positive integer. The message is `Product row ID must be a positive integer` |\n| 404 | `ENTITY_NOT_FOUND` | No product row with this `rowId`. The message is `Item not found` |\n| 404 | `ENTITY_NOT_FOUND` | A row with this `rowId` exists but belongs to another CRM record, not to deal `id`, or has no owner and so cannot pass the check. The message is `Product row not found` |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key is read-only — see [access rights](\u002Fdocs\u002Faccess-rights) |\n| 403 | `SCOPE_DENIED` | API key lacks the `crm` scope |\n| 401 | `TOKEN_MISSING` | API key has no configured tokens |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [Product rows](\u002Fdocs\u002Fentities\u002Fdeals\u002Fproducts-get)\n- [Add a product](\u002Fdocs\u002Fentities\u002Fdeals\u002Fproducts-add)\n- [Set products](\u002Fdocs\u002Fentities\u002Fdeals\u002Fproducts-set)\n- [CRM products](\u002Fdocs\u002Fentities\u002Fproducts)\n","2026-10-14",{},1794739368872]