Dokumentasi API
Integrasi kirim pesan WhatsApp via REST API
Pendahuluan
REST API ini mengirim pesan WhatsApp dari sistem Anda — notifikasi transaksi, OTP, pengingat, broadcast kampanye — dan menerima balasan lewat webhook. Cocok untuk toko online, CRM, aplikasi kasir, atau layanan apa pun yang bisa memanggil HTTP.
Base URL
http://your-domain.com/api/v1Content-Type
application/jsonEndpoint
| Method | Path | Kegunaan |
|---|---|---|
| POST GET | /api/v1/send | Kirim pesan teks atau media |
| POST | /api/v1/inbox | Terima pesan masuk (dipakai gateway / webhook Anda) |
Format respons
Sukses selalu berisi success: true; gagal berisi success: false danerror berisi pesan yang bisa langsung ditampilkan.
{ "success": true, "message_id": "BAE5F6A1C3..." }
{ "success": false, "error": "Device does not belong to this API key" }1. Autentikasi & Perangkat
WakoDinov menggunakan two-layer authentication: API Key untuk autentikasi akun, Device Key untuk memilih perangkat pengirim.
Dua Layer, Lebih Aman
api_key membuktikan identitas akun Anda. device_key menentukan perangkat mana yang mengirim. Device hanya bisa digunakan jika dimiliki oleh akun Anda. Kirim api_key lewat body/query atau header Authorization: Bearer <api_key>.
Ingin API key sendiri? Daftar gratis atau masuk — kunci dan daftar perangkat Anda muncul di sini. Contoh di bawah memakai placeholder USER_API_KEY.
Belum ada perangkat aktif. Tambahkan di halaman Perangkat.
2. Kirim Pesan (Send Message)
/api/v1/sendPOST menerima JSON, form-urlencoded, atau multipart — dan tetap jalur utama. GET menerima parameter di query string, cocok untuk tombol/webhook sederhana. Keduanya perilakunya sama.
Query Parameters (GET)
?api_key=USER_API_KEY&device_key=DEVICE_KEY&to=628123456789&message=Halo%20dari%20API
Parameter
api_keyAPI Key akun Anda — body/query, atau header Authorization: Bearer (wajib)device_keyDevice Key perangkat pengirim — harus milik akun Anda (wajib)toNomor tujuan 628xxx, atau JID grup xxx@g.us. Alias: group / phone (wajib)messageIsi pesan teks (wajib bila tanpa media)media_urlURL publik media — menggantikan/mendampingi message sebagai captionmedia_typeMIME media, mis. image/jpeg, application/pdfsimulate_typingOpsional. true = tampilkan indikator “sedang menulis” sebelum kirim. Default false (langsung). Pakai untuk chatbot/auto-reply, jangan untuk bulk.is_priorityOpsional. Default true = kirim langsung. false = masuk antrean anti-ban (jeda 20-30 dtk per device); respons berisi status: "pending", status akhir menyusul via webhook.Response (Sukses — prioritas)
{
"success": true,
"message_id": "BAE5F6A1C3..."
}Response (Sukses — antrean, is_priority=false)
{
"success": true,
"queued": true,
"status": "pending",
"message_id": "9f1c...-job"
}Response (Error)
{
"success": false,
"error": "Device does not belong to this API key"
}Kirim ke Grup WhatsApp
Endpoint-nya sama. Isi to dengan JID grup <numeric-id>@g.us (mis. 120363021481520594@g.us) alih-alih nomor 628xxx. Cara ambilnya: buka grup di WhatsApp Web, angka panjang di URL sebelum @g.us itulah ID grupnya. JID grup tidak boleh dinormalisasi ke digits. Jika JID salah atau tidak ditemukan, respons: {"success":false,"error":"item-not-found"}. Pastikan akun WA perangkat Anda adalah anggota grup tersebut.
cURL
curl -X POST "http://your-domain.com/api/v1/send" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer USER_API_KEY" \
-d '{
"device_key": "DEVICE_KEY",
"to": "628123456789",
"message": "Halo dari API"
}'JavaScript (Fetch)
const res = await fetch('http://your-domain.com/api/v1/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer USER_API_KEY'
},
body: JSON.stringify({
device_key: 'DEVICE_KEY',
to: '628123456789',
message: 'Halo dari API'
})
});
const data = await res.json();
console.log(data);PHP (cURL)
<?php
$url = 'http://your-domain.com/api/v1/send';
$body = json_encode([
'device_key' => 'DEVICE_KEY',
'to' => '628123456789',
'message' => 'Halo dari API'
]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer USER_API_KEY'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
$response = curl_exec($ch);
curl_close($ch);
echo $response;3. Kirim Media
Endpoint sama (/api/v1/send). Tambahkan media_url, dan message menjadi caption-nya. Ukuran maksimum 16 MB.
Tipe yang didukung
| Tipe | media_type |
|---|---|
| Gambar | image/jpeg · image/png · image/webp · image/gif |
| Video | video/mp4 · video/3gpp |
| Audio | audio/mpeg · audio/mp4 · audio/ogg · audio/aac |
| Dokumen | application/pdf |
Contoh — kirim gambar
cURL
curl -X POST "http://your-domain.com/api/v1/send" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer USER_API_KEY" \
-d '{
"device_key": "DEVICE_KEY",
"to": "628123456789",
"media_url": "https://contoh.com/produk.jpg",
"media_type": "image/jpeg",
"message": "Ini produk yang Anda tanyakan"
}'Unggah file Anda lebih dulu lalu kirim URL publiknya — gateway mengambil media dari URL itu. URL harus dapat diakses publik (bukan localhost). Endpoint unggah panel:POST /api/upload (multipart, field file) — balasannya berisi url yang siap dipakai sebagai media_url.
4. Kuota & Rate Limit
Pembatasan diterapkan per akun, bukan per perangkat. Seluruh perangkat berbagi kuota bulanan yang sama.
| Batas | Nilai |
|---|---|
| Rate limit permintaan | 60 permintaan / menit per akun (balas 429) |
| Kuota pesan | Sesuai paket Anda, direset tiap bulan |
| Jeda anti-ban | 20-30 dtk per device saat kirim lewat antrean (is_priority=false) |
Batas Bulanan per Akun
Maksimum sesuai paket Anda. Kirim ke banyak nomor? Gunakan banyak perangkat untuk throughput lebih tinggi — tetap dalam kuota yang sama.
5. Webhook (Event Masuk)
Gateway mengirim event ke URL webhook Anda via POST berisiContent-Type: application/json. Atur URL dan event yang diinginkan per perangkat di halaman Webhook.
Event yang tersedia
| Event | Kapan |
|---|---|
| message_received | Ada pesan masuk ke perangkat (pribadi atau grup) |
| device_connected | Perangkat berhasil tersambung ke WhatsApp |
| device_disconnected | Perangkat terputus (logout, banned, atau koneksi hilang) |
Payload — message_received (pesan pribadi)
{
"event": "message_received",
"device_key": "dev_xxx",
"from_number": "628123456789",
"from_name": "Nama Pengirim",
"sender_number": "",
"sender_name": "",
"message": "Halo, pesanan saya sudah dikirim?",
"message_type": "text"
}Payload — message_received (dari grup)
Untuk grup, from_number berisi JID grup (…@g.us), sedangkan pengirim sebenarnya ada di sender_number/sender_name.
{
"event": "message_received",
"device_key": "dev_xxx",
"from_number": "120363021481520594@g.us",
"from_name": "",
"sender_number": "628987654321@s.whatsapp.net",
"sender_name": "Budi",
"message": "Setuju, lanjut ya",
"message_type": "text"
}Balas HTTP 200 dalam 10 detik; pengiriman bersifat fire-and-forget — tidak ada percobaan ulang otomatis.message_type bernilaitext | image | video | audio | document | sticker | other.
Payload — device_connected / device_disconnected
Semua event device menyertakan timestamp ISO-8601.reason bernilai logged_out (sesi dihapus),status_<code> (putus sementara, mis. status_401), ataudisconnected. Perangkat akan menyambung ulang otomatis kecuali logged_out.
{
"event": "device_connected",
"device_key": "dev_xxx",
"timestamp": "2024-01-01T00:00:00.000Z",
"jid": "628123456789:12@s.whatsapp.net"
}6. Kode Status HTTP
| Kode | Arti |
|---|---|
| 200 | Request berhasil |
| 400 | Parameter tidak lengkap (api_key, device_key, to, atau message kosong) |
| 401 | API Key tidak valid |
| 403 | Device bukan milik akun, perangkat tidak aktif, atau limit bulanan tercapai |
| 404 | Device tidak ditemukan |
| 429 | Rate limit tercapai (60 permintaan/menit). Respons menyertakan sisa detik |