Для AI-агентов: markdown этой страницы — /docs-content/entities/order-statuses/aggregate.md индекс документации — /llms.txt

Агрегация статусов заказов

POST /v1/order-statuses/aggregate

Подсчёт количества статусов с группировкой по type или notify. Единственное числовое поле — sort, поэтому числовые функции (sum, avg) почти не нужны — основной сценарий — count с фильтром или группировкой.

Стандартные поля

Все поля статуса категориальные — подходят только для groupBy и filter:

Поле Назначение
type Группировка по типу: O (заказа) или D (доставки)
notify Группировка по тому, отправляется ли уведомление

Полный список агрегируемых полей перечислен в таблице выше.

Поля запроса (тело)

Параметр Тип Обяз. Описание
aggregate array нет Массив агрегаций. Для статусов основной вариант — count. Числовые функции принимают единственное числовое поле sort. Формат подсчёта — { "field": "*", "function": "count" }. Без параметра — count записей с учётом фильтра
filter object нет Фильтрация — те же поля, что в GET /v1/order-statuses. Синтаксис фильтрации
groupBy string | string[] нет Поле или массив полей для группировки (максимум 5)
groupOrderBy array нет Сортировка групп: [{ "field": "count", "direction": "desc" }]
groupLimit number нет Ограничение количества возвращаемых групп (1-1000)

Примеры

curl — личный ключ

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/order-statuses/aggregate" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "groupBy": "type"
  }'

curl — OAuth-приложение

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/order-statuses/aggregate" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "groupBy": "type"
  }'

JavaScript — личный ключ

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/order-statuses/aggregate', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    groupBy: 'type',
  }),
})

const { success, data } = await res.json()
console.log('Распределение статусов:', data.groups)

JavaScript — OAuth-приложение

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/order-statuses/aggregate', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    groupBy: 'type',
  }),
})

const { success, data } = await res.json()

Другие сценарии

Подсчёт записей — count с полем "*", самый быстрый запрос без выгрузки записей. Без массива aggregate результат тот же:

JSON
{ "aggregate": [{ "field": "*", "function": "count" }] }

Сколько статусов с включённым уведомлением:

JSON
{
  "filter": { "notify": true }
}

Группировка по обоим осям сразу:

JSON
{
  "groupBy": ["type", "notify"]
}

Поля ответа

Поле Тип Описание
success boolean Всегда true при успехе
data.count number Общее количество статусов, соответствующих фильтру
data.aggregates object Результаты числовых агрегаций — для статусов их считают только по sort; пустой объект, если массив aggregate не передан
data.groups array Группы (только при groupBy)
data.meta.totalRecords number Общее количество записей
data.meta.recordsProcessed number Количество обработанных записей
data.meta.truncated boolean true, если числа посчитаны не по всем записям под фильтр: прочитано меньше записей, чем обещал data.count — в том числе когда под фильтр попало больше 5000, — либо срез оборвался ошибкой подстраницы. Размер нехватки приходит в data.meta.recordsShortfall, оборванный срез — в data.meta.pageErrorSample. Присутствует всегда, на полном ответе равен false. Если в запросе нет ни groupBy, ни числовых функций, записи не выгружаются и флаг всегда false
data.meta.groupTotal number Количество групп до groupLimit
data.meta.groupsTruncated boolean Был ли список групп обрезан groupLimit

Пример ответа

JSON
{
  "success": true,
  "data": {
    "count": 9,
    "aggregates": {},
    "groups": [
      { "type": "O", "count": 6, "aggregates": {} },
      { "type": "D", "count": 3, "aggregates": {} }
    ],
    "meta": {
      "totalRecords": 9,
      "recordsProcessed": 9,
      "truncated": false,
      "groupTotal": 2,
      "groupsTruncated": false
    }
  }
}

Без groupBy поле data.groups в ответе отсутствует.

Пример ответа при ошибке

400 — неизвестное поле в groupBy:

JSON
{
  "success": false,
  "error": {
    "code": "INVALID_PARAMS",
    "message": "groupBy field 'foo' is not aggregatable on this entity. Available: type, notify."
  }
}

Ошибки

HTTP Код Описание
400 INVALID_PARAMS Неизвестная функция или несуществующее поле — сообщение содержит список допустимых полей
400 INVALID_PARAMS Передано больше 5 полей в groupBy
400 INVALID_PARAMS Зарезервированные ключевые слова в groupBy: count, aggregates, meta, groups
403 SCOPE_DENIED API-ключ не имеет скоупа sale
401 TOKEN_MISSING API-ключ не имеет настроенных токенов
429 RATE_LIMITED Превышен лимит запросов: 300 в минуту на портал, все API-ключи портала делят один лимит. Точное значение — в заголовке x-ratelimit-limit (потолок делится на реплики). Повторите после срока из заголовка Retry-After

Полный список общих ошибок API — Ошибки.

Известные особенности

Практически нужен только count. Единственное числовое поле статуса — sort, и только его принимают функции sum / avg / min / max; по любому другому полю они отвечают 400 INVALID_PARAMS. Для подсчёта статусов используйте count (без aggregate) с фильтром или группировкой.

Малый объём данных. На порталах число статусов измеряется десятками, поэтому потолок в 5000 записей для этой сущности не достигается.

Признак усечения приходит рядом с самим числом. Когда ответ приходит с meta.truncated: true, пометка truncated: true стоит внутри объекта каждого поля в data.aggregates, у каждого элемента data.groups, а в data.meta.warnings добавляется предупреждение с кодом AGGREGATE_TRUNCATED. Так клиент, который читает только само число, видит, что оно посчитано по части записей. На полном ответе ни одной из этих пометок нет. Полный разбор — Агрегация POST — потолок 5000 записей.

Смотрите также