Atur webhook untuk menerima pesan masuk dan status pengiriman.
Panduan
Autentikasi
Tidak ada header Authorization. Kredensial dikirim sebagai field di body permintaan.
api_key dan secret_key adalah kunci yang sama, yaitu Kode Akses akun Anda. Namanya berbeda antar endpoint karena sejarah, jadi ikuti nama yang tertulis di tiap endpoint.
Pasangan kredensial
api_key + number_id
Pengiriman lewat perangkat WhatsApp yang Anda hubungkan dengan QR. number_id didapat dari Info akun & perangkat.
secret_key + licenses_key
Pengiriman lewat nomor resmi WhatsApp Business API. licenses_key tampil sebagai "Kunci Nomor" di halaman perangkat, atau lewat Daftar perangkat WABA.
Simpan kredensial di server Anda. Kode Akses mewakili seluruh akun. Jangan menaruhnya di aplikasi web atau aplikasi ponsel yang bisa dibongkar pengguna.
Panduan
Format jawaban & kode
Jawaban selalu JSON dengan code dan message. Periksa isi code, karena sebagian endpoint menjawab HTTP 200 walaupun code berisi error.
code
Arti
Yang perlu diperiksa
200
Berhasil
Permintaan diterima. Untuk pengiriman, pesan diterima sistem, belum tentu sampai ke penerima. Status akhirnya datang lewat webhook status.
400
Tidak valid
Isi parameter tidak sesuai, atau batas kirim per menit terlewati.
403
Ditolak
Kode Akses salah, paket habis, atau paket belum mendukung fitur tersebut.
404
Tidak ditemukan
Perangkat pengirim, template, atau data yang dirujuk tidak ada.
405
Parameter kurang
Ada parameter wajib yang kosong, atau metode bukan POST.
408
Waktu habis
Server pengirim tidak menjawab. Coba lagi beberapa saat kemudian.
Kode error dari Meta
Untuk WhatsApp Business API, kegagalan sering datang dari Meta dan muncul di field errors pada webhook status.
Kode
Arti
Cara mengatasi
131056
Terlalu sering ke nomor yang sama
Beri jeda antar pengiriman ke nomor tersebut.
132000
Jumlah variabel tidak cocok
Banyaknya nilai di variables harus sama dengan jumlah {{n}} di template.
132012
Format parameter tidak sesuai
Periksa jenis dan urutan variabel, termasuk di header dan tombol. Untuk template ber-header gambar, video, atau dokumen, kirim image_url atau file_url bila media di template kosong.
132001
Template tidak ditemukan di akun pengirim
Template dibuat di nomor atau akun WhatsApp Business yang berbeda. Pastikan licenses_key dan platform sesuai tempat template dibuat, dan template berisi ID template yang benar.
131047
Di luar jendela 24 jam
Pesan bebas hanya bisa dikirim dalam 24 jam sejak penerima membalas. Di luar itu, kirim memakai template yang sudah disetujui.
131042
Masalah pembayaran akun bisnis
Ada tagihan Meta yang belum lunas atau metode pembayaran bermasalah. Periksa Penagihan di WhatsApp Manager.
131026
Pesan tidak terkirim ke nomor tujuan
Nomor penerima tidak terdaftar di WhatsApp atau tidak bisa menerima pesan. Bersihkan dari daftar tujuan.
131031
Akun WhatsApp Business dikunci
Cek Business Support Home di Meta untuk penyebab dan cara membukanya.
Webhook
Cara kerja webhook
BalesOtomatis mengirim POST ke URL Anda setiap ada pesan masuk, pesan keluar, atau perubahan status pengiriman.
Dikirim setiap ada pesan masuk ke nomor Anda: teks, media, lokasi, atau balasan tombol.
Kanal: WhatsApp (non-resmi) dan WhatsApp Business API
Isi data
data.number_keystring
Kunci perangkat penerima event: number_id untuk WhatsApp, licenses_key untuk WhatsApp Business API. Sama dengan header BLS-OTO-NUMBERID.
data.chat_idstring
Lawan bicara. WhatsApp Business API: nomor, mis. 628123456789. WhatsApp: JID, mis. 628123456789@s.whatsapp.net, …@lid, atau …@g.us untuk grup.
data.message_idstring
ID pesan. WhatsApp Business API memakai format wamid.….
data.namestring
Nama pengirim. Di WhatsApp Business API saat ini berisi nomor pengirim, bukan nama profil.
data.profile_picturestring
URL foto profil. Selalu kosong di WhatsApp Business API.
data.timestampstring | number
Waktu pesan dalam detik Unix. WhatsApp Business API mengirim string, WhatsApp mengirim angka.
data.message_bodystring
Isi teks, atau keterangan media. Bisa tidak ada sama sekali di WhatsApp kalau pesan tidak punya teks.
data.message_ackstring
Status pesan di sisi WhatsApp saat event dikirim, mis. SERVER_ACK.
data.has_mediaboolean
true kalau pesan berisi gambar, video, dokumen, atau audio.
data.media_mimestring
Jenis media, mis. image/jpeg.
data.media_namestring
Nama file (untuk dokumen).
data.media_bodystring
WhatsApp: isi file dalam base64. WhatsApp Business API: ID media Meta, unduh lewat Graph API.
data.location_attachedobject
{lat, lng} untuk pesan lokasi, selain itu berisi null.
data.is_forwadingboolean
Pesan diteruskan dari chat lain. Ejaan kunci memang is_forwading.
data.is_from_meboolean
true kalau pesan dikirim dari nomor Anda sendiri.
data.interactiveobject | nullWhatsApp Business API saja
Balasan tombol atau daftar: {type, id, title}, dengan description untuk daftar.
data.phone_numberstring | nullWhatsApp saja
Nomor lawan bicara tanpa akhiran JID. null kalau WhatsApp hanya memberi ID LID.
data.wa_idstring | nullWhatsApp saja
JID berbasis nomor, mis. 628123456789@s.whatsapp.net.
data.lidstring | nullWhatsApp saja
ID LID lawan bicara bila ada.
data.is_lidbooleanWhatsApp saja
true kalau chat_id berformat LID.
data.is_groupbooleanWhatsApp saja
true untuk pesan grup.
data.sender_idstring | nullWhatsApp saja
Khusus grup: JID anggota yang mengirim.
data.sender_phonestring | nullWhatsApp saja
Khusus grup: nomor anggota yang mengirim.
Batasan saat ini
WhatsApp Business API: stiker, reaksi, kartu kontak, klik tombol template, dan balasan Flow datang dengan message_body kosong.
WhatsApp Business API: pesan yang disunting atau dihapus pengirim tidak diteruskan.
WhatsApp: file base64 di atas 10 MB tidak terkirim ke webhook.
Webhook
Pesan keluar
EVENToutgoing_chat
Dikirim setiap nomor WhatsApp Anda mengirim pesan, baik lewat API, dashboard, maupun langsung dari HP. Isinya sama dengan pesan masuk, dengan is_from_me bernilai true.
Kanal: WhatsApp (non-resmi)
Hanya untuk WhatsApp (non-resmi). Nomor WhatsApp Business API belum mengirim event ini: pesan yang dikirim dari aplikasi WhatsApp di HP pada nomor WhatsApp Business API tidak diteruskan ke webhook. Untuk pesan yang dikirim lewat BalesOtomatis (API, broadcast, CRM) pada nomor WhatsApp Business API, statusnya tersedia lewat event Status pengiriman.
Isi data
data.number_keystring
Kunci perangkat penerima event: number_id untuk WhatsApp, licenses_key untuk WhatsApp Business API. Sama dengan header BLS-OTO-NUMBERID.
data.chat_idstring
Lawan bicara. WhatsApp Business API: nomor, mis. 628123456789. WhatsApp: JID, mis. 628123456789@s.whatsapp.net, …@lid, atau …@g.us untuk grup.
data.message_idstring
ID pesan. WhatsApp Business API memakai format wamid.….
data.namestring
Nama pengirim. Di WhatsApp Business API saat ini berisi nomor pengirim, bukan nama profil.
data.profile_picturestring
URL foto profil. Selalu kosong di WhatsApp Business API.
data.timestampstring | number
Waktu pesan dalam detik Unix. WhatsApp Business API mengirim string, WhatsApp mengirim angka.
data.message_bodystring
Isi teks, atau keterangan media. Bisa tidak ada sama sekali di WhatsApp kalau pesan tidak punya teks.
data.message_ackstring
Status pesan di sisi WhatsApp saat event dikirim, mis. SERVER_ACK.
data.has_mediaboolean
true kalau pesan berisi gambar, video, dokumen, atau audio.
data.media_mimestring
Jenis media, mis. image/jpeg.
data.media_namestring
Nama file (untuk dokumen).
data.media_bodystring
WhatsApp: isi file dalam base64. WhatsApp Business API: ID media Meta, unduh lewat Graph API.
data.location_attachedobject
{lat, lng} untuk pesan lokasi, selain itu berisi null.
data.is_forwadingboolean
Pesan diteruskan dari chat lain. Ejaan kunci memang is_forwading.
data.is_from_meboolean
true kalau pesan dikirim dari nomor Anda sendiri.
data.phone_numberstring | null
Nomor lawan bicara tanpa akhiran JID. null kalau WhatsApp hanya memberi ID LID.
data.wa_idstring | null
JID berbasis nomor, mis. 628123456789@s.whatsapp.net.
data.lidstring | null
ID LID lawan bicara bila ada.
data.is_lidboolean
true kalau chat_id berformat LID.
data.is_groupboolean
true untuk pesan grup.
data.sender_idstring | null
Khusus grup: JID anggota yang mengirim.
data.sender_phonestring | null
Khusus grup: nomor anggota yang mengirim.
Batasan saat ini
WhatsApp (non-resmi) tidak mengirim event status terkirim atau dibaca.
Webhook
Status pengiriman
EVENTmessage_status
Dikirim setiap status pesan keluar berubah: terkirim, sampai di HP penerima, dibaca, atau gagal. Berlaku untuk semua pesan keluar dari nomor itu, termasuk template, broadcast, dan balasan AI.
Kanal: WhatsApp Business API
Mencocokkan dengan pesan yang Anda kirim
Simpan message dari jawaban kirim template (percakapan baru) atau kirim pesan bebas: nilainya adalah wamid. Cocokkan dengan data.message_id di event ini. Endpoint kirim template memproses pesan lewat antrean dan belum mengembalikan wamid, jadi untuk endpoint itu cocokkan dengan recipient_id dan waktu kirim.
Isi data
data.number_keystring
licenses_key perangkat pengirim.
data.message_idstring
ID pesan wamid.…, sama dengan ID yang dikembalikan endpoint kirim.
data.statusstring
sent, delivered, read, atau failed.
data.timestampstring
Waktu perubahan status dalam detik Unix.
data.recipient_idstring
Nomor penerima.
data.conversationobject | null
Objek percakapan dari Meta (id, origin.type).
data.pricingobject | null
Objek biaya dari Meta (billable, pricing_model, category).
data.errorsarray | null
Detail kegagalan dari Meta saat status bernilai failed, mis. kode 131026.
data.is_templateboolean
true kalau percakapan dimulai oleh bisnis (origin.type = business_initiated). Bukan penanda pasti bahwa pesan itu template.
Batasan saat ini
Satu pesan bisa menghasilkan beberapa event (sent, lalu delivered, lalu read). Urutan kedatangan tidak dijamin, jadi jangan menurunkan status yang sudah lebih tinggi.
Kirim Pesan WhatsApp
Kirim pesan teks / gambar
POST/public/v1/send_personal_message
Mengirim pesan ke satu nomor WhatsApp. Bisa teks saja, gambar saja, atau gambar dengan keterangan.
Endpoint ini memakai perangkat WhatsApp (dihubungkan dengan QR): kredensialnya api_key + number_id. number_id berbeda untuk tiap nomor, sedangkan api_key sama untuk seluruh akun. Nomor WhatsApp Business API memakai secret_key + licenses_key dan tidak bisa dipakai di endpoint ini; kirim lewat Kirim template.
Parameter body
api_keystringwajib
API key akun Anda.
number_idstringwajib
ID perangkat WhatsApp pengirim.
phone_nostringwajib
Nomor tujuan.
customer_namestringwajib
Nama penerima, dipakai di isi pesan.
service_namestringwajib
Nama layanan, mis. Login Dashboard.
company_namestringwajib
Nama perusahaan Anda.
lifetimeintegerwajib
Masa berlaku kode dalam detik, mis. 300 untuk 5 menit. Nilai kecil seperti 5 berarti kode kedaluwarsa dalam 5 detik.
country_codestringopsional
Kode negara.
custom_templatestringopsional
Templat pesan Anda sendiri, menggantikan templat bawaan. Wajib memuat {{code}}; placeholder lain yang tersedia: {{customer_name}}, {{service_name}}, {{company_name}}, {{expiry}} (mis. 5 minutes), dan {{lifetime}} (detik). Maksimal 1000 karakter. Kalau templat tidak memuat {{code}} atau terlalu panjang, pesan tetap terkirim dengan templat bawaan dan respons memuat field warning.
OTP
Verifikasi kode OTP
POST/public/v1/validate_otp
Memeriksa apakah kode OTP yang dimasukkan pengguna benar dan masih berlaku.
Urutan variables harus sama persis dengan nomor variabel di template. Kalau template Anda memakai {{1}}, {{2}}, dan {{5}}, isi index 2 dan 3 dengan string kosong supaya posisi tidak bergeser. Jumlah nilai di variables harus sama dengan jumlah variabel di template; kalau kurang atau lebih, permintaan tetap dijawab 200 tetapi ditolak Meta saat pengiriman (kode 132000).
200 dengan message: "queued" berarti pesan masuk antrean, bukan konfirmasi terkirim. Pengiriman ke Meta dilakukan belakangan oleh worker. Pantau hasil akhirnya lewat webhook Status pengiriman. Endpoint ini belum mengembalikan ID pesan (wamid), jadi cocokkan event dengan recipient_id dan waktu kirim.
Parameter body
secret_keystringwajib
Secret key akun Anda.
licenses_keystringwajib
Kunci perangkat pengirim. Untuk platformwhatsapp_bisnis_api isi kunci nomor dari tab WhatsApp Business API di Platform Manager; untuk whatsapp_cloud_api isi kunci koneksi dari tab WhatsApp Business (Cloud API). Template harus dibuat di nomor yang sama dengan pengirim ini.
recipientsstringwajib*
Nomor tujuan. Wajib kecuali Anda memakai bsuid.
bsuidstringopsional
Alternatif recipients, memakai ID kontak internal.
templatestringwajib
Template ID yang sudah berstatus APPROVED.
variablesarrayopsional
Nilai variabel body, berupa array string berurutan: index 0 untuk {{1}}, index 1 untuk {{2}}, dan seterusnya.
platformstringopsional
whatsapp_bisnis_api (bawaan; nomor yang disambung lewat "Mulai Daftar WhatsApp") atau whatsapp_cloud_api (koneksi Cloud API manual). Harus sesuai jenis koneksi dari licenses_key.
file_urlstringopsional
URL file untuk template ber-header DOCUMENT atau VIDEO. Harus bisa diakses publik.
fileNamestringopsional
Nama file yang tampil di chat penerima, mis. invoice.pdf.
messageTypestringopsional
MIME file, mis. application/pdf. Kalau dikosongkan, ditebak dari ekstensi file_url.
image_urlstringopsional
URL gambar untuk template ber-header IMAGE. Wajib dikirim bila template ber-header gambar dan kolom Media di Template Detail kosong. Tautan harus publik (bisa dibuka tanpa login).
quoted_msg_idstringopsional
ID pesan yang dibalas.
send_as_captionbooleanopsional
Kirim teks sebagai keterangan lampiran.
* wajib salah satu, lihat keterangan parameter.
WhatsApp Business API
Kirim template (percakapan baru)
POST/public/v1/send_new_chat_template
Sama seperti kirim template, tetapi ditujukan untuk memulai percakapan baru dengan penerima yang belum pernah berinteraksi. Mendukung lampiran dan lokasi.
Mengirim pesan bebas lewat WhatsApp Business API. Hanya bisa dipakai kalau penerima menghubungi Anda lebih dulu dan masih dalam jendela 24 jam. Di luar itu, gunakan template.