Panduan & Referensi API Broadcast
Semua yang perlu kamu tahu buat integrasi sistem kamu sendiri (toko online, CRM, aplikasi internal) dengan platform broadcast WhatsApp kami — dari konsep dasar sampai detail tiap endpoint API.
Mulai Cepat
Tiga langkah buat mulai kirim broadcast lewat API kamu sendiri.
- Hubungkan nomor WhatsApp Business kamu. Kalau belum, hubungkan lewat halaman Nomor & WABA di dashboard — ini yang jadi sumber pengiriman semua pesanmu.
-
Bikin API key.
Buka halaman API Key di dashboard, klik "Buat Key Baru". Key ini (diawali
fvb_...) berlaku buat semua nomor WABA milik akunmu — cuma ditampilkan sekali saat dibuat, jadi simpan baik-baik. -
Coba panggilan pertama.
Panggil
GET /api/broadcast/numbersbuat mastiin key-nya jalan dan dapetinconnection_idnomor kamu. Atau langsung coba interaktif lewat API Playground di dashboard tanpa nulis kode dulu.
Konsep Dasar
Template vs. Teks Bebas
Ada dua cara kirim pesan lewat WhatsApp Business Platform, dan itu bukan pilihan kami — itu aturan Meta:
- Template — pesan dengan format tetap yang sudah disetujui Meta sebelumnya. Ini satu-satunya
cara memulai percakapan baru ke nomor yang belum pernah chat ke kamu. Dipakai oleh
POST /senddanPOST /send-to-group. - Teks bebas — balasan bebas format, tapi cuma bisa dikirim dalam jendela 24 jam
sejak pelanggan terakhir kali chat ke nomor kamu. Dipakai oleh
POST /send-text.
Kenapa selalu butuh connection_id?
Satu API key berlaku buat semua nomor WhatsApp yang dimiliki akunmu — bukan cuma satu. Karena
itu, tiap kali mau kirim, kamu wajib bilang mau kirim dari nomor yang mana lewat connection_id.
Dapatkan daftarnya dari GET /api/broadcast/numbers.
Siapa Nyiapin Apa?
Ada 2 hal yang harus ADA sebelum bisa kirim, dan tempat nyiapinnya beda — ini yang paling sering bikin bingung integrator baru:
- Isi & tampilan pesan (Template) — wajib dibikin dan disetujui Meta dulu lewat
dashboard kami, bukan lewat API. Ini bukan pilihan desain kami — persetujuan
template itu review manual dari pihak Meta sendiri, gak ada platform manapun yang bisa bikin itu instan
lewat panggilan API. Kabar baiknya: ini cuma sekali per jenis pesan, bukan tiap mau kirim — sekali
promo_septemberapproved, kamu bisa panggil dia berkali-kali lewat API kapan saja. - Daftar penerima & datanya — ini 100% bisa dari sistem kamu sendiri, gak perlu
nyentuh dashboard kami sama sekali: kirim langsung nomor + datanya lewat
POST /send. Cuma kalau kamu memang mau manfaatin kontak yang sudah tersimpan & dikelompokkan di dashboard kami, baru pakaiPOST /send-to-group— itu opsional, bukan keharusan.
Cara Isi Variable Template ({{1}}, {{2}}, dst.)
Variable di template itu berdasarkan urutan/posisi, bukan nama field — Meta gak punya konsep "nama variable", cuma nomor urut. Caranya:
- Panggil
GET /api/broadcast/templates/{name}, baca teks body-nya buat ngerti maksud tiap nomor (misal"Halo {{1}}, promo {{2}}% khusus kamu!"—{{1}}= nama,{{2}}= diskon). - Isi array
variablespersis di urutan itu:["Budi", "20"].
Penting kalau mau kirim personalized (nama/isi beda tiap orang): 1 panggilan
POST /send memakai 1 array variables yang sama buat SEMUA nomor
di request itu — bukan per-orang. Kalau tiap penerima harus dapet isian yang beda-beda, panggil
POST /send berkali-kali, 1 panggilan per penerima, masing-masing dengan
numbers (isi 1 nomor) dan variables miliknya sendiri — bukan sekali panggil buat
semua orang sekaligus.
Skenario Umum
Tiga situasi paling sering dipakai integrasi lain lewat API kami — dan endpoint mana yang cocok buat masing-masing.
Promo ke Nomor Baru
Sistem kamu (misal toko online) mau kirim penawaran ke ratusan nomor dari database sendiri — nomor-nomor itu belum tentu pernah chat ke WABA kamu, jadi wajib pakai Template yang sudah disetujui Meta.
POST /sendBroadcast ke Grup Pelanggan
Kontaknya sudah tersimpan & dikelompokkan di dashboard kami (misal grup "Pelanggan VIP") dan
sudah punya Template ter-mapping — sistem kamu tinggal panggil group_id-nya, tanpa
perlu kirim ulang seluruh daftar nomor.
Balas Otomatis Pelanggan
Pelanggan baru chat ke nomor kamu (masih dalam jendela 24 jam) — sistem kamu dapat kabarnya lewat
webhook message.received, lalu kode kamu sendiri
yang mutusin mau dibalas apa (misal konfirmasi pesanan) dan panggil endpoint ini buat kirimnya. Ini
bukan fitur auto-reply otomatis dari kami — logic "balas apa"-nya 100% punya kamu. (Fitur balas
otomatis milik kami sendiri, Keyword Auto-Reply & AI Agent, ada di dashboard tapi belum
tersedia lewat API.)
Autentikasi
Semua request ditandatangani lewat header Authorization pakai skema Bearer. Tempel API key kamu
(yang diawali fvb_...) apa adanya, tanpa kutip tambahan:
Header wajib di setiap request
Authorization: Bearer fvb_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Kalau header-nya hilang, key-nya salah, sudah dicabut, atau kedaluwarsa — semua endpoint balikin
401 dengan pesan error yang jelas, bukan diam-diam gagal.
Dashboard vs. API — Kapan Pakai yang Mana?
Keduanya kirim lewat jalur yang sama persis di belakang layar — bedanya cuma siapa yang memicu pengirimannya, dan beberapa fitur di dashboard memang belum kami buka lewat API.
- Dashboard cocok kalau kamu (atau tim kamu) yang manual pilih kontak/grup dan kirim broadcast langsung dari browser — nggak butuh kode sama sekali.
- API cocok kalau pengirimannya harus otomatis dipicu dari sistem lain — misalnya toko online kamu otomatis kirim notifikasi WhatsApp begitu ada pesanan baru, atau CRM kamu kirim reminder terjadwal sendiri.
| Fitur | Dashboard | API |
|---|---|---|
| Kirim Template ke nomor manual | ||
| Kirim Template ke grup kontak | ||
| Kirim Template Carousel | ||
| Balas teks bebas ke 1 nomor | ||
| Teks bebas ke seluruh grup sekaligusbelum ada di API | ||
| Tombol CTA (link / balas cepat)belum ada di API | ||
| Lampiran media di teks bebasbelum ada di API | ||
| Jadwalkan kirim nantibelum ada di API | ||
| Riwayat & log pengiriman |
Butuh CTA, media, atau kirim terjadwal lewat API? Fitur-fitur itu masih eksklusif dashboard buat sekarang — kabarin kami kalau butuh dibuka lewat API juga.
Webhook
Kebalikan dari semua endpoint di atas — bukan kamu yang manggil kami, tapi kami yang otomatis kirim data ke sistem kamu begitu ada kejadian, tanpa kamu perlu nembak API terus-menerus buat ngecek "ada yang baru belum?".
Bisa Dipakai Buat Apa?
Dua kejadian yang sekarang bisa didorong otomatis ke sistem kamu:
Balasan Baru Masuk — message.received
Pelanggan baru saja chat ke nomor kamu. Cocok buat bikin bot customer service sendiri —
begitu event ini masuk, sistem kamu bisa langsung panggil POST /send-text buat balas
otomatis (masih dalam jendela 24 jam yang sama), atau sekadar mencatatnya ke CRM/helpdesk kamu sendiri
tanpa staff harus buka dashboard kami.
Status Kirim Berubah — message.status_update
Pesan yang kamu kirim berubah status (terkirim → diterima → dibaca, atau gagal). Kombinasinya:
panggil GET /broadcasts/{id} sekali buat dapetin kondisi awal begitu
selesai kirim, abis itu gak perlu nembak API itu lagi — tiap perubahan status
selanjutnya otomatis didorong lewat webhook ini.
Webhook ini sifatnya opsional pelengkap, bukan pengganti — kalau sistem kamu udah cukup dengan cara nembak API biasa (polling), gak masalah, gak wajib pasang webhook sama sekali.
Cara Pasang — 1. Daftarkan URL kamu
Buka halaman API Key
di dashboard, tempel 1 URL server kamu sendiri yang bisa nerima POST (wajib https://,
gak boleh mengarah ke alamat internal/privat). Kami langsung kirim 1 permintaan verifikasi ke situ — endpoint
kamu harus membalas kode acaknya persis biar statusnya jadi "Aktif". Ini buat mastiin kamu beneran pemilik
URL itu, sama seperti Meta memverifikasi webhook mereka sendiri ke kami.
Body permintaan verifikasi yang kami kirim
{
"event": "webhook.verification",
"sent_at": "2026-08-28T10:00:00+07:00",
"data": { "challenge": "aB3xZ..." }
}
Balas dengan status 200 — boleh cuma teks polos berisi nilai challenge itu apa
adanya, atau JSON {"challenge": "aB3xZ..."}. Salah satu cukup.
Cara Pasang — 2. Verifikasi tanda tangannya
Tiap permintaan (verifikasi maupun event beneran) dikirim dengan 2 header tambahan — pakai ini buat memastikan requestnya beneran dari kami, bukan orang lain yang menembak URL kamu:
Header di tiap permintaan webhook
X-Webhook-Event: message.received X-Webhook-Signature: sha256=1a2b3c...
Secret buat verifikasi ini ada di halaman API Key yang sama (tombol "Lihat" di kartu Webhook) — jangan
pernah ditaruh di kode sisi client/browser, cuma dipakai di server kamu. Cara ceknya: hitung ulang
HMAC-SHA256 dari raw body permintaan (persis apa adanya, sebelum di-parse jadi objek) pakai
secret itu, lalu bandingkan hasilnya dengan nilai setelah sha256= di header — pakai
perbandingan yang aman dari timing attack (hash_equals), bukan == biasa.
Contoh endpoint penerima webhook (PHP) — bisa langsung ditempel
$rawBody = file_get_contents('php://input'); // wajib RAW, bukan hasil json_decode
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$secret = 'whsec_...'; // ambil dari kartu Webhook di halaman API Key
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $secret);
if (! hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}
// Lolos verifikasi — baru sekarang aman diproses.
$payload = json_decode($rawBody, true);
$event = $payload['event']; // 'message.received' / 'message.status_update' / 'webhook.verification'
$data = $payload['data'];
Detail Teknis — Bentuk Tiap Event
message.received — balasan baru masuk ke Inbox:
Contoh body event
{
"event": "message.received",
"sent_at": "2026-08-28T10:05:00+07:00",
"data": {
"message_id": 1042,
"wamid": "wamid.HBg...",
"connection_id": 4,
"from": "6281234567890",
"contact_name": "Budi Santoso",
"type": "text",
"body": "Halo, saya mau tanya stok",
"timestamp": "2026-08-28T10:05:00+07:00"
}
}
message.status_update — status pesan yang kamu kirim berubah (field-nya sama persis dengan salah satu baris recipients di GET /broadcasts/{id}):
Contoh body event
{
"event": "message.status_update",
"sent_at": "2026-08-28T10:06:00+07:00",
"data": {
"broadcast_id": 514,
"phone": "6281234567890",
"message_id": "wamid.HBg...",
"status": "delivered",
"error": null,
"sent_at": "2026-08-28T10:05:50+07:00",
"delivered_at": "2026-08-28T10:06:00+07:00",
"read_at": null
}
}
status naik bertahap sent → delivered → read, atau langsung
failed (isi error dengan alasannya) — sama persis urutan yang dipakai
GET /broadcasts/{id}, jadi kode yang sudah kamu tulis buat parsing endpoint itu bisa dipakai ulang.
Aturan pengiriman
- Balas
200secepatnya (dalam 5 detik) — kalau server kamu lambat/tidak merespons, dianggap gagal. - Gagal terkirim akan dicoba ulang otomatis 3x (jeda 30 detik, 2 menit, lalu 10 menit) sebelum menyerah.
- Riwayat tiap percobaan pengiriman (berhasil maupun gagal, lengkap dengan kode responsnya) bisa dilihat di kartu Webhook halaman API Key.
- 1 client cuma bisa punya 1 URL webhook aktif untuk sekarang — dipakai bersama buat semua event dan semua nomor WhatsApp kamu.
Endpoint yang Tersedia
Semua endpoint di bawah butuh header Authorization: Bearer fvb_... — dapatkan API key kamu dari halaman
API Key di dashboard.
Tanpa key yang valid, semua endpoint ini balikin 401.
Ada 2 bentuk error yang bisa kamu terima: field wajib yang kosong/salah tipe balikin 422 bentuk bawaan Laravel
({"message": "...", "errors": {"field": ["..."]}}), sedangkan error dari logika kami sendiri (template gak ketemu, jendela 24 jam abis, dll) balikin bentuk yang lebih simpel {"error": "..."} — kedua contoh di bawah tiap endpoint pakai bentuk yang kedua.
Postman Collection
Semua endpoint di bawah dalam 1 file siap-import — lengkap dengan contoh request, response, dan penjelasan tiap parameter. Cocok buat langsung dicoba di Postman atau dikasih ke AI/developer lain biar langsung paham.
Nomor & Koneksi
Satu API key berlaku buat semua nomor WhatsApp yang dimiliki akunmu. Resource ini yang ngasih tau nomor apa aja yang tersedia dan connection_id-nya masing-masing — nilai yang wajib disertakan di setiap operasi kirim pesan di bawah.
Operasi 1
/api/broadcast/numbers
Daftar Nomor
Nomor WhatsApp mana aja yang bisa dipakai buat kirim lewat API key ini.
Contoh Request
Contoh Response Berhasil 200
{
"numbers": [
{
"connection_id": 4,
"phone_number": "6281234567890",
"label": "Nomor Utama",
"waba_name": "Toko Maju Jaya"
}
]
}
Template
Template adalah pesan berformat tetap yang sudah disetujui Meta — satu-satunya cara memulai percakapan baru ke nomor yang belum pernah chat ke kamu (lihat Konsep Dasar). Resource ini cuma nampilin template yang sudah kamu tandai "Bisa dipakai lewat API" di dashboard.
Operasi 2
/api/broadcast/templates
Daftar Template
Template yang sudah disetujui Meta dan dicentang "Bisa dipakai lewat API". Variabelnya diberi posisi {{1}}, {{2}}, dst. — urutan diisinya diserahkan ke sistem kamu sendiri.
Contoh Request
Contoh Response Berhasil 200
{
"templates": [
{
"name": "info_promo",
"category": "MARKETING",
"language": "id",
"body": "Halo {{1}}, ada promo spesial buat kamu: {{2}}!",
"variable_count": 2,
"waba_name": "Toko Maju Jaya",
"note": null
},
{
"name": "otp_login",
"category": "AUTHENTICATION",
"language": "id",
"body": "",
"variable_count": 0,
"waba_name": "Toko Maju Jaya",
"note": "Kategori Authentication: teks pesan dibuat otomatis oleh Meta, tidak ada variabel bebas. Kirim lewat POST /send-otp dengan parameter code."
}
]
}
/api/broadcast/templates/{name}
Detail 1 Template
Struktur komponen lengkap satu template (HEADER/BODY/FOOTER/BUTTONS) — buat yang cuma butuh tau 1 template doang, bukan nge-list semuanya.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
name |
string | wajib | Path parameter — nama template dari GET /templates. |
Contoh Request
Contoh Response Berhasil 200
{
"name": "info_promo",
"category": "MARKETING",
"language": "id",
"variable_count": 2,
"waba_name": "Toko Maju Jaya",
"components": [
{
"type": "HEADER",
"format": "IMAGE"
},
{
"type": "BODY",
"text": "Halo {{1}}, ada promo spesial buat kamu: {{2}}!"
},
{
"type": "FOOTER",
"text": "Balas STOP untuk berhenti menerima pesan promosi."
}
],
"note": null
}
Contoh Response Gagal 404
{
"error": "Template 'info_promo' tidak ditemukan atau belum bisa dipakai lewat API."
}
Pesan — Pakai Template
Kirim broadcast pakai Template yang sudah disetujui Meta — satu-satunya cara memulai percakapan baru ke nomor yang belum pernah chat ke kamu. Dua operasi di bawah beda cuma di sumber penerimanya: nomor mentah yang kamu kirim sendiri, atau grup kontak yang sudah tersimpan di dashboard.
Operasi 4
/api/broadcast/groups
Daftar Grup Kontak
Semua grup kontak client ini, berlaku buat semua nomor (gak terikat 1 WABA) — inilah yang ngasih tau group_id buat dipakai di operasi "Kirim ke Grup Kontak" di bawah.
Contoh Request
Contoh Response Berhasil 200
{
"groups": [
{
"group_id": 12,
"name": "Pelanggan VIP",
"active_contacts_count": 48,
"total_contacts_count": 50
}
]
}
/api/broadcast/groups/{id}/contacts
Daftar Kontak dalam Grup
Isi satu grup kontak — nama, nomor, custom field, dan status opt-out tiap kontak. Berguna buat preview isi grup sebelum manggil "Kirim ke Grup Kontak" di bawah.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
id |
integer | wajib | Path parameter — group_id dari GET /groups. |
Contoh Request
Contoh Response Berhasil 200
{
"group_id": 12,
"name": "Pelanggan VIP",
"contacts": [
{
"contact_id": 30,
"name": "Andi Saputra",
"phone": "6281234567890",
"custom_fields": {
"kota": "Bandung"
},
"opted_out": false
}
]
}
Contoh Response Gagal 404
{
"error": "Grup kontak tidak ditemukan."
}
/api/broadcast/send
Kirim ke Nomor Langsung
Kirim broadcast pakai template langsung ke daftar nomor yang kamu kirim di request — nomornya tidak disimpan sebagai kontak kami, cocok kalau sistem kamu sendiri yang mengelola data pelanggan.
Kalau template_name bertipe Media Card Carousel, parameter cards WAJIB disertakan (jumlahnya harus persis sama dengan jumlah kartu template-nya, urutan sama kayak di dashboard). Buat template biasa, jangan sertakan cards sama sekali.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
connection_id |
integer | wajib | Dari GET /numbers. |
template_name |
string | wajib | Harus sudah approved di WABA ini. |
numbers |
array<string> | wajib | Maksimal 1000 nomor per request. |
variables |
array | opsional | Isi buat {{1}}, {{2}}, dst di body utama — sama buat semua nomor di request ini. |
cards |
array | opsional | WAJIB kalau template-nya Carousel — 1 objek per kartu, urutan sama kayak di dashboard: <code>header_media_url</code> (wajib, URL gambar/video), <code>header_type</code> (<code>image</code>/<code>video</code>, default <code>image</code>), <code>body_params</code> (isi <code>{{n}}</code> khusus kartu itu), <code>buttons</code> (<code>[{type, text, payload}]</code>). |
dry_run |
boolean | opsional | Kalau <code>true</code>, cuma validasi + balikin teks pesan yang bakal terkirim (dari template lokal kami) buat tiap nomor, termasuk preview tiap kartu carousel (<code>cards_preview</code>) kalau ada — gak ada Meta yang dipanggil, gak ada broadcast yang dibuat/diantre. |
Contoh Request
Contoh Response Berhasil 201
{
"broadcast_id": 512,
"status": "queued",
"template": "info_promo",
"total_recipients": 2
}
Contoh Response Gagal 422
{
"error": "Template 'info_promo' tidak ditemukan atau belum approved buat nomor ini."
}
/api/broadcast/send-to-group
Kirim ke Grup Kontak
Kirim ke satu grup kontak yang sudah ada di dashboard kami — grup itu harus sudah punya tepat 1 template yang di-mapping (lewat halaman Template) kecuali kamu sertakan template_name buat pilih salah satu.
Sama kayak Kirim ke Nomor Langsung — kalau template_name/mapping grup-nya bertipe Media Card Carousel, parameter cards WAJIB disertakan (jumlah & urutan sama kayak di dashboard), dikirim sama persis ke semua kontak di grup ini. Buat template biasa, jangan sertakan cards.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
connection_id |
integer | wajib | Dari GET /numbers. |
group_id |
integer | wajib | ID grup kontak. |
template_name |
string | opsional | Wajib kalau grupnya punya >1 template ter-mapping. |
variables |
array | opsional | Cuma buat variabel yang belum otomatis terisi dari data kontak. |
cards |
array | opsional | WAJIB kalau template-nya Carousel — bentuknya sama persis kayak di <a href="#ep-send">Kirim ke Nomor Langsung</a>: 1 objek per kartu (<code>header_media_url</code>, <code>header_type</code>, <code>body_params</code>, <code>buttons</code>), dikirim sama ke semua kontak di grup. |
dry_run |
boolean | opsional | Kalau <code>true</code>, cuma validasi + balikin teks pesan yang bakal terkirim buat tiap kontak di grup (sudah termasuk variabel yang otomatis terisi dari data kontak), termasuk preview tiap kartu carousel (<code>cards_preview</code>) kalau ada — gak ada Meta yang dipanggil, gak ada broadcast yang dibuat/diantre. |
Contoh Request
Contoh Response Berhasil 201
{
"broadcast_id": 513,
"status": "queued",
"template": "info_promo",
"group": "Pelanggan VIP",
"total_recipients": 48
}
Contoh Response Gagal 422
{
"error": "Grup \"Pelanggan VIP\" punya lebih dari 1 template ter-mapping \u2014 sertakan 'template_name' buat pilih salah satu.",
"available_templates": [
"info_promo",
"reminder_bayar"
]
}
Pesan — Teks Bebas
Balasan bebas format, tanpa Template — tapi Meta cuma mengizinkannya dalam jendela 24 jam sejak pelanggan terakhir kali chat ke nomor kamu. Cocok buat auto-reply customer service, bukan buat broadcast promosi ke nomor baru (pakai resource Pesan — Pakai Template buat itu).
Operasi 1
/api/broadcast/send-text
Balas Teks Bebas
Kirim pesan teks bebas (bukan template) — cuma jalan dalam jendela 24 jam Meta (nomor tujuan harus baru saja chat ke WABA ini). Dikirim langsung (synchronous), hasilnya dibalikin seketika, bukan diantre.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
connection_id |
integer | wajib | Dari GET /numbers. |
phone |
string | wajib | Nomor tujuan. |
message |
string | wajib | Maksimal 4096 karakter. |
Contoh Request
Contoh Response Berhasil 201
{
"status": "sent",
"message_id": "wamid.HBg...",
"broadcast_id": 514
}
Contoh Response Gagal 422
{
"error": "(#131047) Message failed to send because more than 24 hours have passed since the customer last replied to this number.",
"error_code": 131047,
"broadcast_id": 514
}
Pesan — OTP/Verifikasi
Kirim kode OTP/verifikasi (login, ganti password, dsb) lewat Template kategori khusus Authentication — beda dari Template biasa, teks pesannya dibuat otomatis oleh Meta (bukan kamu yang nulis), kamu cuma kirim kodenya. Kode OTP itu sendiri dibuat dan dicocokkan oleh sistem kamu sendiri — resource ini cuma tugas nganterinnya lewat WhatsApp. Dikirim langsung (synchronous), hasilnya dibalikin seketika, bukan diantre — cocok buat orang yang lagi nunggu kode di HP-nya.
Operasi 1
/api/broadcast/send-otp
Kirim Kode OTP
template_name wajib sudah approved, kategori Authentication, dan dicentang "Bisa dipakai lewat API" (lihat Daftar Template — template kategori ini juga muncul di situ, ditandai lewat field note).
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
connection_id |
integer | wajib | Dari GET /numbers. |
template_name |
string | wajib | Template kategori Authentication yang sudah approved. |
phone |
string | wajib | Nomor tujuan. |
code |
string | wajib | Kode OTP-nya — maksimal 20 karakter. Dibuat & disimpan sendiri oleh sistem kamu, bukan oleh kami. |
Contoh Request
Contoh Response Berhasil 201
{
"status": "sent",
"message_id": "wamid.HBg...",
"broadcast_id": 515
}
Contoh Response Gagal 422
{
"error": "Template 'otp_login' tidak ditemukan, belum approved, bukan kategori Authentication, atau belum dicentang \"Bisa dipakai lewat API\"."
}
Status Broadcast
Setiap operasi kirim di atas (/send, /send-to-group, /send-text, /send-otp) langsung balikin broadcast_id begitu request-nya diterima — resource ini yang biarin sistem kamu cek hasilnya belakangan, tanpa perlu buka dashboard.
Operasi 1
/api/broadcast/broadcasts/{id}
Cek Status Broadcast
Status keseluruhan (sent_count/delivered_count/read_count/failed_count) plus rincian per nomor penerima — status per-penerima naik bertahap pending → sent → delivered → read begitu Meta ngirim webhook callback-nya ke kami, atau langsung failed kalau gagal.
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
id |
integer | wajib | Path parameter — broadcast_id dari response operasi kirim. |
Contoh Request
Contoh Response Berhasil 200
{
"broadcast_id": 514,
"status": "completed",
"template": "info_promo",
"group": null,
"total_count": 2,
"sent_count": 0,
"delivered_count": 1,
"read_count": 1,
"failed_count": 1,
"created_at": "2026-08-18T02:10:00+00:00",
"recipients": [
{
"phone": "6281234567890",
"status": "read",
"message_id": "wamid.HBg...",
"error": null,
"sent_at": "2026-08-18T02:10:05+00:00",
"delivered_at": "2026-08-18T02:10:08+00:00",
"read_at": "2026-08-18T02:11:40+00:00"
},
{
"phone": "6281298765432",
"status": "failed",
"message_id": null,
"error": "Nomor Tidak Terdaftar di WhatsApp \u2014 (#131026) ...",
"sent_at": null,
"delivered_at": null,
"read_at": null
}
]
}
Contoh Response Gagal 404
{
"error": "Broadcast tidak ditemukan."
}
Mau coba langsung?
API Playground di dashboard biarin kamu kirim request beneran ke setiap endpoint di atas, langsung dari browser, tanpa perlu nulis kode dulu.