[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Fdeal-categories":3,"docs-tabs-entities\u002Fdeal-categories":6},{"content":4,"lastmod":5},"# Воронки сделок\n\nВоронки продаж (категории сделок). Каждая воронка содержит свой набор стадий.\n\nBitrix24 API: `crm.dealcategory.*`\nСкоуп: `crm`\n\nСтадии воронки: `GET \u002Fv1\u002Fstatuses?filter[entityId]=DEAL_STAGE_{categoryId}`\n\nОсновная воронка с id `0` через `\u002Fv1\u002Fdeal-categories` не возвращается и недоступна по id — для неё используйте универсальный эндпоинт `\u002Fv1\u002Fcategories\u002F2`.\n\n## Операции\n\n- [Создать воронку](.\u002Fdeal-categories\u002Fcreate.md) — `POST \u002Fv1\u002Fdeal-categories`\n- [Список воронок](.\u002Fdeal-categories\u002Flist.md) — `GET \u002Fv1\u002Fdeal-categories`\n- [Получить воронку](.\u002Fdeal-categories\u002Fget.md) — `GET \u002Fv1\u002Fdeal-categories\u002F:id`\n- [Обновить воронку](.\u002Fdeal-categories\u002Fupdate.md) — `PATCH \u002Fv1\u002Fdeal-categories\u002F:id`\n- [Удалить воронку](.\u002Fdeal-categories\u002Fdelete.md) — `DELETE \u002Fv1\u002Fdeal-categories\u002F:id`\n- [Поиск воронок](.\u002Fdeal-categories\u002Fsearch.md) — `POST \u002Fv1\u002Fdeal-categories\u002Fsearch`\n- [Поля воронки](.\u002Fdeal-categories\u002Ffields.md) — `GET \u002Fv1\u002Fdeal-categories\u002Ffields`\n- [Агрегация воронок](.\u002Fdeal-categories\u002Faggregate.md) — `POST \u002Fv1\u002Fdeal-categories\u002Faggregate`\n","2026-06-19",{"deal-categories\u002Fcreate.md":7,"deal-categories\u002Flist.md":8,"deal-categories\u002Fget.md":9,"deal-categories\u002Fupdate.md":10,"deal-categories\u002Fdelete.md":11,"deal-categories\u002Fsearch.md":12,"deal-categories\u002Ffields.md":13,"deal-categories\u002Faggregate.md":14},"\n## Создать воронку\n\n`POST \u002Fv1\u002Fdeal-categories`\n\nСоздаёт новую воронку сделок. После создания добавьте стадии через [справочники](\u002Fdocs\u002Fentities\u002Fstatuses) с `entityId = DEAL_STAGE_{id}`.\n\n## Параметры тела запроса\n\n| Параметр | Тип | Обязат. | Описание |\n|----------|-----|:-------:|---------|\n| `name` | string | да | Название воронки |\n| `sort` | number | | Порядок сортировки |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"name\": \"Корпоративные продажи\", \"sort\": 200}'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"name\": \"Корпоративные продажи\", \"sort\": 200}'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories', {\n  method: 'POST',\n  headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({ name: 'Корпоративные продажи', sort: 200 }),\n})\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories', {\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({ name: 'Корпоративные продажи', sort: 200 }),\n})\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | ID воронки |\n| `name` | string | Название |\n| `sort` | number | Сортировка |\n| `isLocked` | string | Заблокирована (Y\u002FN) |\n| `createdAt` | datetime | Дата создания |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 5,\n    \"createdAt\": \"2026-06-01T10:00:00+03:00\",\n    \"name\": \"Оптовые продажи\",\n    \"sort\": 200,\n    \"isLocked\": false\n  }\n}\n```\n\n\n## Пример ответа при ошибке\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"BITRIX_ERROR\", \"message\": \"NAME is required\" }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `BITRIX_ERROR` | Ошибка Bitrix24 |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | Не передан API-ключ |\n\nПолный список ошибок — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Справочники CRM](\u002Fdocs\u002Fentities\u002Fstatuses) — создание стадий для новой воронки\n- [Описание полей](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Ffields) — все доступные поля\n- [Воронки сделок](\u002Fdocs\u002Fentities\u002Fdeal-categories) — обзор сущности\n","\n## Список воронок\n\n`GET \u002Fv1\u002Fdeal-categories`\n\nВозвращает список воронок сделок портала с поддержкой сортировки и пагинации.\n\nОсновная воронка с id `0` в список не входит — она доступна через `\u002Fv1\u002Fcategories\u002F2`.\n\n## Параметры\n\n| Параметр | Тип | По умолч. | Описание |\n|----------|-----|-----------|---------|\n| `limit` | number | `50` | Количество записей |\n| `offset` | number | `0` | Пропустить N записей |\n| `select` | string | — | Выборка полей: `?select=id,name,sort` |\n| `order` | object | — | Сортировка: `?order[sort]=asc` |\n| `filter` | object | — | Фильтрация по полям `GET \u002Fv1\u002Fdeal-categories\u002Ffields`.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `?filter[name]=Newest` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories?order[sort]=asc\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories?order[sort]=asc\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories?order[sort]=asc', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\nconst { success, data, meta } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories?order[sort]=asc', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data[].id` | number | ID воронки |\n| `data[].name` | string | Название |\n| `data[].sort` | number | Сортировка |\n| `data[].isLocked` | string | Заблокирована (Y\u002FN) |\n| `data[].createdAt` | datetime | Дата создания |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 1,\n      \"name\": \"Продажи\",\n      \"sort\": 100,\n      \"isLocked\": \"N\",\n      \"createdAt\": \"2025-01-15T10:30:00+03:00\"\n    },\n    {\n      \"id\": 3,\n      \"name\": \"Корпоративные продажи\",\n      \"sort\": 200,\n      \"isLocked\": \"N\",\n      \"createdAt\": \"2025-06-01T14:00:00+03:00\"\n    }\n  ],\n  \"meta\": { \"total\": 2, \"hasMore\": false }\n}\n```\n\n\n## Пример ответа при ошибке\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"SCOPE_DENIED\", \"message\": \"This endpoint requires 'crm' scope\" }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | Не передан API-ключ |\n\nПолный список ошибок — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Воронки сделок](\u002Fdocs\u002Fentities\u002Fdeal-categories) — обзор сущности\n- [Создать воронку](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Fcreate) — добавление воронки\n- [Сделки](\u002Fdocs\u002Fentities\u002Fdeals) — сущность, использующая воронки\n- [Batch](\u002Fdocs\u002Fbatch) — объединение запросов\n","\n## Получить воронку\n\n`GET \u002Fv1\u002Fdeal-categories\u002F:id`\n\nВозвращает воронку сделок по ID.\n\n## Параметры пути\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `id` | number | ID воронки. Список — `GET \u002Fv1\u002Fdeal-categories` |\n\nОсновная воронка с id `0` через этот эндпоинт недоступна — для неё используйте `\u002Fv1\u002Fcategories\u002F2\u002F0`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | ID воронки |\n| `name` | string | Название |\n| `sort` | number | Сортировка |\n| `isLocked` | string | Заблокирована (Y\u002FN) |\n| `createdAt` | datetime | Дата создания |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 3,\n    \"name\": \"Корпоративные продажи\",\n    \"sort\": 200,\n    \"isLocked\": \"N\",\n    \"createdAt\": \"2025-06-01T14:00:00+03:00\"\n  }\n}\n```\n\n\n## Пример ответа при ошибке\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"ENTITY_NOT_FOUND\", \"message\": \"Not found\" }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Воронка не найдена |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | Не передан API-ключ |\n\nПолный список ошибок — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список воронок](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Flist) — все воронки\n- [Обновить воронку](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Fupdate) — изменение названия\n- [Воронки сделок](\u002Fdocs\u002Fentities\u002Fdeal-categories) — обзор сущности\n","\n## Обновить воронку\n\n`PATCH \u002Fv1\u002Fdeal-categories\u002F:id`\n\nОбновляет поля воронки сделок по ID.\n\n## Параметры пути\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `id` | number | ID воронки |\n\n## Параметры тела запроса\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `name` | string | Название воронки |\n| `sort` | number | Порядок сортировки |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"name\": \"Корпоративные продажи B2B\"}'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"name\": \"Корпоративные продажи B2B\"}'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3', {\n  method: 'PATCH',\n  headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({ name: 'Корпоративные продажи B2B' }),\n})\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3', {\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({ name: 'Корпоративные продажи B2B' }),\n})\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | object | Полный объект воронки после обновления |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 5,\n    \"createdAt\": \"2026-06-01T10:00:00+03:00\",\n    \"name\": \"Оптовые продажи\",\n    \"sort\": 200,\n    \"isLocked\": false\n  }\n}\n```\n\n\n## Пример ответа при ошибке\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"ENTITY_NOT_FOUND\", \"message\": \"Not found.\" }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Воронка не найдена |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | Не передан API-ключ |\n\nПолный список ошибок — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Получить воронку](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Fget) — текущие значения\n- [Описание полей](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Ffields) — все доступные поля\n- [Воронки сделок](\u002Fdocs\u002Fentities\u002Fdeal-categories) — обзор сущности\n","\n## Удалить воронку\n\n`DELETE \u002Fv1\u002Fdeal-categories\u002F:id`\n\nУдаляет воронку сделок по ID. Основную воронку (ID 0) удалить нельзя. При удалении все сделки переносятся в основную воронку.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | ID воронки |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3', {\n  method: 'DELETE',\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nif (res.status === 204) {\n  console.log('Воронка удалена')\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002F3', {\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('Удалено')\n}\n```\n\n## Ответ\n\nПри успешном удалении возвращается HTTP-статус `204 No Content` с пустым телом — признак успеха проверяется по статусу.\n\n## Пример ответа\n\n```\nHTTP\u002F1.1 204 No Content\n```\n\n## Пример ответа при ошибке\n\n404 — воронка не найдена:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Not found.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Воронка не найдена |\n| 422 | `BITRIX_ERROR` | ID невалиден или попытка удалить основную воронку (ID 0) |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | Не передан API-ключ |\n\nПолный список ошибок — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список воронок](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Flist) — найти воронки\n- [Сделки](\u002Fdocs\u002Fentities\u002Fdeals) — сделки перенесутся в основную воронку\n- [Воронки сделок](\u002Fdocs\u002Fentities\u002Fdeal-categories) — обзор сущности\n","\n## Поиск воронок\n\n`POST \u002Fv1\u002Fdeal-categories\u002Fsearch`\n\nПоиск воронок сделок с фильтрами через тело запроса — единый интерфейс с остальными сущностями. Для простых выборок по одному-двум полям подойдёт и [`GET \u002Fv1\u002Fdeal-categories`](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Flist) с query-фильтром.\n\n## Поля запроса (body)\n\n| Параметр | Тип | По умолч. | Описание |\n|----------|-----|-----------|---------|\n| `filter` | object | — | Фильтрация по полям `GET \u002Fv1\u002Fdeal-categories\u002Ffields`.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `{ \"isLocked\": \"N\" }` |\n| `limit` | number | `50` | Количество записей (до 5000) |\n| `offset` | number | `0` | Пропустить N записей |\n| `order` | object | — | Сортировка: `{ \"sort\": \"asc\" }` |\n| `select` | string[] | — | Выборка полей: `[\"id\", \"name\", \"sort\"]` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"isLocked\": \"N\" },\n    \"order\": { \"sort\": \"asc\" },\n    \"select\": [\"id\", \"name\", \"sort\"],\n    \"limit\": 3\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"isLocked\": \"N\" },\n    \"order\": { \"sort\": \"asc\" },\n    \"select\": [\"id\", \"name\", \"sort\"],\n    \"limit\": 3\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    filter: { isLocked: 'N' },\n    order: { sort: 'asc' },\n    select: ['id', 'name', 'sort'],\n    limit: 3,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Fsearch', {\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    filter: { isLocked: 'N' },\n    order: { sort: 'asc' },\n    select: ['id', 'name', 'sort'],\n    limit: 3,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | array | Массив воронок (поля — см. [Поля](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Ffields)) |\n| `meta.total` | number | Общее количество воронок под фильтр |\n| `meta.hasMore` | boolean | Есть ли записи за пределами текущей страницы |\n\n## Пример ответа\n\nВ запросе передан `select`, поэтому в ответе только выбранные поля.\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    { \"id\": 1, \"name\": \"Newest\", \"sort\": 100 },\n    { \"id\": 11, \"name\": \"English\", \"sort\": 200 }\n  ],\n  \"meta\": { \"total\": 6, \"hasMore\": true }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет скоупа:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'crm' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Нарушена валидация полей запроса |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список воронок](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Flist)\n- [Агрегация воронок](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Faggregate)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Сделки](\u002Fdocs\u002Fentities\u002Fdeals)\n","\n## Поля воронки\n\n`GET \u002Fv1\u002Fdeal-categories\u002Ffields`\n\nВозвращает описание всех полей воронки с типами и атрибутами.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Ffields', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | RO | Описание |\n|------|-----|:--:|---------|\n| `id` | number | да | ID воронки |\n| `name` | string | | Название |\n| `sort` | number | | Сортировка |\n| `isLocked` | string | да | Заблокирована (Y\u002FN) |\n| `createdAt` | datetime | да | Дата создания |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"fields\": {\n      \"id\": { \"type\": \"number\", \"readonly\": true },\n      \"name\": { \"type\": \"string\", \"readonly\": false },\n      \"sort\": { \"type\": \"number\", \"readonly\": false },\n      \"isLocked\": { \"type\": \"string\", \"readonly\": true },\n      \"createdAt\": { \"type\": \"datetime\", \"readonly\": true }\n    },\n    \"batch\": [\"create\", \"update\", \"delete\"]\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет скоупа:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'crm' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | Не передан API-ключ |\n\nПолный список ошибок — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Воронки сделок](\u002Fdocs\u002Fentities\u002Fdeal-categories) — обзор сущности\n- [Список воронок](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Flist) — получить воронки\n- [Сделки](\u002Fdocs\u002Fentities\u002Fdeals) — используют categoryId\n","\n## Агрегация воронок\n\n`POST \u002Fv1\u002Fdeal-categories\u002Faggregate`\n\nПодсчёт количества воронок и числовые агрегаты по фильтру. Без тела запроса возвращает общее количество воронок одним вызовом, без выгрузки записей.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `aggregate` | array | нет | Массив агрегаций. Каждый элемент: `{ \"field\": \"sort\", \"function\": \"sum\" }`. Функции: `count`, `sum`, `avg`, `min`, `max`. Для `count` поле — `\"*\"`. Без массива возвращается только `count` |\n| `filter` | object | нет | Фильтрация по полям `GET \u002Fv1\u002Fdeal-categories\u002Ffields`. [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering) |\n\nЧисловые функции (`sum`\u002F`avg`\u002F`min`\u002F`max`) применимы к числовым полям воронки — `sort`. Группировка (`groupBy`) недоступна: у воронок нет категориальных полей для группировки, запрос с `groupBy` возвращает `400 INVALID_PARAMS`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{}'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{}'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Faggregate', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({}),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Всего воронок:', data.count)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdeal-categories\u002Faggregate', {\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})\n\nconst { success, data } = await res.json()\n```\n\n## Другие сценарии\n\nПодсчёт записей — `count` с полем `\"*\"`, самый быстрый запрос без выгрузки записей. Без массива `aggregate` результат тот же:\n\n```json\n{ \"aggregate\": [{ \"field\": \"*\", \"function\": \"count\" }] }\n```\n\nСумма поля `sort` по всем воронкам:\n\n```json\n{\n  \"aggregate\": [{ \"field\": \"sort\", \"function\": \"sum\" }]\n}\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.count` | number | Общее количество воронок под фильтр |\n| `data.aggregates` | object | Результаты числовых агрегаций по полям. Пустой объект, если массив `aggregate` не передан |\n| `data.meta.totalRecords` | number | Общее количество воронок под фильтр |\n| `data.meta.recordsProcessed` | number | Сколько записей обработано: `0` для чистого `count`, число записей при числовых функциях |\n| `data.meta.truncated` | boolean | `true`, если под фильтр попало больше 5000 записей |\n\n## Пример ответа\n\nЗапрос количества (тело `{}`):\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 6,\n    \"aggregates\": {},\n    \"meta\": {\n      \"totalRecords\": 6,\n      \"recordsProcessed\": 0,\n      \"truncated\": false\n    }\n  }\n}\n```\n\nСумма поля `sort` (тело `{ \"aggregate\": [{ \"field\": \"sort\", \"function\": \"sum\" }] }`):\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 6,\n    \"aggregates\": { \"sort\": { \"sum\": 2410 } },\n    \"meta\": {\n      \"totalRecords\": 6,\n      \"recordsProcessed\": 6,\n      \"truncated\": false\n    }\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — передан `groupBy` (у воронок нет полей для группировки):\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"groupBy field 'isLocked' is not aggregatable on this entity. Available: .\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Передан `groupBy` или числовая функция по нечисловому полю |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список воронок](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Flist)\n- [Поиск воронок](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Fsearch)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n"]