Webhook Pesan dan Status Pesan
Webhook pesan dan status pesan mengirimkan notifikasi otomatis ke server setiap kali ada pesan masuk atau perubahan status pengiriman pesan seperti teks, reply, reaction, maupun status sent, delivered, dan read.
Prasyarat
- Webhook sudah dikonfigurasi dan tipe event koneksi sudah diaktifkan di dashboard.
Panduan konfigurasi di Integrasi Notifikasi Webhook.
Event: message
Dikirim saat ada pesan masuk. Pesan bisa berupa teks biasa, pesan yang dikutip (quote), atau reaction.
Field type di dalam results menentukan jenis pesan:
| Nilai type | Keterangan |
|---|---|
| conversation | Pesan teks biasa |
| extendedTextMessage | Pesan teks dengan format tambahan, strukturnya sama dengan conversation |
| reactionMessage | Reaction yang diberikan pada pesan tertentu |
{
"type": "message", // Tipe webhook yang dikirim
"results": { // Kumpulan object dari event message
/*
Object dibawah ini hanya akan tampil ketika Anda mengirim pesan lewat API
*/
"messageStubParameters": [],
"labels": [],
"userReceipt": [],
"reactions": [],
"pollUpdates": [],
"eventResponses": [],
"statusMentions": [],
"messageAddOns": [],
"statusMentionSources": [],
"supportAiCitations": [],
/* ---------------- */
"key": { // Informasi pengirim
"fromMe": false, // Dikirim dari nomer sendiri ?
"id": "xxxxx", // ID pesan
"senderLid": "xxxxx@lid", // Nomor samaran di whatsapp
},
"messageTimestamp": 1691639955, // Waktu pesan
"pushName": "xxxxx", // Nama Whatsapp
"broadcast": false, // Apakah pesan broadcast ?
"status": 2, // Object ini hanya muncul ketika mengirim pesan via API
"message": {
... // Object disini adalah raw pesan whatsapp, bisa berubah sewaktu2
},
"verifiedBizName": "WHAPI", // Object untuk nama whatsapp bisnis
"t": 1691639955, // Waktu pesan
"id": "xxxxx", // ID pesan
"fromMe": false, // Dikirim dari nomer sendiri ?
"isGroupMsg": false, // Apakah pesan dari grup ?
"isStories": false, // Apakah pesan story ?
"pushname": "WHAPI", // Object untuk nama whatsapp bisnis
"timestamp": 1691639955, // Waktu pesan
"isEphemeralMessage": false,
"viewOnce": false, // Pesan dilihat 1x
"type": "extendedTextMessage", // ada 3 type reactionMessage | extendedTextMessage | conversation
"isMedia": false, // Apakah pesan media?
"quotedMsg": { // Jika pesan berupa quote, akan ada data disini
... // Data object disini adalah raw dari whatsapp.
},
"mentionedJidList": [], // Mention nama akan muncul disini
"body": "Isi Pesan", // Berisi isi pesan / caption pada gambar / caption pada dokumen
"replyData": "xxxxxx", // ID Untuk mereply pesan ini
"apiKey": "xxxxx" // Alamat API Key dari device
}
}
Catatan penting untuk beberapa field:
| Field | Keterangan |
|---|---|
| body | Isi teks pesan atau caption media. Ambil nilai dari field ini untuk mendapatkan teks pesan |
| results.message | Object raw dari WhatsApp. Strukturnya bisa berubah sewaktu-waktu, tidak disarankan sebagai acuan utama |
| quotedMsg | Berisi data pesan yang dikutip jika pesan merupakan balasan. Struktur bisa berubah |
| mentionedJidList | Daftar nomor yang di-mention dalam pesan |
| messageTimestamp, timestamp, t | Ketiganya menampilkan waktu yang sama — waktu pesan dikirim |
| verifiedBizName | Hanya muncul jika nomor yang terhubung adalah WhatsApp Business |
| status | Hanya muncul saat pesan dikirim via API, bukan pesan masuk dari pengguna lain |
Event: message_ack
Dikirim saat status pengiriman pesan berubah di perangkat.
{
"type": "message_ack", // Tipe webhook yang dikirim
"results": { // Kumpulan object dari event message_ack
"apiKey": "xxxxx", // Alamat API Key dari device
"ack": {
"ack": 2, // Status perubahan pesan 0, 1, 2, 3, 4, 5
"id": "xxxxx", // ID dari pesan
}
}
}
Nilai yang mungkin untuk field ack.ack:
| Nilai | Keterangan |
|---|---|
| 0 | Error |
| 1 | Queued — dalam antrian |
| 2 | Pending — menunggu dikirim |
| 3 | Pesan berhasil dikirim ke server WhatsApp |
| 4 | Pesan sudah dibaca |
| 5 | Pesan audio sudah didengarkan |
Event: message_ack_browser
Dikirim saat status pengiriman pesan berubah di WhatsApp Web. Struktur payload sama persis dengan message_ack, hanya type yang berbeda.
{
"type": "message_ack_browser",
"results": {
"apiKey": "xxxxx",
"ack": {
"ack": 3, // Status perubahan pesan 0, 1, 2, 3, 4, 5
"id": "xxxxx",
}
}
}