ThunderPhone 2.0 este acum disponibil.Self-service, de la 2 ¢/min.Citiți anunțul

Webhooks

Catalog de evenimente

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, 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 / web.turn, care sunt livrate doar către endpointurile care le menționează explicit).

Aceste evenimente sunt transmise în două stiluri:

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. 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 pentru schema completă de solicitare / răspuns.

{
  "data": {
    "call_id": 987654321,
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  },
  "event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
  "type": "telephony.incoming"
}
CâmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, dacă a fost alocat unul
agent_namestring | nullAgentul 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 pentru schema încărcăturii utile.

CâmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, dacă a fost alocat unul
agent_namestring | nullAgentul care a gestionat apelul, dacă a fost alocat unul

telephony.tool

Trimis după ce un apel telefonic invocă un instrument de funcție. 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.

{
  "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âmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, dacă a fost alocat unul
agent_namestring | nullAgentul 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. Nu blochează.

{
  "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âmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, dacă a fost alocat unul
agent_namestring | nullAgentul care a gestionat apelul, dacă a fost alocat unul
positionintegerIndexul turului în istoricul apelului — o identitate stabilă pentru ordonare
rolestringassistant (vorbirea agentului) sau user (vorbirea apelantului)
textstringTextul transcrierii turului, așa cum este cunoscut la momentul emiterii
entry_typestringTipul intrării de istoric subiacente: completion (agent) sau user_turn / span (apelant)
start_ms, end_msintegerDecalaje audio în ms de la începutul apelului; prezente numai când momentul redării era deja cunoscut la momentul emiterii

web.incoming

Echivalentul pe canalul web al telephony.incoming, trimis când începe o sesiune a unui widget web 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.

{
  "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âmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, dacă a fost alocat unul
agent_namestring | nullAgentul 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, plus origin_domain, cu from_number setat la "web".

CâmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, dacă a fost alocat unul
agent_namestring | nullAgentul care a gestionat apelul, dacă a fost alocat unul

web.tool

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

CâmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, dacă a fost alocat unul
agent_namestring | nullAgentul care a gestionat apelul, dacă a fost alocat unul

web.turn

Echivalentul pe canalul web al 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âmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, dacă a fost alocat unul
agent_namestring | nullAgentul 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: 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.

{
  "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âmpTipDescriere
call_idintegerApelul care a fost transferat
agent_idinteger | nullAgentul care a gestionat apelul, dacă a fost atribuit unul
agent_namestring | nullAgentul care a gestionat apelul, dacă a fost atribuit unul
transfer_outcomestringrefer_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
destinationstring | nullNumărul către care a fost transferat apelul
sip_statusinteger | nullStarea 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_kindstring | nullNumai 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_secondsinteger | nullNumai pentru bridged: durata facturată de ThunderPhone pentru punte, în secunde
bridge_total_centsinteger | nullNumai 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 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} 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.

{
  "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.

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.

{
  "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ă.

{
  "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âmpTipDescriere
voice.idstringID public al vocii personalizate
voice.namestringValoarea vocii agentului în forma custom:<public_id>
voice.display_namestringNumele vocii destinat organizației
voice.languagestringCodul unic de limbă al clonei
voice.genderstringmale, female sau un șir gol
voice.statusstringready pentru voice.ready; failed pentru voice.failed
voice.failure_reasonstringGol la reușită; detaliul erorii de procesare la eșec
voice.created_at, voice.updated_attimestampMarcaje temporale ISO 8601
reasonstringDetaliul erorii; prezent numai pentru voice.failed

Evenimente de calitate

call.graded

Trimis de fiecare dată când o rulare de evaluare AI se finalizează pentru un apel. Nu blochează execuția.

{
  "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âmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, când a fost atribuit unul
agent_namestring | nullAgentul care a gestionat apelul, când a fost atribuit unul
grade.idintegerID-ul evaluării
grade.scoreinteger | null0–100
grade.call_outcomestringsuccess, failure, unknown sau no_conversation
grade.summarystringRezumat într-un paragraf
grade.detected_issuesarrayȘiruri care descriu problemele identificate de evaluator
grade.statusstringÎntotdeauna completed — sunt emise numai rulările finalizate
grade.grader_modelstringEvaluatorul care a produs rezultatul (de exemplu, heuristic-v1)
grade.graded_at, grade.created_attimestamp
reportobject | nullRaportul de apel 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

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

{
  "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âmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, atunci când a fost atribuit unul
agent_namestring | nullAgentul care a gestionat apelul, atunci când a fost atribuit unul
summarystring | nullRezumatul apelului 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.statusstringÎntotdeauna completed pentru acest eveniment
extracted_data.fieldsobjectValori indexate după cheile câmpurilor de extragere configurate; valorile indisponibile sunt null
extracted_data.evidenceobjectDovezi 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.verificationstringverified 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_reasonsobjectMotive indexate după câmpurile care au fost setate la null prin fundamentare structurală sau de verificatorul independent
extracted_data.schema_versionstringHash-ul schemei exacte de câmpuri utilizate pentru această extragere
extracted_attimestampOra finalizării în format ISO 8601
modelstringModelul 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.

{
  "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ă — fie trimis de un utilizator din tabloul de bord (source: "user"), fie creat automat prin evaluarea apelului (source: "system"). Nu blochează execuția.

{
  "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âmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, atunci când a fost atribuit unul
agent_namestring | nullAgentul care a gestionat apelul, atunci când a fost atribuit unul
issue_report.severitystringcritical, warning sau info
issue_report.statusstringopen sau resolved
issue_report.sourcestringuser (trimis din tabloul de bord) sau system (creat prin evaluare)

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.

{
  "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âmpTipDescriere
automaticbooleantrue pentru o escaladare automată; false pentru o escaladare manuală
cluster_idUUIDModelul de problemă escaladat
escalation_idUUIDÎnregistrarea escaladării
statusstringopen 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.


Evenimente pentru apeluri de test

test-call.completed

Trimis atunci când o rulare de apel de test 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.

{
  "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âmpTipDescriere
agent_idinteger | nullAgentul care a gestionat apelul, atunci când a fost alocat unul
agent_namestring | nullAgentul care a gestionat apelul, atunci când a fost alocat unul
test_call_run.target_typestringagent sau phone_number
test_call_run.target_idintegerID-ul agentului sau ID-ul numărului de telefon vizat de rulare, corespunzător cu target_type
test_call_run.statusstringcompleted sau failed
test_call_run.call_idinteger | nullnull atunci când rularea a eșuat înainte de inițierea unui apel
test_call_run.error_messagestringGol în caz de reușită

Evenimente de alertă

alert.triggered

Trimis atunci când o regulă de alertă 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.

{
  "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âmpTipDescriere
event_id (din data)UUIDID-ul de declanșare al alertei — diferit de event_id de livrare din plic
rule_id, rule_nameUUID, stringRegula care s-a declanșat
metricstringsuccess_rate, failure_rate, avg_score, call_volume sau suite_regression
comparatorstringlt, lte, gt sau gte
metric_valuenumberValoarea metricii în fereastra de evaluare atunci când regula s-a declanșat
thresholdnumberPragul configurat
window_hoursintegerFereastra de evaluare anterioară
fired_attimestamp

Consultați ghidul despre alerte 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, 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, 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.

{
  "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âmpTipDescriere
migration.idUUIDMigrarea
migration.routing_idUUIDApelul rutat, conform valorii returnate când l-ați inițiat
migration.armstringours (inițiat de ThunderPhone) sau vendor (inițiat de cealaltă platformă)
migration.vendorstringretell, vapi, elevenlabs sau bland
migration.vendor_call_idstring | nullID-ul apelului de pe cealaltă platformă; null pentru ours
migration.metadataobjectmetadata trimise când ați inițiat apelul
migration.vendor_cost_usdstring | nullCostul apelului raportat de cealaltă platformă, când l-a raportat
call_idinteger | nullID-ul apelului ThunderPhone; null pentru vendor
statusstringPentru 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.

{
  "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âmpTipDescriere
migration_idUUIDMigrarea
vendorșir de caractereretell, vapi, elevenlabs sau bland
reasonșir de caractereours_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_percentnumăr întregPonderea apelurilor ThunderPhone înainte de revenire
ours_percentnumăr întregÎntotdeauna 0
stepnumăr întreg | nullPasul programării la care se afla (începând de la 0)
ours / theirsobiect | nullApelurile 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_failednumăr întregConexiunile eșuate numărate în ultimele 15 minute
droppednumăr întregApelurile numărate ca abandonate în ultimele 30 de minute
rolled_back_atmarcaj temporal

Resurse asociate