Dokumentasi API
Base URL https://waba.pasardonomulyo.com/api/v1 · semua request dan respons berformat JSON.
Autentikasi
Buat API key di halaman nomor WhatsApp. Satu API key terikat ke satu nomor. Kirim di header:
Authorization: Bearer wag_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Kirim pesan POST /messages
| Field | Keterangan |
|---|---|
| to wajib | Nomor tujuan, mis. 08123456789 atau 628123456789 |
| message wajib* | Isi pesan (maks 4096). Mendukung spintax {Halo|Hai} |
| type | text (default), image, document, video |
| media_url | URL HTTPS publik file media (wajib bila type bukan text) |
| filename, mimetype | Untuk dokumen |
| priority | normal (default: ikut jeda & jam kirim) atau high (OTP: jeda 2–6 detik, 24 jam) |
| idempotency_key | Request ulang dengan key sama tidak membuat pesan ganda |
curl -X POST https://waba.pasardonomulyo.com/api/v1/messages \
-H "Authorization: Bearer wag_xxx" -H "Content-Type: application/json" \
-d '{"to":"08123456789","message":"Kode OTP Anda 123456","priority":"high"}'
# 202 Accepted
{"success":true,"data":{"id":"01jc...","to":"628123456789","status":"queued","priority":"high"}}
Broadcast POST /messages/bulk
Masuk antrian normal dengan jeda acak per nomor. Variabel {{nama}} diisi per penerima, nomor ganda dikirim sekali.
{
"message": "{Halo|Hai} {{nama}}, pesanan Anda sudah dikirim.",
"recipients": [
{"to": "08123456789", "variables": {"nama": "Budi"}},
{"to": "08567890123", "variables": {"nama": "Sari"}}
]
}
Nomor resmi (Meta Cloud API) template
Endpoint dan API key sama dengan nomor scan QR. Bedanya, aturan Meta berlaku:
- Pesan bebas (message, media) hanya bisa dikirim ke nomor yang mengirim pesan ke Anda dalam 24 jam terakhir. Di luar itu API membalas OUTSIDE_SERVICE_WINDOW.
- Untuk memulai percakapan, kirim template yang sudah disetujui Meta. Daftar template: GET /templates.
- Tidak ada jeda acak. Pesan langsung dikirim ke Meta; batas harian mengikuti tier nomor dari Meta.
POST /messages
{
"to": "08123456789",
"template": {
"name": "info_pengiriman",
"language": "id",
"variables": ["Budi", "INV-1042"]
}
}
Broadcast template: variables per penerima berupa list mengisi {{1}}, {{2}}, dst. Atau tulis placeholder di template.variables lalu isi dari objek variabel penerima.
POST /messages/bulk
{
"template": { "name": "info_pengiriman", "language": "id", "variables": ["{{nama}}", "{{invoice}}"] },
"recipients": [
{"to": "08123456789", "variables": {"nama": "Budi", "invoice": "INV-1042"}},
{"to": "08567890123", "variables": ["Sari", "INV-1043"]}
]
}
Webhook message.status dari nomor resmi menyertakan pricing.category (marketing, utility, authentication, service) dan pricing.billable. Event template.status dikirim saat template disetujui atau ditolak.
Endpoint lain
Status pesan: queued, sent, delivered, read, failed
Status nomor, isi antrian, terkirim hari ini, limit harian
Cek nomor terdaftar WhatsApp (maks 50). Body: {"numbers":["0812..."]}
Kuota periode ini: limit, terpakai, sisa
Khusus nomor resmi: daftar template, status, jumlah variabel
Contoh kode
$res = Http::withToken(env('WA_API_KEY'))
->post('https://waba.pasardonomulyo.com/api/v1/messages', [
'to' => '08123456789',
'message' => 'Pesanan #1234 sudah kami terima.',
'idempotency_key' => 'order-1234-received',
]);
$messageId = $res->json('data.id');
const res = await fetch('https://waba.pasardonomulyo.com/api/v1/messages', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.WA_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ to: '08123456789', message: 'Halo dari Node.js' }),
});
console.log(await res.json());
$ch = curl_init('https://waba.pasardonomulyo.com/api/v1/messages');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('WA_API_KEY'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['to' => '08123456789', 'message' => 'Halo dari PHP']),
]);
$res = json_decode(curl_exec($ch), true);
Kode error
| HTTP | Kode | Arti |
|---|---|---|
| 401 | UNAUTHENTICATED | API key salah atau dicabut |
| 402 | SUBSCRIPTION_EXPIRED | Langganan tidak aktif |
| 403 | IP_NOT_ALLOWED · INSUFFICIENT_SCOPE | IP tidak di whitelist / key tidak punya izin |
| 409 | DEVICE_NOT_READY | Nomor belum terhubung (scan QR dulu) / akses Meta dicabut |
| 422 | OUTSIDE_SERVICE_WINDOW | Nomor resmi: penerima di luar jendela 24 jam, pakai template |
| 422 | TEMPLATE_NOT_FOUND · TEMPLATE_NOT_APPROVED · TEMPLATE_PARAM_MISMATCH | Template tidak ada, belum disetujui, atau jumlah variabel salah |
| 422 | INVALID_NUMBER · BULK_LIMIT_EXCEEDED | Input tidak valid / melebihi batas paket |
| 429 | QUOTA_EXCEEDED · RATE_LIMITED | Kuota habis / terlalu banyak request |
| 503 | ENGINE_UNAVAILABLE | Layanan pengiriman gangguan, kuota dikembalikan |
Pesan gagal (mis. not_on_whatsapp) tidak dihitung kuota. Pesan normal yang melewati limit harian otomatis dijadwalkan ke hari berikutnya.
Webhook
Atur URL di dashboard. Setiap request ditandatangani HMAC-SHA256 (header X-Webhook-Signature) dan dicoba ulang bertahap bila gagal.