Для AI-агентов: markdown этой страницы — /docs-content/entities/deal-categories/aggregate.md индекс документации — /llms.txt
Агрегация воронок
POST /v1/deal-categories/aggregate
Подсчёт количества воронок и числовые агрегаты по фильтру. Без тела запроса возвращает общее количество воронок одним вызовом, без выгрузки записей.
Поля запроса (body)
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
aggregate |
array | нет | Массив агрегаций. Каждый элемент: { "field": "sort", "function": "sum" }. Функции: count, sum, avg, min, max. Для count поле — "*". Без массива возвращается только count |
filter |
object | нет | Точное равенство и $in по id, name, sort. Фильтр по isLocked или createdAt даёт 400 UNSUPPORTED_FILTER. Синтаксис фильтрации |
Числовые функции (sum/avg/min/max) применимы к числовым полям воронки — sort. Группировка (groupBy) недоступна: у воронок нет категориальных полей для группировки, запрос с groupBy возвращает 400 INVALID_PARAMS.
Примеры
curl — личный ключ
curl -X POST "https://vibecode.bitrix24.tech/v1/deal-categories/aggregate" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
curl — OAuth-приложение
curl -X POST "https://vibecode.bitrix24.tech/v1/deal-categories/aggregate" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'
JavaScript — личный ключ
const res = await fetch('https://vibecode.bitrix24.tech/v1/deal-categories/aggregate', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
})
const { success, data } = await res.json()
console.log('Всего воронок:', data.count)
JavaScript — OAuth-приложение
const res = await fetch('https://vibecode.bitrix24.tech/v1/deal-categories/aggregate', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
})
const { success, data } = await res.json()
Другие сценарии
Подсчёт записей — count с полем "*", самый быстрый запрос без выгрузки записей. Без массива aggregate результат тот же:
{ "aggregate": [{ "field": "*", "function": "count" }] }
Сумма поля sort по всем воронкам:
{
"aggregate": [{ "field": "sort", "function": "sum" }]
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Всегда true при успехе |
data.count |
number | Общее количество воронок под фильтр |
data.aggregates |
object | Результаты числовых агрегаций по полям. Пустой объект, если массив aggregate не передан |
data.meta.totalRecords |
number | Общее количество воронок под фильтр |
data.meta.recordsProcessed |
number | Сколько записей обработано: 0 для чистого count, число записей при числовых функциях |
data.meta.truncated |
boolean | true, если числа посчитаны не по всем записям под фильтр: прочитано меньше записей, чем обещал data.count — в том числе когда под фильтр попало больше 5000, — либо срез оборвался ошибкой подстраницы. Размер нехватки приходит в data.meta.recordsShortfall, оборванный срез — в data.meta.pageErrorSample. Присутствует всегда, на полном ответе равен false. Если в запросе нет ни groupBy, ни числовых функций, записи не выгружаются и флаг всегда false |
Пример ответа
Запрос количества (тело {}):
{
"success": true,
"data": {
"count": 6,
"aggregates": {},
"meta": {
"totalRecords": 6,
"recordsProcessed": 0,
"truncated": false
}
}
}
Сумма поля sort (тело { "aggregate": [{ "field": "sort", "function": "sum" }] }):
{
"success": true,
"data": {
"count": 6,
"aggregates": { "sort": { "sum": 2410 } },
"meta": {
"totalRecords": 6,
"recordsProcessed": 6,
"truncated": false
}
}
}
Пример ответа при ошибке
400 — передан groupBy (у воронок нет полей для группировки):
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "groupBy field 'isLocked' is not aggregatable on this entity. Available: ."
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | INVALID_PARAMS |
Передан groupBy или числовая функция по нечисловому полю |
| 403 | SCOPE_DENIED |
API-ключ не имеет скоупа crm |
| 401 | TOKEN_MISSING |
API-ключ не имеет настроенных токенов |
| 429 | RATE_LIMITED |
Превышен лимит запросов: 300 в минуту на портал, все API-ключи портала делят один лимит. Точное значение — в заголовке x-ratelimit-limit (потолок делится на реплики). Повторите после срока из заголовка Retry-After |
Полный список общих ошибок API — Ошибки.
Известные особенности
Признак усечения приходит рядом с самим числом. Когда ответ приходит с meta.truncated: true, пометка truncated: true стоит внутри объекта каждого поля в data.aggregates, у каждого элемента data.groups, а в data.meta.warnings добавляется предупреждение с кодом AGGREGATE_TRUNCATED. Так клиент, который читает только само число, видит, что оно посчитано по части записей. На полном ответе ни одной из этих пометок нет. Полный разбор — Агрегация POST — потолок 5000 записей.