Аналитика и справочники
Чтение статистики прошедших звонков с фильтрацией по дате, типу, оператору и другим полям, и справочник доступных голосов для синтеза речи в автозвонках.
Bitrix24 API: voximplant.statistic.get, voximplant.tts.voices.get
Скоуп: telephony
Статистика звонков
GET /v1/calls/statistics
Возвращает список записей о прошедших звонках с поддержкой фильтрации по полям, сортировки и пагинации.
Параметры
| Параметр | Тип | По умолч. | Описание |
|---|---|---|---|
filter (query) |
object | — | Фильтрация по полям записи (UPPER_SNAKE_CASE). Поддерживаются операторы >, >=, <, <=, ! в виде префикса к имени поля. Пример: ?filter[CALL_TYPE]=1, ?filter[>CALL_START_DATE]=2026-01-01T00:00:00 |
sort (query) |
string | — | Поле для сортировки в UPPER_SNAKE_CASE. Пример: CALL_START_DATE |
order (query) |
string | — | Направление сортировки: ASC или DESC |
limit (query) |
number | 50 |
Максимальное количество записей в ответе (до 500) |
offset (query) |
number | 0 |
Смещение для пагинации |
Диапазон дат задаётся двумя операторами одновременно. Пример: filter[>CALL_START_DATE]=2026-04-01T00:00:00&filter[<CALL_START_DATE]=2026-04-30T23:59:59.
Примеры
curl — личный ключ
curl "https://vibecode.bitrix24.tech/v1/calls/statistics?limit=10&sort=CALL_START_DATE&order=DESC&filter[CALL_TYPE]=1" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth-приложение
curl "https://vibecode.bitrix24.tech/v1/calls/statistics?limit=10&sort=CALL_START_DATE&order=DESC&filter[CALL_TYPE]=1" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — личный ключ
const params = new URLSearchParams({
limit: '10',
sort: 'CALL_START_DATE',
order: 'DESC',
'filter[CALL_TYPE]': '1',
})
const res = await fetch(`https://vibecode.bitrix24.tech/v1/calls/statistics?${params}`, {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const { success, data, total } = await res.json()
console.log(`Найдено звонков: ${total}`)
JavaScript — OAuth-приложение
const params = new URLSearchParams({
limit: '10',
sort: 'CALL_START_DATE',
order: 'DESC',
'filter[CALL_TYPE]': '1',
})
const res = await fetch(`https://vibecode.bitrix24.tech/v1/calls/statistics?${params}`, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data, total } = await res.json()
JavaScript — перебор всех страниц
const pageSize = 100
let offset = 0
const allCalls = []
while (true) {
const params = new URLSearchParams({
limit: String(pageSize),
offset: String(offset),
sort: 'CALL_START_DATE',
order: 'DESC',
})
const res = await fetch(`https://vibecode.bitrix24.tech/v1/calls/statistics?${params}`, {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
// total лежит в корне ответа — общее число записей под фильтром
const { data, total } = await res.json()
allCalls.push(...data)
offset += data.length
// берём следующую страницу, пока не собрали все записи
if (offset >= total || data.length === 0) break
}
console.log(`Собрано записей: ${allCalls.length}`)
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Всегда true при успехе |
data |
array | Массив записей о звонках |
data[].id |
string | Внутренний идентификатор записи |
data[].portalUserId |
string | ID оператора. Список: `GET /v1/users` |
data[].portalNumber |
string | Идентификатор линии: reg<id> — арендованная линия Voximplant, sip<id> — SIP-линия, REST_APP:<id> — линия через REST-приложение |
data[].phoneNumber |
string | Номер телефона клиента |
data[].callId |
string | Идентификатор звонка. Префиксы: externalCall. — от `register`, callback. — от обратного звонка, infocall. — от автозвонка |
data[].externalCallId |
string | null | Внешний идентификатор, переданный при регистрации |
data[].callCategory |
string | Категория: external для звонков через REST API |
data[].callLog |
string | null | URL детального лога Voximplant. null для звонков через REST-приложение |
data[].callDuration |
string | Длительность звонка в секундах (строка) |
data[].callStartDate |
string | Дата начала звонка, ISO 8601 с тайм-зоной портала |
data[].callRecordUrl |
string | URL аудиозаписи звонка |
data[].callVote |
string | null | Оценка звонка от 1 до 5 |
data[].cost |
string | Стоимость звонка (десятичная строка) |
data[].costCurrency |
string | Код валюты (RUR и др.) |
data[].callFailedCode |
string | Код результата: 200 — успех, 603-S — отменён, 304 — пропущен, 500 — ошибка сценария, 402 — недостаточно средств, 403 — запрещено |
data[].callFailedReason |
string | Текстовая причина результата |
data[].crmEntityType |
string | Тип привязанной CRM-сущности: LEAD, CONTACT или пустая строка. Источник: лиды, контакты |
data[].crmEntityId |
string | ID привязанной CRM-сущности |
data[].crmActivityId |
string | ID CRM-активности. "0" — активность не создана |
data[].restAppId |
string | null | ID приложения-инициатора звонка |
data[].restAppName |
string | null | Название приложения-инициатора звонка |
data[].transcriptId |
string | null | ID прикреплённой транскрипции. Прикрепить: `POST /v1/calls/:callId/transcription` |
data[].transcriptPending |
string | Y — транскрипция в обработке, N — транскрипция готова или отсутствует |
data[].sessionId |
string | Идентификатор сессии Voximplant |
data[].redialAttempt |
string | null | Номер попытки перенабора |
data[].comment |
string | null | Комментарий оператора |
data[].recordDuration |
string | null | Длительность записи разговора в секундах |
data[].recordFileId |
string | null | ID файла записи на Диске |
data[].callType |
string | Тип звонка: "1" — исходящий, "2" — входящий, "3" — входящий с перенаправлением, "4" — обратный звонок, "5" — информационный (автозвонок) |
total |
number | Общее количество записей, соответствующих фильтру |
Пример ответа
{
"success": true,
"data": [
{
"id": "1",
"portalUserId": "1",
"portalNumber": "reg133788",
"phoneNumber": "+79638835976",
"callId": "11018129443EB80D.1754478520.11438214",
"externalCallId": null,
"callCategory": "external",
"callLog": "https://storage-gw-ru-02.voximplant.com/voximplant-logs/2025/08/06/...",
"callDuration": "0",
"callStartDate": "2025-08-06T14:08:40+03:00",
"callRecordUrl": "",
"callVote": null,
"cost": "0.0000",
"costCurrency": "RUR",
"callFailedCode": "603-S",
"callFailedReason": "Decline self",
"crmEntityType": "CONTACT",
"crmEntityId": "275",
"crmActivityId": "7739",
"restAppId": null,
"restAppName": null,
"transcriptId": null,
"transcriptPending": "N",
"sessionId": "3841557776",
"redialAttempt": null,
"comment": null,
"recordDuration": null,
"recordFileId": null,
"callType": "1"
}
],
"total": 30
}
Пример ответа при ошибке
403 — нет скоупа telephony:
{
"success": false,
"error": {
"code": "SCOPE_DENIED",
"message": "This endpoint requires 'telephony' scope"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 401 | MISSING_API_KEY |
Не передан заголовок X-Api-Key |
| 401 | INVALID_API_KEY |
Неверный API-ключ |
| 401 | TOKEN_MISSING |
Ключ не имеет настроенных токенов Битрикс24 |
| 401 | KEY_INACTIVE |
API-ключ неактивен или отозван |
| 403 | SCOPE_DENIED |
Ключу не хватает скоупа telephony |
| 422 | BITRIX_ERROR |
Битрикс24 вернул ошибку (текст в error.message) |
| 429 | RATE_LIMITED |
Превышен лимит запросов |
| 502 | BITRIX_UNAVAILABLE |
Битрикс24 недоступен |
Полный список общих ошибок API — Ошибки.
Известные особенности
Имена полей в фильтре и сортировке — UPPER_SNAKE_CASE, а в ответе — camelCase. Параметры filter и sort принимают исходные имена Битрикс24 (CALL_TYPE, CALL_START_DATE), а поля ответа приходят в camelCase (callType, callStartDate). Фильтр по camelCase-имени молча игнорируется — возвращаются все записи.
total находится в корне ответа. В отличие от других list-эндпоинтов Вайбкод, поле total расположено непосредственно в корне ответа, а не в meta.total.
Фильтр по несуществующему полю не возвращает ошибку — некорректное имя поля молча игнорируется и возвращаются все записи.
Смотрите также
- Зарегистрировать звонок — возвращает
CALL_ID, который появляется в статистике - Обратный звонок
- Автозвонок с синтезом речи
- Автозвонок с аудиофайлом
- Справочник голосов — доступные голоса для автозвонка
- Лиды, Контакты — сущности из полей
CRM_ENTITY_TYPE/CRM_ENTITY_ID - Телефония — обзор