ThunderPhone 2.0 уже доступен.Самостоятельное подключение — от 2 центов/мин.Читать анонс

Webhooks

Каталог событий

Все типы событий вебхуков, которые отправляет ThunderPhone.

Каждое тело вебхука содержит поле type, значение которого — один из типов событий на этой странице. Когда вы подписываетесь на эндпоинт, массив events должен содержать нужные вам типы событий (или быть пустым, чтобы подписаться на всё — за исключением событий каждого хода telephony.turn / web.turn, которые доставляются только на эндпоинты, явно указывающие их).

Эти события передаются в двух стилях:

  • Доставки на эндпоинт всегда являются неблокирующими уведомлениями с повторными попытками: ответьте любым кодом 2xx; конверт содержит event_id для дедупликации.
  • Блокирующие обмены выполняются только через устаревший вебхук с одним URL: запрос конфигурации telephony.incoming / web.incoming (номера в режиме вебхука и ключи виджета, тайм-аут 10 с) и диспетчеризация инструментов в режиме вебхука. Ваш ответ влияет на текущий звонок.

Примеры полезных нагрузок ниже показывают конверт эндпоинта в порядке передачи (ключи отсортированы по алфавиту: data, event_id, type); устаревшие доставки содержат те же data без event_id.

События звонков

telephony.incoming

Отправляется, когда входящий звонок поступает на один из ваших номеров телефона. Доставки на конечную точку являются уведомлениями без ожидания ответа и отправляются для каждого входящего звонка, независимо от того, настроен ли номер для агента или вебхука. Номера без назначенного агента дополнительно получают блокирующий запрос конфигурации на устаревший вебхук — полную схему запроса и ответа см. в разделе telephony.incoming / web.incoming.

{
  "data": {
    "call_id": 987654321,
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  },
  "event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
  "type": "telephony.incoming"
}

telephony.complete

Отправляется при завершении входящего или исходящего телефонного звонка. Неблокирующее. Включает расшифровку, URL записи при наличии и сводку по тарификации. Схему полезной нагрузки см. в разделе telephony.complete / web.complete.

telephony.tool

Отправляется после вызова в телефонном звонке инструмента функции. Неблокирующее уведомление для аудита — к моменту доставки этого события инструмент уже выполнен; оно охватывает ваши собственные инструменты функций, но не встроенные инструменты, инструменты базы знаний, подключения приложений или инструменты MCP.

{
  "data": {
    "arguments": { "date": "2026-04-21" },
    "call_id": 987654321,
    "from_number": "+14155550199",
    "response": {
      "response": { "available_slots": ["9:00 AM", "2:00 PM"] },
      "status": 200
    },
    "to_number": "+15551234567",
    "tool_name": "search_appointments"
  },
  "event_id": "1f0a7c3e-52d4-4a0e-8f4b-b1a6a1c0d9e2",
  "type": "telephony.tool"
}

response — это результат выполнения: {"status": <http status>, "response": <your endpoint's JSON>} при успехе или {"status": <status>, "error": "<message>"} при ошибке.

telephony.turn

Отправляется во время активного звонка, один раз для каждого содержащего речь хода по мере его возникновения — для произнесённых ответов агента и расшифрованных ходов звонящего. Позволяет отслеживать разговор в реальном времени через обычные вебхуки вместо опроса GET /v1/calls/{call_id}/transcript. Неблокирующее.

{
  "data": {
    "call_id": 987654321,
    "entry_type": "completion",
    "from_number": "+14155550199",
    "position": 7,
    "role": "assistant",
    "start_ms": 15200,
    "text": "How many employees does your company have?",
    "to_number": "+15551234567"
  },
  "event_id": "8d3f5a2c-7b1e-4c9a-b6d0-2e4f6a8c0d1e",
  "type": "telephony.turn"
}
ПолеТипОписание
positionintegerИндекс хода в истории звонка — стабильный идентификатор для сортировки
rolestringassistant (речь агента) или user (речь звонящего)
textstringТекст расшифровки хода, известный на момент отправки
entry_typestringБазовый тип записи истории: completion (агент) или user_turn / span (звонящий)
start_ms, end_msintegerСмещения аудио в мс с начала звонка; присутствуют только если время воспроизведения уже было известно на момент отправки

web.incoming

Эквивалент telephony.incoming для веб-канала, отправляемый при запуске сеанса веб-виджета или тестового звонка с микрофона в конструкторе. Доставки на конечную точку являются уведомлениями без ожидания ответа для каждого веб-сеанса. Публикуемые ключи в mode="webhook" дополнительно получают блокирующий запрос конфигурации на устаревший вебхук — этот блокирующий запрос имеет другую структуру (origin_domain, publishable_key_prefix; без номеров телефона). См. telephony.incoming / web.incoming.

{
  "data": {
    "call_id": 987654322,
    "from_number": "web",
    "origin_domain": "https://example.com",
    "publishable_key_prefix": "pk_live_a1b2",
    "to_number": "+15551234567"
  },
  "event_id": "9a2b4c6d-8e0f-4a1b-9c2d-3e4f5a6b7c8d",
  "type": "web.incoming"
}

from_number всегда содержит литерал "web". Для сеансов виджета в режиме вебхука to_number пуст (номер агента для сеанса назначается после конфигурации); для тестовых звонков с микрофона в конструкторе пусты origin_domain и publishable_key_prefix.

web.complete

Эквивалент telephony.complete для веб-канала, охватывающий звонки веб-виджета (direction: "web") и тестовые звонки с микрофона в конструкторе (direction: "test"). Неблокирующее. Имеет ту же структуру полезной нагрузки, что и telephony.complete, с дополнительным origin_domain и значением "web" в from_number.

web.tool

Эквивалент telephony.tool для веб-канала. data содержит origin_domain вместо from_number / to_number.

web.turn

Эквивалент telephony.turn для веб-канала, охватывающий звонки веб-виджета и тестовые звонки с микрофона в конструкторе. Имеет ту же структуру полезной нагрузки, но содержит origin_domain вместо from_number / to_number. Как и telephony.turn, требует явной подписки — оно никогда не доставляется через пустой массив events.


События голосов

Создание пользовательского голоса выполняется асинхронно. Эти неблокирующие события позволяют реагировать на конечный результат вместо опроса эндпоинта сведений о клоне.

voice.ready

Отправляется, когда пользовательский голос завершает обработку и может быть назначен агенту.

{
  "data": {
    "voice": {
      "created_at": "2026-07-30T14:12:08.317Z",
      "display_name": "Support voice",
      "failure_reason": "",
      "gender": "female",
      "id": "cv_2f6f90b0e9a34ee8b39be7d1",
      "language": "en",
      "name": "custom:cv_2f6f90b0e9a34ee8b39be7d1",
      "status": "ready",
      "updated_at": "2026-07-30T14:13:31.605Z"
    }
  },
  "event_id": "2d5f0a61-e9b5-4a3c-b684-29d7d9e4b214",
  "type": "voice.ready"
}

voice.failed

Отправляется, когда обработка пользовательского голоса завершается необратимой ошибкой.

{
  "data": {
    "reason": "audio sample could not be processed",
    "voice": {
      "created_at": "2026-07-30T14:12:08.317Z",
      "display_name": "Support voice",
      "failure_reason": "audio sample could not be processed",
      "gender": "female",
      "id": "cv_2f6f90b0e9a34ee8b39be7d1",
      "language": "en",
      "name": "custom:cv_2f6f90b0e9a34ee8b39be7d1",
      "status": "failed",
      "updated_at": "2026-07-30T14:13:31.605Z"
    }
  },
  "event_id": "3493e985-1a75-4f77-a10a-e74af440cd31",
  "type": "voice.failed"
}
ПолеТипОписание
voice.idstringПубличный идентификатор пользовательского голоса
voice.namestringЗначение голоса агента в формате custom:<public_id>
voice.display_namestringНазвание голоса для организации
voice.languagestringКод единственного языка клона
voice.genderstringmale, female или пустая строка
voice.statusstringready для voice.ready; failed для voice.failed
voice.failure_reasonstringПусто при успехе; сведения об ошибке обработки при сбое
voice.created_at, voice.updated_attimestampМетки времени ISO 8601
reasonstringСведения об ошибке; присутствует только в voice.failed

События качества

call.graded

Отправляется при завершении запуска оценки звонка ИИ. Не блокирует выполнение.

{
  "data": {
    "call_id": 987654321,
    "grade": {
      "call_outcome": "success",
      "created_at": "2026-04-20T18:25:11.002Z",
      "detected_issues": [],
      "graded_at": "2026-04-20T18:25:11.002Z",
      "grader_model": "heuristic-v1",
      "id": 5512,
      "score": 92,
      "status": "completed",
      "summary": "Caller asked about their policy and got a full answer…"
    }
  },
  "event_id": "7c1d2e3f-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
  "type": "call.graded"
}
ПолеТипОписание
grade.idintegerИдентификатор оценки
grade.scoreinteger | null0–100
grade.call_outcomestringsuccess, failure, unknown или no_conversation
grade.summarystringКраткое описание в одном абзаце
grade.detected_issuesarrayСтроки с проблемами, найденными оценщиком
grade.statusstringВсегда completed — события отправляются только для завершённых запусков
grade.grader_modelstringМодель оценщика, сформировавшая результат (например, heuristic-v1)
grade.graded_at, grade.created_attimestamp

issue.reported

Отправляется при создании отчёта о проблеме — либо пользователем в панели управления (source: "user"), либо автоматически при оценке звонка (source: "system"). Не блокирует выполнение.

{
  "data": {
    "call_id": 987654321,
    "issue_report": {
      "created_at": "2026-04-20T18:25:11.002Z",
      "description": "Five-second silence before responding to the main question.",
      "id": 4321,
      "severity": "warning",
      "source": "system",
      "status": "open",
      "title": "Agent paused too long"
    }
  },
  "event_id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
  "type": "issue.reported"
}
ПолеТипОписание
issue_report.severitystringcritical, warning или info
issue_report.statusstringopen или resolved
issue_report.sourcestringuser (создан пользователем в панели управления) или system (создан при оценке)

События тестовых звонков

test-call.completed

Отправляется, когда запуск тестового звонка достигает конечного статуса — completed или failed, включая запуски, завершившиеся ошибкой при старте и не создавшие звонок. Не блокирует выполнение. Полезно для подключения пакетных запусков CI к вашим системам чатов и уведомлений.

{
  "data": {
    "test_call_run": {
      "call_id": 987654321,
      "completed_at": "2026-04-20T18:25:04.822Z",
      "error_message": "",
      "id": 7110,
      "status": "completed",
      "target_id": 12,
      "target_type": "agent"
    }
  },
  "event_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
  "type": "test-call.completed"
}
ПолеТипОписание
test_call_run.target_typestringagent или phone_number
test_call_run.target_idintegerИдентификатор агента или номера телефона, на который был нацелен запуск, в соответствии с target_type
test_call_run.statusstringcompleted или failed
test_call_run.call_idinteger | nullnull, если запуск завершился ошибкой до совершения звонка
test_call_run.error_messagestringПусто при успешном выполнении

События оповещений

alert.triggered

Отправляется, когда правило оповещения с включённым каналом Доставка в вебхуки разработчика пересекает свой порог. Не блокирует выполнение. Правило срабатывает один раз, а затем соблюдает период ожидания, поэтому при длительном нарушении создаётся одно событие на каждое окно периода ожидания.

{
  "data": {
    "comparator": "lt",
    "event_id": "b8e6a1d4-2c3f-4a5b-9c8d-7e6f5a4b3c2d",
    "fired_at": "2026-04-20T18:00:00+00:00",
    "metric": "success_rate",
    "metric_value": 71.4,
    "rule_id": "d2c3b4a5-6f7e-4d8c-9b0a-1c2d3e4f5a6b",
    "rule_name": "Success rate below 80%",
    "threshold": 80.0,
    "window_hours": 24
  },
  "event_id": "4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f7a",
  "type": "alert.triggered"
}
ПолеТипОписание
event_iddata)UUIDИдентификатор срабатывания оповещения — отличается от event_id доставки в оболочке события
rule_id, rule_nameUUID, строкаСработавшее правило
metricстрокаsuccess_rate, failure_rate, avg_score, call_volume или suite_regression
comparatorстрокаlt, lte, gt или gte
metric_valueчислоЗначение метрики за окно, когда сработало правило
thresholdчислоНастроенный порог
window_hoursцелое числоПредшествующее окно оценки
fired_atвременная метка

Сведения о создании правил, метриках, периодах ожидания и каналах email / Slack см. в руководстве по оповещениям.


Связанные материалы