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

# Gebeurteniscatalogus

> Alle webhook-gebeurtenistypen die ThunderPhone verstuurt.

Elke webhookbody heeft een veld `type` waarvan de waarde een van de
gebeurtenistypen op deze pagina is. Wanneer je je abonneert op een
[endpoint](/nl/webhooks/endpoints), moet de array `events` de
gewenste gebeurtenistypen bevatten (of leeg zijn om je op alles te abonneren).

Twee bezorgstijlen dragen deze gebeurtenissen:

* **Endpointleveringen** zijn altijd **niet-blokkerende** meldingen
  met [nieuwe pogingen](/nl/webhooks/overview): reageer met
  een willekeurige 2xx; de envelop bevat een `event_id` om op te dedupliceren.
* **Blokkerende** uitwisselingen vinden alleen plaats via de
  [verouderde webhook met één URL](/nl/webhooks/overview): het
  configuratieverzoek [`telephony.incoming` / `web.incoming`](/nl/webhooks/call-incoming)
  (nummers in webhookmodus en widgetsleutels, time-out van 10 s) en toolverzending
  in webhookmodus via
  [tool dispatch](/nl/tools/overview). Je reactie
  bepaalt het live gesprek.

De onderstaande voorbeeldpayloads tonen de endpointenvelop in de
verzendvolgorde (sleutels alfabetisch gesorteerd: `data`, `event_id`, `type`);
verouderde leveringen bevatten dezelfde `data` zonder `event_id`.

## Oproepgebeurtenissen

### `telephony.incoming`

Verzonden wanneer een inkomende oproep een van je
[telefoonnummers](/api-reference/phone-numbers) bereikt. Endpointleveringen zijn
fire-and-forgetmeldingen die voor **elke** inkomende oproep worden verzonden, ongeacht
of het nummer voor een agent of webhook is geconfigureerd. Nummers zonder
toegewezen agent ontvangen daarnaast het **blokkerende** configuratieverzoek
op de verouderde webhook — zie
[`telephony.incoming` / `web.incoming`](/nl/webhooks/call-incoming) voor
het volledige aanvraag-/antwoordschema.

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

Verzonden wanneer een inkomende of uitgaande telefonieoproep eindigt. Niet-blokkerend.
Bevat het volledige transcript, de opname-URL en het factureringsoverzicht. Zie
[`telephony.complete` / `web.complete`](/nl/webhooks/call-complete) voor
het payloadschema.

### `telephony.tool`

Verzonden nadat een telefonieoproep een
[functietool](/nl/tools/overview) aanroept. Niet-blokkerende auditmelding —
de tool is al uitgevoerd wanneer deze gebeurtenis wordt afgeleverd; dit betreft
je eigen functietools (geen ingebouwde tools, knowledge-base-, app-connection-
of MCP-tools).

```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` is het uitgevoerde resultaat: `{"status": <http status>,
"response": <your endpoint's JSON>}` bij succes, of
`{"status": <status>, "error": "<message>"}` bij een fout.

### `web.incoming`

Het equivalent van `telephony.incoming` voor het webkanaal, verzonden wanneer een
[webwidget](/nl/widget/overview)-sessie of een microfoontestoproep in de builder
start. Endpointleveringen zijn fire-and-forget voor elke websessie.
Publiceerbare sleutels in `mode="webhook"` ontvangen daarnaast het
**blokkerende** configuratieverzoek op de verouderde webhook — dat
blokkerende verzoek heeft een andere structuur (`origin_domain`,
`publishable_key_prefix`; geen telefoonnummers). Zie
[`telephony.incoming` / `web.incoming`](/nl/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` is altijd de letterlijke waarde `"web"`. Voor webwidgetsessies in
webhookmodus is `to_number` leeg (het agentnummer van de sessie wordt
na configuratie toegewezen); voor microfoontestoproepen in de builder zijn
`origin_domain` en `publishable_key_prefix` leeg.

### `web.complete`

Het equivalent van `telephony.complete` voor het webkanaal, met webwidgetoproepen
(`direction: "web"`) en microfoontestoproepen in de builder
(`direction: "test"`). Niet-blokkerend. Dezelfde payloadstructuur als
[`telephony.complete`](/nl/webhooks/call-complete), plus `origin_domain`,
waarbij `from_number` is ingesteld op `"web"`.

<Note>
  Op de verouderde webhook met één URL worden microfoontestoproepen in de builder
  historisch gerapporteerd als `telephony.complete` — alleen oproepen met `direction:
      "web"` gebruiken daar het type `web.complete`. Het endpointsysteem
  wijst zowel web- als testoproepen toe aan `web.*`. Historische payloads kunnen
  de verouderde `direction`-waarden `widget` of `mic` bevatten.
</Note>

### `web.tool`

Het equivalent van `telephony.tool` voor het webkanaal. De `data` bevat
`origin_domain` in plaats van `from_number` / `to_number`.

***

## Kwaliteitsgebeurtenissen

### `call.graded`

Verzonden wanneer een [AI-beoordelingsrun](/api-reference/calls#ai-call-grading)
voor een oproep is voltooid. Niet-blokkerend.

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

| Veld                                  | Type            | Beschrijving                                                              |
| ------------------------------------- | --------------- | ------------------------------------------------------------------------- |
| `grade.id`                            | integer         | Beoordelings-ID                                                           |
| `grade.score`                         | integer \| null | 0–100                                                                     |
| `grade.call_outcome`                  | string          | `success`, `failure`, `unknown` of `no_conversation`                      |
| `grade.summary`                       | string          | Samenvatting van één alinea                                               |
| `grade.detected_issues`               | array           | Probleemreeksen die door de beoordelaar zijn gevonden                     |
| `grade.status`                        | string          | Altijd `completed` — alleen voltooide runs worden verzonden               |
| `grade.grader_model`                  | string          | Welke beoordelaar het resultaat heeft geproduceerd (bijv. `heuristic-v1`) |
| `grade.graded_at`, `grade.created_at` | timestamp       |                                                                           |

<Note>
  Een oproep kan meer dan één keer worden beoordeeld — een snelle heuristische beoordeling wordt
  vaak gevolgd door een volledige modelbeoordeling zodra de opname
  beschikbaar is, en handmatige herbeoordelingen zijn mogelijk. Elke voltooide run
  verzendt zijn eigen `call.graded`-gebeurtenis; beschouw de meest recente `graded_at` als
  leidend.
</Note>

### `issue.reported`

Verzonden wanneer een [probleemrapport](/api-reference/issue-reports) wordt aangemaakt —
ingediend door een gebruiker vanuit het dashboard (`source: "user"`) of
automatisch door oproepbeoordeling (`source: "system"`). Niet-blokkerend.

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

| Veld                    | Type   | Beschrijving                                                                      |
| ----------------------- | ------ | --------------------------------------------------------------------------------- |
| `issue_report.severity` | string | `critical`, `warning` of `info`                                                   |
| `issue_report.status`   | string | `open` of `resolved`                                                              |
| `issue_report.source`   | string | `user` (ingediend vanuit het dashboard) of `system` (aangemaakt door beoordeling) |

<Note>
  Het herbeoordelen van een oproep bouwt de door het systeem gegenereerde probleemrapporten opnieuw op, waardoor
  `issue.reported` opnieuw wordt verzonden voor de opnieuw aangemaakte rapporten. Dedupliqueer op
  `call_id` + `title` als je slechts één melding per onderliggend
  probleem wilt.
</Note>

***

## Gebeurtenissen voor testoproepen

### `test-call.completed`

Verzonden wanneer een
[testoproep-run](/api-reference/test-calls#test-call-run-object)
een eindstatus bereikt — `completed` of `failed`, inclusief runs
die bij het starten zijn mislukt en nooit een oproep hebben gemaakt. Niet-blokkerend. Nuttig
om batch-CI-runs te koppelen aan je chat-/meldingssystemen.

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

| Veld                          | Type            | Beschrijving                                                                                |
| ----------------------------- | --------------- | ------------------------------------------------------------------------------------------- |
| `test_call_run.target_type`   | string          | `agent` of `phone_number`                                                                   |
| `test_call_run.target_id`     | integer         | De agent-ID of telefoonnummer-ID waarop de run was gericht, overeenkomend met `target_type` |
| `test_call_run.status`        | string          | `completed` of `failed`                                                                     |
| `test_call_run.call_id`       | integer \| null | `null` wanneer de run mislukte voordat een oproep werd geplaatst                            |
| `test_call_run.error_message` | string          | Leeg bij succes                                                                             |

***

## Waarschuwingsgebeurtenissen

### `alert.triggered`

Verzonden wanneer een [waarschuwingsregel](/nl/guides/alerts) met het kanaal **Bezorgen aan
developerwebhooks** ingeschakeld de drempelwaarde overschrijdt.
Niet-blokkerend. Een regel wordt één keer geactiveerd en respecteert vervolgens de afkoelperiode, dus een
aanhoudende overschrijding produceert één gebeurtenis per afkoelperiode.

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

| Veld                   | Type             | Beschrijving                                                                                       |
| ---------------------- | ---------------- | -------------------------------------------------------------------------------------------------- |
| `event_id` (in `data`) | UUID             | De **activerings-id** van de waarschuwing — anders dan de `event_id` voor bezorging van de envelop |
| `rule_id`, `rule_name` | UUID, tekenreeks | De regel die werd geactiveerd                                                                      |
| `metric`               | tekenreeks       | `success_rate`, `failure_rate`, `avg_score`, `call_volume` of `suite_regression`                   |
| `comparator`           | tekenreeks       | `lt`, `lte`, `gt` of `gte`                                                                         |
| `metric_value`         | getal            | De waarde van de metriek in het venster toen de regel werd geactiveerd                             |
| `threshold`            | getal            | De geconfigureerde drempelwaarde                                                                   |
| `window_hours`         | geheel getal     | Doorlopend evaluatievenster                                                                        |
| `fired_at`             | tijdstempel      |                                                                                                    |

Zie de [handleiding Waarschuwingen](/nl/guides/alerts) voor het maken van regels, metriekwaarden,
afkoelperiodes en de e-mail- / Slack-kanalen.

***

## Gerelateerd

<CardGroup cols={2}>
  <Card title="telephony.incoming / web.incoming" icon="phone" href="/nl/webhooks/call-incoming">
    De blokkerende payload voor inkomende oproepen waarop je moet reageren.
  </Card>

  <Card title="telephony.complete / web.complete" icon="phone-slash" href="/nl/webhooks/call-complete">
    Transcript en metriekwaarden na de oproep.
  </Card>

  <Card title="Webhook-eindpunten" icon="bolt" href="/nl/webhooks/endpoints">
    Abonneer een URL op een subset van deze gebeurtenissen.
  </Card>

  <Card title="Functietools" icon="screwdriver-wrench" href="/nl/tools/overview">
    Hoe `telephony.tool` / `web.tool`-gebeurtenissen worden gegenereerd.
  </Card>
</CardGroup>
