ThunderPhone 2.0 באוויר.בשירות עצמי, החל מ-2¢/דקה.קראו את הודעת ההשקה

Webhooks

קטלוג אירועים

כל סוגי אירועי ה-webhook ש-ThunderPhone מפיק.

כל גוף של וובהוק כולל שדה type שהערך שלו הוא אחד מסוגי האירועים בדף זה. כאשר אתם נרשמים לנקודת קצה, המערך events חייב להכיל את סוגי האירועים הרצויים לכם (או להיות ריק כדי להירשם לכל האירועים — למעט אירועי כל-תור telephony.turn / web.turn, שנמסרים רק לנקודות קצה שמציינות אותם במפורש).

שני סגנונות מסירה נושאים אירועים אלה:

דוגמאות המטענים בהמשך מציגות את מעטפת נקודת הקצה בסדר ההעברה שלה (מפתחות ממוינים לפי סדר אלפביתי: data, event_id, type); מסירות מדור קודם נושאות את אותו data ללא event_id.

אירועי שיחות

telephony.incoming

נשלח כאשר שיחה נכנסת מגיעה לאחד ממספרי הטלפון שלכם. משלוחים לנקודת קצה הם התראות מסוג fire-and-forget הנשלחות עבור כל שיחה נכנסת, בין אם המספר מוגדר עבור סוכן או עבור webhook. מספרים ללא סוכן מוקצה מקבלים בנוסף את בקשת התצורה החוסמת ב-webhook הישן — עיינו ב- 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]. גם תמלולי השלמה מצנזרים אותם; אחזרו את התוכן ואת הנמען ממשאב ה-SMS ברמת הארגון באמצעות message_id שבתגובה.

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

נשלח במהלך שיחת טלפוניה פעילה, פעם אחת עבור כל תור הכולל דיבור בזמן התרחשותו — ההשלמות המדוברות של הסוכן והתורים המתומללים של המתקשר. מאפשר לכם לעקוב אחר השיחה החיה באמצעות webhooks רגילים במקום לבצע polling של 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היסטי שמע באלפיות שנייה מתחילת השיחה; קיימים רק כאשר תזמון ההשמעה כבר היה ידוע בעת הפליטה

web.incoming

המקביל בערוץ האינטרנט של telephony.incoming, נשלח כאשר סשן של ווידג'ט אינטרנט או שיחת בדיקת מיקרופון בבונה מתחילים. משלוחים לנקודת קצה הם מסוג fire-and-forget עבור כל סשן אינטרנט. מפתחות הניתנים לפרסום במצב mode="webhook" מקבלים בנוסף את בקשת התצורה החוסמת ב-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". עבור סשנים של וידג'ט במצב webhook, 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 מכיל origin_domain במקום from_number / to_number.

שדהסוגתיאור
agent_idinteger | nullהסוכן שטיפל בשיחה, כאשר הוקצה סוכן
agent_namestring | nullהסוכן שטיפל בשיחה, כאשר הוקצה סוכן

web.turn

המקביל בערוץ האינטרנט של telephony.turn, המכסה שיחות וידג'ט אינטרנט ושיחות בדיקת מיקרופון בבונה. מבנה מטען זהה, עם origin_domain במקום from_number / to_number. בדומה ל-telephony.turn, הוא דורש רישום מפורש — הוא לעולם אינו נמסר דרך מערך events ריק.

שדהסוגתיאור
agent_idinteger | nullהסוכן שטיפל בשיחה, כאשר הוקצה סוכן
agent_namestring | nullהסוכן שטיפל בשיחה, כאשר הוקצה סוכן

call.transfer_completed

נשלח פעם אחת לכל שיחה עם התוצאה הסופית של העברת שיחה: העברה קרה, או הגישור בין האנשים שהעברה חמה משאירה לאחר שהסוכן יוצא מהשיחה. אינו חוסם, ונמסר לנקודות קצה בלבד (לעולם לא ל-webhook מדור קודם עם כתובת 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_idמספר שלםהשיחה שהועברה
agent_idמספר שלם | nullהסוכן שטיפל בשיחה, כאשר הוקצה סוכן
agent_nameמחרוזת | nullהסוכן שטיפל בשיחה, כאשר הוקצה סוכן
transfer_outcomeמחרוזתrefer_accepted: הספק קיבל את השיחה. bridged: ThunderPhone שמרה בעצמה על החיבור בין המתקשר ליעד, בין שהספק סירב להעברה קרה ובין שהסוכן של העברה חמה יצא מהשיחה. bridge_unanswered: הספק סירב להעברה קרה והיעד לא ענה לשיחה ש-ThunderPhone ביצעה בעצמה. failed: ההעברה לא הושלמה והשיחה הסתיימה
destinationמחרוזת | nullהמספר שאליו הועברה השיחה
sip_statusמספר שלם | nullסטטוס ה-SIP של הספק כאשר סירב להעברה הקרה: 403 (לדוגמה, trunk של Twilio ללא העברת שיחות), 405 או 501. הערך null כאשר הספק לא סירב לה
bridge_kindמחרוזת | nullעבור bridged בלבד: cold_fallback (העברה קרה שסורבה ו-ThunderPhone חיברה) או warm (שני האנשים בהעברה חמה לאחר שהסוכן עזב)
bridge_secondsמספר שלם | nullעבור bridged בלבד: זמן הגישור ש-ThunderPhone חייבה עליו, בשניות
bridge_total_centsמספר שלם | 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.idמחרוזתמזהה ציבורי של קול מותאם אישית
voice.nameמחרוזתערך הקול של הסוכן בתבנית custom:<public_id>
voice.display_nameמחרוזתשם הקול המוצג לארגון
voice.languageמחרוזתקוד השפה היחידה של השכפול
voice.genderמחרוזתmale, female או מחרוזת ריקה
voice.statusמחרוזתready עבור voice.ready; failed עבור voice.failed
voice.failure_reasonמחרוזתריק במקרה של הצלחה; פירוט כשל העיבוד במקרה של כשל
voice.created_at, voice.updated_atחותמת זמןחותמות זמן בתקן ISO 8601
reasonמחרוזתפירוט הכשל; קיים רק ב-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ראיות לפי שדה חילוץ. ערך שאינו null כולל את הציטוט המדויק שנבדק מבנית (עד 1,000 תווים), את speaker_role (caller או agent) ואת turn_index; ציטוטים ארוכים יותר שהוחזרו על ידי המודל נדחים במקום להיחתך, והראיות הן null בכל פעם שהשדה שלהן הוא null
extracted_data.verificationstringverified רק כאשר מעבר הראיות העצמאי החזיר בדיוק פסק דין תקין אחד לכל שדה מועמד. unavailable מציין שהמעבר נכשל, חרג מזמן ההמתנה, לא כלל תקציב מספיק או החזיר פלט פגום או חלקי. מעבר שאינו זמין לחלוטין שומר ערכים המבוססים מבנית לצורך בדיקת לקוחות. בפלט חלקי, פסקי דין תקינים מוחלים וכל מועמד ללא בדיוק פסק דין תקין אחד מאופס ל-null
extracted_data.field_reasonsobjectסיבות לפי שדות שאופסו ל-null על ידי ביסוס מבני או המאמת העצמאי
extracted_data.schema_versionstringגיבוב של סכמת השדות המדויקת ששימשה לחילוץ זה
extracted_attimestampזמן השלמה בתקן ISO 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, או כאשר תיקון באמצעות 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"
}
שדהסוגתיאור
automaticbooleantrue עבור הסלמה אוטומטית; false עבור הסלמה ידנית
cluster_idUUIDדפוס הבעיה שהוסלם
escalation_idUUIDרשומת ההסלמה
statusstringopen כאשר האירוע נשלח

זוהי התראה, ולא חבילת הראיות. השתמשו ב-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מזהה הסוכן או מזהה מספר הטלפון שאליו כוונה ההרצה, בהתאם ל-target_type
test_call_run.statusstringcompleted או failed
test_call_run.call_idinteger | nullnull כאשר ההרצה נכשלה לפני שבוצעה שיחה
test_call_run.error_messagestringריק במקרה של הצלחה

אירועי התראות

alert.triggered

נשלח כאשר כלל התראה שבו הערוץ מסירה ל-webhooks של מפתחים מופעל חוצה את הסף שלו. ללא חסימה. כלל מופעל פעם אחת ולאחר מכן מכבד את זמן ההמתנה שלו, כך שהפרה מתמשכת מייצרת אירוע אחד בכל חלון זמן המתנה.

{
  "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מזהה ההפעלה של ההתראה — שונה ממזהה ה-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 התחילה שולחת גם telephony.complete כרגיל, עם אותו call_id. שיחה בפלטפורמה האחרת שלא הסתיימה לאחר שעתיים, או שההגירה שלה הסתיימה או איבדה את המפתח שלה קודם לכן, נשלחת עם 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מזהה השיחה של הפלטפורמה האחרת; null עבור ours
migration.metadataobjectה-metadata ששלחתם בעת התחלת השיחה
migration.vendor_cost_usdstring | nullהעלות שהפלטפורמה האחרת דיווחה עבורה לשיחה, אם דיווחה
call_idinteger | nullמזהה השיחה של ThunderPhone; ‏null עבור vendor
statusstringעבור vendor: ‏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

נשלח כאשר המעבר ההדרגתי של הגירה מחזיר את כל השיחות לפלטפורמה האחרת באופן אוטומטי: 3 שיחות לא הצליחו להתחבר ל-ThunderPhone בתוך 15 דקות, 2 שיחות שנשלחו ל-ThunderPhone הסתיימו לפני שהסוכן ענה, או ששיעור תוצאות המשימות של 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 ‏(3 חיבורים שנכשלו בתוך 15 דקות), dropped_calls ‏(2 שיחות שהסתיימו לפני שהסוכן ענה, בתוך 30 דקות), או 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חותמת זמן

קשור