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/v1

Content-Type

application/json

Endpoint

MethodPathKegunaan
POST GET/api/v1/sendKirim pesan teks atau media
POST/api/v1/inboxTerima 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)

POSTGET/api/v1/send

POST 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 caption
media_typeMIME media, mis. image/jpeg, application/pdf
simulate_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

Tipemedia_type
Gambarimage/jpeg · image/png · image/webp · image/gif
Videovideo/mp4 · video/3gpp
Audioaudio/mpeg · audio/mp4 · audio/ogg · audio/aac
Dokumenapplication/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.

BatasNilai
Rate limit permintaan60 permintaan / menit per akun (balas 429)
Kuota pesanSesuai paket Anda, direset tiap bulan
Jeda anti-ban20-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

EventKapan
message_receivedAda pesan masuk ke perangkat (pribadi atau grup)
device_connectedPerangkat berhasil tersambung ke WhatsApp
device_disconnectedPerangkat 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

KodeArti
200Request berhasil
400Parameter tidak lengkap (api_key, device_key, to, atau message kosong)
401API Key tidak valid
403Device bukan milik akun, perangkat tidak aktif, atau limit bulanan tercapai
404Device tidak ditemukan
429Rate limit tercapai (60 permintaan/menit). Respons menyertakan sisa detik
Dokumentasi API WhatsApp | Blast In