Dokumentasi API

Referensi lengkap WA Gateway API v2.1 — untuk developer yang mengintegrasikan notifikasi, OTP, reminder, dan broadcast WhatsApp ke aplikasinya.

1. Pengantar

Base URLhttps://wa.pgtm.biz.id
FormatJSON (Content-Type: application/json) untuk request & response.
Envelope responsSemua respons berisi status (boolean) dan request_id. Sukses menambah field sesuai endpoint; gagal berisi code + reason yang stabil untuk ditangani program.
Request IDDikirim juga sebagai header X-Request-Id. Sebutkan ID ini bila melaporkan masalah.
CORSDiaktifkan untuk semua endpoint API (Access-Control-Allow-Origin: *). Token tetap rahasia — jangan ekspos di kode frontend publik.
// Contoh respons sukses
{ "status": true, "detail": "queued", "id": ["msg-9f2ac41bd207"], "accepted": 1, "rejected": 0, "request_id": "req-1a2b3c" }

// Contoh respons gagal
{ "status": false, "code": "TOKEN_INVALID", "reason": "token invalid", "request_id": "req-1a2b3c" }

2. Autentikasi

Dua jenis token, jangan tertukar:

TokenUntukLokasi
Token device/send, /validate, /device, /fetch-groups, /message/:idKartu device di dashboard
Token akun/get-devicesKartu "Token akun" di dashboard
curl https://wa.pgtm.biz.id/device -H "Authorization: Bearer TOKEN_DEVICE"

Prefiks Bearer opsional. Token juga dapat dikirim sebagai field token di body JSON (tidak disarankan — header lebih aman). Perlakukan token seperti password: bocor = regenerasi dari dashboard.

3. Endpoint

POST/send — kirim pesan

Mengirim teks, media, atau lokasi ke satu/banyak nomor dan grup. Pesan masuk antrean dan dikirim berurutan dengan jeda anti-spam (lihat Batas & perilaku).

ParameterTipeWajibKeterangan
targetstringYaSatu atau banyak penerima dipisah koma. Nomor: format lokal 08xx atau internasional 62xx. Grup: ID berakhiran @g.us (ambil dari /fetch-groups). Nomor tak valid dihitung di field rejected.
messagestringKondisionalIsi teks / caption media. Wajib kecuali mengirim lokasi murni. Kata "OTP" di pesan = jalur prioritas.
urlstring (URL)TidakURL publik gambar (jpg/png/webp), video (mp4), atau dokumen. Butuh paket berkmedia.
scheduleintegerTidakUnix timestamp (detik) — pesan dikirim pada waktu itu.
delayintegerTidakTunda N detik dari sekarang (alternatif schedule).
latitude + longitudenumberTidakKirim titik lokasi (keduanya harus diisi).
curl -X POST https://wa.pgtm.biz.id/send \
  -H "Authorization: Bearer TOKEN_DEVICE" -H "Content-Type: application/json" \
  -d '{"target":"081234567890","message":"Halo, tagihan Anda sudah terbit."}'
{ "status": true, "detail": "queued", "id": ["msg-9f2ac41bd207"], "accepted": 1, "rejected": 0, "request_id": "req-1a2b3c" }

Simpan id untuk melacak status lewat GET /message/:id. detail = scheduled bila memakai schedule/delay.

GET/message/:id — status pesan

StateArti
queuedDi antrean, menunggu giliran kirim.
scheduledMenunggu jadwal (schedule/delay).
sentTerkirim; wa_id berisi ID pesan WhatsApp.
failedGagal setelah percobaan ulang maksimal.
not_foundID tidak dikenal (atau bukan milik device token ini).
curl https://wa.pgtm.biz.id/message/msg-9f2ac41bd207 -H "Authorization: Bearer TOKEN_DEVICE"
// → { "status": true, "data": { "id": "msg-9f2ac41bd207", "state": "sent", "to": "6281234567890", "wa_id": "3EB0A1B2C3" }, "request_id": "req-…" }

POST/validate — cek nomor WhatsApp

curl -X POST https://wa.pgtm.biz.id/validate -H "Authorization: Bearer TOKEN_DEVICE" -H "Content-Type: application/json" -d '{"target":"081234567890,081298765432"}'
// → { "status": true, "detail": "ok", "result": [ { "target": "081234567890", "registered": true } ], "request_id": "req-…" }

Device harus terhubung; bila tidak, respons DEVICE_OFFLINE.

GET/device — profil device

Status koneksi, nomor terhubung, paket, sisa kuota, dan masa aktif pemilik token device.

POST/fetch-groups — daftar grup

Mengembalikan groups: [{id: "…@g.us", name}] dari grup yang diikuti device. Juga tersedia via GET.

GET/get-devices — semua device akun

Memakai token akun. Mengembalikan profil akun (paket & kuota) + daftar device beserta status koneksinya.

GET/health — status layanan

Tanpa autentikasi: jumlah device, device online, dan panjang antrean.

4. Contoh kode — POST /send

PHP (cURL)
$curl = curl_init();
curl_setopt_array($curl, [
  CURLOPT_URL => 'https://wa.pgtm.biz.id/send',
  CURLOPT_POST => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer TOKEN_DEVICE', 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(['target' => '081234567890', 'message' => 'Halo dari PHP']),
]);
echo curl_exec($curl);
Node.js (fetch)
const res = await fetch('https://wa.pgtm.biz.id/send', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer TOKEN_DEVICE', 'Content-Type': 'application/json' },
  body: JSON.stringify({ target: '081234567890', message: 'Halo dari Node.js' }),
});
console.log(await res.json());
Python (requests)
import requests
r = requests.post('https://wa.pgtm.biz.id/send',
  headers={'Authorization': 'Bearer TOKEN_DEVICE'},
  json={'target': '081234567890', 'message': 'Halo dari Python'})
print(r.json())

5. Webhook pesan masuk

Isi Webhook URL di dashboard. Setiap pesan masuk diteruskan (POST JSON) ke URL tersebut:

FieldKeterangan
eventSelalu "incoming".
deviceID device penerima.
fromJID pengirim (…@s.whatsapp.net atau …@g.us untuk grup).
idID pesan WhatsApp.
messageIsi teks pesan (kosong untuk media tanpa caption).
{ "event": "incoming", "device": "dev-7c1e2a", "from": "[email protected]", "id": "3EB0…", "message": "halo" }

Perilaku: timeout 8 detik, tanpa retry — pastikan endpoint Anda cepat & selalu balas HTTP 2xx. Selama webhook terisi, autoreply nonaktif. Keamanan: gunakan path URL yang sulit ditebak (mis. /webhook/<kata-rahasia>) karena payload tidak ditandatangani.

6. Autoreply

Diatur dari dashboard (bukan API): balasan default untuk semua pesan, dan balasan kata kunci (pesan mengandung kata kunci, tidak peka huruf besar/kecil). Variabel {nama} (nama profil pengirim) dan {nomor} didukung. Batas anti-flood: maks 1 balasan per pengirim per menit. Webhook yang terisi mengambil alih — autoreply berhenti bekerja.

7. Kode error

HTTPCodeArtiTindakan
401TOKEN_INVALIDToken device tidak dikenal.Periksa token di dashboard; regenerasi bila bocor.
401ACCOUNT_TOKEN_INVALIDToken akun tidak dikenal (khusus /get-devices).Gunakan token akun dari dashboard, bukan token device.
400VALIDATION_ERRORParameter wajib kosong / target tidak valid.Isi target & pesan; format nomor 08xx / 62xx / @g.us.
403PLAN_INACTIVEAkun nonaktif atau paket kedaluwarsa.Perpanjang paket.
403MEDIA_NOT_ALLOWEDPaket tidak termasuk kirim media.Naik paket berkmedia atau kirim teks saja.
403QUOTA_EXCEEDEDKuota bulanan habis (termasuk antrean berjalan).Tunggu reset bulanan atau naik paket.
429RATE_LIMITEDLebih dari 60 permintaan/menit per token.Kurangi frekuensi; antrekan di sisi klien.
405METHOD_NOT_ALLOWEDMetode HTTP salah untuk endpoint ini.Ikuti metode pada referensi endpoint.
200*DEVICE_OFFLINEDevice belum terhubung ke WhatsApp.Hubungkan device (scan QR / pairing) lalu ulangi.
200*UPSTREAM_ERRORGagal membaca data dari sesi WhatsApp.Ulangi beberapa saat lagi; cek status device.
404NOT_FOUNDPath tidak ada.Periksa URL & base URL.
500SERVER_ERRORKesalahan internal.Ulangi; sertakan request_id bila melapor.

* DEVICE_OFFLINE & UPSTREAM_ERROR dikembalikan dengan HTTP 200 dan status:false karena keduanya adalah status domain (device), bukan kesalahan permintaan.

8. Batas & perilaku pengiriman

Jeda anti-spamAntrean global dikirim satu per satu dengan jeda 3–8 detik acak antar pesan (pesan mengandung "OTP": ±2,5 detik, diprioritaskan). Ini menekan risiko pembatasan nomor oleh WhatsApp.
Percobaan ulangKegagalan kirim diulang hingga 5 kali sebelum berstatus failed.
Rate limit API60 permintaan/menit per token untuk /send, /validate, /fetch-groups.
KuotaDihitung per pesan terkirim sesuai paket; reset otomatis tiap awal bulan. Cek sisa lewat GET /device.
Format nomor08xx otomatis dinormalisasi ke 62xx. Nomor di luar pola valid ditolak (rejected).
Risiko nomorGateway tidak resmi: broadcast agresif ke nomor asing berisiko dibatasi WhatsApp. Gunakan nomor khusus.

9. OpenAPI & riwayat versi

Spesifikasi mesin-terbaca (OpenAPI 3.0): GET /openapi.json — impor ke Postman/Insomnia/Swagger untuk eksplorasi & generate client.

VersiPerubahan
2.1Kode error stabil + request_id, rate limit, CORS, GET /message/:id, OpenAPI, dokumentasi lengkap.
2.0Broadcast, template, kontak, autoreply, schedule/delay, kirim lokasi, /fetch-groups, /get-devices + token akun, desain web baru.
1.0Rilis awal: /send, /validate, /device, multi-device, kuota paket, webhook.