> ## 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.

# Catálogo de eventos

> Todos los tipos de eventos de webhook que emite ThunderPhone.

Cada cuerpo de webhook tiene un campo `type` cuyo valor es uno de los tipos de evento de esta página. Cuando te suscribes a un [endpoint](/es/webhooks/endpoints), el arreglo `events` debe contener los tipos de evento que quieres recibir (o estar vacío para suscribirte a todos).

Estos eventos se entregan en dos estilos:

* Las **entregas a endpoints** son siempre notificaciones **no bloqueantes** con [reintentos](/es/webhooks/overview): responde con cualquier 2xx; el sobre incluye un `event_id` para deduplicar.
* Los intercambios **bloqueantes** se ejecutan solo en el [webhook heredado de URL única](/es/webhooks/overview): la solicitud de configuración [`telephony.incoming` / `web.incoming`](/es/webhooks/call-incoming) (números en modo webhook y claves de widget, tiempo de espera de 10 s) y el [despacho de herramientas](/es/tools/overview) en modo webhook. Tu respuesta da forma a la llamada en vivo.

Las cargas útiles de ejemplo a continuación muestran el sobre del endpoint en su orden de transmisión (claves ordenadas alfabéticamente: `data`, `event_id`, `type`); las entregas heredadas incluyen los mismos `data` sin `event_id`.

## Eventos de llamadas

### `telephony.incoming`

Se envía cuando una llamada entrante llega a uno de tus
[números de teléfono](/api-reference/phone-numbers). Las entregas a endpoints son
notificaciones de envío y olvido enviadas para **cada** llamada entrante, sin importar
si el número está configurado con un agente o con un webhook. Los números sin
un agente asignado reciben además la solicitud de configuración **bloqueante**
en el webhook heredado; consulta
[`telephony.incoming` / `web.incoming`](/es/webhooks/call-incoming) para
ver el esquema completo de solicitud/respuesta.

```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`

Se envía cuando finaliza una llamada de telefonía entrante o saliente. No bloqueante.
Incluye la transcripción completa, la URL de la grabación y el resumen de facturación. Consulta
[`telephony.complete` / `web.complete`](/es/webhooks/call-complete) para
ver el esquema de la carga útil.

### `telephony.tool`

Se envía después de que una llamada de telefonía invoca una
[herramienta de función](/es/tools/overview). Notificación de auditoría no bloqueante:
la herramienta ya se ejecutó cuando se entrega este evento; cubre
tus propias herramientas de función (no las herramientas integradas, de base de conocimientos, de conexión de aplicaciones
ni 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` es el resultado ejecutado: `{"status": <http status>,
"response": <your endpoint's JSON>}` en caso de éxito, o
`{"status": <status>, "error": "<message>"}` en caso de error.

### `web.incoming`

El equivalente de `telephony.incoming` para el canal web, enviado cuando inicia una
sesión de [widget web](/es/widget/overview) o una llamada de prueba de micrófono del builder.
Las entregas a endpoints son de envío y olvido para cada sesión web.
Las claves publicables en `mode="webhook"` reciben además la
solicitud de configuración **bloqueante** en el webhook heredado; esa
solicitud bloqueante tiene una estructura diferente (`origin_domain`,
`publishable_key_prefix`; sin números de teléfono). Consulta
[`telephony.incoming` / `web.incoming`](/es/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` siempre es el literal `"web"`. Para sesiones de widgets en modo webhook,
`to_number` está vacío (el número del agente de la sesión se asigna
después de la configuración); para llamadas de prueba de micrófono del builder, `origin_domain` y
`publishable_key_prefix` están vacíos.

### `web.complete`

El equivalente de `telephony.complete` para el canal web, que cubre llamadas de
widgets web (`direction: "web"`) y llamadas de prueba de micrófono del builder
(`direction: "test"`). No bloqueante. Tiene la misma estructura de carga útil que
[`telephony.complete`](/es/webhooks/call-complete), además de `origin_domain`,
con `from_number` establecido en `"web"`.

<Note>
  En el webhook heredado de URL única, las llamadas de prueba de micrófono del builder
  históricamente se reportan como `telephony.complete`; solo las llamadas con `direction:
      "web"` usan allí el tipo `web.complete`. El sistema de endpoints
  asigna tanto las llamadas web como las de prueba a `web.*`. Las cargas útiles históricas pueden
  contener los valores heredados de `direction` `widget` o `mic`.
</Note>

### `web.tool`

El equivalente de `telephony.tool` para el canal web. `data` contiene
`origin_domain` en lugar de `from_number` / `to_number`.

***

## Eventos de calidad

### `call.graded`

Se envía cada vez que se completa una [ejecución de evaluación con IA](/api-reference/calls#ai-call-grading)
para una llamada. No bloqueante.

```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"
}
```

| Campo                                 | Tipo            | Descripción                                                      |
| ------------------------------------- | --------------- | ---------------------------------------------------------------- |
| `grade.id`                            | integer         | ID de la evaluación                                              |
| `grade.score`                         | integer \| null | 0–100                                                            |
| `grade.call_outcome`                  | string          | `success`, `failure`, `unknown` o `no_conversation`              |
| `grade.summary`                       | string          | Resumen de un párrafo                                            |
| `grade.detected_issues`               | array           | Cadenas de problemas detectados por el evaluador                 |
| `grade.status`                        | string          | Siempre `completed` — solo se envían ejecuciones finalizadas     |
| `grade.grader_model`                  | string          | Qué evaluador produjo el resultado (por ejemplo, `heuristic-v1`) |
| `grade.graded_at`, `grade.created_at` | timestamp       |                                                                  |

<Note>
  Una llamada puede evaluarse más de una vez — una evaluación heurística rápida suele
  ir seguida de una evaluación completa con un modelo cuando la grabación está
  disponible, y es posible volver a evaluar manualmente. Cada ejecución completada
  envía su propio evento `call.graded`; considera el valor más reciente de `graded_at`
  como la fuente autorizada.
</Note>

### `issue.reported`

Se envía cuando se crea un [reporte de problema](/api-reference/issue-reports) —
ya sea que un usuario lo presente desde el dashboard (`source: "user"`) o
que la evaluación de llamadas lo genere automáticamente (`source: "system"`). No bloqueante.

```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"
}
```

| Campo                   | Tipo   | Descripción                                                                  |
| ----------------------- | ------ | ---------------------------------------------------------------------------- |
| `issue_report.severity` | string | `critical`, `warning` o `info`                                               |
| `issue_report.status`   | string | `open` o `resolved`                                                          |
| `issue_report.source`   | string | `user` (presentado desde el dashboard) o `system` (creado por la evaluación) |

<Note>
  Volver a evaluar una llamada reconstruye sus reportes de problemas generados por el sistema,
  lo que vuelve a enviar `issue.reported` para los reportes recreados. Elimina duplicados según
  `call_id` + `title` si solo quieres una notificación por cada problema subyacente.
</Note>

***

## Eventos de llamadas de prueba

### `test-call.completed`

Se envía cuando una
[ejecución de llamada de prueba](/api-reference/test-calls#test-call-run-object)
alcanza un estado final — `completed` o `failed`, incluidas las ejecuciones
que fallaron al iniciarse y nunca generaron una llamada. No bloqueante. Útil
para integrar ejecuciones de CI por lotes con tus sistemas de chat/notificaciones.

```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"
}
```

| Campo                         | Tipo            | Descripción                                                                                   |
| ----------------------------- | --------------- | --------------------------------------------------------------------------------------------- |
| `test_call_run.target_type`   | string          | `agent` o `phone_number`                                                                      |
| `test_call_run.target_id`     | integer         | El ID del agente o del número de teléfono al que se dirigió la ejecución, según `target_type` |
| `test_call_run.status`        | string          | `completed` o `failed`                                                                        |
| `test_call_run.call_id`       | integer \| null | `null` cuando la ejecución falló antes de realizar una llamada                                |
| `test_call_run.error_message` | string          | Vacío en caso de éxito                                                                        |

***

## Eventos de alerta

### `alert.triggered`

Se envía cuando una [regla de alerta](/es/guides/alerts) con el canal **Entregar a
webhooks de desarrollador** habilitado supera su umbral.
No bloqueante. Una regla se activa una vez y luego respeta su período de espera, por lo que una
infracción sostenida produce un evento por cada ventana de espera.

```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"
}
```

| Campo                  | Tipo            | Descripción                                                                        |
| ---------------------- | --------------- | ---------------------------------------------------------------------------------- |
| `event_id` (en `data`) | UUID            | El ID de **activación** de la alerta, distinto del `event_id` de entrega del sobre |
| `rule_id`, `rule_name` | UUID, cadena    | La regla que se activó                                                             |
| `metric`               | cadena          | `success_rate`, `failure_rate`, `avg_score`, `call_volume` o `suite_regression`    |
| `comparator`           | cadena          | `lt`, `lte`, `gt` o `gte`                                                          |
| `metric_value`         | número          | El valor de la métrica durante la ventana cuando se activó la regla                |
| `threshold`            | número          | El umbral configurado                                                              |
| `window_hours`         | entero          | Ventana de evaluación retrospectiva                                                |
| `fired_at`             | marca de tiempo |                                                                                    |

Consulta la [guía de alertas](/es/guides/alerts) para crear reglas, métricas,
períodos de espera y los canales de correo electrónico / Slack.

***

## Relacionado

<CardGroup cols={2}>
  <Card title="telephony.incoming / web.incoming" icon="phone" href="/es/webhooks/call-incoming">
    La carga útil bloqueante de llamadas entrantes a la que debes responder.
  </Card>

  <Card title="telephony.complete / web.complete" icon="phone-slash" href="/es/webhooks/call-complete">
    Transcripción y métricas posteriores a la llamada.
  </Card>

  <Card title="Endpoints de webhook" icon="bolt" href="/es/webhooks/endpoints">
    Suscribe una URL a un subconjunto de estos eventos.
  </Card>

  <Card title="Herramientas de funciones" icon="screwdriver-wrench" href="/es/tools/overview">
    Cómo se generan los eventos `telephony.tool` / `web.tool`.
  </Card>
</CardGroup>
