Webhook CDR
Protokol push webhook, payload peristiwa, dan verifikasi tanda tangan X-CALLBACK-ID untuk catatan panggilan suara.
Webhook CDR
Saat panggilan mencapai status akhir, platform mendorong catatan panggilan (CDR) ke endpoint webhook yang Anda konfigurasikan melalui HTTP POST. Ini alternatif selain polling API kueri catatan panggilan.
Prasyarat: Konfigurasikan endpoint webhook di InnoPaas Console (jenis peristiwa: push status CDR, cdr_status_push). Kredensial tanda tangan (username dan secret) bersifat opsional; jika dikonfigurasi, push menyertakan header tanda tangan — lihat Verifikasi tanda tangan.
Protokol push
- Metode:
POSTdengan bodyapplication/json; charset=utf-8 - Receiver Anda harus merespons 2xx dalam batas waktu; selain itu dianggap gagal
-
Versi saat ini tidak melakukan retry otomatis untuk push yang gagal. Jaga kestabilan receiver Anda dan tangani
eventIdsecara idempoten (eventIdsama dengan identifier panggilancallId).
Payload peristiwa
{
"eventCode": "cdr_status_push",
"eventId": "YYYX931******64224",
"eventTime": "2026-11-09 10:00:41",
"data": {
"callId": "YYYX931******64224",
"mobile": "8613800138000",
"callStatus": 2,
"callDesc": "200",
"callDescMsg": "呼叫成功",
"callTime": "2026-11-09 10:00:05",
"startTime": "2026-11-09 10:00:07",
"answerTime": "2026-11-09 10:00:11",
"byeTime": "2026-11-09 10:00:35",
"ringTime": "2026-11-09 10:00:09",
"invokeTime": "2026-11-09 10:00:00",
"batchNo": "B20261109***",
"templateId": "Tpl_0001",
"recordUrl": "https://example.com/rec/xxx.mp3"
}
}Kolom data:
| Kolom | Tipe | Deskripsi |
|---|---|---|
| callId | String | Identifier panggilan unik (callId yang sama dengan API kirim) |
| mobile | String | Nomor penerima |
| callStatus | Integer | Kode status panggilan (numerik; merujuk pada push aktual) |
| callDesc | String | Kode terminasi |
| callDescMsg | String | Keterangan kode terminasi |
| callTime | String | Waktu panggilan |
| startTime | String | Waktu dial panggilan ini |
| answerTime | String | Waktu tersambung (kosong bila tidak tersambung) |
| byeTime | String | Waktu terputus |
| ringTime | String | Waktu berdering |
| invokeTime | String | Waktu tugas dimulai |
| batchNo | String | Nomor batch |
| templateId | String | ID template |
| recordUrl | String | URL file rekaman (kosong bila tidak ada) |
Verifikasi tanda tangan
Jika kredensial tanda tangan dikonfigurasi, setiap push menyertakan header X-CALLBACK-ID:
timestamp=<epoch millis>;nonce=<random 32 karakter>;username=<username terkonfigurasi>;signature=<tanda tangan>Cara menghitung signature:
- Konten yang ditandatangani =
timestamp + nonce + username, tiga segmen digabung berurutan tanpa pemisah - Algoritma =
HMAC-SHA256, dengan kunci secret yang dikonfigurasi - Output berupa string heksadesimal huruf kecil
Contoh verifikasi (Java):
String header = request.getHeader("X-CALLBACK-ID"); // timestamp=...;nonce=...;username=...;signature=...
Map<String, String> kv = new LinkedHashMap<>();
for (String pair : header.split(";")) {
int i = pair.indexOf('=');
kv.put(pair.substring(0, i), pair.substring(i + 1));
}
String expected = hmacSha256Hex(SECRET,
kv.get("timestamp") + kv.get("nonce") + kv.get("username"));
if (!expected.equals(kv.get("signature"))) {
// verifikasi gagal, tolak
}Jika kredensial tanda tangan tidak dikonfigurasi (username dan secret kosong), push berupa POST biasa tanpa header X-CALLBACK-ID.
Catatan
- Endpoint harus dapat diakses dari internet publik; respons 2xx berarti sukses
- Tangani
eventId(=callId) secara idempoten untuk menghindari duplikasi data - Kolom push selaras dengan API kueri catatan — kombinasikan keduanya: terima real-time via webhook, rekonsiliasi via API kueri
Terakhir diperbarui pada