---
title: "Katalog událostí"
description: "Všechny typy událostí webhooků, které ThunderPhone odesílá."
---

Každé tělo webhooku obsahuje pole `type`, jehož hodnota je jedním z typů
událostí na této stránce. Když se přihlásíte k odběru
[koncového bodu](/cs/webhooks/endpoints), pole `events` musí obsahovat
požadované typy událostí (nebo musí být prázdné, pokud se chcete přihlásit k odběru všeho —
s výjimkou událostí pro jednotlivá kola [`telephony.turn`](#telephony-turn) /
[`web.turn`](#web-turn), které jsou doručovány pouze koncovým bodům,
jež je výslovně uvádějí).

Tyto události jsou doručovány dvěma způsoby:

* Doručení do **endpointu** jsou vždy **neblokující** oznámení
  s [opakovanými pokusy](/cs/webhooks/overview): odpovězte
  libovolným kódem 2xx; obálka obsahuje `event_id` pro deduplikaci.
* **Blokující** výměny probíhají pouze na
  [starším webhooku s jedinou URL](/cs/webhooks/overview): při
  požadavku na konfiguraci [`telephony.incoming` / `web.incoming`](/cs/webhooks/call-incoming)
  (čísla v režimu webhooku: 13 s včetně jednoho
  opakovaného pokusu; klíče widgetu v režimu webhooku: 10 s) a při odesílání
  [nástroje](/cs/tools/overview) v režimu webhooku. Vaše odpověď
  ovlivňuje průběh živého hovoru.

Ukázkové datové obsahy níže zobrazují obálku koncového bodu v pořadí přenášeném po síti
(klíče jsou seřazeny abecedně: `data`, `event_id`, `type`); starší
doručení obsahují stejná `data` bez `event_id`.

## Události hovorů

### `telephony.incoming`

Odesílá se, když příchozí hovor dorazí na jedno z vašich
[telefonních čísel](/api-reference/phone-numbers). Doručení na endpoint jsou
oznámení typu fire-and-forget odesílaná pro **každý** příchozí hovor bez ohledu
na to, zda je číslo nakonfigurováno pro agenta nebo webhook. Čísla bez
přiřazeného agenta navíc obdrží **blokující** požadavek na konfiguraci
na starším webhooku — úplné schéma požadavku / odpovědi naleznete v
[`telephony.incoming` / `web.incoming`](/cs/webhooks/call-incoming).

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |
| `agent_name` | string \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |

### `telephony.complete`

Odesílá se po skončení příchozího nebo odchozího telefonního hovoru. Neblokující.
Zahrnuje přepis, adresu URL nahrávky, je-li k dispozici, a souhrn vyúčtování. Schéma
datové struktury naleznete v
[`telephony.complete` / `web.complete`](/cs/webhooks/call-complete).

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |
| `agent_name` | string \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |

### `telephony.tool`

Odesílá se poté, co telefonní hovor vyvolá
[funkční nástroj](/cs/tools/overview). Neblokující oznámení pro audit —
nástroj již byl spuštěn v okamžiku doručení této události; zahrnuje
vaše vlastní funkční nástroje a vestavěný nástroj `send_sms` (nikoli jiné vestavěné
nástroje, nástroje znalostní báze, připojení aplikací ani nástroje MCP). Pro `send_sms`
jsou `arguments.to` i `arguments.body` hodnotou `[REDACTED]`. Přepisy
po dokončení hovoru je také redigují; obsah a příjemce načtěte ze zdroje SMS
v rozsahu organizace pomocí `message_id` z odpovědi.

```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` je výsledek provedení: při úspěchu `{"status": <http status>,
"response": <your endpoint's JSON>}` nebo při selhání
`{"status": <status>, "error": "<message>"}`.

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |
| `agent_name` | string \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |

### `telephony.turn`

Odesílá se během **probíhajícího** telefonního hovoru, jednou pro každý
tah obsahující řeč, jakmile nastane — mluvené dokončení odpovědi agenta a
přepsané tahy volajícího. Umožňuje sledovat živou konverzaci
prostřednictvím běžných webhooků namísto dotazování
[`GET /v1/calls/{call_id}/transcript`](/api-reference/calls#get-transcript).
Neblokující.

<Note>
  **Vyžaduje se explicitní odběr.** Na rozdíl od všech ostatních typů událostí
  se události tahů nikdy nedoručují prostřednictvím prázdného pole `events`
  (odběr všech událostí). Endpoint je obdrží pouze tehdy, když jeho seznam
  `events` explicitně obsahuje `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"
}
```

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |
| `agent_name` | string \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |
| `position` | integer | Index tahu v historii hovoru — stabilní identifikátor pro řazení |
| `role` | string | `assistant` (řeč agenta) nebo `user` (řeč volajícího) |
| `text` | string | Text přepisu tahu známý v okamžiku odeslání |
| `entry_type` | string | Typ podkladové položky historie: `completion` (agent) nebo `user_turn` / `span` (volající) |
| `start_ms`, `end_ms` | integer | Posuny zvuku v ms od začátku hovoru; jsou uvedeny pouze tehdy, pokud bylo při odeslání již známo časování přehrávání |

<Note>
  Doručení je alespoň jednou a tahy mohou dorazit **mimo pořadí**:
  odstraňte duplicity podle `event_id` obálky a řaďte podle `position`. Přepisy
  volajícího se mohou po odeslání ještě upřesnit; přepis
  [`telephony.complete`](/cs/webhooks/call-complete) po skončení hovoru je
  autoritativní. Odesílají se pouze mluvené tahy — volání nástrojů, šeptání a
  další interní položky se v tomto proudu nikdy neobjeví.
</Note>

### `web.incoming`

Ekvivalent `telephony.incoming` pro webový kanál, odesílaný při zahájení relace
[webového widgetu](/cs/widget/overview) nebo testovacího hovoru mikrofonu v editoru.
Doručení na endpoint jsou oznámení typu fire-and-forget pro každou webovou relaci.
Publikovatelné klíče v `mode="webhook"` navíc obdrží **blokující** požadavek na
konfiguraci na starším webhooku — tento blokující požadavek má jinou strukturu
(`origin_domain`, `publishable_key_prefix`; žádná telefonní čísla). Viz
[`telephony.incoming` / `web.incoming`](/cs/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` je vždy doslovná hodnota `"web"`. U relací widgetu v režimu webhooku
je `to_number` prázdné (číslo agenta relace se přiřadí po konfiguraci); u testovacích
hovorů mikrofonu v editoru jsou `origin_domain` a `publishable_key_prefix` prázdné.

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |
| `agent_name` | string \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |

### `web.complete`

Ekvivalent `telephony.complete` pro webový kanál, zahrnující hovory webového
widgetu (`direction: "web"`) a testovací hovory mikrofonu v editoru
(`direction: "test"`). Neblokující. Stejná struktura dat jako u
[`telephony.complete`](/cs/webhooks/call-complete), navíc s `origin_domain`,
přičemž `from_number` je nastaveno na `"web"`.

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |
| `agent_name` | string \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |

<Note>
  Na starším webhooku s jedinou adresou URL se testovací hovory mikrofonu v editoru
  historicky vykazují jako `telephony.complete` — typ `web.complete` se zde používá
  pouze pro hovory s `direction: "web"`. Systém endpointů mapuje webové i testovací
  hovory na `web.*`. Historické datové struktury mohou obsahovat starší hodnoty
  `direction` `widget` nebo `mic`.
</Note>

### `web.tool`

Ekvivalent `telephony.tool` pro webový kanál. `data` obsahuje
`origin_domain` namísto `from_number` / `to_number`.

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |
| `agent_name` | string \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |

### `web.turn`

Ekvivalent [`telephony.turn`](#telephony-turn) pro webový kanál, zahrnující hovory
webového widgetu a testovací hovory mikrofonu v editoru. Stejná struktura dat,
s `origin_domain` namísto `from_number` / `to_number`.
Stejně jako `telephony.turn` vyžaduje **explicitní odběr** — nikdy se nedoručuje
prostřednictvím prázdného pole `events`.

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |
| `agent_name` | string \| null | Hlasový agent, který hovor vyřídil, pokud byl přiřazen |

### `call.transfer_completed`

Odesílá se jednou za hovor s konečným výsledkem
[přepojení hovoru](/cs/guides/call-transfers): studeného přepojení nebo
spojení mezi lidmi, které po odpojení agenta zůstane po teplém přepojení.
Neblokuje zpracování a doručuje se pouze do endpointů (nikdy do staršího
webhooku s jedinou URL). Přichází po události `telephony.complete` hovoru:
jakmile operátor převezme hovor nebo přepojení selže, případně, když
ThunderPhone hovor propojil, po ukončení spojení.

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `call_id` | celé číslo | Hovor, který byl přepojen |
| `agent_id` | celé číslo \| null | Agent, který hovor vyřídil, pokud byl přiřazen |
| `agent_name` | řetězec \| null | Agent, který hovor vyřídil, pokud byl přiřazen |
| `transfer_outcome` | řetězec | `refer_accepted`: operátor hovor převzal. `bridged`: ThunderPhone ponechal volajícího a cílové číslo propojené, protože operátor odmítl studené přepojení nebo protože se agent při teplém přepojení odpojil. `bridge_unanswered`: operátor odmítl studené přepojení a cílové číslo neodpovědělo na vlastní hovor ThunderPhone. `failed`: přepojení neproběhlo a hovor skončil |
| `destination` | řetězec \| null | Číslo, na které byl hovor přepojen |
| `sip_status` | celé číslo \| null | Stav SIP operátora při odmítnutí studeného přepojení: `403` (například trunk Twilio bez přepojování hovorů), `405` nebo `501`. `null`, pokud jej operátor neodmítl |
| `bridge_kind` | řetězec \| null | Pouze pro `bridged`: `cold_fallback` (odmítnuté studené přepojení, které ThunderPhone propojil) nebo `warm` (dva účastníci teplého přepojení po odpojení agenta) |
| `bridge_seconds` | celé číslo \| null | Pouze pro `bridged`: doba propojení, kterou ThunderPhone účtoval, v sekundách |
| `bridge_total_cents` | celé číslo \| null | Pouze pro `bridged`: cena propojení v centech USD po započtení případného kreditu na bezplatné hovory, účtovaná samostatně od `billing_total_cents` hovoru |

Stejné hodnoty jsou v [objektu hovoru](/api-reference/calls#call-object)
jako `transfer_outcome`, `transfer_destination`, `transfer_sip_status`,
`transfer_bridge_kind`, `transfer_bridge_seconds` a
`transfer_bridge_total_cents`. `event_id` je při každém doručení pro hovor
stejné, takže opakované hlášení nikdy nevytvoří druhou událost.

---

## Události SMS

Události SMS popisují zprávy odeslané prostřednictvím účtu Twilio nebo Telnyx
připojeného k organizaci. Tělo zprávy je vynecháno a `to` je začerněno.
Zprávu v rozsahu organizace načtěte z
[`GET /v1/sms/{message_id}`](/api-reference/sms#retrieve-a-message), pokud
potřebujete její obsah nebo příjemce.

### `sms.sent`

Odesílá se, když operátor zákazníka přijme požadavek na odchozí SMS. Nejde
o potvrzení doručení do zařízení.

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

Odesílá se po trvalém odmítnutí operátorem, po vyčerpání opakovaných pokusů
při přechodných chybách nebo pokud je výsledek definitivně neznámý.
`error_code` je stabilní kód ThunderPhone a `error_message` uvádí akci
zákazníka, pokud je k dispozici. `status: "unknown"` znamená, že operátor
mohl SMS přijmout; ověřte ji v protokolu operátora, protože ThunderPhone ji
automaticky znovu neodešle.

### `sms.received`

Vyhrazeno pro podporu příchozích SMS. V aktuální verzi se neodesílají žádné
události `sms.received`. Konfigurace webhooku příchozího operátora a ověření
podpisu budou vydány samostatně.

---

## Hlasové události

Vytváření vlastního hlasu probíhá asynchronně. Tyto neblokující události vám
umožňují reagovat na konečný výsledek namísto dotazování
[koncového bodu s podrobnostmi klonu](/api-reference/custom-voices#list-and-retrieve-clones).

`voice.ready` a `voice.failed` se doručují pouze do koncového bodu pro celou
organizaci s `events: []`. Nelze je vybrat jako explicitní filtry událostí.

### `voice.ready`

Odesílá se, když vlastní hlas dokončí zpracování a lze jej přiřadit agentovi.

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

Odesílá se, když zpracování vlastního hlasu skončí trvalým selháním.

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `voice.id` | řetězec | Veřejné ID vlastního hlasu |
| `voice.name` | řetězec | Hodnota hlasu agenta ve formátu `custom:<public_id>` |
| `voice.display_name` | řetězec | Název hlasu viditelný organizaci |
| `voice.language` | řetězec | Kód jediného jazyka klonu |
| `voice.gender` | řetězec | `male`, `female` nebo prázdný řetězec |
| `voice.status` | řetězec | `ready` pro `voice.ready`; `failed` pro `voice.failed` |
| `voice.failure_reason` | řetězec | Při úspěchu prázdné; při selhání podrobnost o chybě zpracování |
| `voice.created_at`, `voice.updated_at` | časové razítko | Časová razítka ISO 8601 |
| `reason` | řetězec | Podrobnost o selhání; přítomna pouze u `voice.failed` |

---

## Události kvality

### `call.graded`

Odesílá se po dokončení [běhu hodnocení AI](/api-reference/calls#ai-call-grading)
pro hovor. Neblokující.

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, který vyřídil hovor, pokud byl přiřazen |
| `agent_name` | string \| null | Agent, který vyřídil hovor, pokud byl přiřazen |
| `grade.id` | integer | ID hodnocení |
| `grade.score` | integer \| null | 0–100 |
| `grade.call_outcome` | string | `success`, `failure`, `unknown` nebo `no_conversation` |
| `grade.summary` | string | Jednoodstavcové shrnutí |
| `grade.detected_issues` | array | Řetězce problémů nalezených hodnotitelem |
| `grade.status` | string | Vždy `completed` — událost se odesílá pouze pro dokončená spuštění |
| `grade.grader_model` | string | Hodnotitel, který vytvořil výsledek (např. `heuristic-v1`) |
| `grade.graded_at`, `grade.created_at` | timestamp | |
| `report` | object \| null | [Report hovoru](/api-reference/calls#call-report) určený zákazníkovi: štítek výsledku, příznak vyžadující pozornost a důvod, volající, jednořádkové shrnutí, zkušenost volajícího. U časného heuristického hodnocení je `null` nebo jde o report `pending`, jehož pole obsahují zástupné hodnoty; událost úplného hodnocení obsahuje dokončený report |

<Note>
  Hovor lze hodnotit vícekrát — po rychlém heuristickém hodnocení
  často následuje hodnocení plným modelem, jakmile je k dispozici
  nahrávka, a je možné provést i ruční přehodnocení. Každý dokončený
  běh odešle vlastní událost `call.graded`; za autoritativní považujte
  nejnovější hodnotu `graded_at`.
</Note>

### `call.data_extracted`

Odesílá se po úspěšném dokončení extrakce strukturovaných dat, včetně
pozdního opakování po `telephony.complete` / `web.complete` nebo ručního
opětovného spuštění prostřednictvím
[`POST /v1/calls/{call_id}/extract`](/api-reference/calls#run-data-extraction).
Neblokující.

V blokujícím režimu extrakce událost dokončení obvykle nečeká déle než
75sekundový limit pro extrakci. Pokud dojde ke ztrátě procesu pracovníka
extrakce, produkční vyprazdňování finalizace (každých pět minut) uvolní
dokončení, jehož `blocking_deadline_at` uplynul, ještě před zahájením dalšího
pokusu o extrakci. Pozdější úspěch je doručen samostatně jako tato událost.

<Warning>
  Extrahované hodnoty představují interpretaci konverzace modelem. Každá
  nenulová hodnota obsahuje citaci, roli mluvčího a index tahu, na kterých
  byla založena, a také příznak ověření na úrovni běhu. Před rozhodnutími
  týkajícími se peněz, identity nebo přístupu výsledek ověřte.
</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"
}
```

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, který vyřídil hovor, pokud byl přiřazen |
| `agent_name` | string \| null | Agent, který vyřídil hovor, pokud byl přiřazen |
| `summary` | string \| null | Dokončené [shrnutí hovoru](/cs/webhooks/call-complete), když má agent zapnutou možnost **Generovat souhrn hovoru**, takže pozdní událost extrakce doručí také shrnutí, které nestihlo okno dokončení; jinak `null`. Agenti se shrnutím, ale bez polí extrakce, tuto událost nikdy neodesílají: pozdní shrnutí načtěte z `GET /v1/calls/{call_id}` |
| `extracted_data.status` | string | Pro tuto událost vždy `completed` |
| `extracted_data.fields` | object | Hodnoty s klíči podle nakonfigurovaných klíčů extrakčních polí; nedostupné hodnoty jsou `null` |
| `extracted_data.evidence` | object | Důkazy s klíči podle extrakčního pole. Nenulová hodnota obsahuje přesnou strukturálně ověřenou citaci (nejvýše 1 000 znaků), `speaker_role` (`caller` nebo `agent`) a `turn_index`; delší citace vrácené modelem jsou namísto zkrácení odmítnuty a důkaz je vždy `null`, když je jeho pole `null` |
| `extracted_data.verification` | string | `verified` pouze tehdy, když nezávislý průchod důkazů vrátil právě jeden platný verdikt pro každé kandidátní pole. `unavailable` znamená, že průchod selhal, vypršel jeho časový limit, neměl dostatečný rozpočet nebo vrátil chybně formátovaný či částečný výstup. Zcela nedostupný průchod zachová hodnoty strukturálně podložené pro kontrolu zákazníkem. U částečného výstupu se použijí platné verdikty a každý kandidát bez právě jednoho platného verdiktu se nastaví na hodnotu null |
| `extracted_data.field_reasons` | object | Důvody s klíči podle polí, která byla nastavena na null strukturálním ukotvením nebo nezávislým ověřovatelem |
| `extracted_data.schema_version` | string | Hash přesného schématu polí použitého pro tuto extrakci |
| `extracted_at` | timestamp | Čas dokončení ve formátu ISO 8601 |
| `model` | string | Model použitý pro extrakci |

### `campaign.completed`

Odešle se jednou, když kampaň přejde ze stavu `running` do `completed`, ať už
její plán skončil, nebo všechny kontakty dosáhly koncových stavů. Opakované
pokusy runneru neodesílají další událost. Tato událost životního cyklu na
úrovni organizace se doručuje pouze do koncových bodů s rozsahem organizace,
nikoli do koncových bodů s rozsahem agenta. Neblokující.

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

Čtyři počty výsledků se vzájemně vylučují a jejich součet odpovídá hodnotě
`contacts_total`: `completed` obsahuje úspěšné kontakty; `no_answer` obsahuje
koncové neúspěšné/vyčerpané kontakty, jejichž konečným výsledkem byla
neodpověď; `failed` obsahuje všechny ostatní koncové neúspěšné/vyčerpané
kontakty; a `remaining` obsahuje čekající, naplánované nebo právě volané
kontakty. Kontakt čekající na opakovaný pokus je `remaining`, i když jeho
poslední pokus skončil bez odpovědi. Probíhající hovory jsou odsouhlaseny před
jednorázovým snímkem dokončení. `started_at` je nakonfigurovaný začátek
kampaně, nebo čas vytvoření kampaně, pokud začátek nebyl nakonfigurován.

### `issue.reported`

Odešle se při vytvoření [hlášení problému](/api-reference/issue-reports) —
buď jej uživatel odešle z řídicího panelu (`source: "user"`), nebo jej
automaticky vytvoří hodnocení hovoru (`source: "system"`). Neblokující.

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, který vyřídil hovor, pokud byl přiřazen |
| `agent_name` | string \| null | Agent, který vyřídil hovor, pokud byl přiřazen |
| `issue_report.severity` | string | `critical`, `warning` nebo `info` |
| `issue_report.status` | string | `open` nebo `resolved` |
| `issue_report.source` | string | `user` (odesláno z řídicího panelu) nebo `system` (vytvořeno hodnocením) |

<Note>
  Přehodnocení hovoru znovu vytvoří jeho systémem generovaná hlášení
  problémů, čímž se pro znovu vytvořená hlášení opět odešle
  `issue.reported`. Pokud chcete pouze jedno oznámení pro každý
  základní problém, deduplikujte podle `call_id` + `title`.
</Note>

### `issue.escalated`

Odešle se, když je vzorec problému odeslán ThunderPhone ke kontrole týmem:
po kliknutí na **Nahlásit ThunderPhoneu** nebo když funkce Opravit pomocí AI
nemůže potvrdit opravu na straně zákazníka a problém automaticky předá.
Tuto událost přijímají pouze koncové body pro celou organizaci.

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `automatic` | boolean | `true` pro automatickou eskalaci; `false` pro ruční eskalaci |
| `cluster_id` | UUID | Eskalovaný vzorec problému |
| `escalation_id` | UUID | Záznam eskalace |
| `status` | string | `open` při odeslání události |

Jde o oznámení, nikoli o balíček důkazů. Pomocí `cluster_id` jej propojte se
vzorem problému. Viz [Nahlásit ThunderPhoneu](/cs/guides/issues).

---

## Události testovacích hovorů

### `test-call.completed`

Odesílá se, když
[testovací běh hovoru](/api-reference/test-calls#test-call-run-object)
dosáhne konečného stavu — `completed` nebo `failed`, včetně běhů,
které selhaly při spuštění a nikdy nevytvořily hovor. Neblokující. Užitečné
pro propojení dávkových běhů CI s vašimi systémy chatu a oznámení.

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `agent_id` | integer \| null | Agent, který obsloužil hovor, pokud byl přiřazen |
| `agent_name` | string \| null | Agent, který obsloužil hovor, pokud byl přiřazen |
| `test_call_run.target_type` | string | `agent` nebo `phone_number` |
| `test_call_run.target_id` | integer | ID agenta nebo telefonního čísla, na které byl běh zaměřen, podle hodnoty `target_type` |
| `test_call_run.status` | string | `completed` nebo `failed` |
| `test_call_run.call_id` | integer \| null | `null`, pokud běh selhal před uskutečněním hovoru |
| `test_call_run.error_message` | string | Při úspěchu je prázdné |

---

## Události upozornění

### `alert.triggered`

Odesílá se, když [pravidlo upozornění](/cs/guides/alerts) s povoleným kanálem
**Doručovat do webhooků pro vývojáře** překročí svůj práh.
Neblokující. Pravidlo se spustí jednou a poté respektuje dobu ochlazení, takže
trvalé překročení vytvoří jednu událost za každé okno doby ochlazení.

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `event_id` (v `data`) | UUID | ID **spuštění** upozornění — liší se od `event_id` doručení v obálce |
| `rule_id`, `rule_name` | UUID, string | Pravidlo, které se spustilo |
| `metric` | string | `success_rate`, `failure_rate`, `avg_score`, `call_volume` nebo `suite_regression` |
| `comparator` | string | `lt`, `lte`, `gt` nebo `gte` |
| `metric_value` | number | Hodnota metriky v okně při spuštění pravidla |
| `threshold` | number | Nakonfigurovaný práh |
| `window_hours` | integer | Posuvné hodnoticí okno |
| `fired_at` | timestamp | |

Informace o vytváření pravidel, metrikách, dobách ochlazení a kanálech
e-mail / Slack najdete v [průvodci upozorněními](/cs/guides/alerts).

---

## Události migrace

### `migration.call.complete`

Odesílá se po ukončení hovoru uskutečněného prostřednictvím
[`POST /v1/migrations/{id}/calls`](/api-reference/migration-calls),
bez ohledu na to, která platforma jej zpracovala. Neblokuje. Doručí se až přibližně 5 minut
po ukončení hovoru. `data` obsahuje všechna pole z
[`telephony.complete`](/cs/webhooks/call-complete) a blok `migration`. Hovor uskutečněný službou ThunderPhone také jako obvykle odešle `telephony.complete` se
stejným `call_id`. Hovor na druhé platformě, který neskončil ani po 2
hodinách nebo jehož migrace byla dokončena či nejprve ztratila svůj klíč, se odešle se
`status: "unknown"` a bez přepisu.

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `migration.id` | UUID | Migrace |
| `migration.routing_id` | UUID | Směrovaný hovor vrácený při jeho uskutečnění |
| `migration.arm` | string | `ours` (uskutečnil jej ThunderPhone) nebo `vendor` (uskutečnila jej druhá platforma) |
| `migration.vendor` | string | `retell`, `vapi`, `elevenlabs` nebo `bland` |
| `migration.vendor_call_id` | string \| null | ID hovoru druhé platformy; pro `ours` je `null` |
| `migration.metadata` | object | Hodnota `metadata`, kterou jste odeslali při uskutečnění hovoru |
| `migration.vendor_cost_usd` | string \| null | Náklady na hovor nahlášené druhou platformou, pokud je nahlásila |
| `call_id` | integer \| null | ID hovoru ThunderPhone; pro `vendor` je `null` |
| `status` | string | Pro `vendor`: `completed`, když příjemce hovoru mluvil, `failed`, když nemluvil, `unknown` ve výše uvedeném případě. Pro `ours`: jako v `telephony.complete` |

Pro hovor `vendor` nemá ThunderPhone žádné údaje o účtování ani extrakci:
`billable_minutes`, `billing_total_cents` a `extracted_data` jsou `null`,
`product` a `voice` jsou prázdné, `recording_mode` je `vendor` a
`recording_url` je odkaz druhé platformy, pokud jej poskytla.

### `migration.rollback`

Odesílá se, když postupné přepínání migrace samo přesune všechny hovory zpět na
druhou platformu: 3 hovory se během 15 minut nepodařilo připojit k ThunderPhone,
2 hovory odeslané do ThunderPhone skončily před odpovědí agenta nebo míra
úspěšnosti výsledků úloh ThunderPhone klesla pod míru druhé platformy o více než
nastavený rozdíl. Neblokující, jednou při každém vrácení zpět. Poté je podíl
ThunderPhone 0 % a migrace je pozastavena, dokud ji někdo znovu nespustí na
kartě Migrace agenta. Datová část neobsahuje žádná telefonní čísla, přepisy ani
ID hovorů.

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

| Pole | Typ | Popis |
|-------|------|-------------|
| `migration_id` | UUID | Migrace |
| `vendor` | řetězec | `retell`, `vapi`, `elevenlabs` nebo `bland` |
| `reason` | řetězec | `ours_failed_burst` (3 neúspěšná připojení během 15 minut), `dropped_calls` (2 hovory skončily před odpovědí agenta během 30 minut) nebo `rate_gap` (rozdíl v míře úspěšnosti výsledků úloh při nejméně `rollback_min_calls` vyhodnocených hovorech na každé straně) |
| `previous_percent` | celé číslo | Podíl hovorů ThunderPhone před vrácením zpět |
| `ours_percent` | celé číslo | Vždy `0` |
| `step` | celé číslo \| null | Krok harmonogramu, na kterém se nacházela (indexováno od 0) |
| `ours` / `theirs` | objekt \| null | Vyhodnocené hovory v aktuálním kroku a jejich míra úspěšnosti; `theirs` může zahrnovat posledních 30 dní, pokud má krok příliš málo hovorů. `null`, pokud žádné nebyly |
| `ours_failed` | celé číslo | Neúspěšná připojení započítaná za posledních 15 minut |
| `dropped` | celé číslo | Hovory započítané jako předčasně ukončené za posledních 30 minut |
| `rolled_back_at` | časové razítko | |

---

## Související

<CardGroup cols={2}>
  <Card title="telephony.incoming / web.incoming" icon="phone" href="/cs/webhooks/call-incoming">
    Blokující datová část příchozího hovoru, na kterou musíte odpovědět.
  </Card>
  <Card title="telephony.complete / web.complete" icon="phone-slash" href="/cs/webhooks/call-complete">
    Přepis a metriky po hovoru.
  </Card>
  <Card title="Koncové body webhooků" icon="bolt" href="/cs/webhooks/endpoints">
    Přihlaste URL k odběru podmnožiny těchto událostí.
  </Card>
  <Card title="Funkční nástroje" icon="screwdriver-wrench" href="/cs/tools/overview">
    Jak se generují události `telephony.tool` / `web.tool`.
  </Card>
</CardGroup>
