Аналитика
Отчёты по звонкам аккаунта за период. Все методы — GET /api/v2/analytics/….
Общие параметры
| Параметр | Тип | Описание |
|---|---|---|
amocrmId обязательный | int | Аккаунт amoCRM |
from, to | string | Период, дата или дата со временем в ISO. По умолчанию последние 30 дней; не длиннее 366 дней. to без времени включает весь этот день |
timezone | string | Часовой пояс IANA (Europe/Moscow), по которому считаются дни и часы. По умолчанию пояс аккаунта amoCRM |
type | string или список | call_in, call_out |
responsibleId | int или список | Ответственные пользователи amoCRM |
Отчёты обновляются не чаще раза в 60 секунд для одного набора параметров.
Сравнение с прошлым периодом везде считается против периода той же длины, который закончился прямо перед from. Значение со сравнением имеет вид:
{ "value": 412, "previous": 380, "delta": 8, "deltaUnit": "percent" }
delta — изменение: в процентах (percent), в процентных пунктах для долей (points) или в единицах оценки (absolute); null, если сравнивать не с чем.
Определения: без ответа — звонок с нулевой длительностью или без записи; время разговора — сумма длительностей остальных звонков; доля расшифрованных — расшифрованные звонки к звонкам с записью.
Сводка
GET /api/v2/analytics/overview
{
"ok": true,
"data": {
"period": { "from": "2026-09-19T00:00:00.000Z", "to": "2026-10-19T23:59:59.999Z" },
"previousPeriod": { "from": "2026-08-18T00:00:00.000Z", "to": "2026-09-18T23:59:59.999Z" },
"tiles": {
"calls": { "value": 412, "previous": 380, "delta": 8, "deltaUnit": "percent", "unanswered": 37 },
"talk": { "value": 58210, "previous": 61400, "delta": -5, "deltaUnit": "percent", "avgSeconds": 155 },
"transcribed": { "value": 91.2, "previous": 88.0, "delta": 3.2, "deltaUnit": "points", "transcribed": 342, "withRecording": 375 },
"score": { "value": 7.4, "previous": 7.1, "delta": 0.3, "deltaUnit": "absolute", "scoredCalls": 334, "max": 10 }
},
"daily": {
"rows": [{ "day": "2026-10-19", "inCount": 9, "outCount": 6, "inSeconds": 1420, "outSeconds": 800, "unanswered": 2 }],
"peak": { "day": "2026-10-07", "count": 24 },
"averagePerDay": 13.3
},
"funnel": {
"steps": [
{ "key": "all", "count": 412, "share": 100 },
{ "key": "withRecording", "count": 375, "share": 91 },
{ "key": "transcribed", "count": 342, "share": 91.2 },
{ "key": "analysed", "count": 334, "share": 97.7 },
{ "key": "delivered", "count": 310, "share": 92.8 }
],
"hint": { "notTranscribed": 33, "top": [{ "responsibleId": 102, "name": "Мария Орлова", "count": 21, "allowed": false }] }
},
"scores": {
"max": 10,
"buckets": [{ "score": 7, "count": 96 }, { "score": 8, "count": 120 }],
"low": { "threshold": 5, "count": 28, "share": 8.4 }
}
}
}
| Поле | Описание |
|---|---|
tiles.calls | Число звонков; unanswered — из них без ответа |
tiles.talk | Время разговора в секундах; avgSeconds — средняя длительность |
tiles.transcribed | Доля расшифрованных в процентах; transcribed и withRecording — числа, из которых она получена |
tiles.score | Средняя оценка менеджеров, число оценённых звонков и верх шкалы. null, если оценок нет |
daily.rows | Каждый день периода: входящие и исходящие — количество и секунды, звонки без ответа. Дни без звонков присутствуют с нулями |
daily.peak, daily.averagePerDay | День с наибольшим числом звонков и среднее в день |
funnel.steps | Пять шагов: все звонки → с записью → расшифрованы → проанализированы → доставлены вебхуком. share — доля от предыдущего шага в процентах |
funnel.hint | Сколько звонков с записью не расшифровано и у каких сотрудников; allowed — разрешена ли расшифровка звонков этого сотрудника настройками |
scores | Распределение оценок: число звонков на каждую оценку и доля звонков ниже середины шкалы. null, если оценок нет |
Оценка берётся из сценария с ролью manager-score; если такого нет — из любого сценария с resultType: "score".
Сотрудники
GET /api/v2/analytics/managers
Дополнительные параметры
| Параметр | Тип | Описание |
|---|---|---|
sort | string | calls (по умолчанию), name, talk, avg, transcribed |
order | string | asc или desc. По умолчанию desc, для name — asc |
Ответ 200 — массив, по строке на ответственного
{
"ok": true,
"data": [
{
"responsibleId": 101,
"name": "Иван Петров",
"calls": 148,
"inCount": 90,
"outCount": 58,
"talkSeconds": 21300,
"avgSeconds": 158,
"transcribed": 131,
"withRecording": 135,
"transcribedShare": 97,
"score": 7.9,
"scoredCalls": 128,
"allowedForTranscription": true
}
]
}
score — средняя оценка сотрудника, null, если ни один его звонок не оценён. allowedForTranscription — разрешена ли расшифровка его звонков настройками; null, если настроек нет.
Загрузка по часам
GET /api/v2/analytics/hours
{
"ok": true,
"data": {
"period": { "from": "2026-09-19T00:00:00.000Z", "to": "2026-10-19T23:59:59.999Z" },
"timezone": "Europe/Moscow",
"cells": [{ "weekday": 1, "hour": 10, "calls": 31, "unanswered": 4 }],
"peak": { "weekday": 2, "hour": 11, "calls": 38, "unanswered": 6, "unansweredShare": 15.8 },
"hoursRange": { "from": 8, "to": 20 }
}
}
cells содержит все 168 ячеек «день недели × час»: weekday от 1 (понедельник) до 7, hour от 0 до 23. peak — самая загруженная ячейка с долей звонков без ответа. hoursRange — первый и последний час, на которые приходится не меньше 1 % звонков.
Анализ разговоров
GET /api/v2/analytics/insights
Отчёт по содержанию разговоров: тон клиента, темы, возражения и итоги. Данные появляются для звонков, расшифрованных после включения анализа.
Поле data | Описание |
|---|---|
analysedCalls | Сколько звонков периода проанализировано |
tone.total | Три класса тона — positive, neutral, negative: count, share и delta в пунктах к прошлому периоду |
tone.weekly | По неделям периода: число звонков каждого тона и negativeShare |
leaders | Лидеры по трём критериям — score (оценка), agreements (договорённости), positive (позитивный тон): minimumCalls — порог участия, leader — карточка лидера, rating — рейтинг |
topics | Темы: topicId, name, calls, share, разбивка по тону и delta к прошлому периоду |
objections | callsWithObjectionsShare — доля звонков с возражениями, handledShare — доля отработанных, items — по каждому коду: count, handled, handledShare |
outcomes | items — каждый итог с подписью, числом и долей; agreementShare — доля договорённостей |
Коды возражений: price (цена), found_cheaper (нашли дешевле), think (нужно подумать), timing (не вовремя), no_budget (нет бюджета), other.
Итоги разговора: agreed (договорились), visit_scheduled (назначена встреча), callback (перезвонить), refusal (отказ), none.
Темы
Темы разговоров хранятся в словаре аккаунта. Пока активных тем меньше 15, новые добавляются автоматически; после этого разговоры относятся только к существующим темам.
Словарь тем
GET /api/v2/analytics/insights/topics?amocrmId={amocrmId}
{
"ok": true,
"data": [{ "topicId": 3, "name": "Сроки доставки", "active": true, "createdAt": "2026-09-20T10:00:00.000Z" }]
}
Возвращает все темы аккаунта, включая выключенные.
Карточка темы
GET /api/v2/analytics/insights/topics/{topicId}
Принимает общие параметры.
{
"ok": true,
"data": {
"topicId": 3,
"name": "Сроки доставки",
"calls": 46,
"example": { "quote": "Мне обещали привезти ещё в пятницу", "responsibleName": "Иван Петров", "date": "2026-10-18T09:12:00.000Z", "type": "call_in" },
"topManagers": [{ "responsibleId": 101, "name": "Иван Петров", "count": 19 }],
"outcomes": [{ "outcome": "callback", "label": "Перезвонить", "count": 21, "share": 45.7 }]
}
}
example — последняя цитата клиента по теме (до 200 символов), topManagers — трое сотрудников, которые обсуждают тему чаще всего, outcomes — чем заканчиваются такие разговоры. Ошибка 404 — темы нет.
Изменить тему
PATCH /api/v2/analytics/insights/topics/{topicId}
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
amocrmId обязательное | int | Аккаунт amoCRM |
name | string | Новое название, до 64 символов, уникальное в аккаунте |
active | bool | Включить или выключить тему |
Нужно передать name, active или оба. Выключенная тема сразу пропадает из отчёта и больше не присваивается новым разговорам; уже проанализированные звонки сохраняют её.
Ответ 200 — обновлённая тема. Ошибки: 400 — неверное поле; 404 — темы нет; 409 — название занято или уже включено 15 тем.
Настройки анализа разговоров
Анализ разговоров выключен по умолчанию и является платной функцией: каждый расшифрованный звонок дополнительно обрабатывается моделью ИИ.
Получить настройки анализа
GET /api/v2/analytics/insights/settings?amocrmId={amocrmId}
{
"ok": true,
"data": {
"enabled": false,
"model": "gpt-6-luna",
"estimatedCostUsdPerCall": 0.0005,
"tokenOwner": "welbex",
"backlog": { "calls": 342, "from": "2026-09-19T11:00:00.000Z", "to": "2026-10-19T11:00:00.000Z" }
}
}
| Поле | Описание |
|---|---|
enabled | Включён ли анализ |
model, estimatedCostUsdPerCall | Модель и оценка стоимости одного звонка в долларах |
tokenOwner | Чьим ключом ИИ оплачивается анализ: client — ключом аккаунта, welbex — ключом сервиса |
backlog | Расшифрованные звонки за последние 30 дней, которые ещё не проанализированы |
Включить или выключить анализ
PATCH /api/v2/analytics/insights/settings
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
amocrmId обязательное | int | Аккаунт amoCRM |
enabled обязательное | bool | Включить или выключить |
backfillDays | int | От 1 до 366. Вместе с enabled: true — проанализировать уже расшифрованные звонки за столько дней |
После включения анализируются звонки, расшифрованные с этого момента. Прошлые звонки обрабатываются только при backfillDays: от новых к старым, не больше 5 000 звонков за запрос, по той же цене за звонок. Повторный запрос не ставит звонок в очередь дважды.
Ответ 200
{
"ok": true,
"data": {
"enabled": true,
"backfill": { "queued": 342, "from": "2026-09-19T11:00:00.000Z", "to": "2026-10-19T11:00:00.000Z" }
}
}
backfill равен null, если backfillDays не передан.