ThunderPhone 2.0 kini resmi hadir.Layanan mandiri, mulai dari 2¢/menit.Baca pengumumannya

Webhooks

Katalog Peristiwa

Semua jenis peristiwa webhook yang dipancarkan ThunderPhone.

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

Dua gaya pengiriman membawa event ini:

Payload contoh di bawah menunjukkan envelope endpoint dalam urutan wire-nya (kunci diurutkan secara alfabetis: data, event_id, type); pengiriman lama membawa data yang sama tanpa event_id.

Peristiwa panggilan

telephony.incoming

Dikirim ketika panggilan masuk mencapai salah satu nomor telepon Anda. Pengiriman endpoint adalah notifikasi fire-and-forget yang dikirim untuk setiap panggilan masuk, baik nomor tersebut dikonfigurasi untuk agen maupun webhook. Nomor tanpa agen yang ditetapkan juga menerima permintaan konfigurasi blocking 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"
}

telephony.complete

Dikirim ketika panggilan telepon masuk atau keluar berakhir. Non-blocking. Mencakup transkrip, URL rekaman jika tersedia, dan ringkasan penagihan. Lihat telephony.complete / web.complete untuk skema payload.

telephony.tool

Dikirim setelah panggilan telepon memanggil function tool. Notifikasi audit non-blocking — tool telah dijalankan saat peristiwa ini dikirim; peristiwa ini mencakup function tool Anda sendiri (bukan tool bawaan, basis pengetahuan, koneksi aplikasi, atau MCP).

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

telephony.turn

Dikirim saat 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. Non-blocking.

{
  "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
positionintegerIndeks giliran dalam riwayat panggilan — identitas stabil untuk pengurutan
rolestringassistant (ucapan agen) atau user (ucapan penelepon)
textstringTeks transkrip giliran sebagaimana diketahui pada waktu pengiriman
entry_typestringJenis entri riwayat yang mendasari: completion (agen), atau user_turn / span (penelepon)
start_ms, end_msintegerOffset audio dalam md sejak panggilan dimulai; hanya ada ketika waktu pemutaran sudah diketahui pada waktu pengiriman

web.incoming

Padanan kanal web untuk telephony.incoming, dikirim ketika 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 blocking pada webhook lama — permintaan blocking 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 berupa 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.

web.complete

Padanan kanal web untuk telephony.complete, yang mencakup panggilan widget web (direction: "web") dan panggilan uji mikrofon builder (direction: "test"). Non-blocking. Bentuk payload sama seperti telephony.complete, ditambah origin_domain, dengan from_number ditetapkan ke "web".

web.tool

Padanan kanal web untuk telephony.tool. data memuat origin_domain, bukan from_number / to_number.

web.turn

Padanan kanal web untuk telephony.turn, yang mencakup panggilan widget web dan panggilan uji mikrofon builder. Bentuk payload sama, dengan origin_domain menggantikan from_number / to_number. Seperti telephony.turn, peristiwa ini memerlukan langganan eksplisit — peristiwa ini tidak pernah dikirim melalui array events kosong.


Peristiwa suara

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

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"
}
KolomTipeDeskripsi
voice.idstringID publik suara kustom
voice.namestringNilai suara agen dalam format custom:<public_id>
voice.display_namestringNama suara yang ditampilkan kepada organisasi
voice.languagestringKode bahasa tunggal kloning
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…"
    }
  },
  "event_id": "7c1d2e3f-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
  "type": "call.graded"
}
KolomTipeDeskripsi
grade.idintegerID penilaian
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 peristiwa
grade.grader_modelstringPenilai yang menghasilkan hasil (misalnya heuristic-v1)
grade.graded_at, grade.created_attimestamp

issue.reported

Dikirim ketika sebuah laporan masalah dibuat — baik diajukan oleh pengguna dari dasbor (source: "user") maupun 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"
}
KolomTipeDeskripsi
issue_report.severitystringcritical, warning, atau info
issue_report.statusstringopen atau resolved
issue_report.sourcestringuser (diajukan dari dasbor) atau system (dibuat oleh penilaian)

Peristiwa panggilan uji

test-call.completed

Dikirim ketika sebuah proses panggilan uji mencapai status terminal — completed atau failed, termasuk proses yang gagal saat peluncuran dan tidak pernah menghasilkan panggilan. Tidak memblokir. Berguna untuk menghubungkan proses 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"
}
KolomTipeDeskripsi
test_call_run.target_typestringagent atau phone_number
test_call_run.target_idintegerID agen atau ID nomor telepon yang menjadi target proses, sesuai dengan target_type
test_call_run.statusstringcompleted atau failed
test_call_run.call_idinteger | nullnull ketika proses gagal sebelum panggilan dilakukan
test_call_run.error_messagestringKosong jika berhasil

Peristiwa peringatan

alert.triggered

Dikirim saat sebuah aturan peringatan dengan kanal Kirim ke webhook developer yang diaktifkan melampaui ambangnya. Tidak memblokir. Aturan dipicu sekali lalu mematuhi periode cooldown-nya, sehingga pelanggaran berkelanjutan menghasilkan satu peristiwa per jendela cooldown.

{
  "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 selama jendela saat aturan dipicu
thresholdnumberAmbang yang dikonfigurasi
window_hoursintegerJendela evaluasi berjalan
fired_attimestamp

Lihat panduan Peringatan untuk membuat aturan, metrik, cooldown, serta kanal email / Slack.


Terkait