[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-telephony\u002Fanalytics":3,"docs-tabs-telephony\u002Fanalytics":6},{"content":4,"lastmod":5},"# Аналитика и справочники\n\nЧтение статистики прошедших звонков с фильтрацией по дате, типу, оператору и другим полям, и справочник доступных голосов для синтеза речи в автозвонках.\n\nBitrix24 API: `voximplant.statistic.get`, `voximplant.tts.voices.get`\nСкоуп: `telephony`\n\n## Операции\n\n- [Статистика звонков](.\u002Fanalytics\u002Fstatistics.md) — `GET \u002Fv1\u002Fcalls\u002Fstatistics`\n- [Справочник голосов](.\u002Fanalytics\u002Fvoices.md) — `GET \u002Fv1\u002Fcalls\u002Fvoices`\n\n## Смотрите также\n\n- [Телефония — обзор](..\u002Ftelephony.md)\n- [Исходящие звонки](.\u002Foutbound.md) — голоса используются как `voice` в автозвонке с синтезом речи\n","2026-06-18",{"analytics\u002Fstatistics.md":7,"analytics\u002Fvoices.md":8},"\n## Статистика звонков\n\n`GET \u002Fv1\u002Fcalls\u002Fstatistics`\n\nВозвращает список записей о прошедших звонках с поддержкой фильтрации по полям, сортировки и пагинации.\n\n## Параметры\n\n| Параметр | Тип | По умолч. | Описание |\n|----------|-----|-----------|---------|\n| `filter` (query) | object | — | Фильтрация по полям записи (UPPER_SNAKE_CASE). Поддерживаются операторы `>`, `>=`, `\u003C`, `\u003C=`, `!` в виде префикса к имени поля. Пример: `?filter[CALL_TYPE]=1`, `?filter[>CALL_START_DATE]=2026-01-01T00:00:00` |\n| `sort` (query) | string | — | Поле для сортировки в UPPER_SNAKE_CASE. Пример: `CALL_START_DATE` |\n| `order` (query) | string | — | Направление сортировки: `ASC` или `DESC` |\n| `limit` (query) | number | `50` | Максимальное количество записей в ответе (до 500) |\n| `offset` (query) | number | `0` | Смещение для пагинации |\n\nДиапазон дат задаётся двумя операторами одновременно. Пример: `filter[>CALL_START_DATE]=2026-04-01T00:00:00&filter[\u003CCALL_START_DATE]=2026-04-30T23:59:59`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fstatistics?limit=10&sort=CALL_START_DATE&order=DESC&filter[CALL_TYPE]=1\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fstatistics?limit=10&sort=CALL_START_DATE&order=DESC&filter[CALL_TYPE]=1\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst params = new URLSearchParams({\n  limit: '10',\n  sort: 'CALL_START_DATE',\n  order: 'DESC',\n  'filter[CALL_TYPE]': '1',\n})\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fstatistics?${params}`, {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nconst { success, data, total } = await res.json()\nconsole.log(`Найдено звонков: ${total}`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst params = new URLSearchParams({\n  limit: '10',\n  sort: 'CALL_START_DATE',\n  order: 'DESC',\n  'filter[CALL_TYPE]': '1',\n})\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fstatistics?${params}`, {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data, total } = await res.json()\n```\n\n### JavaScript — перебор всех страниц\n\n```javascript\nconst pageSize = 100\nlet offset = 0\nconst allCalls = []\n\nwhile (true) {\n  const params = new URLSearchParams({\n    limit: String(pageSize),\n    offset: String(offset),\n    sort: 'CALL_START_DATE',\n    order: 'DESC',\n  })\n\n  const res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fstatistics?${params}`, {\n    headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n  })\n  \u002F\u002F total лежит в корне ответа — общее число записей под фильтром\n  const { data, total } = await res.json()\n\n  allCalls.push(...data)\n  offset += data.length\n\n  \u002F\u002F берём следующую страницу, пока не собрали все записи\n  if (offset >= total || data.length === 0) break\n}\n\nconsole.log(`Собрано записей: ${allCalls.length}`)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив записей о звонках |\n| `data[].id` | string | Внутренний идентификатор записи |\n| `data[].portalUserId` | string | ID оператора. Список: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers) |\n| `data[].portalNumber` | string | Идентификатор линии: `reg\u003Cid>` — арендованная линия Voximplant, `sip\u003Cid>` — SIP-линия, `REST_APP:\u003Cid>` — линия через REST-приложение |\n| `data[].phoneNumber` | string | Номер телефона клиента |\n| `data[].callId` | string | Идентификатор звонка. Префиксы: `externalCall.` — от [`register`](..\u002Fcrm\u002Fregister.md), `callback.` — от [обратного звонка](..\u002Foutbound\u002Fcallback.md), `infocall.` — от [автозвонка](..\u002Foutbound\u002Fauto-call.md) |\n| `data[].externalCallId` | string \\| null | Внешний идентификатор, переданный при регистрации |\n| `data[].callCategory` | string | Категория: `external` для звонков через REST API |\n| `data[].callLog` | string \\| null | URL детального лога Voximplant. `null` для звонков через REST-приложение |\n| `data[].callDuration` | string | Длительность звонка в секундах (строка) |\n| `data[].callStartDate` | string | Дата начала звонка, ISO 8601 с тайм-зоной портала |\n| `data[].callRecordUrl` | string | URL аудиозаписи звонка |\n| `data[].callVote` | string \\| null | Оценка звонка от `1` до `5` |\n| `data[].cost` | string | Стоимость звонка (десятичная строка) |\n| `data[].costCurrency` | string | Код валюты (`RUR` и др.) |\n| `data[].callFailedCode` | string | Код результата: `200` — успех, `603-S` — отменён, `304` — пропущен, `500` — ошибка сценария, `402` — недостаточно средств, `403` — запрещено |\n| `data[].callFailedReason` | string | Текстовая причина результата |\n| `data[].crmEntityType` | string | Тип привязанной CRM-сущности: `LEAD`, `CONTACT` или пустая строка. Источник: [лиды](\u002Fdocs\u002Fentities\u002Fleads), [контакты](\u002Fdocs\u002Fentities\u002Fcontacts) |\n| `data[].crmEntityId` | string | ID привязанной CRM-сущности |\n| `data[].crmActivityId` | string | ID CRM-активности. `\"0\"` — активность не создана |\n| `data[].restAppId` | string \\| null | ID приложения-инициатора звонка |\n| `data[].restAppName` | string \\| null | Название приложения-инициатора звонка |\n| `data[].transcriptId` | string \\| null | ID прикреплённой транскрипции. Прикрепить: [`POST \u002Fv1\u002Fcalls\u002F:callId\u002Ftranscription`](..\u002Fcrm\u002Ftranscription.md) |\n| `data[].transcriptPending` | string | `Y` — транскрипция в обработке, `N` — транскрипция готова или отсутствует |\n| `data[].sessionId` | string | Идентификатор сессии Voximplant |\n| `data[].redialAttempt` | string \\| null | Номер попытки перенабора |\n| `data[].comment` | string \\| null | Комментарий оператора |\n| `data[].recordDuration` | string \\| null | Длительность записи разговора в секундах |\n| `data[].recordFileId` | string \\| null | ID файла записи на Диске |\n| `data[].callType` | string | Тип звонка: `\"1\"` — исходящий, `\"2\"` — входящий, `\"3\"` — входящий с перенаправлением, `\"4\"` — [обратный звонок](..\u002Foutbound\u002Fcallback.md), `\"5\"` — информационный ([автозвонок](..\u002Foutbound\u002Fauto-call.md)) |\n| `total` | number | Общее количество записей, соответствующих фильтру |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": \"1\",\n      \"portalUserId\": \"1\",\n      \"portalNumber\": \"reg133788\",\n      \"phoneNumber\": \"+79638835976\",\n      \"callId\": \"11018129443EB80D.1754478520.11438214\",\n      \"externalCallId\": null,\n      \"callCategory\": \"external\",\n      \"callLog\": \"https:\u002F\u002Fstorage-gw-ru-02.voximplant.com\u002Fvoximplant-logs\u002F2025\u002F08\u002F06\u002F...\",\n      \"callDuration\": \"0\",\n      \"callStartDate\": \"2025-08-06T14:08:40+03:00\",\n      \"callRecordUrl\": \"\",\n      \"callVote\": null,\n      \"cost\": \"0.0000\",\n      \"costCurrency\": \"RUR\",\n      \"callFailedCode\": \"603-S\",\n      \"callFailedReason\": \"Decline self\",\n      \"crmEntityType\": \"CONTACT\",\n      \"crmEntityId\": \"275\",\n      \"crmActivityId\": \"7739\",\n      \"restAppId\": null,\n      \"restAppName\": null,\n      \"transcriptId\": null,\n      \"transcriptPending\": \"N\",\n      \"sessionId\": \"3841557776\",\n      \"redialAttempt\": null,\n      \"comment\": null,\n      \"recordDuration\": null,\n      \"recordFileId\": null,\n      \"callType\": \"1\"\n    }\n  ],\n  \"total\": 30\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет скоупа `telephony`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'telephony' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 401 | `TOKEN_MISSING` | Ключ не имеет настроенных токенов Битрикс24 |\n| 401 | `KEY_INACTIVE` | API-ключ неактивен или отозван |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `telephony` |\n| 422 | `BITRIX_ERROR` | Битрикс24 вернул ошибку (текст в `error.message`) |\n| 429 | `RATE_LIMITED` | Превышен лимит запросов |\n| 502 | `BITRIX_UNAVAILABLE` | Битрикс24 недоступен |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Имена полей в фильтре и сортировке — UPPER_SNAKE_CASE, а в ответе — camelCase.** Параметры `filter` и `sort` принимают исходные имена Битрикс24 (`CALL_TYPE`, `CALL_START_DATE`), а поля ответа приходят в camelCase (`callType`, `callStartDate`). Фильтр по camelCase-имени молча игнорируется — возвращаются все записи.\n\n**`total` находится в корне ответа.** В отличие от других list-эндпоинтов Вайбкод, поле `total` расположено непосредственно в корне ответа, а не в `meta.total`.\n\n**Фильтр по несуществующему полю** не возвращает ошибку — некорректное имя поля молча игнорируется и возвращаются все записи.\n\n## Смотрите также\n\n- [Зарегистрировать звонок](..\u002Fcrm\u002Fregister.md) — возвращает `CALL_ID`, который появляется в статистике\n- [Обратный звонок](..\u002Foutbound\u002Fcallback.md)\n- [Автозвонок с синтезом речи](..\u002Foutbound\u002Fauto-call.md)\n- [Автозвонок с аудиофайлом](..\u002Foutbound\u002Fauto-call-audio.md)\n- [Справочник голосов](.\u002Fvoices.md) — доступные голоса для автозвонка\n- [Лиды](\u002Fdocs\u002Fentities\u002Fleads), [Контакты](\u002Fdocs\u002Fentities\u002Fcontacts) — сущности из полей `CRM_ENTITY_TYPE` \u002F `CRM_ENTITY_ID`\n- [Телефония — обзор](\u002Fdocs\u002Ftelephony)\n","\n## Справочник голосов\n\n`GET \u002Fv1\u002Fcalls\u002Fvoices`\n\nВозвращает словарь доступных голосов для синтеза речи. Идентификаторы из ответа передаются как параметр `voice` в [`POST \u002Fv1\u002Fcalls\u002Fauto-call`](..\u002Foutbound\u002Fauto-call.md).\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fvoices \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fvoices \\\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\u002Fcalls\u002Fvoices', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nconst { success, data } = await res.json()\nconst voices = Object.entries(data)\n\u002F\u002F [['ruinternalfemale', 'Русский (женский) (Default)'], ...]\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fvoices', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | object | Словарь голосов: ключ — идентификатор голоса, значение — название для отображения с указанием источника синтеза в скобках |\n| `data.\u003CvoiceId>` | string | Название голоса. В скобках — источник синтеза: `Amazon` или `Default`. Передавайте `voiceId` как параметр `voice` в автозвонке |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"auenglishfemale\": \"Австралийский английский (женский) (Amazon)\",\n    \"brportuguesefemale\": \"Бразильский португальский (женский) (Amazon)\",\n    \"ruinternalfemale\": \"Русский (женский) (Default)\",\n    \"ruinternalmale\": \"Русский (мужской) (Default)\",\n    \"ukenglishfemale\": \"Английский (женский) (Amazon)\",\n    \"ukenglishmale\": \"Английский (мужской) (Amazon)\",\n    \"usenglishfemale\": \"Американский английский (женский) (Default)\",\n    \"usenglishmale\": \"Американский английский (мужской) (Default)\",\n    \"eurfrenchfemale\": \"Французский (женский) (Amazon)\",\n    \"eurfrenchmale\": \"Французский (мужской) (Amazon)\",\n    \"eurgermanfemale\": \"Немецкий (женский) (Default)\",\n    \"eurgermanmale\": \"Немецкий (мужской) (Default)\",\n    \"jpjapanesefemale\": \"Японский (женский) (Default)\",\n    \"chchinesefemale\": \"Китайский (женский) (Default)\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет скоупа `telephony`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'telephony' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 401 | `TOKEN_MISSING` | Ключ не имеет настроенных токенов Битрикс24 |\n| 401 | `KEY_INACTIVE` | API-ключ неактивен или отозван |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `telephony` |\n| 422 | `BITRIX_ERROR` | Битрикс24 вернул ошибку (текст в `error.message`) |\n| 429 | `RATE_LIMITED` | Превышен лимит запросов |\n| 502 | `BITRIX_UNAVAILABLE` | Битрикс24 недоступен |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**`data` — объект-словарь, не массив.** Для перебора всех голосов используйте `Object.entries(data)`. Получить конкретный голос по идентификатору: `data['ruinternalfemale']`.\n\n**Голос по умолчанию.** При вызове автозвонка без параметра `voice` Битрикс24 выбирает голос по умолчанию исходя из языка портала. Для русскоязычного портала — `ruinternalfemale`.\n\n**Набор голосов зависит от тарифа.** Доступные голоса и их идентификаторы могут различаться в зависимости от тарифного плана портала.\n\n## Смотрите также\n\n- [Автозвонок с синтезом речи](..\u002Foutbound\u002Fauto-call.md) — использует идентификатор голоса из этого справочника\n- [Автозвонок с аудиофайлом](..\u002Foutbound\u002Fauto-call-audio.md)\n- [Статистика звонков](.\u002Fstatistics.md)\n- [Телефония — обзор](\u002Fdocs\u002Ftelephony)\n"]