Lewati ke konten
WA Gateway
Developer

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
Simpan key di server, jangan pernah di aplikasi frontend atau HP. Aktifkan IP whitelist bila memungkinkan.

Kirim pesan POST /messages

FieldKeterangan
to wajibNomor 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

GET/messages/{id}

Status pesan: queued, sent, delivered, read, failed

GET/device

Status nomor, isi antrian, terkirim hari ini, limit harian

POST/numbers/check

Cek nomor terdaftar WhatsApp (maks 50). Body: {"numbers":["0812..."]}

GET/usage

Kuota periode ini: limit, terpakai, sisa

GET/templates

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

HTTPKodeArti
401UNAUTHENTICATEDAPI key salah atau dicabut
402SUBSCRIPTION_EXPIREDLangganan tidak aktif
403IP_NOT_ALLOWED · INSUFFICIENT_SCOPEIP tidak di whitelist / key tidak punya izin
409DEVICE_NOT_READYNomor belum terhubung (scan QR dulu) / akses Meta dicabut
422OUTSIDE_SERVICE_WINDOWNomor resmi: penerima di luar jendela 24 jam, pakai template
422TEMPLATE_NOT_FOUND · TEMPLATE_NOT_APPROVED · TEMPLATE_PARAM_MISMATCHTemplate tidak ada, belum disetujui, atau jumlah variabel salah
422INVALID_NUMBER · BULK_LIMIT_EXCEEDEDInput tidak valid / melebihi batas paket
429QUOTA_EXCEEDED · RATE_LIMITEDKuota habis / terlalu banyak request
503ENGINE_UNAVAILABLELayanan 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.

message.sentmessage.statusmessage.failedmessage.incomingdevice.statustemplate.statusticket.replied