Dokumentasi API
ZS WhatsApp Gateway menyediakan REST API untuk mengirim pesan WhatsApp lewat nomor Anda sendiri. Hubungkan instance, buat API key, lalu kirim pesan melalui endpoint sederhana.
Base URL
https://api.zs-whatsapp-gateway.fajarhidayat.devPrefix
/api/v1Autentikasi
API memakai dua jenis kredensial tergantung endpoint:
JWT (pengguna dashboard)
Header
Authorization: Bearer <token>. Token didapat dari endpoint login. Endpoint admin butuh JWT denganrole = admin.API key (akses gateway)
Header
x-api-key: <key>(atauAuthorization: Bearer <key>).
curl -X POST https://api.zs-whatsapp-gateway.fajarhidayat.dev/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@zsgateway.local","password":"admin123"}'Format Respons
Semua respons memakai amplop yang konsisten.
{
"success": true,
"message": "OK",
"data": { }
}{
"success": true,
"message": "OK",
"data": [],
"pagination": { "page": 1, "limit": 20, "total": 0, "totalPages": 1 }
}{
"success": false,
"message": "Validation failed",
"errors": []
}Rate Limit
Endpoint pengiriman pesan (/gateway/send dan /gateway/send-media) dibatasi per API key/IP. Jika
melebihi batas, server membalas 429 dengan { "success": false, "message": "Rate limit exceeded" }.
Auth
Registrasi, login, verifikasi, dan profil pengguna dashboard.
/api/v1/auth/register PublikBuat akun (belum terverifikasi), kirim tautan verifikasi email. Body: name, email, phone, password, passwordConfirmation.
/api/v1/auth/login PublikLogin (akun harus terverifikasi), balas user + JWT. Body: email, password.
/api/v1/auth/verify-email PublikVerifikasi akun via token tautan. Body: token.
/api/v1/auth/resend-verification PublikKirim ulang tautan verifikasi (enumeration-safe). Body: email.
/api/v1/auth/reset-methods PublikDaftar kanal reset yang tersedia. Body: email -> { methods, whatsappAvailable, maskedEmail, maskedPhone }.
/api/v1/auth/forgot-password PublikKirim tautan reset via email atau whatsapp. Body: email, channel.
/api/v1/auth/reset-password PublikSet password baru via token. Body: token, password, passwordConfirmation.
/api/v1/auth/me JWTProfil pengguna saat ini.
/api/v1/auth/me JWTPerbarui profil. Body: name?, phone?.
/api/v1/auth/change-password JWTGanti password. Body: currentPassword, newPassword.
Alur lupa password (berbasis tautan)
reset-methodsmengembalikan kanal yang valid. WhatsApp tersedia hanya jika nomor terdaftar sebagai WA valid.forgot-passwordmengirim tautan via kanal terpilih; jatuh ke email bila WA tidak tersedia. Respons selalu sukses (enumeration-safe).reset-passwordmenyetel password baru. Tautan menuju{APP_URL}/reset-password?token=...
Instances
Kelola koneksi WhatsApp (semua butuh JWT).
/api/v1/instances JWTBuat instance. Body: name.
/api/v1/instances JWTDaftar (paginated). Query: page, limit, status, search.
/api/v1/instances/:id JWTDetail + status live + QR.
/api/v1/instances/:id JWTGanti nama. Body: name.
/api/v1/instances/:id JWTHapus + wipe session.
/api/v1/instances/:id/connect JWTMulai sesi Baileys. Body: method (qr|code), phoneNumber (wajib bila code).
/api/v1/instances/:id/reconnect JWTRestart sesi. Body: method (qr|code), phoneNumber (wajib bila code).
/api/v1/instances/:id/qr JWTAmbil QR (data URL) + status.
/api/v1/instances/:id/pairing-code JWTAmbil pairing code 8 digit (poll sampai muncul). Body: phoneNumber?.
/api/v1/instances/:id/logout JWTLogout + hapus kredensial.
Metode koneksi: qr (poll GET /qr) atau code (poll POST /pairing-code).
Status instance: disconnected | connecting | qr_required | pairing_required | connected.
curl -X POST https://api.zs-whatsapp-gateway.fajarhidayat.dev/api/v1/instances \
-H "Authorization: Bearer <JWT>" \
-H "Content-Type: application/json" \
-d '{"name":"My Instance"}'API Keys
Kelola kunci akses gateway (butuh JWT). Kunci mentah hanya ditampilkan sekali.
/api/v1/api-keys JWTBuat key (raw ditampilkan sekali). Body: name, instanceId?.
/api/v1/api-keys JWTDaftar key. Query: page, limit, instanceId.
/api/v1/api-keys/:id/regenerate JWTKunci baru, record sama.
/api/v1/api-keys/:id/revoke JWTCabut key.
/api/v1/api-keys/:id JWTHapus key.
Gateway
Endpoint pengiriman pesan, diautentikasi dengan API key.
/api/v1/gateway/status API keyStatus koneksi. Query: instanceId?.
/api/v1/gateway/send API keyKirim teks (rate-limited). Body: to, message, instanceId?.
/api/v1/gateway/send-media API keyKirim media (multipart). Field: to, mediaType, caption?, instanceId?, file.
mediaType = image | video | audio | document. Jika API key terikat ke
sebuah instance, instanceId opsional dan binding diberlakukan.
curl -X POST https://api.zs-whatsapp-gateway.fajarhidayat.dev/api/v1/gateway/send \
-H "x-api-key: zs_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{"to":"6281234567890","message":"Hello"}'curl -X POST https://api.zs-whatsapp-gateway.fajarhidayat.dev/api/v1/gateway/send-media \
-H "x-api-key: zs_live_xxxxx" \
-F "to=6281234567890" \
-F "mediaType=image" \
-F "caption=Hi" \
-F "file=@./photo.jpg"Logs
Riwayat pesan & event (butuh JWT).
/api/v1/logs JWTDaftar log. Query: page, limit, instanceId, status, direction, search, from, to.
/api/v1/logs/export JWTEkspor log (download). Query: filter + format=csv|json.
/api/v1/logs/:id JWTDetail satu log.
status = pending | sent | delivered | failed. direction = inbound | outbound.
curl "https://api.zs-whatsapp-gateway.fajarhidayat.dev/api/v1/logs/export?format=csv" \
-H "Authorization: Bearer <JWT>" -o logs.csvDashboard
Metrik operasional (butuh JWT).
/api/v1/dashboard/stats JWTMetrik operasional.
/api/v1/dashboard/recent-activity JWT10 event log terbaru.
Plans
Paket langganan. Daftar paket aktif bersifat publik (halaman pricing).
/api/v1/plans PublikDaftar paket aktif (untuk halaman pricing FE).
/api/v1/plans/all AdminSemua paket termasuk nonaktif.
/api/v1/plans AdminBuat paket. Body: code, name, price, interval, maxInstances, maxApiKeys, maxMonthlyCredits, features[].
/api/v1/plans/:id AdminUpdate paket.
/api/v1/plans/:id AdminHapus (atau nonaktifkan bila masih ada langganan).
features berupa array terstruktur [{ icon, label, included }] (bukan HTML). Kuota
(maxInstances/maxApiKeys/maxMonthlyCredits) di-enforce server; -1 = unlimited.
Subscriptions
Langganan pengguna (butuh JWT).
/api/v1/subscriptions/active JWTLangganan aktif (fallback ke free bila belum punya).
/api/v1/subscriptions/history JWTRiwayat langganan.
/api/v1/subscriptions/subscribe JWTMulai langganan. Body: planCode. Gratis -> aktif; berbayar -> balas payment (QRIS).
/api/v1/subscriptions/:id/cancel JWTBatalkan langganan.
Alur berbayar: subscribe -> type=payment_required + objek payment (QRIS)
-> user bayar -> webhook Qrispy -> langganan otomatis aktif.
Payments (QRIS)
Pembayaran QRIS via Qrispy (butuh JWT, kecuali webhook).
/api/v1/payments/generate JWTBuat QRIS baru. Body: amount, paymentReference?, returnUrl?.
/api/v1/payments JWTList pembayaran lokal milik user. Query: page, limit, status.
/api/v1/payments/:qrisId/status JWTCek status (sinkron dari Qrispy).
/api/v1/payments/:qrisId/cancel JWTBatalkan QRIS pending.
/api/v1/payments/transactions JWTProxy list transaksi dari Qrispy.
/api/v1/payments/balance AdminSaldo merchant Qrispy.
/api/v1/payments/webhook PublikWebhook payment.received (diverifikasi X-Qrispy-Signature).
amount integer IDR (min 100). Status:
pending | paid | expired | cancelled | failed. Response generate berisi qrImageBase64 (data URL siap tampil) + expiresInSeconds.
Admin
Butuh JWT dengan role = admin.
/api/v1/admin/stats AdminStatistik seluruh platform.
/api/v1/admin/users AdminDaftar user. Query: page, limit, search.
/api/v1/admin/users/:id/active AdminAktifkan/nonaktifkan user. Body: isActive.
/api/v1/admin/users/:id/role AdminUbah role. Body: role (user|admin).
/api/v1/admin/audit-logs AdminJejak audit. Query: page, limit, action, userId.
Config
Konfigurasi runtime publik untuk FE (1x hit).
/api/v1/config PublikBranding app, urls, storage provider, Google client id, OTP expiry, dan batas upload per tipe.
App Settings (Master Aplikasi)
Branding & identitas aplikasi.
/api/v1/app-settings/branding PublikBranding publik (nama app, tagline, logo, ikon, warna).
/api/v1/app-settings AdminSeluruh pengaturan aplikasi.
/api/v1/app-settings AdminUpdate master aplikasi. Body: appName?, tagline?, description?, primaryColor?, dll.
/api/v1/app-settings/assets AdminUpload aset branding (multipart: logo?, icon?, favicon?).
Aset yang diupload disajikan di /uploads/.... logoUrl/iconUrl/faviconUrl dibangun otomatis dari API_BASE_URL.
System
/api/v1/health PublikLiveness + uptime.
/ PublikNama API + versi.
/uploads/* PublikBerkas upload lokal (logo/ikon branding).