[{"data":1,"prerenderedAt":7},["ShallowReactive",2],{"docs-entities\u002Fdeal-categories\u002Fsearch":3,"docs-tabs-entities\u002Fdeal-categories\u002Fsearch":6},{"content":4,"lastmod":5},"\n## Search funnels\n\n`POST \u002Fv1\u002Fdeal-categories\u002Fsearch`\n\nSearch sales funnels with filters via the request body — the same interface as for other entities. For simple selections by one or two fields, [`GET \u002Fv1\u002Fdeal-categories`](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Flist) with a query filter also works.\n\n## Request fields (body)\n\n| Parameter | Type | Required | Default | Description |\n|----------|-----|:-----:|-----------|---------|\n| `filter` | object | no | — | Exact-match and `$in` (IN set) only, by `id`, `name`, `sort`. Operators (`>`, `>=`, `\u003C`, `\u003C=`, `!`, `%`, `$ne`, `$contains`, `$nin`) and filtering by `isLocked` \u002F `createdAt` are not supported — you get `400 UNSUPPORTED_FILTER`.\u003Cbr>[Filtering syntax](\u002Fdocs\u002Ffiltering). Example: `{ \"id\": { \"$in\": [1, 11] } }` |\n| `limit` | number | no | `50` | Number of records (up to 5000) |\n| `offset` | number | no | `0` | Skip N records |\n| `sort` | string | no | — | Sort field. The `-` prefix means descending: `\"-sort\"`. The long form `\"order\": { \"sort\": \"desc\" }` is accepted too |\n| `select` | string[] | no | — | Field selection: `[\"id\", \"name\", \"sort\"]` |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fdeal-categories\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"id\": { \"$in\": [1, 11] } },\n    \"sort\": \"sort\",\n    \"select\": [\"id\", \"name\", \"sort\"],\n    \"limit\": 3\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\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\": { \"id\": { \"$in\": [1, 11] } },\n    \"sort\": \"sort\",\n    \"select\": [\"id\", \"name\", \"sort\"],\n    \"limit\": 3\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\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: { id: { $in: [1, 11] } },\n    sort: 'sort',\n    select: ['id', 'name', 'sort'],\n    limit: 3,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\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: { id: { $in: [1, 11] } },\n    sort: 'sort',\n    select: ['id', 'name', 'sort'],\n    limit: 3,\n  }),\n})\n\nconst { success, data, meta } = 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 funnels (fields — see [Fields](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Ffields)) |\n| `meta.total` | number | Total number of funnels matching the filter |\n| `meta.hasMore` | boolean | Whether there are records beyond the current page |\n| `meta.durationMs` | number | Request duration in milliseconds |\n\nThe `meta` fields sit next to `data`, not inside it. Page through the results using `meta.hasMore`: a `data` length equal to `limit` does not rule out the last page.\n\n## Response example\n\nThe request includes `select`, so the response contains only the selected fields.\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\": 2, \"hasMore\": false, \"durationMs\": 167 }\n}\n```\n\n## Error response example\n\n400 — a non-filterable field in the filter (`isLocked` is a visibility toggle, not an equality field):\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"UNSUPPORTED_FILTER\",\n    \"message\": \"UNSUPPORTED_FILTER: 'isLocked' is not filterable on 'deal-categories'. Its Bitrix24 method (crm.dealcategory.list) filters by exact match only. Filterable: id, name, sort.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `UNSUPPORTED_FILTER` | An operator or a non-filterable field in the filter. Filter by exact match or `$in` on `id`, `name`, `sort` |\n| 400 | `INVALID_PARAMS` | Request field validation failed |\n| 403 | `SCOPE_DENIED` | The API key lacks the `crm` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n| 429 | `RATE_LIMITED` | Rate limit exceeded: 300 requests per minute per portal. All API keys of the portal share one limit. The current limit is returned in the `x-ratelimit-limit` header. Retry after the delay in the `Retry-After` header |\n\nFor the full list of common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [List funnels](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Flist)\n- [Aggregate funnels](\u002Fdocs\u002Fentities\u002Fdeal-categories\u002Faggregate)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [Deals](\u002Fdocs\u002Fentities\u002Fdeals)\n","2026-11-02",{},1794739366666]