> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thunderphone.com/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

Каждое тело вебхука содержит поле `type`, значение которого соответствует одному из типов событий на этой странице. Когда вы подписываетесь на [конечную точку](/ru/webhooks/endpoints), массив `events` должен содержать нужные типы событий (или быть пустым для подписки на все события).

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

* **Доставки в конечную точку** всегда являются **неблокирующими** уведомлениями с [повторными попытками](/ru/webhooks/overview): отвечайте любым статусом 2xx; конверт содержит `event_id` для дедупликации.
* **Блокирующие** обмены выполняются только через [устаревший вебхук с одним URL](/ru/webhooks/overview): запрос конфигурации [`telephony.incoming` / `web.incoming`](/ru/webhooks/call-incoming) (номера в режиме вебхука и ключи виджетов, тайм-аут 10 с) и отправка инструментов в режиме вебхука [tool dispatch](/ru/tools/overview). Ваш ответ определяет ход текущего звонка.

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

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

### `telephony.incoming`

Отправляется, когда входящий звонок поступает на один из ваших
[номеров телефона](/api-reference/phone-numbers). Доставки на эндпоинт — это
уведомления без ожидания ответа, отправляемые для **каждого** входящего звонка независимо
от того, настроен ли для номера агент или вебхук. Номера без
назначенного агента дополнительно получают **блокирующий** запрос конфигурации
в устаревшем вебхуке — полную схему запроса и ответа см. в
[`telephony.incoming` / `web.incoming`](/ru/webhooks/call-incoming).

```json theme={null}
{
  "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`](/ru/webhooks/call-complete).

### `telephony.tool`

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

```json theme={null}
{
  "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>"}` при ошибке.

### `web.incoming`

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

```json theme={null}
{
  "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`](/ru/webhooks/call-complete), с добавлением `origin_domain`;
значение `from_number` устанавливается в `"web"`.

<Note>
  В устаревшем вебхуке с единым URL тестовые звонки с микрофона в конструкторе
  исторически передаются как `telephony.complete` — там только звонки с `direction:
      "web"` используют тип `web.complete`. Система эндпоинтов
  сопоставляет и веб-звонки, и тестовые звонки с `web.*`. Исторические полезные нагрузки могут
  содержать устаревшие значения `direction`: `widget` или `mic`.
</Note>

### `web.tool`

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

***

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

### `call.graded`

Отправляется при завершении [запуска ИИ-оценки](/api-reference/calls#ai-call-grading)
для звонка. Не блокирует выполнение.

```json theme={null}
{
  "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.id`                            | integer         | ID оценки                                                                 |
| `grade.score`                         | integer \| null | 0–100                                                                     |
| `grade.call_outcome`                  | string          | `success`, `failure`, `unknown` или `no_conversation`                     |
| `grade.summary`                       | string          | Резюме в один абзац                                                       |
| `grade.detected_issues`               | array           | Строки с проблемами, найденными оценщиком                                 |
| `grade.status`                        | string          | Всегда `completed` — события отправляются только для завершённых запусков |
| `grade.grader_model`                  | string          | Оценщик, сформировавший результат (например, `heuristic-v1`)              |
| `grade.graded_at`, `grade.created_at` | timestamp       |                                                                           |

<Note>
  Звонок может быть оценён несколько раз — за быстрой эвристической оценкой
  часто следует оценка полной моделью, когда становится доступна запись,
  также возможна повторная оценка вручную. Каждый завершённый запуск
  отправляет собственное событие `call.graded`; считайте последнюю дату
  `graded_at` источником достоверных данных.
</Note>

### `issue.reported`

Отправляется при создании [отчёта о проблеме](/api-reference/issue-reports) —
либо пользователем из панели управления (`source: "user"`), либо
автоматически при оценке звонка (`source: "system"`). Не блокирует выполнение.

```json theme={null}
{
  "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.severity` | string | `critical`, `warning` или `info`                                         |
| `issue_report.status`   | string | `open` или `resolved`                                                    |
| `issue_report.source`   | string | `user` (отправлен из панели управления) или `system` (создан при оценке) |

<Note>
  Повторная оценка звонка заново формирует созданные системой отчёты о проблемах,
  из-за чего для повторно созданных отчётов снова отправляется `issue.reported`.
  Выполняйте дедупликацию по `call_id` + `title`, если вам нужно только одно
  уведомление для каждой исходной проблемы.
</Note>

***

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

### `test-call.completed`

Отправляется, когда
[запуск тестового звонка](/api-reference/test-calls#test-call-run-object)
достигает конечного статуса — `completed` или `failed`, включая запуски,
которые завершились ошибкой при запуске и не создали звонок. Не блокирует выполнение. Полезно
для интеграции пакетных запусков CI с вашими системами чатов и уведомлений.

```json theme={null}
{
  "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_type`   | string          | `agent` или `phone_number`                                                                   |
| `test_call_run.target_id`     | integer         | ID агента или номера телефона, на который был нацелен запуск, в соответствии с `target_type` |
| `test_call_run.status`        | string          | `completed` или `failed`                                                                     |
| `test_call_run.call_id`       | integer \| null | `null`, если запуск завершился ошибкой до совершения звонка                                  |
| `test_call_run.error_message` | string          | Пусто при успехе                                                                             |

***

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

### `alert.triggered`

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

```json theme={null}
{
  "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_id` (в `data`)  | UUID            | Идентификатор **срабатывания** оповещения — отличается от `event_id` доставки в оболочке события |
| `rule_id`, `rule_name` | UUID, строка    | Сработавшее правило                                                                              |
| `metric`               | строка          | `success_rate`, `failure_rate`, `avg_score`, `call_volume` или `suite_regression`                |
| `comparator`           | строка          | `lt`, `lte`, `gt` или `gte`                                                                      |
| `metric_value`         | число           | Значение метрики за окно на момент срабатывания правила                                          |
| `threshold`            | число           | Настроенный порог                                                                                |
| `window_hours`         | целое число     | Скользящее окно оценки                                                                           |
| `fired_at`             | временная метка |                                                                                                  |

См. [руководство по оповещениям](/ru/guides/alerts), чтобы создавать правила, настраивать метрики,
периоды ожидания и каналы по email / Slack.

***

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

<CardGroup cols={2}>
  <Card title="telephony.incoming / web.incoming" icon="phone" href="/ru/webhooks/call-incoming">
    Блокирующая полезная нагрузка входящего вызова, на которую необходимо ответить.
  </Card>

  <Card title="telephony.complete / web.complete" icon="phone-slash" href="/ru/webhooks/call-complete">
    Расшифровка и метрики после вызова.
  </Card>

  <Card title="Конечные точки вебхуков" icon="bolt" href="/ru/webhooks/endpoints">
    Подпишите URL на подмножество этих событий.
  </Card>

  <Card title="Инструменты функций" icon="screwdriver-wrench" href="/ru/tools/overview">
    Как создаются события `telephony.tool` / `web.tool`.
  </Card>
</CardGroup>
