---
title: "Catalog de evenimente"
description: "Toate tipurile de evenimente webhook emise de ThunderPhone."
---

Fiecare corp de webhook are un câmp `type` a cărui valoare este unul dintre
tipurile de evenimente de pe această pagină. Când vă abonați la un
[endpoint](/ro/webhooks/endpoints), matricea `events` trebuie să conțină
tipurile de evenimente dorite (sau să fie goală pentru a vă abona la toate —
cu excepția evenimentelor per tură [`telephony.turn`](#telephony-turn) /
[`web.turn`](#web-turn), care sunt livrate doar către endpointurile care
le menționează explicit).

Aceste evenimente sunt transmise în două stiluri:

* **Livrările către endpointuri** sunt întotdeauna notificări **neblocante**, cu [reîncercări](/ro/webhooks/overview): răspundeți cu orice cod 2xx; plicul conține un `event_id` pentru deduplicare.
* Schimburile **blocante** au loc numai prin [webhook-ul vechi cu un singur URL](/ro/webhooks/overview): cererea de configurare [`telephony.incoming` / `web.incoming`](/ro/webhooks/call-incoming) (numere în modul webhook: 13 s, inclusiv o reîncercare; chei de widget în modul webhook: 10 s) și [dispecerizarea instrumentelor](/ro/tools/overview) în modul webhook. Răspunsul dumneavoastră modelează apelul în direct.

Exemplele de încărcături utile de mai jos afișează anvelopa endpointului în
ordinea transmisă (chei sortate alfabetic: `data`, `event_id`, `type`);
livrările moștenite conțin aceleași date `data` fără `event_id`.

## Evenimente pentru apeluri

### `telephony.incoming`

Trimis când un apel de intrare ajunge la unul dintre
[numerele dumneavoastră de telefon](/api-reference/phone-numbers). Livrările către endpoint sunt
notificări fără așteptarea unui răspuns trimise pentru **fiecare** apel de intrare, indiferent
dacă numărul este configurat cu un agent sau cu un webhook. Numerele fără
un agent alocat primesc suplimentar solicitarea de configurare **blocantă**
pe webhookul vechi — consultați
[`telephony.incoming` / `web.incoming`](/ro/webhooks/call-incoming) pentru
schema completă de solicitare / răspuns.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |

### `telephony.complete`

Trimis când se încheie un apel telefonic de intrare sau de ieșire. Nu blochează.
Include transcrierea, URL-ul înregistrării când este disponibil și rezumatul facturării. Consultați
[`telephony.complete` / `web.complete`](/ro/webhooks/call-complete) pentru
schema încărcăturii utile.

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |

### `telephony.tool`

Trimis după ce un apel telefonic invocă un
[instrument de funcție](/ro/tools/overview). Notificare de audit care nu blochează —
instrumentul a fost deja executat când acest eveniment este livrat; acesta acoperă
propriile instrumente de funcție și instrumentul integrat `send_sms` (nu alte instrumente integrate,
instrumente din baza de cunoștințe, conexiuni de aplicații sau instrumente MCP). Pentru `send_sms`,
atât `arguments.to`, cât și `arguments.body` sunt `[REDACTED]`. Transcrierile
de finalizare le redactează, de asemenea; preluați conținutul și destinatarul din
resursa SMS la nivel de organizație folosind `message_id` din răspuns.

```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` este rezultatul executat: `{"status": <http status>,
"response": <your endpoint's JSON>}` în caz de reușită sau
`{"status": <status>, "error": "<message>"}` în caz de eșec.

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |

### `telephony.turn`

Trimis în timp ce un apel telefonic este **în desfășurare**, o dată pentru fiecare
tur care conține vorbire, pe măsură ce are loc — răspunsurile rostite ale
agentului și tururile transcrise ale apelantului. Vă permite să urmăriți conversația
în timp real prin webhookuri obișnuite, în loc să interogați periodic
[`GET /v1/calls/{call_id}/transcript`](/api-reference/calls#get-transcript).
Nu blochează.

<Note>
  **Este necesară abonarea explicită.** Spre deosebire de toate celelalte tipuri de evenimente,
  evenimentele de tur nu sunt niciodată livrate printr-o matrice `events`
  goală (abonare la toate). Un endpoint le primește numai când lista sa `events`
  conține explicit `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"
}
```

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |
| `position` | integer | Indexul turului în istoricul apelului — o identitate stabilă pentru ordonare |
| `role` | string | `assistant` (vorbirea agentului) sau `user` (vorbirea apelantului) |
| `text` | string | Textul transcrierii turului, așa cum este cunoscut la momentul emiterii |
| `entry_type` | string | Tipul intrării de istoric subiacente: `completion` (agent) sau `user_turn` / `span` (apelant) |
| `start_ms`, `end_ms` | integer | Decalaje audio în ms de la începutul apelului; prezente numai când momentul redării era deja cunoscut la momentul emiterii |

<Note>
  Livrarea este cel puțin o dată, iar tururile pot ajunge **în altă ordine**:
  eliminați duplicatele folosind `event_id` din pachetul evenimentului și ordonați după `position`. Transcrierile
  apelantului se pot rafina în continuare după emitere; transcrierea
  [`telephony.complete`](/ro/webhooks/call-complete) de după apel este
  autoritară. Sunt emise doar tururile rostite — apelurile de instrumente, șoaptele și
  alte intrări interne nu apar niciodată în acest flux.
</Note>

### `web.incoming`

Echivalentul pe canalul web al `telephony.incoming`, trimis când începe o sesiune
a unui [widget web](/ro/widget/overview) sau un apel de test al microfonului în constructor.
Livrările către endpoint sunt fără așteptarea unui răspuns pentru fiecare sesiune web.
Cheile publicabile în `mode="webhook"` primesc suplimentar solicitarea de configurare
**blocantă** pe webhookul vechi — acea solicitare blocantă are o structură diferită (`origin_domain`,
`publishable_key_prefix`; fără numere de telefon). Consultați
[`telephony.incoming` / `web.incoming`](/ro/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` este întotdeauna valoarea literală `"web"`. Pentru sesiunile widgetului
în modul webhook, `to_number` este gol (numărul agentului pentru sesiune este alocat
după configurare); pentru apelurile de test ale microfonului în constructor, `origin_domain` și
`publishable_key_prefix` sunt goale.

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |

### `web.complete`

Echivalentul pe canalul web al `telephony.complete`, care acoperă apelurile
widgetului web (`direction: "web"`) și apelurile de test ale microfonului în constructor
(`direction: "test"`). Nu blochează. Are aceeași structură a încărcăturii utile ca
[`telephony.complete`](/ro/webhooks/call-complete), plus `origin_domain`,
cu `from_number` setat la `"web"`.

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |

<Note>
  Pe webhookul vechi cu un singur URL, apelurile de test ale microfonului în constructor
  sunt raportate istoric ca `telephony.complete` — numai apelurile cu `direction:
  "web"` folosesc acolo tipul `web.complete`. Sistemul de endpointuri
  mapează atât apelurile web, cât și cele de test la `web.*`. Încărcăturile utile istorice pot
  conține valorile vechi `widget` sau `mic` pentru `direction`.
</Note>

### `web.tool`

Echivalentul pe canalul web al `telephony.tool`. Elementul `data` conține
`origin_domain` în loc de `from_number` / `to_number`.

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |

### `web.turn`

Echivalentul pe canalul web al [`telephony.turn`](#telephony-turn),
care acoperă apelurile widgetului web și apelurile de test ale microfonului în constructor. Are aceeași structură
a încărcăturii utile, cu `origin_domain` în loc de `from_number` / `to_number`.
La fel ca `telephony.turn`, necesită o **abonare explicită** —
nu este niciodată livrat printr-o matrice `events` goală.

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, dacă a fost alocat unul |

### `call.transfer_completed`

Trimis o dată per apel, cu rezultatul final al unui
[transfer de apel](/ro/guides/call-transfers): un transfer direct sau puntea dintre persoane
pe care o lasă în urmă un transfer asistat după ce agentul se retrage.
Nu blochează execuția și este livrat numai către endpointuri (niciodată către
webhookul moștenit cu un singur URL). Sosește după `telephony.complete` al apelului:
după ce operatorul preia apelul sau transferul eșuează ori, atunci când
ThunderPhone a creat o punte pentru apel, după încheierea punții.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `call_id` | integer | Apelul care a fost transferat |
| `agent_id` | integer \| null | Agentul care a gestionat apelul, dacă a fost atribuit unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, dacă a fost atribuit unul |
| `transfer_outcome` | string | `refer_accepted`: operatorul a preluat apelul. `bridged`: ThunderPhone a menținut conectate apelantul și destinația, fie deoarece operatorul a refuzat un transfer direct, fie deoarece agentul dintr-un transfer asistat s-a retras. `bridge_unanswered`: operatorul a refuzat un transfer direct, iar destinația nu a răspuns la apelul inițiat de ThunderPhone. `failed`: transferul nu a reușit, iar apelul s-a încheiat |
| `destination` | string \| null | Numărul către care a fost transferat apelul |
| `sip_status` | integer \| null | Starea SIP a operatorului atunci când a refuzat transferul direct: `403` (de exemplu, un trunk Twilio fără transfer de apel), `405` sau `501`. `null` atunci când operatorul nu l-a refuzat |
| `bridge_kind` | string \| null | Numai pentru `bridged`: `cold_fallback` (un transfer direct refuzat pe care ThunderPhone l-a conectat) sau `warm` (cele două persoane dintr-un transfer asistat după plecarea agentului) |
| `bridge_seconds` | integer \| null | Numai pentru `bridged`: durata facturată de ThunderPhone pentru punte, în secunde |
| `bridge_total_cents` | integer \| null | Numai pentru `bridged`: costul punții în cenți USD după aplicarea oricărui credit gratuit pentru apel, facturat separat de `billing_total_cents` al apelului |

Aceleași valori se află pe [obiectul apelului](/api-reference/calls#call-object)
ca `transfer_outcome`, `transfer_destination`, `transfer_sip_status`,
`transfer_bridge_kind`, `transfer_bridge_seconds` și
`transfer_bridge_total_cents`. `event_id` este același la fiecare livrare
pentru un apel, astfel încât un raport repetat nu produce niciodată un al doilea eveniment.

---

## Evenimente SMS

Evenimentele SMS descriu mesajele trimise prin contul Twilio sau Telnyx conectat al organizației. Corpul mesajului este omis, iar `to` este redactat.
Preluați mesajul din domeniul organizației din
[`GET /v1/sms/{message_id}`](/api-reference/sms#retrieve-a-message) atunci când aveți nevoie de conținutul sau de destinatarul acestuia.

### `sms.sent`

Trimis atunci când operatorul clientului acceptă o solicitare SMS de ieșire. Acesta nu este un raport de livrare pe dispozitiv.

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

Trimis după o respingere permanentă din partea operatorului, după epuizarea reîncercărilor tranzitorii sau atunci când rezultatul este necunoscut în mod definitiv. `error_code` este un cod ThunderPhone stabil, iar `error_message` indică acțiunea clientului, atunci când este disponibilă. `status: "unknown"` înseamnă că operatorul ar fi putut accepta SMS-ul; reconciliați-l în jurnalul operatorului, deoarece ThunderPhone nu îl va retrimite automat.

### `sms.received`

Rezervat pentru suportul SMS de intrare. În versiunea curentă nu sunt emise evenimente `sms.received`. Configurarea webhook-urilor de intrare ale operatorului și verificarea semnăturii vor fi lansate separat.

---

## Evenimente vocale

Crearea vocilor personalizate este asincronă. Aceste evenimente neblocante vă permit să reacționați la un rezultat final, în loc să interogați repetat
[endpointul cu detaliile clonei](/api-reference/custom-voices#list-and-retrieve-clones).

`voice.ready` și `voice.failed` sunt livrate numai către un endpoint la nivelul întregii organizații cu `events: []`. Acestea nu pot fi selectate ca filtre explicite de evenimente.

### `voice.ready`

Trimis atunci când o voce personalizată finalizează procesarea și poate fi atribuită unui 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`

Trimis atunci când procesarea unei voci personalizate ajunge la o eroare permanentă.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `voice.id` | string | ID public al vocii personalizate |
| `voice.name` | string | Valoarea vocii agentului în forma `custom:<public_id>` |
| `voice.display_name` | string | Numele vocii destinat organizației |
| `voice.language` | string | Codul unic de limbă al clonei |
| `voice.gender` | string | `male`, `female` sau un șir gol |
| `voice.status` | string | `ready` pentru `voice.ready`; `failed` pentru `voice.failed` |
| `voice.failure_reason` | string | Gol la reușită; detaliul erorii de procesare la eșec |
| `voice.created_at`, `voice.updated_at` | timestamp | Marcaje temporale ISO 8601 |
| `reason` | string | Detaliul erorii; prezent numai pentru `voice.failed` |

---

## Evenimente de calitate

### `call.graded`

Trimis de fiecare dată când o [rulare de evaluare AI](/api-reference/calls#ai-call-grading)
se finalizează pentru un apel. Nu blochează execuția.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, când a fost atribuit unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, când a fost atribuit unul |
| `grade.id` | integer | ID-ul evaluării |
| `grade.score` | integer \| null | 0–100 |
| `grade.call_outcome` | string | `success`, `failure`, `unknown` sau `no_conversation` |
| `grade.summary` | string | Rezumat într-un paragraf |
| `grade.detected_issues` | array | Șiruri care descriu problemele identificate de evaluator |
| `grade.status` | string | Întotdeauna `completed` — sunt emise numai rulările finalizate |
| `grade.grader_model` | string | Evaluatorul care a produs rezultatul (de exemplu, `heuristic-v1`) |
| `grade.graded_at`, `grade.created_at` | timestamp | |
| `report` | object \| null | [Raportul de apel](/api-reference/calls#call-report) destinat clientului: eticheta rezultatului, indicatorul și motivul pentru necesitatea de atenție, apelantul, rezumatul într-un rând, experiența apelantului. La o evaluare euristică timpurie, acesta este `null` sau un raport `pending` ale cărui câmpuri sunt substituenți; evenimentul evaluării complete îl conține pe cel finalizat |

<Note>
  Un apel poate fi evaluat de mai multe ori — o evaluare euristică rapidă este
  adesea urmată de o evaluare completă a modelului după ce înregistrarea devine
  disponibilă și sunt posibile reevaluări manuale. Fiecare rulare finalizată
  emite propriul eveniment `call.graded`; considerați cel mai recent
  `graded_at` drept autoritar.
</Note>

### `call.data_extracted`

Trimis de fiecare dată când extragerea structurată de date se finalizează cu succes, inclusiv după o
reîncercare întârziată după `telephony.complete` / `web.complete` sau după o rerulare manuală prin
[`POST /v1/calls/{call_id}/extract`](/api-reference/calls#run-data-extraction).
Nu blochează execuția.

Într-un mod de extragere cu blocare, evenimentul de finalizare așteaptă în mod normal cel mult
bugetul de extragere de 75 de secunde. Dacă procesul de lucru pentru extragere este
pierdut, procesul de golire pentru finalizare din producție (la fiecare cinci minute) eliberează o
finalizare al cărei `blocking_deadline_at` a trecut înainte de a începe o altă
încercare de extragere. Un succes ulterior este livrat separat prin acest eveniment.

<Warning>
  Valorile extrase reprezintă interpretarea conversației de către un model. Fiecare
  valoare diferită de null include citatul, rolul vorbitorului și indicele turei pe care
  s-a bazat, precum și un indicator de verificare la nivel de rulare. Verificați rezultatul înainte de a lua decizii care implică bani, identitate sau acces.
</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"
}
```

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, atunci când a fost atribuit unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, atunci când a fost atribuit unul |
| `summary` | string \| null | [Rezumatul apelului](/ro/webhooks/call-complete) finalizat atunci când agentul are activată opțiunea **Generați un rezumat al apelului**, astfel încât un eveniment de extragere întârziat livrează și un rezumat care a ratat fereastra de finalizare; `null` în caz contrar. Agenții cu un rezumat, dar fără câmpuri de extragere, nu emit niciodată acest eveniment: citiți un rezumat întârziat din `GET /v1/calls/{call_id}` |
| `extracted_data.status` | string | Întotdeauna `completed` pentru acest eveniment |
| `extracted_data.fields` | object | Valori indexate după cheile câmpurilor de extragere configurate; valorile indisponibile sunt `null` |
| `extracted_data.evidence` | object | Dovezi indexate după câmpul de extragere. O valoare diferită de null conține citatul exact verificat structural (cel mult 1.000 de caractere), `speaker_role` (`caller` sau `agent`) și `turn_index`; citatele mai lungi returnate de model sunt respinse în loc să fie trunchiate, iar dovezile sunt `null` ori de câte ori câmpul lor este `null` |
| `extracted_data.verification` | string | `verified` numai atunci când etapa independentă de verificare a dovezilor a returnat exact un verdict valid pentru fiecare câmp candidat. `unavailable` înseamnă că etapa a eșuat, a expirat, nu a avut buget suficient sau a returnat rezultate malformate ori parțiale. O etapă complet indisponibilă păstrează valorile fundamentate structural pentru revizuirea de către client. Pentru rezultate parțiale, se aplică verdictele valide și fiecare candidat fără exact un verdict valid este setat la null |
| `extracted_data.field_reasons` | object | Motive indexate după câmpurile care au fost setate la null prin fundamentare structurală sau de verificatorul independent |
| `extracted_data.schema_version` | string | Hash-ul schemei exacte de câmpuri utilizate pentru această extragere |
| `extracted_at` | timestamp | Ora finalizării în format ISO 8601 |
| `model` | string | Modelul utilizat pentru extragere |

### `campaign.completed`

Trimis o dată când o campanie trece de la `running` la `completed`, indiferent dacă
programarea sa s-a încheiat sau toate contactele au ajuns în stări terminale. Reîncercările
executorului nu emit un alt eveniment. Acest eveniment de ciclu de viață la nivel de organizație este livrat numai
către endpointuri cu domeniu de organizație, nu către endpointuri cu domeniu de agent. Nu blochează execuția.

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

Cele patru numărători de rezultate sunt disjuncte și totalul lor este `contacts_total`:
`completed` conține contactele reușite; `no_answer` conține contactele terminale
eșuate/epuizate al căror rezultat final a fost lipsa răspunsului; `failed` conține
toate celelalte contacte terminale eșuate/epuizate; iar `remaining` conține contacte în așteptare,
programate sau apelate în prezent. Un contact care așteaptă o reîncercare este
`remaining`, chiar și atunci când cea mai recentă încercare nu a primit răspuns. Apelurile în desfășurare
sunt reconciliate înainte de instantaneul de finalizare emis o singură dată. `started_at` este
începutul configurat al campaniei sau ora creării campaniei atunci când nu a fost configurat un început.

### `issue.reported`

Trimis când este creat un [raport de problemă](/api-reference/issue-reports) —
fie trimis de un utilizator din tabloul de bord (`source: "user"`), fie creat
automat prin evaluarea apelului (`source: "system"`). Nu blochează execuția.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, atunci când a fost atribuit unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, atunci când a fost atribuit unul |
| `issue_report.severity` | string | `critical`, `warning` sau `info` |
| `issue_report.status` | string | `open` sau `resolved` |
| `issue_report.source` | string | `user` (trimis din tabloul de bord) sau `system` (creat prin evaluare) |

<Note>
  Reevaluarea unui apel reconstruiește rapoartele sale de problemă generate de sistem,
  ceea ce emite din nou `issue.reported` pentru rapoartele recreate. Eliminați
  duplicatele după `call_id` + `title` dacă doriți o singură notificare pentru fiecare
  problemă de bază.
</Note>

### `issue.escalated`

Trimis când un model de problemă este trimis la ThunderPhone pentru revizuire de către personal: după
**Raportați la ThunderPhone** sau când Remediere cu AI nu poate confirma o
remediere de partea clientului și direcționează problema automat. Numai endpointurile la nivelul întregii organizații
primesc acest eveniment.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `automatic` | boolean | `true` pentru o escaladare automată; `false` pentru o escaladare manuală |
| `cluster_id` | UUID | Modelul de problemă escaladat |
| `escalation_id` | UUID | Înregistrarea escaladării |
| `status` | string | `open` când este emis evenimentul |

Aceasta este o notificare, nu pachetul de dovezi. Utilizați `cluster_id` pentru a o corela
cu modelul de problemă. Consultați [Raportați la ThunderPhone](/ro/guides/issues).

---

## Evenimente pentru apeluri de test

### `test-call.completed`

Trimis atunci când o
[rulare de apel de test](/api-reference/test-calls#test-call-run-object)
ajunge la o stare terminală — `completed` sau `failed`, inclusiv rulările
care au eșuat la lansare și nu au generat niciodată un apel. Nu blochează execuția. Util pentru
conectarea rulărilor CI în lot la sistemele dumneavoastră de chat/notificări.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `agent_id` | integer \| null | Agentul care a gestionat apelul, atunci când a fost alocat unul |
| `agent_name` | string \| null | Agentul care a gestionat apelul, atunci când a fost alocat unul |
| `test_call_run.target_type` | string | `agent` sau `phone_number` |
| `test_call_run.target_id` | integer | ID-ul agentului sau ID-ul numărului de telefon vizat de rulare, corespunzător cu `target_type` |
| `test_call_run.status` | string | `completed` sau `failed` |
| `test_call_run.call_id` | integer \| null | `null` atunci când rularea a eșuat înainte de inițierea unui apel |
| `test_call_run.error_message` | string | Gol în caz de reușită |

---

## Evenimente de alertă

### `alert.triggered`

Trimis atunci când o [regulă de alertă](/ro/guides/alerts) cu canalul **Livrare către
webhook-uri pentru dezvoltatori** activat își depășește pragul.
Nu blochează execuția. O regulă se declanșează o singură dată și apoi respectă perioada sa de
așteptare, astfel încât o încălcare persistentă produce un eveniment pentru fiecare fereastră de așteptare.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `event_id` (din `data`) | UUID | ID-ul de **declanșare** al alertei — diferit de `event_id` de livrare din plic |
| `rule_id`, `rule_name` | UUID, string | Regula care s-a declanșat |
| `metric` | string | `success_rate`, `failure_rate`, `avg_score`, `call_volume` sau `suite_regression` |
| `comparator` | string | `lt`, `lte`, `gt` sau `gte` |
| `metric_value` | number | Valoarea metricii în fereastra de evaluare atunci când regula s-a declanșat |
| `threshold` | number | Pragul configurat |
| `window_hours` | integer | Fereastra de evaluare anterioară |
| `fired_at` | timestamp | |

Consultați [ghidul despre alerte](/ro/guides/alerts) pentru crearea regulilor, metricilor,
perioadelor de așteptare și canalelor de e-mail / Slack.

---

## Evenimente de migrare

### `migration.call.complete`

Trimis când se încheie un apel inițiat prin
[`POST /v1/migrations/{id}/calls`](/api-reference/migration-calls),
indiferent de platforma care l-a preluat. Nu blochează. Ajunge la până la aproximativ 5 minute
după încheierea apelului. `data` conține toate câmpurile din
[`telephony.complete`](/ro/webhooks/call-complete), plus un bloc `migration`. Un
apel inițiat de ThunderPhone trimite, de asemenea, `telephony.complete` ca de obicei, cu același
`call_id`. Un apel de pe cealaltă platformă care nu s-a încheiat după 2
ore sau a cărui migrare s-a finalizat ori și-a pierdut cheia înainte este trimis cu
`status: "unknown"` și fără transcriere.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `migration.id` | UUID | Migrarea |
| `migration.routing_id` | UUID | Apelul rutat, conform valorii returnate când l-ați inițiat |
| `migration.arm` | string | `ours` (inițiat de ThunderPhone) sau `vendor` (inițiat de cealaltă platformă) |
| `migration.vendor` | string | `retell`, `vapi`, `elevenlabs` sau `bland` |
| `migration.vendor_call_id` | string \| null | ID-ul apelului de pe cealaltă platformă; `null` pentru `ours` |
| `migration.metadata` | object | `metadata` trimise când ați inițiat apelul |
| `migration.vendor_cost_usd` | string \| null | Costul apelului raportat de cealaltă platformă, când l-a raportat |
| `call_id` | integer \| null | ID-ul apelului ThunderPhone; `null` pentru `vendor` |
| `status` | string | Pentru `vendor`: `completed` când apelatul a vorbit, `failed` când nu a vorbit, `unknown` conform celor de mai sus. Pentru `ours`: ca în `telephony.complete` |

Pentru un apel `vendor`, ThunderPhone nu are date de facturare sau de extragere:
`billable_minutes`, `billing_total_cents` și `extracted_data` sunt `null`,
`product` și `voice` sunt goale, `recording_mode` este `vendor`, iar
`recording_url` este linkul celeilalte platforme, când aceasta a furnizat unul.

### `migration.rollback`

Trimis atunci când trecerea treptată a unei migrări redirecționează automat toate
apelurile înapoi către cealaltă platformă: 3 apeluri nu s-au conectat la ThunderPhone în 15
minute, 2 apeluri trimise către ThunderPhone s-au încheiat înainte ca agentul vocal să răspundă sau
rata rezultatelor sarcinilor ThunderPhone a scăzut cu mai mult decât diferența configurată sub cea a
celeilalte platforme. Nu blochează, o dată pentru fiecare revenire. După aceasta, ponderea ThunderPhone
este de 0%, iar migrarea este pusă pe pauză până când cineva o reia din fila Migrare a
agentului vocal. Încărcătura nu conține numere de telefon, transcrieri sau ID-uri de apel.

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

| Câmp | Tip | Descriere |
|-------|------|-------------|
| `migration_id` | UUID | Migrarea |
| `vendor` | șir de caractere | `retell`, `vapi`, `elevenlabs` sau `bland` |
| `reason` | șir de caractere | `ours_failed_burst` (3 conexiuni eșuate în 15 minute), `dropped_calls` (2 apeluri încheiate înainte ca agentul vocal să răspundă, în 30 de minute) sau `rate_gap` (diferența ratei rezultatelor sarcinilor pentru cel puțin `rollback_min_calls` apeluri evaluate de fiecare parte) |
| `previous_percent` | număr întreg | Ponderea apelurilor ThunderPhone înainte de revenire |
| `ours_percent` | număr întreg | Întotdeauna `0` |
| `step` | număr întreg \| null | Pasul programării la care se afla (începând de la 0) |
| `ours` / `theirs` | obiect \| null | Apelurile evaluate în pasul curent și rata lor de succes; `theirs` poate reprezenta ultimele 30 de zile atunci când pasul are prea puține apeluri. `null` dacă nu a existat niciunul |
| `ours_failed` | număr întreg | Conexiunile eșuate numărate în ultimele 15 minute |
| `dropped` | număr întreg | Apelurile numărate ca abandonate în ultimele 30 de minute |
| `rolled_back_at` | marcaj temporal | |

---

## Resurse asociate

<CardGroup cols={2}>
  <Card title="telephony.incoming / web.incoming" icon="phone" href="/ro/webhooks/call-incoming">
    Încărcătura utilă blocantă pentru apelul de intrare la care trebuie să răspundeți.
  </Card>
  <Card title="telephony.complete / web.complete" icon="phone-slash" href="/ro/webhooks/call-complete">
    Transcrierea și metricile de după apel.
  </Card>
  <Card title="Puncte finale pentru webhook-uri" icon="bolt" href="/ro/webhooks/endpoints">
    Abonați un URL la un subset al acestor evenimente.
  </Card>
  <Card title="Instrumente de funcție" icon="screwdriver-wrench" href="/ro/tools/overview">
    Modul în care sunt generate evenimentele `telephony.tool` / `web.tool`.
  </Card>
</CardGroup>
