ThunderPhone 2.0 अब लाइव है।सेल्फ़-सर्व, 2¢/मिनट से।घोषणा पढ़ें

Webhooks

इवेंट्स कैटलॉग

ThunderPhone द्वारा भेजे जाने वाले सभी वेबहुक इवेंट प्रकार।

हर वेबहुक बॉडी में एक type फ़ील्ड होता है, जिसका मान इस पेज पर दिए गए इवेंट टाइप में से एक होता है। जब आप किसी एंडपॉइंट को सब्सक्राइब करते हैं, तो events ऐरे में वे इवेंट टाइप होने चाहिए जिन्हें आप चाहते हैं (या सभी को सब्सक्राइब करने के लिए इसे खाली छोड़ें — प्रति-टर्न इवेंट्स telephony.turn / web.turn को छोड़कर, जो केवल उन एंडपॉइंट्स पर डिलीवर होते हैं जो उन्हें स्पष्ट रूप से नामित करते हैं)।

इन इवेंट्स को डिलीवर करने की दो स्टाइल हैं:

  • एंडपॉइंट डिलीवरी हमेशा रीट्राई के साथ नॉन-ब्लॉकिंग नोटिफिकेशन होती हैं: किसी भी 2xx के साथ रिस्पॉन्ड करें; एनवेलप में डीडुप्लिकेशन के लिए event_id होता है।
  • ब्लॉकिंग एक्सचेंज केवल लेगेसी सिंगल-URL वेबहुक पर चलते हैं: telephony.incoming / web.incoming कॉन्फ़िगरेशन रिक्वेस्ट (वेबहुक-मोड नंबर: एक रीट्राई सहित 13 s; वेबहुक-मोड विजेट की: 10 s) और वेबहुक-मोड टूल डिस्पैच। आपका रिस्पॉन्स लाइव कॉल को आकार देता है।

नीचे दिए गए उदाहरण पेलोड्स वायर ऑर्डर में एंडपॉइंट एनवेलप दिखाते हैं (कीज़ वर्णमाला क्रम में सॉर्ट की गई हैं: data, event_id, type); लेगेसी डिलीवरी में event_id के बिना वही data होता है।

कॉल इवेंट्स

telephony.incoming

जब कोई इनबाउंड कॉल आपके किसी फोन नंबर पर पहुंचती है, तब भेजा जाता है। एंडपॉइंट डिलीवरी हर इनबाउंड कॉल के लिए भेजी जाने वाली फायर-एंड-फॉरगेट नोटिफिकेशन हैं, चाहे नंबर एजेंट-कॉन्फ़िगर किया गया हो या वेबहुक-कॉन्फ़िगर किया गया हो। जिन नंबरों को कोई एजेंट असाइन नहीं किया गया है, उन्हें लेगेसी वेबहुक पर अतिरिक्त रूप से ब्लॉकिंग कॉन्फ़िगरेशन रिक्वेस्ट मिलती है — पूर्ण रिक्वेस्ट / रिस्पॉन्स स्कीमा के लिए telephony.incoming / web.incoming देखें।

{
  "data": {
    "call_id": 987654321,
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  },
  "event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
  "type": "telephony.incoming"
}
फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
agent_namestring | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था

telephony.complete

जब कोई इनबाउंड या आउटबाउंड टेलीफोनी कॉल समाप्त होती है, तब भेजा जाता है। नॉन-ब्लॉकिंग। इसमें ट्रांसक्रिप्ट, उपलब्ध होने पर रिकॉर्डिंग URL और बिलिंग सारांश शामिल होता है। पेलोड स्कीमा के लिए telephony.complete / web.complete देखें।

फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
agent_namestring | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था

telephony.tool

टेलीफोनी कॉल द्वारा फंक्शन टूल इनवोक किए जाने के बाद भेजा जाता है। नॉन-ब्लॉकिंग ऑडिट नोटिफिकेशन — यह इवेंट डिलीवर होने तक टूल पहले ही एक्ज़ीक्यूट हो चुका होता है; इसमें आपके अपने फंक्शन टूल और बिल्ट-इन send_sms टूल शामिल होते हैं (अन्य बिल्ट-इन, नॉलेज-बेस, ऐप-कनेक्शन या MCP टूल नहीं)। send_sms के लिए, arguments.to और arguments.body दोनों [REDACTED] होते हैं। कंप्लीशन ट्रांसक्रिप्ट भी इन्हें रिडैक्ट करते हैं; रिस्पॉन्स के message_id का उपयोग करके संगठन-स्कोप्ड SMS रिसोर्स से कंटेंट और प्राप्तकर्ता प्राप्त करें।

{
  "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 एक्ज़ीक्यूट किया गया परिणाम है: सफलता पर {"status": <http status>, "response": <your endpoint's JSON>}, या विफलता पर {"status": <status>, "error": "<message>"}।

फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
agent_namestring | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था

telephony.turn

टेलीफोनी कॉल चल रही हो तब, प्रत्येक स्पीच-युक्त टर्न के लिए उसके होते ही भेजा जाता है — एजेंट की बोली गई कंप्लीशन और कॉलर के ट्रांसक्राइब किए गए टर्न। यह आपको पोलिंग करने के बजाय सामान्य वेबहुक के माध्यम से लाइव बातचीत फॉलो करने देता है GET /v1/calls/{call_id}/transcript। नॉन-ब्लॉकिंग।

{
  "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"
}
फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
agent_namestring | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
positionintegerकॉल हिस्ट्री में टर्न का इंडेक्स — क्रम निर्धारण के लिए एक स्थिर पहचान
rolestringassistant (एजेंट की स्पीच) या user (कॉलर की स्पीच)
textstringइमिशन के समय ज्ञात टर्न का ट्रांसक्रिप्ट टेक्स्ट
entry_typestringअंतर्निहित हिस्ट्री एंट्री प्रकार: completion (एजेंट), या user_turn / span (कॉलर)
start_ms, end_msintegerकॉल शुरू होने के बाद से ms में ऑडियो ऑफ़सेट; केवल तब मौजूद होते हैं जब इमिशन के समय प्लेआउट टाइमिंग पहले से ज्ञात हो

web.incoming

telephony.incoming का वेब-चैनल समकक्ष, जो वेब विजेट सेशन या बिल्डर माइक टेस्ट कॉल शुरू होने पर भेजा जाता है। एंडपॉइंट डिलीवरी हर वेब सेशन के लिए फायर-एंड-फॉरगेट होती हैं। mode="webhook" में पब्लिशेबल की को लेगेसी वेबहुक पर अतिरिक्त रूप से ब्लॉकिंग कॉन्फ़िगरेशन रिक्वेस्ट मिलती है — उस ब्लॉकिंग रिक्वेस्ट का स्वरूप अलग होता है (origin_domain, publishable_key_prefix; कोई फोन नंबर नहीं)। देखें 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 हमेशा लिटरल "web" होता है। वेबहुक-मोड विजेट सेशन के लिए to_number खाली होता है (सेशन का एजेंट नंबर कॉन्फ़िगरेशन के बाद असाइन किया जाता है); बिल्डर माइक टेस्ट कॉल के लिए origin_domain और publishable_key_prefix खाली होते हैं।

फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
agent_namestring | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था

web.complete

telephony.complete का वेब-चैनल समकक्ष, जिसमें वेब विजेट कॉल (direction: "web") और बिल्डर माइक टेस्ट कॉल (direction: "test") शामिल हैं। नॉन-ब्लॉकिंग। इसका पेलोड स्वरूप telephony.complete जैसा ही है, साथ में origin_domain, और from_number को "web" पर सेट किया जाता है।

फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
agent_namestring | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था

web.tool

telephony.tool का वेब-चैनल समकक्ष। data में from_number / to_number के बजाय origin_domain होता है।

फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
agent_namestring | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था

web.turn

telephony.turn का वेब-चैनल समकक्ष, जिसमें वेब विजेट कॉल और बिल्डर माइक टेस्ट कॉल शामिल हैं। समान पेलोड स्वरूप, जिसमें from_number / to_number के बजाय origin_domain होता है। telephony.turn की तरह, इसके लिए स्पष्ट सब्सक्रिप्शन आवश्यक है — यह कभी भी खाली events ऐरे के माध्यम से डिलीवर नहीं होता।

फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
agent_namestring | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था

call.transfer_completed

हर कॉल के लिए अंतिम परिणाम के साथ एक बार भेजा जाता है कॉल ट्रांसफर का: एक कोल्ड ट्रांसफर, या वह मानव ब्रिज जो एजेंट के हटने के बाद वॉर्म ट्रांसफर में रह जाता है। यह नॉन-ब्लॉकिंग है और केवल एंडपॉइंट्स पर डिलीवर किया जाता है (लेगसी सिंगल-URL वेबहुक पर कभी नहीं)। यह कॉल के telephony.complete के बाद आता है: जब कैरियर कॉल ले लेता है या ट्रांसफर विफल हो जाता है, या जब ThunderPhone ने कॉल को ब्रिज किया हो, तब ब्रिज समाप्त होने पर।

{
  "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"
}
फ़ील्डटाइपविवरण
call_idintegerवह कॉल जिसे ट्रांसफर किया गया था
agent_idinteger | nullकॉल संभालने वाला एजेंट, यदि कोई असाइन किया गया था
agent_namestring | nullकॉल संभालने वाले एजेंट का नाम, यदि कोई असाइन किया गया था
transfer_outcomestringrefer_accepted: कैरियर ने कॉल संभाल लिया। bridged: ThunderPhone ने कॉलर और डेस्टिनेशन को स्वयं कनेक्टेड रखा, क्योंकि कैरियर ने कोल्ड ट्रांसफर अस्वीकार कर दिया था या वॉर्म ट्रांसफर का एजेंट हट गया था। bridge_unanswered: कैरियर ने कोल्ड ट्रांसफर अस्वीकार कर दिया और डेस्टिनेशन ने ThunderPhone की अपनी कॉल का जवाब नहीं दिया। failed: ट्रांसफर पूरा नहीं हुआ और कॉल समाप्त हो गई
destinationstring | nullवह नंबर जिस पर कॉल ट्रांसफर की गई थी
sip_statusinteger | nullकोल्ड ट्रांसफर अस्वीकार करने पर कैरियर का SIP स्टेटस: 403 (उदाहरण के लिए कॉल ट्रांसफर के बिना Twilio ट्रंक), 405 या 501। जब कैरियर ने इसे अस्वीकार नहीं किया हो, तब null
bridge_kindstring | nullकेवल bridged: cold_fallback (एक अस्वीकार किया गया कोल्ड ट्रांसफर जिसे ThunderPhone ने कनेक्ट किया) या warm (एजेंट के जाने के बाद वॉर्म ट्रांसफर के दो लोग)
bridge_secondsinteger | nullकेवल bridged: ThunderPhone द्वारा बिल किया गया ब्रिज किया गया समय, सेकंड में
bridge_total_centsinteger | nullकेवल bridged: किसी भी फ्री कॉल क्रेडिट के बाद USD सेंट में ब्रिज की लागत, जो कॉल के billing_total_cents से अलग बिल की जाती है

यही वैल्यू कॉल ऑब्जेक्ट पर भी transfer_outcome, transfer_destination, transfer_sip_status, transfer_bridge_kind, transfer_bridge_seconds और transfer_bridge_total_cents के रूप में उपलब्ध हैं। event_id हर डिलीवरी में एक ही कॉल के लिए समान होता है, इसलिए दोहराई गई रिपोर्ट कभी दूसरा इवेंट नहीं बनाती।


SMS इवेंट्स

SMS इवेंट्स संगठन के कनेक्टेड Twilio या Telnyx अकाउंट के माध्यम से भेजे गए संदेशों का वर्णन करते हैं। संदेश का मुख्य भाग शामिल नहीं किया जाता और to रिडैक्ट किया जाता है। जब सामग्री या प्राप्तकर्ता की आवश्यकता हो, तब संगठन-स्कोप्ड संदेश को GET /v1/sms/{message_id} से प्राप्त करें।

sms.sent

जब ग्राहक का कैरियर आउटबाउंड SMS अनुरोध स्वीकार करता है, तब भेजा जाता है। यह हैंडसेट डिलीवरी रसीद नहीं है।

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

स्थायी कैरियर अस्वीकृति के बाद, अस्थायी रीट्राई समाप्त होने के बाद, या परिणाम स्थायी रूप से अज्ञात होने पर भेजा जाता है। error_code एक स्थिर ThunderPhone कोड है और उपलब्ध होने पर error_message ग्राहक की आवश्यक कार्रवाई बताता है। status: "unknown" का अर्थ है कि कैरियर ने SMS स्वीकार किया हो सकता है; इसे कैरियर लॉग में रिकंसाइल करें, क्योंकि ThunderPhone इसे स्वचालित रूप से दोबारा नहीं भेजेगा।

sms.received

इनबाउंड SMS समर्थन के लिए आरक्षित है। वर्तमान रिलीज़ में कोई sms.received इवेंट जारी नहीं किए जाते। इनबाउंड कैरियर webhook कॉन्फ़िगरेशन और सिग्नेचर वेरिफिकेशन अलग से जारी किए जाएंगे।


वॉइस इवेंट्स

कस्टम वॉइस निर्माण असिंक्रोनस है। ये नॉन-ब्लॉकिंग इवेंट्स आपको क्लोन विवरण एंडपॉइंट को पोल करने के बजाय किसी अंतिम परिणाम पर प्रतिक्रिया देने देते हैं।

voice.ready और voice.failed केवल events: [] वाले संगठन-व्यापी एंडपॉइंट पर डिलीवर किए जाते हैं। इन्हें स्पष्ट इवेंट फ़िल्टर के रूप में नहीं चुना जा सकता।

voice.ready

जब कस्टम वॉइस की प्रोसेसिंग पूरी हो जाती है और उसे किसी एजेंट को असाइन किया जा सकता है, तब भेजा जाता है।

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

जब कस्टम वॉइस प्रोसेसिंग स्थायी विफलता तक पहुंचती है, तब भेजा जाता है।

{
  "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"
}
फ़ील्डप्रकारविवरण
voice.idstringकस्टम वॉइस का सार्वजनिक id
voice.namestringcustom:<public_id> फ़ॉर्म में एजेंट वॉइस वैल्यू
voice.display_namestringसंगठन के लिए प्रदर्शित वॉइस नाम
voice.languagestringक्लोन का एकल भाषा कोड
voice.genderstringmale, female, या खाली स्ट्रिंग
voice.statusstringvoice.ready के लिए ready; voice.failed के लिए failed
voice.failure_reasonstringसफलता पर खाली; विफलता पर प्रोसेसिंग विफलता का विवरण
voice.created_at, voice.updated_attimestampISO 8601 टाइमस्टैम्प
reasonstringविफलता का विवरण; केवल voice.failed पर मौजूद

गुणवत्ता इवेंट

call.graded

किसी कॉल के लिए AI ग्रेडिंग रन पूरा होने पर भेजा जाता है। नॉन-ब्लॉकिंग।

{
  "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"
}
फ़ील्डटाइपविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, जब कोई असाइन किया गया हो
agent_namestring | nullकॉल संभालने वाला एजेंट, जब कोई असाइन किया गया हो
grade.idintegerग्रेड आईडी
grade.scoreinteger | null0–100
grade.call_outcomestringsuccess, failure, unknown, या no_conversation
grade.summarystringएक-पैराग्राफ सारांश
grade.detected_issuesarrayग्रेडर द्वारा पाए गए समस्या स्ट्रिंग
grade.statusstringहमेशा completed — केवल पूर्ण रन ही एमिट होते हैं
grade.grader_modelstringपरिणाम देने वाला ग्रेडर (उदा. heuristic-v1)
grade.graded_at, grade.created_attimestamp
reportobject | nullग्राहक के लिए कॉल रिपोर्ट: परिणाम लेबल, ध्यान-आवश्यक फ़्लैग और कारण, कॉलर, एक-पंक्ति सारांश, कॉलर अनुभव। शुरुआती ह्यूरिस्टिक ग्रेड में यह null या pending रिपोर्ट होती है, जिसके फ़ील्ड प्लेसहोल्डर होते हैं; पूर्ण ग्रेड का इवेंट पूर्ण रिपोर्ट प्रदान करता है

call.data_extracted

संरचित डेटा एक्सट्रैक्शन सफलतापूर्वक पूरा होने पर भेजा जाता है, जिसमें telephony.complete / web.complete के बाद का देर से किया गया रीट्राई या POST /v1/calls/{call_id}/extract के माध्यम से मैन्युअल री-रन शामिल है। नॉन-ब्लॉकिंग।

ब्लॉकिंग एक्सट्रैक्शन मोड में, पूर्णता इवेंट सामान्यतः 75-सेकंड के एक्सट्रैक्शन बजट से अधिक प्रतीक्षा नहीं करता। यदि एक्सट्रैक्शन वर्कर प्रोसेस खो जाता है, तो प्रोडक्शन फाइनलाइज़ेशन ड्रेन (हर पाँच मिनट में) दूसरा एक्सट्रैक्शन प्रयास शुरू करने से पहले उस पूर्णता को रिलीज़ करता है जिसका blocking_deadline_at बीत चुका है। बाद की सफलता इस इवेंट के रूप में अलग से डिलीवर की जाती है।

{
  "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"
}
फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल हैंडल करने वाला एजेंट, जब कोई असाइन किया गया हो
agent_namestring | nullकॉल हैंडल करने वाला एजेंट, जब कोई असाइन किया गया हो
summarystring | nullजब एजेंट में कॉल सारांश जनरेट करें चालू हो, तो पूरा हुआ कॉल सारांश, ताकि देर से आने वाला एक्सट्रैक्शन इवेंट उस सारांश को भी डिलीवर करे जो पूर्णता विंडो से छूट गया था; अन्यथा null। जिन एजेंटों में सारांश है लेकिन एक्सट्रैक्शन फ़ील्ड नहीं हैं, वे यह इवेंट कभी नहीं भेजते: देर से आया सारांश GET /v1/calls/{call_id} से पढ़ें
extracted_data.statusstringइस इवेंट के लिए हमेशा completed
extracted_data.fieldsobjectकॉन्फ़िगर किए गए एक्सट्रैक्शन फ़ील्ड कीज़ के अनुसार मान; अनुपलब्ध मान null होते हैं
extracted_data.evidenceobjectएक्सट्रैक्शन फ़ील्ड के अनुसार एविडेंस। किसी नॉन-नल मान में सटीक स्ट्रक्चरल रूप से जाँचा गया कोट (अधिकतम 1,000 कैरेक्टर), speaker_role (caller या agent), और turn_index होता है; लंबे मॉडल-रिटर्न किए गए कोट को ट्रंकेट करने के बजाय अस्वीकार कर दिया जाता है, और जब उसका फ़ील्ड null हो तो एविडेंस भी null होता है
extracted_data.verificationstringverified केवल तब होता है जब स्वतंत्र एविडेंस पास हर कैंडिडेट फ़ील्ड के लिए ठीक एक वैध वर्डिक्ट लौटाता है। unavailable का अर्थ है कि पास विफल हुआ, टाइम आउट हुआ, पर्याप्त बजट नहीं था, या उसने विकृत अथवा आंशिक आउटपुट लौटाया। पूरी तरह अनुपलब्ध पास कस्टमर रिव्यू के लिए स्ट्रक्चरल रूप से आधारित मान सुरक्षित रखता है। आंशिक आउटपुट के लिए, वैध वर्डिक्ट लागू किए जाते हैं और जिस हर कैंडिडेट के लिए ठीक एक वैध वर्डिक्ट नहीं है उसे नल कर दिया जाता है
extracted_data.field_reasonsobjectस्ट्रक्चरल ग्राउंडिंग या स्वतंत्र वेरिफ़ायर द्वारा नल किए गए फ़ील्ड के अनुसार कारण
extracted_data.schema_versionstringइस एक्सट्रैक्शन के लिए उपयोग किए गए सटीक फ़ील्ड स्कीमा का हैश
extracted_attimestampISO 8601 पूर्णता समय
modelstringएक्सट्रैक्शन के लिए उपयोग किया गया मॉडल

campaign.completed

किसी कैंपेन के running से completed में जाने पर एक बार भेजा जाता है, चाहे उसका शेड्यूल समाप्त हुआ हो या सभी कॉन्टैक्ट टर्मिनल स्टेट तक पहुँच गए हों। रनर रीट्राई कोई दूसरा इवेंट नहीं भेजते। यह संगठन-स्तरीय लाइफ़साइकल इवेंट केवल संगठन-स्कोप्ड एंडपॉइंट को डिलीवर किया जाता है, एजेंट-स्कोप्ड एंडपॉइंट को नहीं। नॉन-ब्लॉकिंग।

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

चारों आउटकम काउंट अलग-अलग हैं और इनका योग contacts_total होता है: completed में सफल कॉन्टैक्ट शामिल होते हैं; no_answer में वे टर्मिनल विफल/एक्ज़ॉस्टेड कॉन्टैक्ट शामिल होते हैं जिनका अंतिम आउटकम कोई उत्तर नहीं था; failed में अन्य सभी टर्मिनल विफल/एक्ज़ॉस्टेड कॉन्टैक्ट शामिल होते हैं; और remaining में पेंडिंग, शेड्यूल किए गए या वर्तमान में कॉल किए जा रहे कॉन्टैक्ट शामिल होते हैं। रीट्राई की प्रतीक्षा कर रहा कॉन्टैक्ट remaining होता है, भले ही उसका सबसे हालिया प्रयास बिना जवाब का रहा हो। एक-बार के पूर्णता स्नैपशॉट से पहले इन-फ्लाइट कॉल को रिकन्साइल किया जाता है। started_at कॉन्फ़िगर किया गया कैंपेन स्टार्ट है, या जब कोई स्टार्ट कॉन्फ़िगर नहीं था तो कैंपेन बनाने का समय है।

issue.reported

जब कोई समस्या रिपोर्ट बनाई जाती है तब भेजा जाता है — या तो डैशबोर्ड से उपयोगकर्ता द्वारा दर्ज की गई (source: "user") या कॉल ग्रेडिंग द्वारा स्वचालित रूप से बनाई गई (source: "system")। नॉन-ब्लॉकिंग।

{
  "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"
}
फ़ील्डप्रकारविवरण
agent_idinteger | nullकॉल हैंडल करने वाला एजेंट, जब कोई असाइन किया गया हो
agent_namestring | nullकॉल हैंडल करने वाला एजेंट, जब कोई असाइन किया गया हो
issue_report.severitystringcritical, warning, या info
issue_report.statusstringopen या resolved
issue_report.sourcestringuser (डैशबोर्ड से दर्ज) या system (ग्रेडिंग द्वारा बनाया गया)

issue.escalated

जब कोई समस्या पैटर्न स्टाफ रिव्यू के लिए ThunderPhone को भेजा जाता है तब भेजा जाता है: ThunderPhone को रिपोर्ट करें के बाद, या जब Fix with AI कस्टमर-साइड फ़िक्स की पुष्टि नहीं कर पाता और समस्या को स्वचालित रूप से रूट करता है। केवल संगठन-व्यापी एंडपॉइंट को यह इवेंट मिलता है।

{
  "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"
}
फ़ील्डप्रकारविवरण
automaticbooleanस्वचालित एस्केलेशन के लिए true; मैन्युअल एस्केलेशन के लिए false
cluster_idUUIDएस्केलेट किया गया समस्या पैटर्न
escalation_idUUIDएस्केलेशन रिकॉर्ड
statusstringइवेंट भेजे जाने पर open

यह एक नोटिफ़िकेशन है, एविडेंस बंडल नहीं। इसे समस्या पैटर्न से कोरिलेट करने के लिए cluster_id का उपयोग करें। ThunderPhone को रिपोर्ट करें देखें।


टेस्ट कॉल इवेंट्स

test-call.completed

जब कोई टेस्ट-कॉल रन टर्मिनल स्टेटस — completed या failed — तक पहुंचता है, तब भेजा जाता है, जिसमें वे रन भी शामिल हैं जो लॉन्च के समय विफल हुए और कभी कॉल नहीं बना। नॉन-ब्लॉकिंग। बैच CI रन को अपने चैट/नोटिफिकेशन सिस्टम से जोड़ने के लिए उपयोगी।

{
  "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"
}
फ़ील्डटाइपविवरण
agent_idinteger | nullकॉल संभालने वाला एजेंट, जब कोई असाइन किया गया हो
agent_namestring | nullकॉल संभालने वाले एजेंट का नाम, जब कोई असाइन किया गया हो
test_call_run.target_typestringagent या phone_number
test_call_run.target_idintegerरन द्वारा टार्गेट किया गया एजेंट id या फोन-नंबर id, जो target_type से मेल खाता है
test_call_run.statusstringcompleted या failed
test_call_run.call_idinteger | nullजब कॉल प्लेस होने से पहले रन विफल हो जाए, तब null
test_call_run.error_messagestringसफलता पर खाली

अलर्ट इवेंट्स

alert.triggered

जब डेवलपर वेबहुक पर डिलीवर करें चैनल सक्षम वाला कोई अलर्ट नियम अपनी थ्रेशहोल्ड पार करता है, तब भेजा जाता है। नॉन-ब्लॉकिंग। कोई नियम एक बार फायर होता है और फिर अपने कूलडाउन का पालन करता है, इसलिए लगातार उल्लंघन से हर कूलडाउन विंडो में एक इवेंट बनता है।

{
  "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"
}
फ़ील्डटाइपविवरण
event_id (में data)UUIDअलर्ट फायर होने का id — एनवेलप के डिलीवरी event_id से अलग
rule_id, rule_nameUUID, stringफायर हुआ नियम
metricstringsuccess_rate, failure_rate, avg_score, call_volume, या suite_regression
comparatorstringlt, lte, gt, या gte
metric_valuenumberनियम फायर होने पर विंडो में मीट्रिक का मान
thresholdnumberकॉन्फ़िगर की गई थ्रेशहोल्ड
window_hoursintegerट्रेलिंग इवैल्यूएशन विंडो
fired_attimestamp

नियम, मीट्रिक, कूलडाउन और ईमेल / Slack चैनल बनाने के लिए अलर्ट्स गाइड देखें।


माइग्रेशन इवेंट

migration.call.complete

जब POST /v1/migrations/{id}/calls के माध्यम से किया गया कॉल समाप्त होता है, तब भेजा जाता है, चाहे उसे किसी भी प्लेटफ़ॉर्म ने लिया हो। नॉन-ब्लॉकिंग। यह कॉल समाप्त होने के लगभग 5 मिनट तक बाद आता है। data में telephony.complete के सभी फ़ील्ड और एक migration ब्लॉक होता है। ThunderPhone द्वारा किया गया कॉल भी सामान्य रूप से उसी call_id के साथ telephony.complete भेजता है। दूसरे प्लेटफ़ॉर्म पर किया गया ऐसा कॉल जो 2 घंटे बाद भी समाप्त नहीं हुआ है, या जिसकी माइग्रेशन पहले पूरी हो गई या जिसकी key पहले खो गई, उसे status: "unknown" और बिना ट्रांसक्रिप्ट के भेजा जाता है।

{
  "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"
}
फ़ील्डटाइपविवरण
migration.idUUIDमाइग्रेशन
migration.routing_idUUIDरूट किया गया कॉल, जैसा कि कॉल करते समय लौटाया गया था
migration.armstringours (ThunderPhone ने कॉल किया) या vendor (दूसरे प्लेटफ़ॉर्म ने किया)
migration.vendorstringretell, vapi, elevenlabs, या bland
migration.vendor_call_idstring | nullदूसरे प्लेटफ़ॉर्म का कॉल id; ours के लिए null
migration.metadataobjectकॉल करते समय भेजा गया metadata
migration.vendor_cost_usdstring | nullदूसरे प्लेटफ़ॉर्म द्वारा रिपोर्ट की गई कॉल लागत, यदि उसने रिपोर्ट की हो
call_idinteger | nullThunderPhone कॉल id; vendor के लिए null
statusstringvendor के लिए: जब कॉल प्राप्तकर्ता ने बात की हो तो completed, जब उसने बात न की हो तो failed, और ऊपर बताए अनुसार unknown। ours के लिए: telephony.complete के समान

vendor कॉल के लिए, ThunderPhone के पास कोई बिलिंग या एक्सट्रैक्शन डेटा नहीं होता: billable_minutes, billing_total_cents और extracted_data null होते हैं, product और voice खाली होते हैं, recording_mode vendor होता है, और यदि दूसरे प्लेटफ़ॉर्म ने दिया हो तो recording_url उसका लिंक होता है।

migration.rollback

तब भेजा जाता है जब किसी माइग्रेशन का क्रमिक स्विच अपने आप हर कॉल को दूसरे प्लेटफ़ॉर्म पर वापस भेज देता है: 15 मिनट के भीतर 3 कॉल ThunderPhone से कनेक्ट नहीं हो सकीं, ThunderPhone को भेजी गई 2 कॉल एजेंट के जवाब देने से पहले समाप्त हो गईं, या ThunderPhone की टास्क आउटकम रेट दूसरे प्लेटफ़ॉर्म की रेट से कॉन्फ़िगर किए गए अंतर से अधिक नीचे गिर गई। नॉन-ब्लॉकिंग, प्रत्येक रोलबैक के लिए एक बार। इसके बाद ThunderPhone की कॉल हिस्सेदारी 0% होती है और माइग्रेशन तब तक पॉज़ रहता है जब तक कोई एजेंट के माइग्रेशन टैब पर इसे फिर से शुरू नहीं करता। पेलोड में कोई फ़ोन नंबर, ट्रांसक्रिप्ट या कॉल आईडी नहीं होती।

{
  "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"
}
फ़ील्डटाइपविवरण
migration_idUUIDमाइग्रेशन
vendorस्ट्रिंगretell, vapi, elevenlabs, या bland
reasonस्ट्रिंगours_failed_burst (15 मिनट में 3 असफल कनेक्शन), dropped_calls (30 मिनट के भीतर एजेंट के जवाब देने से पहले समाप्त हुई 2 कॉल), या rate_gap (हर पक्ष के लिए कम से कम rollback_min_calls ग्रेड की गई कॉल पर टास्क आउटकम रेट का अंतर)
previous_percentइंटीजररोलबैक से पहले ThunderPhone की कॉल हिस्सेदारी
ours_percentइंटीजरहमेशा 0
stepइंटीजर | nullवह शेड्यूल स्टेप जिस पर यह था (0-आधारित)
ours / theirsऑब्जेक्ट | nullमौजूदा स्टेप में ग्रेड की गई कॉल और उनकी सफलता रेट; जब स्टेप में बहुत कम कॉल हों, तो theirs पिछले 30 दिनों का हो सकता है। कोई कॉल न होने पर null
ours_failedइंटीजरपिछले 15 मिनट में गिने गए असफल कनेक्शन
droppedइंटीजरपिछले 30 मिनट में ड्रॉप के रूप में गिनी गई कॉल
rolled_back_atटाइमस्टैम्प

संबंधित