---
title: "Hændelseskatalog"
description: "Alle webhook-hændelsestyper, som ThunderPhone udsender."
---

Hver webhook-brødtekst har et `type`-felt, hvis værdi er en af
hændelsestyperne på denne side. Når du abonnerer på et
[endepunkt](/da/webhooks/endpoints), skal `events`-arrayet indeholde de
hændelsestyper, du ønsker (eller være tomt for at abonnere på alt —
undtagen hændelser pr. tur [`telephony.turn`](#telephony-turn) /
[`web.turn`](#web-turn), som kun leveres til endepunkter, der
angiver dem eksplicit).

To leveringsformer transporterer disse hændelser:

* **Endpoint-leveringer** er altid **ikke-blokerende** notifikationer
  med [gentagelser](/da/webhooks/overview): svar med
  enhver 2xx; konvolutten indeholder et `event_id` til deduplikering.
* **Blokerende** udvekslinger kører kun på den
  [ældre webhook med enkelt URL](/da/webhooks/overview): anmodningen om
  konfiguration for [`telephony.incoming` / `web.incoming`](/da/webhooks/call-incoming)
  (numre i webhooktilstand: 13 s inklusive ét gentagelsesforsøg;
  widgetnøgler i webhooktilstand: 10 s) og [værktøjsdistribuering](/da/tools/overview)
  i webhooktilstand. Dit svar former det aktive opkald.

Eksempelpayloadene nedenfor viser endepunktkonvolutten i dens trådrækkefølge
(nøgler sorteret alfabetisk: `data`, `event_id`, `type`); ældre
leveringer indeholder de samme `data` uden `event_id`.

## Opkaldshændelser

### `telephony.incoming`

Sendes, når et indgående opkald når et af dine
[telefonnumre](/api-reference/phone-numbers). Endpoint-leveringer er
fire-and-forget-notifikationer, der sendes for **alle** indgående opkald, uanset
om nummeret er agentkonfigureret eller webhookkonfigureret. Numre uden
en tildelt agent modtager desuden den **blokerende**
konfigurationsanmodning på den ældre webhook — se
[`telephony.incoming` / `web.incoming`](/da/webhooks/call-incoming) for
det fulde skema for anmodning og svar.

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

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |

### `telephony.complete`

Sendes, når et indgående eller udgående telefoniopkald afsluttes. Ikke-blokerende.
Indeholder transskriptionen, optagelses-URL'en, når den er tilgængelig, og faktureringsoversigten. Se
[`telephony.complete` / `web.complete`](/da/webhooks/call-complete) for
payload-skemaet.

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |

### `telephony.tool`

Sendes, efter et telefoniopkald kalder et
[funktionsværktøj](/da/tools/overview). Ikke-blokerende revisionsnotifikation —
værktøjet er allerede kørt, når denne hændelse leveres; den dækker
dine egne funktionsværktøjer og det indbyggede `send_sms`-værktøj (ikke andre indbyggede
værktøjer, vidensbaseværktøjer, appforbindelser eller MCP-værktøjer). For `send_sms`
er både `arguments.to` og `arguments.body` `[REDACTED]`. Transskriptioner
ved afslutning redigerer også disse; hent indholdet og modtageren fra den
organisationsafgrænsede SMS-ressource ved hjælp af svarets `message_id`.

```json
{
  "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` er det udførte resultat: `{"status": <http status>,
"response": <your endpoint's JSON>}` ved succes eller
`{"status": <status>, "error": "<message>"}` ved fejl.

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |

### `telephony.turn`

Sendes, mens et telefoniopkald **er i gang**, én gang for hver
talebærende tur, efterhånden som den sker — agentens talte fuldførelser og
opkalderens transskriberede ture. Gør det muligt at følge den live samtale
via almindelige webhooks i stedet for at polle
[`GET /v1/calls/{call_id}/transcript`](/api-reference/calls#get-transcript).
Ikke-blokerende.

<Note>
  **Eksplicit abonnement påkrævet.** I modsætning til alle andre hændelsestyper
  leveres turhændelser aldrig via et tomt `events`-array
  (abonner på alle). Et endpoint modtager dem kun, når dets `events`-
  liste udtrykkeligt indeholder `telephony.turn` / `web.turn`.
</Note>

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

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `position` | integer | Turens indeks i opkaldshistorikken — en stabil identitet til sortering |
| `role` | string | `assistant` (agenttale) eller `user` (opkaldertale) |
| `text` | string | Turens transskriptionstekst, som den kendes på udsendelsestidspunktet |
| `entry_type` | string | Den underliggende type historikpost: `completion` (agent) eller `user_turn` / `span` (opkalder) |
| `start_ms`, `end_ms` | integer | Lydforskydninger i ms siden opkaldets start; findes kun, når afspilningstiming allerede var kendt på udsendelsestidspunktet |

<Note>
  Levering sker mindst én gang, og ture kan ankomme **i forkert rækkefølge**:
  dedupliker på kuvertens `event_id`, og sorter efter `position`. Opkalderens
  transskriptioner kan stadig blive forbedret efter udsendelse; transskriptionen
  i [`telephony.complete`](/da/webhooks/call-complete) efter opkaldet er
  autoritativ. Kun talte ture udsendes — værktøjskald, hvisken og
  andre interne poster vises aldrig i denne strøm.
</Note>

### `web.incoming`

Webkanalens ækvivalent til `telephony.incoming`, der sendes, når en
[webwidget](/da/widget/overview)-session eller et builder-mikrofontestopkald
starter. Endpoint-leveringer er fire-and-forget for hver websession.
Publicerbare nøgler i `mode="webhook"` modtager desuden den
**blokerende** konfigurationsanmodning på den ældre webhook — denne
blokerende anmodning har en anden struktur (`origin_domain`,
`publishable_key_prefix`; ingen telefonnumre). Se
[`telephony.incoming` / `web.incoming`](/da/webhooks/call-incoming).

```json
{
  "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` er altid den bogstavelige værdi `"web"`. For widgetsessioner
i webhooktilstand er `to_number` tomt (sessionens agentnummer tildeles
efter konfiguration); for builder-mikrofontestopkald er `origin_domain` og
`publishable_key_prefix` tomme.

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |

### `web.complete`

Webkanalens ækvivalent til `telephony.complete`, der dækker opkald fra
webwidgets (`direction: "web"`) og builder-mikrofontestopkald
(`direction: "test"`). Ikke-blokerende. Samme payload-struktur som
[`telephony.complete`](/da/webhooks/call-complete), plus `origin_domain`,
med `from_number` sat til `"web"`.

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |

<Note>
  På den ældre webhook med én URL rapporteres builder-mikrofontestopkald
  historisk som `telephony.complete` — kun opkald med `direction:
  "web"` bruger typen `web.complete` der. Endpoint-systemet
  mapper både web- og testopkald til `web.*`. Historiske payloads kan
  indeholde de ældre `direction`-værdier `widget` eller `mic`.
</Note>

### `web.tool`

Webkanalens ækvivalent til `telephony.tool`. `data` indeholder
`origin_domain` i stedet for `from_number` / `to_number`.

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |

### `web.turn`

Webkanalens ækvivalent til [`telephony.turn`](#telephony-turn), der
dækker opkald fra webwidgets og builder-mikrofontestopkald. Samme payload-
struktur, med `origin_domain` i stedet for `from_number` / `to_number`.
Ligesom `telephony.turn` kræver den et **eksplicit abonnement** — den
leveres aldrig via et tomt `events`-array.

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |

### `call.transfer_completed`

Sendes én gang pr. opkald med det endelige resultat af en
[opkaldsoverførsel](/da/guides/call-transfers): en kold overførsel eller den
forbindelse mellem mennesker, som en varm overførsel efterlader, når agenten træder ud.
Ikke-blokerende og leveres kun til slutpunkter (aldrig til den ældre
webhook med én URL). Den ankommer efter opkaldets `telephony.complete`:
når operatøren overtager opkaldet, eller overførslen mislykkes, eller, når
ThunderPhone har oprettet forbindelse i opkaldet, når forbindelsen afsluttes.

```json
{
  "data": {
    "agent_id": 12,
    "agent_name": "Front desk",
    "bridge_kind": "cold_fallback",
    "bridge_seconds": 255,
    "bridge_total_cents": 5,
    "call_id": 987654321,
    "destination": "+15555550102",
    "sip_status": 403,
    "transfer_outcome": "bridged"
  },
  "event_id": "5b0f6c1e-9d2a-5e7b-8c4d-1a2b3c4d5e6f",
  "type": "call.transfer_completed"
}
```

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `call_id` | integer | Opkaldet, der blev overført |
| `agent_id` | integer \| null | Agenten, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agenten, der håndterede opkaldet, når en var tildelt |
| `transfer_outcome` | string | `refer_accepted`: operatøren overtog opkaldet. `bridged`: ThunderPhone holdt selv den, der ringede, og destinationen forbundet, enten fordi operatøren afviste en kold overførsel, eller fordi en agents deltager i en varm overførsel trådte ud. `bridge_unanswered`: operatøren afviste en kold overførsel, og destinationen besvarede ikke ThunderPhones eget opkald. `failed`: overførslen gik ikke igennem, og opkaldet sluttede |
| `destination` | string \| null | Nummeret, som opkaldet blev overført til |
| `sip_status` | integer \| null | Operatørens SIP-status, da den afviste den kolde overførsel: `403` (for eksempel en Twilio-trunk uden opkaldsoverførsel), `405` eller `501`. `null`, når operatøren ikke afviste den |
| `bridge_kind` | string \| null | Kun `bridged`: `cold_fallback` (en afvist kold overførsel, som ThunderPhone forbandt) eller `warm` (de to personer i en varm overførsel, efter agenten forlod den) |
| `bridge_seconds` | integer \| null | Kun `bridged`: den forbundne tid, som ThunderPhone fakturerede, i sekunder |
| `bridge_total_cents` | integer \| null | Kun `bridged`: hvad forbindelsen kostede i amerikanske cents efter eventuel gratis opkaldskredit, faktureret separat fra opkaldets `billing_total_cents` |

De samme værdier findes på [opkaldsobjektet](/api-reference/calls#call-object)
som `transfer_outcome`, `transfer_destination`, `transfer_sip_status`,
`transfer_bridge_kind`, `transfer_bridge_seconds` og
`transfer_bridge_total_cents`. `event_id` er den samme ved hver levering
for et opkald, så en gentaget rapport aldrig opretter en ny hændelse.

---

## SMS-hændelser

SMS-hændelser beskriver beskeder, der sendes via organisationens tilknyttede
Twilio- eller Telnyx-konto. Beskedens brødtekst udelades, og `to` maskeres.
Hent den organisationsafgrænsede besked fra
[`GET /v1/sms/{message_id}`](/api-reference/sms#retrieve-a-message), når dens
indhold eller modtager er nødvendig.

### `sms.sent`

Sendes, når kundens operatør accepterer en udgående SMS-anmodning. Dette er
ikke en leveringskvittering fra enheden.

```json
{
  "data": {
    "accepted_at": "2026-09-19T15:42:10.113Z",
    "agent_id": 12,
    "call_id": 987654321,
    "created_at": "2026-09-19T15:42:09.901Z",
    "direction": "outbound",
    "error_code": null,
    "error_message": null,
    "from_number": "+15551234567",
    "id": "313a3117-827b-46e9-a01a-ac1493838724",
    "provider": "twilio",
    "provider_id": "SM0123456789abcdef0123456789abcdef",
    "segment_count": 1,
    "source": "agent_tool",
    "status": "accepted",
    "to": "[REDACTED]"
  },
  "event_id": "0ae347b4-1716-45bb-9a0e-b52373586e37",
  "type": "sms.sent"
}
```

### `sms.failed`

Sendes efter en permanent afvisning fra operatøren, efter midlertidige
genforsøg er opbrugt, eller når resultatet endeligt er ukendt. `error_code` er
en stabil ThunderPhone-kode, og `error_message` angiver kundens handling, når
den er tilgængelig. `status: "unknown"` betyder, at operatøren muligvis har
accepteret SMS'en; afstem den i operatørens log, fordi ThunderPhone ikke
gensender den automatisk.

### `sms.received`

Reserveret til understøttelse af indgående SMS. Der udsendes ingen
`sms.received`-hændelser i den aktuelle udgivelse. Konfiguration af indgående
webhooks fra operatøren og signaturverifikation leveres separat.

---

## Stemmehændelser

Oprettelse af brugerdefinerede stemmer er asynkron. Disse ikke-blokerende
hændelser gør det muligt at reagere på et endeligt resultat i stedet for at
forespørge
[slutpunktet for klonedetaljer](/api-reference/custom-voices#list-and-retrieve-clones).

`voice.ready` og `voice.failed` leveres kun til et organisationsdækkende
slutpunkt med `events: []`. De kan ikke vælges som eksplicitte hændelsesfiltre.

### `voice.ready`

Sendes, når en brugerdefineret stemme er færdigbehandlet og kan tildeles til en
agent.

```json
{
  "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`

Sendes, når behandlingen af en brugerdefineret stemme ender med en permanent
fejl.

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

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `voice.id` | string | Offentligt id for brugerdefineret stemme |
| `voice.name` | string | Agentens stemmeværdi på formen `custom:<public_id>` |
| `voice.display_name` | string | Organisationens viste stemmenavn |
| `voice.language` | string | Klonens enkeltstående sprogkode |
| `voice.gender` | string | `male`, `female` eller en tom streng |
| `voice.status` | string | `ready` for `voice.ready`; `failed` for `voice.failed` |
| `voice.failure_reason` | string | Tom ved succes; detalje om behandlingsfejl ved fejl |
| `voice.created_at`, `voice.updated_at` | timestamp | ISO 8601-tidsstempler |
| `reason` | string | Fejldetalje; findes kun på `voice.failed` |

---

## Kvalitetshændelser

### `call.graded`

Sendes, hver gang en [AI-bedømmelse](/api-reference/calls#ai-call-grading)
fuldføres for et opkald. Blokerer ikke.

```json
{
  "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…"
    },
    "report": null
  },
  "event_id": "7c1d2e3f-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
  "type": "call.graded"
}
```

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `grade.id` | integer | Bedømmelses-id |
| `grade.score` | integer \| null | 0–100 |
| `grade.call_outcome` | string | `success`, `failure`, `unknown` eller `no_conversation` |
| `grade.summary` | string | Opsummering på ét afsnit |
| `grade.detected_issues` | array | Problemstrenge fundet af bedømmeren |
| `grade.status` | string | Altid `completed` — kun afsluttede kørsler udsender |
| `grade.grader_model` | string | Hvilken bedømmer der producerede resultatet (f.eks. `heuristic-v1`) |
| `grade.graded_at`, `grade.created_at` | timestamp | |
| `report` | object \| null | Den kundevendte [opkaldsrapport](/api-reference/calls#call-report): resultatetiket, flag og årsag for kræver opmærksomhed, opkalder, opsummering på én linje, opkalderoplevelse. Ved en tidlig heuristisk bedømmelse er den `null` eller en `pending`-rapport, hvis felter er pladsholdere; den fulde bedømmelses hændelse indeholder den færdige rapport |

<Note>
  Et opkald kan bedømmes mere end én gang — en hurtig heuristisk bedømmelse
  efterfølges ofte af en fuld modelbedømmelse, når optagelsen er tilgængelig,
  og manuel genbedømmelse er mulig. Hver fuldført kørsel udsender sin egen
  `call.graded`-hændelse; betragt den seneste `graded_at` som autoritativ.
</Note>

### `call.data_extracted`

Sendes, hver gang udtrækning af strukturerede data fuldføres uden fejl, herunder
en sen genprøve efter `telephony.complete` / `web.complete` eller en manuel
genkørsel via
[`POST /v1/calls/{call_id}/extract`](/api-reference/calls#run-data-extraction).
Blokerer ikke.

I en blokerende udtrækningstilstand venter fuldførelseshændelsen normalt højst
på udtrækningsbudgettet på 75 sekunder. Hvis udtrækningsarbejderprocessen går
tabt, frigiver produktionens afslutningsdræning, der kører hvert femte minut,
en fuldførelse, hvis `blocking_deadline_at` er overskredet, før den starter
endnu et udtrækningsforsøg. En senere succes leveres separat som denne hændelse.

<Warning>
  Udtrukne værdier er en models fortolkning af samtalen. Hver værdi, der ikke er
  null, omfatter citatet, talerrollen og turindekset, som den er baseret på,
  samt et verifikationsflag på kørselsniveau. Bekræft resultatet, før du træffer
  beslutninger, der involverer penge, identitet eller adgang.
</Warning>

```json
{
  "data": {
    "call_id": 987654321,
    "agent_id": 12,
    "agent_name": "Acme intake",
    "extracted_data": {
      "status": "completed",
      "fields": {
        "customer_name": "Alex Morgan",
        "appointment_date": "2026-04-23"
      },
      "evidence": {
        "customer_name": {
          "quote": "My name is Alex Morgan",
          "speaker_role": "caller",
          "turn_index": 4
        },
        "appointment_date": {
          "quote": "April 23 works for me",
          "speaker_role": "caller",
          "turn_index": 7
        }
      },
      "verification": "verified",
      "field_reasons": {},
      "schema_version": "92850758e231a3c95a..."
    },
    "extracted_at": "2026-04-20T18:25:11.002Z",
    "model": "<model id>",
    "summary": "Alex Morgan called to book a follow-up visit and confirmed Thursday, April 23."
  },
  "event_id": "4d79ef1d-c2b1-4ed6-85b8-8326bd2895ef",
  "type": "call.data_extracted"
}
```

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `summary` | string \| null | Den fuldførte [opkaldsoversigt](/da/webhooks/call-complete), når agenten har **Generer en opkaldsoversigt** slået til, så en sen udtrækningshændelse også leverer en oversigt, der ikke nåede med i fuldførelsesvinduet; ellers `null`. Agenter med en oversigt, men uden udtrækningsfelter, udsender aldrig denne hændelse: hent en sen oversigt fra `GET /v1/calls/{call_id}` |
| `extracted_data.status` | string | Altid `completed` for denne hændelse |
| `extracted_data.fields` | object | Værdier med nøgler fra de konfigurerede udtrækningsfeltnøgler; utilgængelige værdier er `null` |
| `extracted_data.evidence` | object | Dokumentation med nøgler fra udtrækningsfeltet. En værdi, der ikke er null, har det nøjagtige strukturelt kontrollerede citat (højst 1.000 tegn), `speaker_role` (`caller` eller `agent`) og `turn_index`; længere citater returneret af modellen afvises i stedet for at blive afkortet, og dokumentation er `null`, når feltet er `null` |
| `extracted_data.verification` | string | Kun `verified`, når det uafhængige dokumentationstjek returnerede præcis én gyldig afgørelse for hvert kandidatfelt. `unavailable` betyder, at kontrollen fejlede, fik timeout, manglede tilstrækkeligt budget eller returnerede forkert formateret eller delvist output. En helt utilgængelig kontrol bevarer strukturelt funderede værdier til kundegennemgang. Ved delvist output anvendes gyldige afgørelser, og hver kandidat uden præcis én gyldig afgørelse nulstilles |
| `extracted_data.field_reasons` | object | Årsager med nøgler fra felter, der blev nulstillet af strukturel fundering eller den uafhængige kontrollør |
| `extracted_data.schema_version` | string | Hash for det nøjagtige feltskema, der blev brugt til denne udtrækning |
| `extracted_at` | timestamp | ISO 8601-tidspunkt for fuldførelse |
| `model` | string | Model brugt til udtrækningen |

### `campaign.completed`

Sendes én gang, når en kampagne går fra `running` til `completed`, uanset om
dens tidsplan sluttede, eller alle kontakter nåede terminale tilstande. Forsøg
fra køreren udsender ikke endnu en hændelse. Denne livscyklushændelse på
organisationsniveau leveres kun til organisationsomfattende slutpunkter, ikke
til agentspecifikke slutpunkter. Blokerer ikke.

```json
{
  "data": {
    "campaign_id": "3f6b2c9e-2a0d-4c63-b6d6-a708dc98f403",
    "name": "May win-back",
    "agent_id": 12,
    "status": "completed",
    "started_at": "2026-04-20T17:00:00Z",
    "completed_at": "2026-04-20T18:25:11Z",
    "counts": {
      "contacts_total": 150,
      "completed": 121,
      "failed": 11,
      "no_answer": 18,
      "remaining": 0
    }
  },
  "event_id": "8d8f52ce-6b46-423f-9dde-cea0b91ec135",
  "type": "campaign.completed"
}
```

De fire resultatantal er gensidigt udelukkende og summerer til `contacts_total`:
`completed` indeholder gennemførte kontakter; `no_answer` indeholder terminalt
mislykkede eller udtømte kontakter, hvis endelige resultat var intet svar;
`failed` indeholder alle andre terminalt mislykkede eller udtømte kontakter; og
`remaining` indeholder afventende, planlagte eller aktuelt ringende kontakter.
En kontakt, der venter på et nyt forsøg, er `remaining`, også når dens seneste
forsøg ikke fik svar. Igangværende opkald afstemmes før øjebliksbilledet for
den engangsudsendte fuldførelse. `started_at` er kampagnens konfigurerede start
eller tidspunktet for oprettelse af kampagnen, når der ikke var konfigureret en
start.

### `issue.reported`

Sendes, når en [problemrapport](/api-reference/issue-reports) oprettes —
enten indsendt af en bruger fra dashboardet (`source: "user"`) eller
automatisk af opkaldsbedømmelse (`source: "system"`). Blokerer ikke.

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

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agent, der håndterede opkaldet, når en var tildelt |
| `issue_report.severity` | string | `critical`, `warning` eller `info` |
| `issue_report.status` | string | `open` eller `resolved` |
| `issue_report.source` | string | `user` (indsendt fra dashboardet) eller `system` (oprettet af bedømmelse) |

<Note>
  Genbedømmelse af et opkald genopbygger dets systemgenererede problemrapporter,
  hvilket genudsender `issue.reported` for de genskabte rapporter. Dedubliker
  på `call_id` + `title`, hvis du kun vil have én notifikation pr. underliggende
  problem.
</Note>

### `issue.escalated`

Sendes, når et problemmønster sendes til ThunderPhone til medarbejdergennemgang:
efter **Rapporter til ThunderPhone**, eller når Ret med AI ikke kan bekræfte en
rettelse på kundesiden og automatisk videresender problemet. Kun
organisationsomfattende slutpunkter modtager denne hændelse.

```json
{
  "data": {
    "automatic": false,
    "cluster_id": "7ac2844c-2df0-4fa8-a560-7378da649e19",
    "escalation_id": "ec99f52b-c8c0-41dd-a4f2-dd8a07b10894",
    "status": "open"
  },
  "event_id": "d8f8f420-7a42-45ba-bcf1-b747f9bbecda",
  "type": "issue.escalated"
}
```

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `automatic` | boolean | `true` for en automatisk eskalering; `false` for en manuel eskalering |
| `cluster_id` | UUID | Eskaleret problemmønster |
| `escalation_id` | UUID | Eskaleringspost |
| `status` | string | `open`, når hændelsen udsendes |

Dette er en notifikation, ikke dokumentationspakken. Brug `cluster_id` til at
knytte den til problemmønsteret. Se
[Rapporter til ThunderPhone](/da/guides/issues).

---

## Testopkaldshændelser

### `test-call.completed`

Sendes, når et
[testopkaldskørsel](/api-reference/test-calls#test-call-run-object)
når en endelig status — `completed` eller `failed`, herunder kørsler,
der mislykkedes ved start og aldrig oprettede et opkald. Ikke-blokerende. Nyttig
til at koble CI-batchkørsler til dine chat- og notifikationssystemer.

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

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `agent_id` | integer \| null | Agenten, der håndterede opkaldet, når en var tildelt |
| `agent_name` | string \| null | Agenten, der håndterede opkaldet, når en var tildelt |
| `test_call_run.target_type` | string | `agent` eller `phone_number` |
| `test_call_run.target_id` | integer | Agent-id'et eller telefonnummer-id'et, som kørslen målrettede, i overensstemmelse med `target_type` |
| `test_call_run.status` | string | `completed` eller `failed` |
| `test_call_run.call_id` | integer \| null | `null`, når kørslen mislykkedes, før et opkald blev foretaget |
| `test_call_run.error_message` | string | Tom ved succes |

---

## Advarselshændelser

### `alert.triggered`

Sendes, når en [advarselsregel](/da/guides/alerts) med kanalen **Lever til
udviklerwebhooks** aktiveret overskrider sin tærskel.
Ikke-blokerende. En regel udløses én gang og overholder derefter sin
nedkølingsperiode, så en vedvarende overskridelse producerer én hændelse pr. nedkølingsvindue.

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

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `event_id` (i `data`) | UUID | Advarslens **udløsnings-id** — adskilt fra konvoluttens leverings-`event_id` |
| `rule_id`, `rule_name` | UUID, string | Reglen, der blev udløst |
| `metric` | string | `success_rate`, `failure_rate`, `avg_score`, `call_volume` eller `suite_regression` |
| `comparator` | string | `lt`, `lte`, `gt` eller `gte` |
| `metric_value` | number | Metrikkens værdi over vinduet, da reglen blev udløst |
| `threshold` | number | Den konfigurerede tærskel |
| `window_hours` | integer | Efterfølgende evalueringsvindue |
| `fired_at` | timestamp | |

Se [vejledningen til advarsler](/da/guides/alerts) for at oprette regler, metrikker,
nedkølingsperioder og e-mail- / Slack-kanaler.

---

## Migreringshændelser

### `migration.call.complete`

Sendes, når et opkald, der er foretaget via
[`POST /v1/migrations/{id}/calls`](/api-reference/migration-calls), afsluttes,
uanset hvilken platform der foretog det. Ikke-blokerende. Det ankommer op til ca. 5 minutter
efter opkaldet afsluttes. `data` har alle felter fra
[`telephony.complete`](/da/webhooks/call-complete) plus en `migration`-blok. Et
opkald foretaget af ThunderPhone sender også `telephony.complete` som normalt med det
samme `call_id`. Et opkald på den anden platform, som ikke er afsluttet efter 2
timer, eller hvis migrering blev afsluttet eller mistede sin nøgle først, sendes med
`status: "unknown"` og uden transskription.

```json
{
  "data": {
    "agent_id": 42,
    "agent_name": "Front desk",
    "billable_minutes": null,
    "billing_total_cents": null,
    "call_id": null,
    "direction": "outbound",
    "duration_seconds": 94,
    "end_reason": "user_hangup",
    "end_time": "2026-10-06T17:01:34+00:00",
    "extracted_data": null,
    "from_number": "+15551234567",
    "migration": {
      "arm": "vendor",
      "id": "5f0c2a9e-7b1d-4c3e-8a6f-2d9e1b4c7a30",
      "metadata": {
        "lead_id": "8812"
      },
      "routing_id": "9b2f8c1e-4d3a-4f6b-8e2d-1a7c5b9e0f34",
      "vendor": "retell",
      "vendor_call_id": "call_6a1f0e",
      "vendor_cost_usd": "0.1240"
    },
    "product": "",
    "recording_mode": "vendor",
    "recording_url": "https://…",
    "start_time": "2026-10-06T17:00:00+00:00",
    "status": "completed",
    "summary": "The callee booked a table for two on Thursday.",
    "thunderphone_retained_call_content": true,
    "to_number": "+14155552671",
    "transcripts": [
      {
        "content": "Hi Ada, this is Rosa's calling about your booking.",
        "role": "agent"
      },
      {
        "content": "Yes, Thursday works.",
        "role": "user"
      }
    ],
    "transfer_number": null,
    "unresolved_variables": [],
    "variables": {
      "first_name": "Ada"
    },
    "voice": ""
  },
  "event_id": "7c1e2f3a-4b5c-4d6e-8f7a-9b0c1d2e3f4a",
  "type": "migration.call.complete"
}
```

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `migration.id` | UUID | Migreringen |
| `migration.routing_id` | UUID | Det routede opkald, som returneret, da du foretog det |
| `migration.arm` | string | `ours` (ThunderPhone foretog det) eller `vendor` (den anden platform gjorde det) |
| `migration.vendor` | string | `retell`, `vapi`, `elevenlabs` eller `bland` |
| `migration.vendor_call_id` | string \| null | Den anden platforms opkalds-id; `null` for `ours` |
| `migration.metadata` | object | Den `metadata`, du sendte, da du foretog opkaldet |
| `migration.vendor_cost_usd` | string \| null | Hvad den anden platform oplyste, at opkaldet kostede, når den gjorde det |
| `call_id` | integer \| null | ThunderPhone-opkalds-id'et; `null` for `vendor` |
| `status` | string | For `vendor`: `completed`, når modtageren talte, `failed`, når vedkommende ikke gjorde, `unknown` som ovenfor. For `ours`: som i `telephony.complete` |

For et `vendor`-opkald har ThunderPhone ingen fakturerings- eller udtræksdata:
`billable_minutes`, `billing_total_cents` og `extracted_data` er `null`,
`product` og `voice` er tomme, `recording_mode` er `vendor`, og
`recording_url` er den anden platforms link, når den angav et.

### `migration.rollback`

Sendes, når en migrations gradvise skift automatisk flytter alle opkald tilbage til den anden
platform: 3 opkald kunne ikke oprette forbindelse til ThunderPhone inden for 15
minutter, 2 opkald sendt til ThunderPhone sluttede, før agenten svarede, eller
ThunderPhones opgaveudførelsesrate faldt mere end den konfigurerede forskel under
den anden platforms. Ikke-blokerende, én gang pr. tilbagerulning. Derefter er ThunderPhones
andel 0 %, og migreringen er sat på pause, indtil nogen genoptager den på agentens
fane Migrering. Dataobjektet indeholder ingen telefonnumre, transskriptioner eller
opkalds-id'er.

```json
{
  "data": {
    "agent_id": 42,
    "agent_name": "Front desk",
    "dropped": 0,
    "migration_id": "5f0c2a9e-7b1d-4c3e-8a6f-2d9e1b4c7a30",
    "ours": {
      "graded": 20,
      "success_rate": 0.8
    },
    "ours_failed": 3,
    "ours_percent": 0,
    "previous_percent": 25,
    "reason": "ours_failed_burst",
    "rolled_back_at": "2026-10-10T12:05:00+00:00",
    "step": 1,
    "theirs": {
      "graded": 20,
      "success_rate": 0.8
    },
    "vendor": "retell"
  },
  "event_id": "3d1f6b2a-8c4e-5a7b-9d0e-2f1a3b4c5d6e",
  "type": "migration.rollback"
}
```

| Felt | Type | Beskrivelse |
|-------|------|-------------|
| `migration_id` | UUID | Migreringen |
| `vendor` | string | `retell`, `vapi`, `elevenlabs` eller `bland` |
| `reason` | string | `ours_failed_burst` (3 mislykkede forbindelser på 15 minutter), `dropped_calls` (2 opkald sluttede, før agenten svarede, inden for 30 minutter) eller `rate_gap` (forskel i opgaveudførelsesrate over mindst `rollback_min_calls` graderede opkald pr. side) |
| `previous_percent` | integer | ThunderPhones andel af opkald før tilbagerulningen |
| `ours_percent` | integer | Altid `0` |
| `step` | integer \| null | Det plantrin, den var på (0-baseret) |
| `ours` / `theirs` | object \| null | Graderede opkald i det aktuelle trin og deres succesrate; `theirs` kan være de seneste 30 dage, når trinnet har for få opkald. `null`, når der ikke var nogen |
| `ours_failed` | integer | Mislykkede forbindelser talt inden for de seneste 15 minutter |
| `dropped` | integer | Opkald talt som afbrudte inden for de seneste 30 minutter |
| `rolled_back_at` | timestamp | |

---

## Relateret

<CardGroup cols={2}>
  <Card title="telephony.incoming / web.incoming" icon="phone" href="/da/webhooks/call-incoming">
    Den blokerende payload for indgående opkald, som du skal svare på.
  </Card>
  <Card title="telephony.complete / web.complete" icon="phone-slash" href="/da/webhooks/call-complete">
    Transskription og metrikker efter opkaldet.
  </Card>
  <Card title="Webhook-slutpunkter" icon="bolt" href="/da/webhooks/endpoints">
    Abonner en URL på en delmængde af disse hændelser.
  </Card>
  <Card title="Funktionsværktøjer" icon="screwdriver-wrench" href="/da/tools/overview">
    Sådan genereres hændelserne `telephony.tool` / `web.tool`.
  </Card>
</CardGroup>
