ThunderPhone 2.0 kini resmi hadir.Gunakan langsung secara mandiri, mulai 2¢/menit.Baca pengumumannya

Webhooks

Katalog Peristiwa

Semua jenis peristiwa webhook yang dipancarkan ThunderPhone.

Setiap badan webhook memiliki kolom type yang nilainya merupakan salah satu jenis peristiwa di halaman ini. Saat Anda berlangganan ke sebuah endpoint, array events harus memuat jenis peristiwa yang Anda inginkan (atau kosong untuk berlangganan ke semuanya — kecuali peristiwa per-giliran telephony.turn / web.turn, yang dikirimkan hanya ke endpoint yang menyebutkannya secara eksplisit).

Dua gaya pengiriman membawa peristiwa ini:

  • Pengiriman endpoint selalu merupakan notifikasi non-blocking dengan percobaan ulang: respons dengan 2xx apa pun; envelope memuat event_id untuk deduplikasi.
  • Pertukaran blocking hanya berjalan pada webhook lama dengan satu URL: permintaan konfigurasi telephony.incoming / web.incoming (nomor mode webhook: 13 d termasuk satu percobaan ulang; kunci widget mode webhook: 10 d) dan dispatch tool mode webhook. Respons Anda membentuk panggilan langsung.

Contoh payload di bawah menunjukkan envelope endpoint dalam urutan transmisi (kunci diurutkan secara alfabetis: data, event_id, type); pengiriman lama memuat data yang sama tanpa event_id.

Peristiwa panggilan

telephony.incoming

Dikirim saat panggilan masuk mencapai salah satu nomor telepon Anda. Pengiriman endpoint merupakan notifikasi fire-and-forget yang dikirim untuk setiap panggilan masuk, baik nomor tersebut dikonfigurasi untuk agen maupun untuk webhook. Nomor tanpa agen yang ditetapkan juga menerima permintaan konfigurasi pemblokiran pada webhook lama — lihat telephony.incoming / web.incoming untuk skema permintaan / respons lengkap.

{
  "data": {
    "call_id": 987654321,
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  },
  "event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
  "type": "telephony.incoming"
}
BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan

telephony.complete

Dikirim saat panggilan telepon masuk atau keluar berakhir. Tidak memblokir. Mencakup transkrip, URL rekaman jika tersedia, dan ringkasan penagihan. Lihat telephony.complete / web.complete untuk skema payload.

BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan

telephony.tool

Dikirim setelah panggilan telepon memanggil sebuah function tool. Notifikasi audit yang tidak memblokir — tool sudah dieksekusi saat peristiwa ini dikirim; mencakup function tool Anda sendiri dan tool bawaan send_sms (bukan tool bawaan lain, basis pengetahuan, koneksi aplikasi, atau MCP). Untuk send_sms, baik arguments.to maupun arguments.body adalah [REDACTED]. Transkrip penyelesaian juga menyamarkan keduanya; ambil konten dan penerima dari resource SMS dengan cakupan organisasi menggunakan message_id pada respons.

{
  "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 adalah hasil yang dieksekusi: {"status": <http status>, "response": <your endpoint's JSON>} saat berhasil, atau {"status": <status>, "error": "<message>"} saat gagal.

BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan

telephony.turn

Dikirim selama panggilan telepon sedang berlangsung, satu kali untuk setiap giliran yang berisi ucapan saat terjadi — penyelesaian lisan agen dan giliran penelepon yang ditranskripsikan. Memungkinkan Anda mengikuti percakapan langsung melalui webhook biasa alih-alih melakukan polling pada GET /v1/calls/{call_id}/transcript. Tidak memblokir.

{
  "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"
}
BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan
positionintegerIndeks giliran dalam riwayat panggilan — identitas stabil untuk pengurutan
rolestringassistant (ucapan agen) atau user (ucapan penelepon)
textstringTeks transkrip giliran sebagaimana diketahui saat pengiriman
entry_typestringJenis entri riwayat yang mendasarinya: completion (agen), atau user_turn / span (penelepon)
start_ms, end_msintegerOffset audio dalam ms sejak panggilan dimulai; hanya ada ketika waktu pemutaran sudah diketahui saat pengiriman

web.incoming

Setara kanal web dari telephony.incoming, dikirim saat sesi widget web atau panggilan uji mikrofon builder dimulai. Pengiriman endpoint bersifat fire-and-forget untuk setiap sesi web. Publishable key dalam mode="webhook" juga menerima permintaan konfigurasi pemblokiran pada webhook lama — permintaan pemblokiran tersebut memiliki bentuk berbeda (origin_domain, publishable_key_prefix; tanpa nomor telepon). Lihat 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 selalu merupakan literal "web". Untuk sesi widget mode webhook, to_number kosong (nomor agen sesi ditetapkan setelah konfigurasi); untuk panggilan uji mikrofon builder, origin_domain dan publishable_key_prefix kosong.

BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan

web.complete

Setara kanal web dari telephony.complete, mencakup panggilan widget web (direction: "web") dan panggilan uji mikrofon builder (direction: "test"). Tidak memblokir. Bentuk payload sama dengan telephony.complete, ditambah origin_domain, dengan from_number diatur ke "web".

BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan

web.tool

Setara kanal web dari telephony.tool. data memuat origin_domain alih-alih from_number / to_number.

BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan

web.turn

Setara kanal web dari telephony.turn, mencakup panggilan widget web dan panggilan uji mikrofon builder. Bentuk payload sama, dengan origin_domain alih-alih from_number / to_number. Seperti telephony.turn, ini memerlukan langganan eksplisit — tidak pernah dikirim melalui array events kosong.

BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan

call.transfer_completed

Dikirim sekali per panggilan dengan hasil akhir dari transfer panggilan: transfer dingin, atau jembatan manusia yang tersisa dari transfer hangat setelah agen keluar. Tidak memblokir, dan hanya dikirim ke endpoint (tidak pernah ke webhook URL tunggal lama). Peristiwa ini tiba setelah telephony.complete panggilan: setelah operator mengambil alih panggilan atau transfer gagal, atau, ketika ThunderPhone menjembatani panggilan, setelah jembatan berakhir.

{
  "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"
}
BidangJenisDeskripsi
call_idintegerPanggilan yang ditransfer
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditugaskan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditugaskan
transfer_outcomestringrefer_accepted: operator mengambil alih panggilan. bridged: ThunderPhone sendiri menjaga penelepon dan tujuan tetap terhubung, baik karena operator menolak transfer dingin maupun karena agen pada transfer hangat keluar. bridge_unanswered: operator menolak transfer dingin dan tujuan tidak menjawab panggilan ThunderPhone sendiri. failed: transfer tidak berhasil dan panggilan berakhir
destinationstring | nullNomor tujuan transfer panggilan
sip_statusinteger | nullStatus SIP operator ketika menolak transfer dingin: 403 (misalnya trunk Twilio tanpa transfer panggilan), 405, atau 501. null jika operator tidak menolaknya
bridge_kindstring | nullHanya bridged: cold_fallback (transfer dingin yang ditolak lalu dihubungkan oleh ThunderPhone) atau warm (dua orang dalam transfer hangat setelah agen keluar)
bridge_secondsinteger | nullHanya bridged: durasi jembatan yang ditagihkan ThunderPhone, dalam detik
bridge_total_centsinteger | nullHanya bridged: biaya jembatan dalam sen USD setelah kredit panggilan gratis, yang ditagihkan terpisah dari billing_total_cents panggilan

Nilai yang sama tersedia pada objek panggilan sebagai transfer_outcome, transfer_destination, transfer_sip_status, transfer_bridge_kind, transfer_bridge_seconds, dan transfer_bridge_total_cents. event_id sama pada setiap pengiriman untuk suatu panggilan, sehingga laporan berulang tidak pernah menghasilkan peristiwa kedua.


Peristiwa SMS

Peristiwa SMS menjelaskan pesan yang dikirim melalui akun Twilio atau Telnyx yang terhubung dengan organisasi. Isi pesan dihilangkan dan to disamarkan. Ambil pesan dalam cakupan organisasi dari GET /v1/sms/{message_id} saat isi atau penerimanya diperlukan.

sms.sent

Dikirim saat operator pelanggan menerima permintaan SMS keluar. Ini bukan konfirmasi pengiriman ke handset.

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

Dikirim setelah penolakan permanen oleh operator, setelah percobaan ulang sementara habis, atau saat hasilnya tidak diketahui secara final. error_code adalah kode ThunderPhone yang stabil dan error_message menyatakan tindakan pelanggan saat tersedia. status: "unknown" berarti operator mungkin telah menerima SMS; rekonsiliasikan di log operator karena ThunderPhone tidak akan mengirimkannya ulang secara otomatis.

sms.received

Dicadangkan untuk dukungan SMS masuk. Tidak ada peristiwa sms.received yang dikirim pada rilis saat ini. Konfigurasi webhook operator masuk dan verifikasi tanda tangan akan dirilis secara terpisah.


Peristiwa suara

Pembuatan suara kustom bersifat asinkron. Peristiwa nonpemblokiran ini memungkinkan Anda merespons hasil akhir alih-alih melakukan polling pada endpoint detail klon.

voice.ready dan voice.failed hanya dikirim ke endpoint di seluruh organisasi dengan events: []. Keduanya tidak dapat dipilih sebagai filter peristiwa eksplisit.

voice.ready

Dikirim saat suara kustom selesai diproses dan dapat ditetapkan ke agen.

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

Dikirim saat pemrosesan suara kustom mengalami kegagalan permanen.

{
  "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"
}
BidangTipeDeskripsi
voice.idstringID publik suara kustom
voice.namestringNilai suara agen dalam bentuk custom:<public_id>
voice.display_namestringNama suara yang terlihat oleh organisasi
voice.languagestringKode bahasa tunggal klon
voice.genderstringmale, female, atau string kosong
voice.statusstringready untuk voice.ready; failed untuk voice.failed
voice.failure_reasonstringKosong saat berhasil; detail kegagalan pemrosesan saat gagal
voice.created_at, voice.updated_attimestampStempel waktu ISO 8601
reasonstringDetail kegagalan; hanya ada pada voice.failed

Peristiwa kualitas

call.graded

Dikirim setiap kali proses penilaian AI selesai untuk sebuah panggilan. Tidak memblokir.

{
  "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"
}
BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan
grade.idintegerID nilai
grade.scoreinteger | null0–100
grade.call_outcomestringsuccess, failure, unknown, atau no_conversation
grade.summarystringRingkasan satu paragraf
grade.detected_issuesarrayString masalah yang ditemukan oleh penilai
grade.statusstringSelalu completed — hanya proses yang selesai yang mengirimkan event
grade.grader_modelstringPenilai yang menghasilkan hasil (misalnya heuristic-v1)
grade.graded_at, grade.created_attimestamp
reportobject | nullLaporan panggilan yang ditujukan untuk pelanggan: label hasil, penanda dan alasan perlu perhatian, penelepon, ringkasan satu baris, pengalaman penelepon. Pada nilai heuristik awal, nilainya adalah null atau laporan pending dengan bidang placeholder; event nilai lengkap membawa laporan yang telah selesai

call.data_extracted

Dikirim setiap kali ekstraksi data terstruktur berhasil diselesaikan, termasuk percobaan ulang terlambat setelah telephony.complete / web.complete atau proses ulang manual melalui POST /v1/calls/{call_id}/extract. Tidak memblokir.

Dalam mode ekstraksi pemblokiran, peristiwa penyelesaian biasanya menunggu tidak lebih dari anggaran ekstraksi 75 detik. Jika proses pekerja ekstraksi hilang, pengurasan finalisasi produksi (setiap lima menit) merilis penyelesaian yang blocking_deadline_at-nya telah lewat sebelum memulai upaya ekstraksi lainnya. Keberhasilan berikutnya dikirimkan secara terpisah sebagai peristiwa ini.

{
  "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"
}
BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ditetapkan
summarystring | nullRingkasan panggilan yang selesai ketika agen mengaktifkan Buat ringkasan panggilan, sehingga peristiwa ekstraksi terlambat juga mengirimkan ringkasan yang melewati jendela penyelesaian; selain itu null. Agen dengan ringkasan tetapi tanpa bidang ekstraksi tidak pernah mengirim peristiwa ini: baca ringkasan terlambat dari GET /v1/calls/{call_id}
extracted_data.statusstringSelalu completed untuk peristiwa ini
extracted_data.fieldsobjectNilai yang dikunci oleh kunci bidang ekstraksi yang dikonfigurasi; nilai yang tidak tersedia adalah null
extracted_data.evidenceobjectBukti yang dikunci oleh bidang ekstraksi. Nilai non-null memiliki kutipan persis yang diperiksa secara struktural (maksimal 1.000 karakter), speaker_role (caller atau agent), dan turn_index; kutipan yang dikembalikan model dengan panjang lebih besar ditolak, bukan dipotong, dan bukti adalah null setiap kali bidangnya null
extracted_data.verificationstringverified hanya ketika proses bukti independen mengembalikan tepat satu putusan valid untuk setiap bidang kandidat. unavailable berarti proses gagal, habis waktu, tidak memiliki anggaran yang cukup, atau mengembalikan output yang salah format atau parsial. Proses yang sepenuhnya tidak tersedia mempertahankan nilai yang didasarkan secara struktural untuk ditinjau pelanggan. Untuk output parsial, putusan valid diterapkan dan setiap kandidat tanpa tepat satu putusan valid dinullkan
extracted_data.field_reasonsobjectAlasan yang dikunci oleh bidang yang dinullkan oleh landasan struktural atau verifier independen
extracted_data.schema_versionstringHash skema bidang persis yang digunakan untuk ekstraksi ini
extracted_attimestampWaktu penyelesaian ISO 8601
modelstringModel yang digunakan untuk ekstraksi

campaign.completed

Dikirim sekali ketika kampanye berpindah dari running ke completed, baik jadwalnya berakhir maupun semua kontak mencapai status terminal. Percobaan ulang runner tidak mengirim peristiwa lain. Peristiwa siklus hidup tingkat organisasi ini hanya dikirim ke endpoint dengan cakupan organisasi, bukan endpoint dengan cakupan agen. Tidak memblokir.

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

Keempat jumlah hasil saling terpisah dan jika dijumlahkan menghasilkan contacts_total: completed berisi kontak yang berhasil; no_answer berisi kontak gagal/kehabisan upaya yang terminal dengan hasil akhir tidak ada jawaban; failed berisi semua kontak gagal/kehabisan upaya terminal lainnya; dan remaining berisi kontak yang tertunda, terjadwal, atau sedang dihubungi. Kontak yang menunggu percobaan ulang adalah remaining, bahkan ketika upaya terbarunya tidak dijawab. Panggilan yang sedang berlangsung direkonsiliasi sebelum snapshot penyelesaian sekali saja. started_at adalah waktu mulai kampanye yang dikonfigurasi, atau waktu pembuatan kampanye jika waktu mulai tidak dikonfigurasi.

issue.reported

Dikirim ketika sebuah laporan masalah dibuat — baik diajukan oleh pengguna dari dashboard (source: "user") maupun dibuat secara otomatis oleh penilaian panggilan (source: "system"). Tidak memblokir.

{
  "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"
}
BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ditetapkan
issue_report.severitystringcritical, warning, atau info
issue_report.statusstringopen atau resolved
issue_report.sourcestringuser (diajukan dari dashboard) atau system (dibuat oleh penilaian)

issue.escalated

Dikirim ketika pola masalah dikirim ke ThunderPhone untuk ditinjau staf: setelah Laporkan ke ThunderPhone, atau ketika Perbaiki dengan AI tidak dapat mengonfirmasi perbaikan di sisi pelanggan dan merutekan masalah secara otomatis. Hanya endpoint seluruh organisasi yang menerima peristiwa ini.

{
  "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"
}
BidangTipeDeskripsi
automaticbooleantrue untuk eskalasi otomatis; false untuk eskalasi manual
cluster_idUUIDPola masalah yang dieskalasikan
escalation_idUUIDRekaman eskalasi
statusstringopen ketika peristiwa dikirim

Ini adalah notifikasi, bukan kumpulan bukti. Gunakan cluster_id untuk mengorelasikannya dengan pola masalah. Lihat Laporkan ke ThunderPhone.


Peristiwa panggilan uji

test-call.completed

Dikirim ketika sebuah eksekusi test-call mencapai status terminal — completed atau failed, termasuk eksekusi yang gagal saat diluncurkan dan tidak pernah menghasilkan panggilan. Tidak memblokir. Berguna untuk menghubungkan eksekusi CI batch ke sistem chat/notifikasi Anda.

{
  "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"
}
BidangTipeDeskripsi
agent_idinteger | nullAgen yang menangani panggilan, jika ada yang ditetapkan
agent_namestring | nullAgen yang menangani panggilan, jika ada yang ditetapkan
test_call_run.target_typestringagent atau phone_number
test_call_run.target_idintegerID agen atau ID nomor telepon yang dituju eksekusi, sesuai dengan target_type
test_call_run.statusstringcompleted atau failed
test_call_run.call_idinteger | nullnull jika eksekusi gagal sebelum panggilan dilakukan
test_call_run.error_messagestringKosong jika berhasil

Peristiwa peringatan

alert.triggered

Dikirim ketika sebuah aturan peringatan dengan saluran Kirim ke webhook developer diaktifkan melampaui ambang batasnya. Tidak memblokir. Aturan dipicu sekali lalu mematuhi masa tunggunya, sehingga pelanggaran berkelanjutan menghasilkan satu peristiwa per jendela masa tunggu.

{
  "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"
}
BidangTipeDeskripsi
event_id (dalam data)UUIDID pemicu peringatan — berbeda dari event_id pengiriman pada envelope
rule_id, rule_nameUUID, stringAturan yang dipicu
metricstringsuccess_rate, failure_rate, avg_score, call_volume, atau suite_regression
comparatorstringlt, lte, gt, atau gte
metric_valuenumberNilai metrik pada jendela saat aturan dipicu
thresholdnumberAmbang batas yang dikonfigurasi
window_hoursintegerJendela evaluasi berjalan mundur
fired_attimestamp

Lihat panduan Peringatan untuk membuat aturan, metrik, masa tunggu, serta saluran email / Slack.


Peristiwa migrasi

migration.call.complete

Dikirim ketika panggilan yang dilakukan melalui POST /v1/migrations/{id}/calls berakhir, terlepas dari platform yang menanganinya. Tidak memblokir. Peristiwa ini tiba hingga sekitar 5 menit setelah panggilan berakhir. data memiliki setiap field dari telephony.complete beserta blok migration. Panggilan yang dilakukan ThunderPhone juga mengirim telephony.complete seperti biasa, dengan call_id yang sama. Panggilan di platform lain yang belum berakhir setelah 2 jam, atau yang migrasinya selesai atau kehilangan kuncinya terlebih dahulu, dikirim dengan status: "unknown" dan tanpa transkrip.

{
  "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"
}
FieldTipeDeskripsi
migration.idUUIDMigrasi
migration.routing_idUUIDPanggilan yang dirutekan, seperti yang dikembalikan saat Anda melakukannya
migration.armstringours (ThunderPhone yang melakukan panggilan) atau vendor (platform lain yang melakukannya)
migration.vendorstringretell, vapi, elevenlabs, atau bland
migration.vendor_call_idstring | nullID panggilan platform lain; null untuk ours
migration.metadataobjectmetadata yang Anda kirim saat melakukan panggilan
migration.vendor_cost_usdstring | nullBiaya panggilan yang dilaporkan platform lain, jika dilaporkan
call_idinteger | nullID panggilan ThunderPhone; null untuk vendor
statusstringUntuk vendor: completed ketika penerima panggilan berbicara, failed ketika tidak, unknown seperti di atas. Untuk ours: seperti dalam telephony.complete

Untuk panggilan vendor, ThunderPhone tidak memiliki data penagihan atau ekstraksi: billable_minutes, billing_total_cents, dan extracted_data bernilai null, product dan voice kosong, recording_mode adalah vendor, dan recording_url adalah tautan platform lain, jika platform tersebut memberikannya.

migration.rollback

Dikirim ketika peralihan bertahap suatu migrasi secara otomatis memindahkan semua panggilan kembali ke platform lain: 3 panggilan gagal terhubung ke ThunderPhone dalam 15 menit, 2 panggilan yang dikirim ke ThunderPhone berakhir sebelum agen menjawab, atau tingkat hasil tugas ThunderPhone turun lebih dari selisih yang dikonfigurasi di bawah tingkat platform lain. Tidak memblokir, sekali untuk setiap rollback. Setelahnya, porsi ThunderPhone adalah 0% dan migrasi dijeda hingga seseorang melanjutkannya di tab Migrasi agen. Payload tidak memuat nomor telepon, transkrip, atau ID panggilan.

{
  "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"
}
BidangTipeDeskripsi
migration_idUUIDMigrasi
vendorstringretell, vapi, elevenlabs, atau bland
reasonstringours_failed_burst (3 koneksi gagal dalam 15 menit), dropped_calls (2 panggilan berakhir sebelum agen menjawab, dalam 30 menit), atau rate_gap (selisih tingkat hasil tugas pada setidaknya rollback_min_calls panggilan yang dinilai untuk masing-masing pihak)
previous_percentintegerPorsi panggilan ThunderPhone sebelum rollback
ours_percentintegerSelalu 0
stepinteger | nullLangkah jadwal yang sedang digunakan (berbasis 0)
ours / theirsobject | nullPanggilan yang dinilai pada langkah saat ini dan tingkat keberhasilannya; theirs dapat mencakup 30 hari terakhir ketika langkah tersebut memiliki terlalu sedikit panggilan. null jika tidak ada
ours_failedintegerKoneksi gagal yang dihitung dalam 15 menit terakhir
droppedintegerPanggilan yang dihitung sebagai terputus dalam 30 menit terakhir
rolled_back_attimestamp

Terkait