Pakai webhook biar event masuk langsung ke server kamu — nggak usah polling API terus.
Hubungin WhatsApp dulu di dashboard, terus daftarin endpoint HTTPS di Settings → Developer → Webhooks (atau lewat API di bawah). Tiap ada event yang kamu subscribe, Wazapin bakal nge-POST JSON yang udah di-sign ke URL kamu.
Atur endpoint
| Aksi | Method dan path |
|---|---|
| Cek pengaturan webhook | GET /v1/settings/developer/webhooks |
| Buat endpoint | POST /v1/settings/developer/webhooks/endpoints |
| Update endpoint | PATCH /v1/settings/developer/webhooks/endpoints/{endpointID} |
| Hapus endpoint | DELETE /v1/settings/developer/webhooks/endpoints/{endpointID} |
| Rotate signing secret | POST /v1/settings/developer/webhooks/endpoints/{endpointID}/rotate-secret |
| Kirim test delivery | POST /v1/settings/developer/webhooks/endpoints/{endpointID}/test |
| Cek daftar delivery | GET /v1/settings/developer/webhooks/deliveries |
| Retry delivery | POST /v1/settings/developer/webhooks/deliveries/{messageID}/retry |
Lengkapnya cek di API reference → Webhooks.
Bentuk payload-nya (bukan wrapper event_type)
Beda sama beberapa docs BSP yang bungkus tiap event kayak { "type": "...", "data": { } }, Wazapin pakai model webhook signing yang standar:
| Di mana | Isinya |
|---|---|
| Header HTTP | ID pengiriman (svix-id / webhook-id), timestamp, signature — lihat Contoh signature webhook |
| Body JSON | Cuma field khusus event itu aja (flat object) |
Nama event-nya (misalnya message.new) itu nunjukin jenis subscription / delivery-nya. Nama ini nggak dimunculin lagi sebagai event_type di dalam body.
Pakai header ID delivery buat idempotency (sama kayak event_id di provider lain). Cek Siklus hidup pesan dan idempotency.
Jenis event messaging (yang paling sering dipakai)
Subscribe event ini di aplikasi pas kamu integrasi kirim/terima:
| Event | Ke-trigger kapan |
|---|---|
message.new |
Ada pesan baru di conversation (masuk dari kontak, atau echo outbound tertentu). |
message.sent |
Pesan outbound kekirim dari workspace kamu. |
message.status_update |
Status pesan terkirim berubah — sent, delivered, read, atau failed. |
conversation.updated |
Metadata conversation berubah (assignee, status, preview, dll.). |
contact.updated |
Profil kontak yang nyambung ke conversation ke-update. |
template.status_update |
Status approval template WhatsApp berubah. |
Daftar lengkap plus contohnya: Katalog event webhook. Kamu bisa filter jenis event per endpoint di pengaturan webhook.
Contoh body: message.new (teks masuk)
{
"message_id": "9f1fd66d-c37a-4b50-a8c2-b4dca523f9c8",
"conversation_id": "0f89b0f9-74b4-44f9-b9b6-48f6d4de57aa",
"contact_id": "c1a2b3c4-d5e6-7890-abcd-ef1234567890",
"channel_id": "wzp_abc123",
"direction": "inbound",
"from_phone": "6281234567890",
"msg_type": "text"
}Contoh body: message.status_update
{
"message_id": "9f1fd66d-c37a-4b50-a8c2-b4dca523f9c8",
"conversation_id": "0f89b0f9-74b4-44f9-b9b6-48f6d4de57aa",
"status": "delivered",
"organization_id": "org_123"
}Contoh lainnya: Contoh payload webhook.
Verifikasi signature
Pakai signing secret endpoint kamu (whsec_…) dan verifikasi header-nya pakai raw body sebelum kamu parse JSON.
Pengiriman & retry
- Langsung balas
2xxsecepatnya; prosesnya belakangan aja secara async. - Cek dan retry delivery yang gagal lewat deliveries API.
- Deduplikasi pakai header ID delivery +
message_idkalau ada.
Halaman terkait
- Contoh payload webhook
- Contoh signature webhook
- Siklus hidup pesan dan idempotency
- Contoh: handle event webhook
List webhook endpoints
curl "https://api.wazapin.com/v1/settings/developer/webhooks" \
--request GET \
--header "X-Api-Key: $WAZAPIN_API_KEY"const response = await fetch("https://api.wazapin.com/v1/settings/developer/webhooks", {
method: "GET",
});
const data = await response.json();
console.log(data);import os
import requests
response = requests.get(
"https://api.wazapin.com/v1/settings/developer/webhooks",
headers={
"X-Api-Key": os.environ["WAZAPIN_API_KEY"],
},
timeout=30,
)
print(response.status_code, response.json())Create webhook endpoint
curl "https://api.wazapin.com/v1/settings/developer/webhooks/endpoints" \
--request POST \
--header "X-Api-Key: $WAZAPIN_API_KEY" \
--json '{
"url": "https://your-app.com/webhook",
"events": [
"message.received",
"message.delivered"
]
}'const response = await fetch("https://api.wazapin.com/v1/settings/developer/webhooks/endpoints", {
method: "POST",
body: JSON.stringify({
"url": "https://your-app.com/webhook",
"events": [
"message.received",
"message.delivered"
]
}),
});
const data = await response.json();
console.log(data);import os
import requests
response = requests.post(
"https://api.wazapin.com/v1/settings/developer/webhooks/endpoints",
headers={
"X-Api-Key": os.environ["WAZAPIN_API_KEY"],
"Content-Type": "application/json",
},
json={
"url": "https://your-app.com/webhook",
"events": [
"message.received",
"message.delivered"
]
},
timeout=30,
)
print(response.status_code, response.json())