---
title: "Händelsekatalog"
description: "Alla webhook-händelsetyper som ThunderPhone skickar."
---

Varje webhook-kropp har ett `type`-fält vars värde är en av händelsetyperna på den här sidan. När du prenumererar på en
[slutpunkt](/sv/webhooks/endpoints) måste arrayen `events` innehålla de
händelsetyper du vill ha (eller vara tom för att prenumerera på allt —
utom händelserna per tur [`telephony.turn`](#telephony-turn) /
[`web.turn`](#web-turn), som endast levereras till slutpunkter som
anger dem uttryckligen).

Två leveranssätt hanterar dessa händelser:

* **Endpoint-leveranser** är alltid **icke-blockerande** aviseringar
  med [återförsök](/sv/webhooks/overview): svara med
  valfri 2xx; kuvertet innehåller ett `event_id` för deduplicering.
* **Blockerande** utbyten körs endast via den
  [äldre webhooken med en enda URL](/sv/webhooks/overview): begäran om
  konfiguration för [`telephony.incoming` / `web.incoming`](/sv/webhooks/call-incoming)
  (nummer i webhookläge: 13 s inklusive ett återförsök; widgetnycklar i webhookläge: 10 s) och
  [verktygsdirigering](/sv/tools/overview) i webhookläge. Ditt svar
  formar det pågående samtalet.

Exempelnyttolaster nedan visar slutpunktskuvertet i dess överföringsordning
(nycklar sorterade alfabetiskt: `data`, `event_id`, `type`); äldre
leveranser innehåller samma `data` utan `event_id`.

## Samtalshändelser

### `telephony.incoming`

Skickas när ett inkommande samtal når ett av dina
[telefonnummer](/api-reference/phone-numbers). Endpoint-leveranser är
fire-and-forget-notifieringar som skickas för **varje** inkommande samtal, oavsett
om numret är konfigurerat för en agent eller en webhook. Nummer utan
en tilldelad agent får dessutom den **blockerande** konfigurationsbegäran
på den äldre webhooken — se
[`telephony.incoming` / `web.incoming`](/sv/webhooks/call-incoming) för
det fullständiga begäran-/svarsschemat.

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

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent var tilldelad |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent var tilldelad |

### `telephony.complete`

Skickas när ett inkommande eller utgående telefonsamtal avslutas. Icke-blockerande.
Innehåller transkriptionen, inspelnings-URL när den är tillgänglig och en faktureringssammanfattning. Se
[`telephony.complete` / `web.complete`](/sv/webhooks/call-complete) för
payload-schemat.

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent var tilldelad |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent var tilldelad |

### `telephony.tool`

Skickas efter att ett telefonsamtal anropar ett
[funktionsverktyg](/sv/tools/overview). Icke-blockerande granskningsnotifiering —
verktyget har redan körts när den här händelsen levereras; den omfattar
dina egna funktionsverktyg och det inbyggda verktyget `send_sms` (inte andra inbyggda
verktyg, kunskapsbasverktyg, verktyg för appanslutningar eller MCP-verktyg). För `send_sms`
är både `arguments.to` och `arguments.body` `[REDACTED]`. Transkriptioner
vid slutförande maskerar dem också; hämta innehållet och mottagaren från den
organisationsomfattande SMS-resursen med hjälp av 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` är det körda resultatet: `{"status": <http status>,
"response": <your endpoint's JSON>}` vid lyckat resultat, eller
`{"status": <status>, "error": "<message>"}` vid fel.

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent var tilldelad |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent var tilldelad |

### `telephony.turn`

Skickas medan ett telefonsamtal **pågår**, en gång för varje
talbärande tur i takt med att den sker — agentens talade svar och
uppringarens transkriberade turer. Gör att du kan följa den pågående konversationen
via vanliga webhooks i stället för att polla
[`GET /v1/calls/{call_id}/transcript`](/api-reference/calls#get-transcript).
Icke-blockerande.

<Note>
  **Uttrycklig prenumeration krävs.** Till skillnad från alla andra händelsetyper
  levereras turhändelser aldrig via en tom `events`-array
  (prenumerera på alla). En endpoint tar bara emot dem när dess `events`-
  lista uttryckligen innehåller `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"
}
```

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent var tilldelad |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent var tilldelad |
| `position` | integer | Turens index i samtalshistoriken — en stabil identitet för sortering |
| `role` | string | `assistant` (agentens tal) eller `user` (uppringarens tal) |
| `text` | string | Turens transkriptionstext såsom den är känd vid utskickstillfället |
| `entry_type` | string | Den underliggande historikposttypen: `completion` (agent) eller `user_turn` / `span` (uppringare) |
| `start_ms`, `end_ms` | integer | Ljudförskjutningar i ms sedan samtalsstarten; finns bara när uppspelningstiden redan var känd vid utskickstillfället |

<Note>
  Leveransen sker minst en gång och turer kan komma **i fel ordning**:
  deduplicera på omslagets `event_id` och sortera efter `position`. Uppringarens
  transkriptioner kan fortfarande förfinas efter utskick; transkriptionen i
  [`telephony.complete`](/sv/webhooks/call-complete) efter samtalet är
  auktoritativ. Endast talade turer skickas — verktygsanrop, viskningar och
  andra interna poster visas aldrig i denna ström.
</Note>

### `web.incoming`

Motsvarigheten till `telephony.incoming` för webbkanalen, skickad när en
session i en [webbwidget](/sv/widget/overview) eller ett mikrofonsamtalstest i byggaren
startar. Endpoint-leveranser är fire-and-forget för varje webbsession.
Publicerbara nycklar i `mode="webhook"` får dessutom den
**blockerande** konfigurationsbegäran på den äldre webhooken — den
blockerande begäran har en annan form (`origin_domain`,
`publishable_key_prefix`; inga telefonnummer). Se
[`telephony.incoming` / `web.incoming`](/sv/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` är alltid den bokstavliga strängen `"web"`. För widgetsessioner i
webhook-läge är `to_number` tomt (sessionens agentnummer tilldelas
efter konfiguration); för mikrofonsamtalstest i byggaren är `origin_domain` och
`publishable_key_prefix` tomma.

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent var tilldelad |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent var tilldelad |

### `web.complete`

Motsvarigheten till `telephony.complete` för webbkanalen, som omfattar samtal i
webbwidgeten (`direction: "web"`) och mikrofonsamtalstest i byggaren
(`direction: "test"`). Icke-blockerande. Samma payload-form som
[`telephony.complete`](/sv/webhooks/call-complete), plus `origin_domain`,
med `from_number` satt till `"web"`.

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent var tilldelad |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent var tilldelad |

<Note>
  På den äldre webhooken med en enda URL rapporteras mikrofonsamtalstest i byggaren
  historiskt som `telephony.complete` — endast samtal med `direction:
  "web"` använder typen `web.complete` där. Endpointsystemet
  mappar både webb- och testsamtal till `web.*`. Historiska payloads kan
  innehålla de äldre `direction`-värdena `widget` eller `mic`.
</Note>

### `web.tool`

Motsvarigheten till `telephony.tool` för webbkanalen. `data` innehåller
`origin_domain` i stället för `from_number` / `to_number`.

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent var tilldelad |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent var tilldelad |

### `web.turn`

Motsvarigheten till [`telephony.turn`](#telephony-turn) för webbkanalen,
som omfattar samtal i webbwidgeten och mikrofonsamtalstest i byggaren. Samma payload-
form, med `origin_domain` i stället för `from_number` / `to_number`.
Precis som `telephony.turn` kräver den en **uttrycklig prenumeration** —
den levereras aldrig via en tom `events`-array.

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent var tilldelad |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent var tilldelad |

### `call.transfer_completed`

Skickas en gång per samtal med det slutliga resultatet av en
[samtalsöverföring](/sv/guides/call-transfers): en kall överföring eller den mänskliga
brygga som en varm överföring lämnar kvar när agenten kopplas bort.
Blockerar inte och levereras endast till slutpunkter (aldrig till den äldre
webhooken med en enda URL). Den kommer efter samtalets `telephony.complete`:
när operatören tar över samtalet eller överföringen misslyckas, eller när
ThunderPhone har bryggat samtalet, när bryggan avslutas.

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

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `call_id` | integer | Samtalet som överfördes |
| `agent_id` | integer \| null | Agenten som hanterade samtalet, när en agent tilldelades |
| `agent_name` | string \| null | Agenten som hanterade samtalet, när en agent tilldelades |
| `transfer_outcome` | string | `refer_accepted`: operatören tog över samtalet. `bridged`: ThunderPhone höll själv uppringaren och destinationen anslutna, antingen eftersom operatören nekade en kall överföring eller eftersom agenten i en varm överföring kopplades bort. `bridge_unanswered`: operatören nekade en kall överföring och destinationen besvarade inte ThunderPhones eget samtal. `failed`: överföringen genomfördes inte och samtalet avslutades |
| `destination` | string \| null | Numret som samtalet överfördes till |
| `sip_status` | integer \| null | Operatörens SIP-status när den nekade den kalla överföringen: `403` (till exempel en Twilio-trunk utan samtalsöverföring), `405` eller `501`. `null` när operatören inte nekade den |
| `bridge_kind` | string \| null | Endast `bridged`: `cold_fallback` (en nekad kall överföring som ThunderPhone anslöt) eller `warm` (de två personerna i en varm överföring efter att agenten lämnat) |
| `bridge_seconds` | integer \| null | Endast `bridged`: den bryggade tid som ThunderPhone fakturerade, i sekunder |
| `bridge_total_cents` | integer \| null | Endast `bridged`: vad bryggan kostade i amerikanska cent efter eventuell kostnadsfri samtalskredit, fakturerat separat från samtalets `billing_total_cents` |

Samma värden finns på [samtalsobjektet](/api-reference/calls#call-object)
som `transfer_outcome`, `transfer_destination`, `transfer_sip_status`,
`transfer_bridge_kind`, `transfer_bridge_seconds` och
`transfer_bridge_total_cents`. `event_id` är samma vid varje leverans
för ett samtal, så en upprepad rapport skapar aldrig en andra händelse.

---

## SMS-händelser

SMS-händelser beskriver meddelanden som skickas via organisationens anslutna
Twilio- eller Telnyx-konto. Meddelandetexten utelämnas och `to` maskeras.
Hämta det organisationsomfattande meddelandet från
[`GET /v1/sms/{message_id}`](/api-reference/sms#retrieve-a-message) när dess
innehåll eller mottagare behövs.

### `sms.sent`

Skickas när kundens operatör accepterar en begäran om utgående SMS. Detta är
inte ett leveranskvitto till en telefon.

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

Skickas efter ett permanent avslag från operatören, efter att tillfälliga
återförsök har uttömts eller när utfallet är slutgiltigt okänt. `error_code` är
en stabil ThunderPhone-kod och `error_message` anger kundåtgärden när en sådan
är tillgänglig. `status: "unknown"` innebär att operatören kan ha accepterat
SMS:et; stäm av det i operatörens logg eftersom ThunderPhone inte skickar om
det automatiskt.

### `sms.received`

Reserverad för stöd för inkommande SMS. Inga `sms.received`-händelser skickas i
den aktuella versionen. Konfiguration av webhookar för inkommande SMS hos
operatören och signaturverifiering lanseras separat.

---

## Rösthändelser

Skapande av anpassade röster sker asynkront. Med dessa icke-blockerande
händelser kan du reagera på ett slutgiltigt resultat i stället för att polla
[slutpunkten för klondetaljer](/api-reference/custom-voices#list-and-retrieve-clones).

`voice.ready` och `voice.failed` levereras endast till en organisationsomfattande
slutpunkt med `events: []`. De kan inte väljas som explicita händelsefilter.

### `voice.ready`

Skickas när en anpassad röst har slutfört bearbetningen och kan tilldelas till
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`

Skickas när bearbetningen av en anpassad röst når ett permanent fel.

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

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `voice.id` | sträng | Offentligt ID för anpassad röst |
| `voice.name` | sträng | Agentens röstvärde i formatet `custom:<public_id>` |
| `voice.display_name` | sträng | Organisationens visningsnamn för rösten |
| `voice.language` | sträng | Klonens språkkod |
| `voice.gender` | sträng | `male`, `female` eller en tom sträng |
| `voice.status` | sträng | `ready` för `voice.ready`; `failed` för `voice.failed` |
| `voice.failure_reason` | sträng | Tom vid lyckad bearbetning; information om bearbetningsfel vid fel |
| `voice.created_at`, `voice.updated_at` | tidsstämpel | ISO 8601-tidsstämplar |
| `reason` | sträng | Information om fel; finns endast för `voice.failed` |

---

## Kvalitetshändelser

### `call.graded`

Skickas när en [AI-graderingskörning](/api-reference/calls#ai-call-grading)
slutförs för ett samtal. Icke-blockerande.

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

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Röstagenten som hanterade samtalet, när en var tilldelad |
| `agent_name` | string \| null | Röstagenten som hanterade samtalet, när en var tilldelad |
| `grade.id` | integer | Betygs-ID |
| `grade.score` | integer \| null | 0–100 |
| `grade.call_outcome` | string | `success`, `failure`, `unknown` eller `no_conversation` |
| `grade.summary` | string | Sammanfattning i ett stycke |
| `grade.detected_issues` | array | Problemsträngar som hittades av granskaren |
| `grade.status` | string | Alltid `completed` — endast slutförda körningar skickas |
| `grade.grader_model` | string | Vilken granskarmodell som skapade resultatet (t.ex. `heuristic-v1`) |
| `grade.graded_at`, `grade.created_at` | timestamp | |
| `report` | object \| null | Den kundinriktade [samtalsrapporten](/api-reference/calls#call-report): utfallsetikett, flagga och anledning för kräver uppmärksamhet, uppringare, sammanfattning på en rad, uppringarens upplevelse. Vid en tidig heuristisk bedömning är den `null` eller en `pending`-rapport vars fält är platshållare; händelsen för den fullständiga bedömningen innehåller den färdiga rapporten |

<Note>
  Ett samtal kan graderas fler än en gång — ett snabbt heuristiskt betyg följs
  ofta av ett fullständigt modellbetyg när inspelningen är tillgänglig, och
  manuella omgraderingar är möjliga. Varje slutförd körning skickar sin egen
  `call.graded`-händelse; behandla den senaste `graded_at` som auktoritativ.
</Note>

### `call.data_extracted`

Skickas när extrahering av strukturerade data har slutförts, inklusive ett sent
nytt försök efter `telephony.complete` / `web.complete` eller en manuell
omkörning via
[`POST /v1/calls/{call_id}/extract`](/api-reference/calls#run-data-extraction).
Icke-blockerande.

I ett blockerande extraheringsläge väntar slutförandehändelsen normalt högst
den 75 sekunder långa extraheringsbudgeten. Om extraheringsarbetsprocessen
försvinner frigör produktionsslutförandedräneringen (var femte minut) ett
slutförande vars `blocking_deadline_at` har passerat innan den startar ett nytt
extraheringsförsök. En senare lyckad extrahering levereras separat som denna
händelse.

<Warning>
  Extraherade värden är en modells tolkning av samtalet. Varje värde som inte
  är null inkluderar citatet, talarrollen och turindexet som värdet baserades
  på, samt en verifieringsflagga på körningsnivå. Verifiera resultatet innan du
  fattar beslut som rör pengar, identitet eller åtkomst.
</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"
}
```

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent tilldelades |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent tilldelades |
| `summary` | string \| null | Den slutförda [samtalssammanfattningen](/sv/webhooks/call-complete) när agenten har **Generera samtalssammanfattning** aktiverat, så att en sen extraheringshändelse även levererar en sammanfattning som missade slutförandefönstret; annars `null`. Agenter med en sammanfattning men utan extraheringsfält skickar aldrig denna händelse: hämta en sen sammanfattning från `GET /v1/calls/{call_id}` |
| `extracted_data.status` | string | Alltid `completed` för denna händelse |
| `extracted_data.fields` | object | Värden med de konfigurerade nycklarna för extraheringsfält; otillgängliga värden är `null` |
| `extracted_data.evidence` | object | Underlag med extraheringsfält som nyckel. Ett värde som inte är null har det exakta strukturellt kontrollerade citatet (högst 1 000 tecken), `speaker_role` (`caller` eller `agent`) och `turn_index`; längre citat som returneras av modellen avvisas i stället för att trunkeras, och underlag är `null` när dess fält är `null` |
| `extracted_data.verification` | string | `verified` endast när den oberoende underlagspassagen returnerade exakt ett giltigt utlåtande för varje kandidatfält. `unavailable` innebär att passagen misslyckades, tog slut på tid, saknade tillräcklig budget eller returnerade felaktig eller ofullständig utdata. En helt otillgänglig passage behåller strukturellt grundade värden för kundgranskning. Vid ofullständig utdata tillämpas giltiga utlåtanden och varje kandidat utan exakt ett giltigt utlåtande nollställs |
| `extracted_data.field_reasons` | object | Orsaker med fält som nyckel för fält som nollställdes av strukturell grundning eller den oberoende verifieraren |
| `extracted_data.schema_version` | string | Hash för det exakta fältschemat som användes för denna extrahering |
| `extracted_at` | timestamp | ISO 8601-tid för slutförande |
| `model` | string | Modell som användes för extraheringen |

### `campaign.completed`

Skickas en gång när en kampanj går från `running` till `completed`, oavsett om
dess schema avslutades eller alla kontakter nådde slutliga tillstånd. Försök
från köraren skickar inte ytterligare en händelse. Denna
livscykelhändelse på organisationsnivå levereras endast till endpoints på
organisationsnivå, inte endpoints på agentnivå. Icke-blockerande.

```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 fyra utfallsräkningarna är ömsesidigt uteslutande och summerar till
`contacts_total`: `completed` innehåller lyckade kontakter; `no_answer`
innehåller slutligt misslyckade eller uttömda kontakter vars slutliga utfall var
inget svar; `failed` innehåller alla andra slutligt misslyckade eller uttömda
kontakter; och `remaining` innehåller väntande, schemalagda eller kontakter som
just nu rings upp. En kontakt som väntar på ett nytt försök är `remaining`,
även när det senaste försöket inte fick något svar. Pågående samtal stäms av
före ögonblicksbilden för slutförande som endast skickas en gång. `started_at`
är kampanjens konfigurerade starttid eller tidpunkten då kampanjen skapades om
ingen start konfigurerades.

### `issue.reported`

Skickas när en [problemrapport](/api-reference/issue-reports) skapas —
antingen skickad av en användare från instrumentpanelen (`source: "user"`) eller
automatiskt genom samtalsgradering (`source: "system"`). Icke-blockerande.

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

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent som hanterade samtalet, när en agent tilldelades |
| `agent_name` | string \| null | Agent som hanterade samtalet, när en agent tilldelades |
| `issue_report.severity` | string | `critical`, `warning` eller `info` |
| `issue_report.status` | string | `open` eller `resolved` |
| `issue_report.source` | string | `user` (skickad från instrumentpanelen) eller `system` (skapad av gradering) |

<Note>
  Omgradering av ett samtal bygger om dess systemgenererade problemrapporter,
  vilket skickar `issue.reported` igen för de återskapade rapporterna.
  Avduplicera med `call_id` + `title` om du bara vill ha en avisering per
  underliggande problem.
</Note>

### `issue.escalated`

Skickas när ett problemmönster skickas till ThunderPhone för granskning av
personal: efter **Rapportera till ThunderPhone**, eller när Åtgärda med AI inte
kan bekräfta en korrigering på kundsidan och automatiskt dirigerar problemet
vidare. Endast organisationsomfattande endpoints tar emot denna 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"
}
```

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `automatic` | boolean | `true` för en automatisk eskalering; `false` för en manuell eskalering |
| `cluster_id` | UUID | Eskalerat problemmönster |
| `escalation_id` | UUID | Eskaleringspost |
| `status` | string | `open` när händelsen skickas |

Detta är en avisering, inte underlagspaketet. Använd `cluster_id` för att
korrelera den med problemmönstret. Se
[Rapportera till ThunderPhone](/sv/guides/issues).

---

## Händelser för testsamtal

### `test-call.completed`

Skickas när en
[körning av testsamtal](/api-reference/test-calls#test-call-run-object)
når en slutstatus — `completed` eller `failed`, inklusive körningar
som misslyckades vid start och aldrig skapade ett samtal. Icke-blockerande. Användbart
för att koppla batchkörningar i CI till dina chatt- och aviseringssystem.

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

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `agent_id` | integer \| null | Agenten som hanterade samtalet, när en var tilldelad |
| `agent_name` | string \| null | Agenten som hanterade samtalet, när en var tilldelad |
| `test_call_run.target_type` | string | `agent` eller `phone_number` |
| `test_call_run.target_id` | integer | Agent-id:t eller telefonnummer-id:t som körningen riktades mot, enligt `target_type` |
| `test_call_run.status` | string | `completed` eller `failed` |
| `test_call_run.call_id` | integer \| null | `null` när körningen misslyckades innan ett samtal ringdes |
| `test_call_run.error_message` | string | Tom vid lyckat resultat |

---

## Aviseringshändelser

### `alert.triggered`

Skickas när en [aviseringsregel](/sv/guides/alerts) med kanalen **Leverera till
utvecklarwebhooks** aktiverad passerar sitt tröskelvärde.
Icke-blockerande. En regel utlöses en gång och respekterar sedan sin
cooldown, så en ihållande överträdelse ger en händelse per cooldownfönster.

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

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `event_id` (i `data`) | UUID | Larmets **utlösnings-id** — skiljer sig från kuvertets leverans-`event_id` |
| `rule_id`, `rule_name` | UUID, string | Regeln som utlöstes |
| `metric` | string | `success_rate`, `failure_rate`, `avg_score`, `call_volume` eller `suite_regression` |
| `comparator` | string | `lt`, `lte`, `gt` eller `gte` |
| `metric_value` | number | Mätvärdets värde under fönstret när regeln utlöstes |
| `threshold` | number | Det konfigurerade tröskelvärdet |
| `window_hours` | integer | Rullande utvärderingsfönster |
| `fired_at` | timestamp | |

Se [guiden för aviseringar](/sv/guides/alerts) för att skapa regler, mätvärden,
cooldowns och e-post- / Slack-kanalerna.

---

## Migreringshändelser

### `migration.call.complete`

Skickas när ett samtal som ringts via
[`POST /v1/migrations/{id}/calls`](/api-reference/migration-calls) avslutas,
oavsett vilken plattform som hanterade det. Icke-blockerande. Det kommer upp
till cirka 5 minuter efter att samtalet avslutats. `data` innehåller alla fält
från [`telephony.complete`](/sv/webhooks/call-complete) samt ett `migration`-block.
Ett samtal som ThunderPhone ringde skickar också `telephony.complete` som
vanligt, med samma `call_id`. Ett samtal på den andra plattformen som inte har
avslutats efter 2 timmar, eller vars migrering har slutförts eller förlorat sin
nyckel innan dess, skickas med `status: "unknown"` och utan transkription.

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

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `migration.id` | UUID | Migreringen |
| `migration.routing_id` | UUID | Det dirigerade samtalet, enligt svaret när du ringde det |
| `migration.arm` | string | `ours` (ThunderPhone ringde det) eller `vendor` (den andra plattformen gjorde det) |
| `migration.vendor` | string | `retell`, `vapi`, `elevenlabs` eller `bland` |
| `migration.vendor_call_id` | string \| null | Den andra plattformens samtals-id; `null` för `ours` |
| `migration.metadata` | object | Den `metadata` du skickade när du ringde samtalet |
| `migration.vendor_cost_usd` | string \| null | Kostnaden som den andra plattformen rapporterade för samtalet, när den gjorde det |
| `call_id` | integer \| null | ThunderPhones samtals-id; `null` för `vendor` |
| `status` | string | För `vendor`: `completed` när mottagaren pratade, `failed` när mottagaren inte gjorde det, `unknown` enligt ovan. För `ours`: som i `telephony.complete` |

För ett `vendor`-samtal har ThunderPhone inga fakturerings- eller
extraheringsdata: `billable_minutes`, `billing_total_cents` och
`extracted_data` är `null`, `product` och `voice` är tomma,
`recording_mode` är `vendor` och `recording_url` är den andra plattformens
länk, när den gav en.

### `migration.rollback`

Skickas när en migrerings gradvisa övergång automatiskt flyttar tillbaka alla
samtal till den andra plattformen: 3 samtal kunde inte ansluta till ThunderPhone
inom 15 minuter, 2 samtal som skickades till ThunderPhone avslutades innan
agenten svarade, eller ThunderPhones resultatfrekvens för uppgifter sjönk mer än
det konfigurerade gapet under den andra plattformens. Icke-blockerande, en gång
per återställning. Efteråt är ThunderPhones andel 0 % och migreringen pausas tills
någon återupptar den på agentens flik Migration. Nyttolasten innehåller inga
telefonnummer, transkript eller samtals-id:n.

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

| Fält | Typ | Beskrivning |
|-------|------|-------------|
| `migration_id` | UUID | Migreringen |
| `vendor` | sträng | `retell`, `vapi`, `elevenlabs` eller `bland` |
| `reason` | sträng | `ours_failed_burst` (3 misslyckade anslutningar på 15 minuter), `dropped_calls` (2 samtal avslutades innan agenten svarade, inom 30 minuter) eller `rate_gap` (gap i resultatfrekvens för uppgifter över minst `rollback_min_calls` bedömda samtal per sida) |
| `previous_percent` | heltal | ThunderPhones andel av samtalen före återställningen |
| `ours_percent` | heltal | Alltid `0` |
| `step` | heltal \| null | Schemasteget som användes (0-baserat) |
| `ours` / `theirs` | objekt \| null | Bedömda samtal i det aktuella steget och deras framgångsfrekvens; `theirs` kan avse de senaste 30 dagarna när steget har för få samtal. `null` när det inte fanns några |
| `ours_failed` | heltal | Misslyckade anslutningar räknade under de senaste 15 minuterna |
| `dropped` | heltal | Samtal som räknats som avbrutna under de senaste 30 minuterna |
| `rolled_back_at` | tidsstämpel | |

---

## Relaterat

<CardGroup cols={2}>
  <Card title="telephony.incoming / web.incoming" icon="phone" href="/sv/webhooks/call-incoming">
    Den blockerande nyttolasten för inkommande samtal som du måste svara på.
  </Card>
  <Card title="telephony.complete / web.complete" icon="phone-slash" href="/sv/webhooks/call-complete">
    Transkription och mätvärden efter samtalet.
  </Card>
  <Card title="Webhook-slutpunkter" icon="bolt" href="/sv/webhooks/endpoints">
    Prenumerera en URL på en delmängd av dessa händelser.
  </Card>
  <Card title="Funktionsverktyg" icon="screwdriver-wrench" href="/sv/tools/overview">
    Så genereras händelserna `telephony.tool` / `web.tool`.
  </Card>
</CardGroup>
