Аналитика

Отчёты по звонкам аккаунта за период. Все методы — GET /api/v2/analytics/….

Общие параметры

ПараметрТипОписание
amocrmId обязательныйintАккаунт amoCRM
from, tostringПериод, дата или дата со временем в ISO. По умолчанию последние 30 дней; не длиннее 366 дней. to без времени включает весь этот день
timezonestringЧасовой пояс IANA (Europe/Moscow), по которому считаются дни и часы. По умолчанию пояс аккаунта amoCRM
typestring или списокcall_in, call_out
responsibleIdint или списокОтветственные пользователи 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

Дополнительные параметры

ПараметрТипОписание
sortstringcalls (по умолчанию), name, talk, avg, transcribed
orderstringasc или 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 к прошлому периоду
objectionscallsWithObjectionsShare — доля звонков с возражениями, handledShare — доля отработанных, items — по каждому коду: count, handled, handledShare
outcomesitems — каждый итог с подписью, числом и долей; 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
namestringНовое название, до 64 символов, уникальное в аккаунте
activeboolВключить или выключить тему

Нужно передать 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Включить или выключить
backfillDaysintОт 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 не передан.