Dokumentasi Client API

Client API Reference

Referensi lengkap untuk integrasi aplikasi klien. Terdiri dari User Management API (untuk mengontrol sesi WhatsApp Anda dengan batas kuota) dan Public Gateway API (untuk pengiriman pesan, broadcast aman, pengetikan, media, dan webhook).

Full reference for client integrations. Covers the User Management API (for managing your own WhatsApp sessions within your account quota) and the Public Gateway API (for text dispatches, safe broadcast batches, typing presence, media, and webhooks).

🔑 User API: Authorization: Bearer <JWT> ⚡ Gateway API: Authorization: Bearer <API_TOKEN>

Autentikasi & Akun Pengguna User Authentication & Profile

POST /api/auth/login Public

Login dengan username dan password Anda untuk mendapatkan JWT Token aktif. Log in with your username and password to obtain an active JWT Bearer token.

Request Body (JSON)
FieldTipeWajib?Deskripsi
usernamestringYa (Yes)Username terdaftar Anda.
passwordstringYa (Yes)Kata sandi akun Anda.
cURL
curl -X POST "http://localhost:3000/api/auth/login" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "client_budi",
    "password": "secretpassword"
  }'
Response (200 OK)
{
  "success": true,
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "user": {
    "id": 2,
    "username": "client_budi",
    "role": "user",
    "max_sessions": 3,
    "status": "active",
    "expires_at": "2026-12-31T23:59:59.000Z"
  }
}
GET /api/auth/me Bearer JWT

Mengecek profil akun sendiri, status masa aktif (expires_at), dan penggunaan kuota sesi. Inspects your own user profile, expiration date (expires_at), and active session count.

cURL
curl -X GET "http://localhost:3000/api/auth/me" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>"
POST /api/auth/change-password Bearer JWT

Mengganti password akun sendiri. Wajib menyertakan password lama yang benar. Changes your account password. Requires verification of the current password.

cURL
curl -X POST "http://localhost:3000/api/auth/change-password" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "currentPassword": "oldPassword123",
    "newPassword": "newSecretPassword456"
  }'
PATCH /api/auth/username Bearer JWT

Mengubah username akun Anda sendiri setelah memverifikasi password saat ini. Updates your account username after confirming your current password.

cURL
curl -X PATCH "http://localhost:3000/api/auth/username" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "currentPassword": "myPassword123",
    "newUsername": "budi_updated"
  }'

Manajemen Sesi Pengguna (/api/user/*) Client Session Management (/api/user/*)

GET /api/user/sessions Bearer JWT

Mengambil daftar sesi WhatsApp milik akun Anda, status koneksi, kuota maksimal (max_sessions), dan jumlah yang telah dipakai (used_sessions). Retrieves all WhatsApp sessions owned by your account, current statuses, quota limit (max_sessions), and current count (used_sessions).

cURL
curl -X GET "http://localhost:3000/api/user/sessions" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>"
Response (200 OK)
{
  "success": true,
  "sessions": [
    {
      "id": "c7a8b9d0-1234-5678-9abc-def012345678",
      "user_id": 2,
      "name": "WhatsApp CS Toko",
      "api_token": "8f7e6d5c4b3a2109fedcba9876543210...",
      "status": "connected",
      "auto_reply_enabled": 1,
      "watermark_enabled": 1,
      "auto_delete_enabled": 0,
      "auto_delete_delay": 30,
      "created_at": "2026-09-15T09:00:00.000Z"
    }
  ],
  "max_sessions": 3,
  "used_sessions": 1
}
POST /api/user/sessions Bearer JWT

Membuat sesi WhatsApp baru untuk akun Anda. Mengembalikan sessionId dan apiToken statis. Jika kuota Anda sudah penuh (used_sessions >= max_sessions), endpoint ini akan menolak dengan error HTTP 403 Forbidden. Creates a new WhatsApp session slot under your account. Returns a sessionId and static apiToken. If your quota is reached (used_sessions >= max_sessions), returns an HTTP 403 Forbidden error.

Request Body (JSON)
FieldTipeWajib?Deskripsi
namestringYa (Yes)Nama deskriptif untuk sesi ini.
cURL
curl -X POST "http://localhost:3000/api/user/sessions" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "WA Dispatcher 2"
  }'
Response Sukses (200 OK)
{
  "success": true,
  "sessionId": "b4a3c2d1-5678-90ab-cdef-1234567890ab",
  "apiToken": "9e8d7c6b5a43210fedcba9876543210fedcba9876543210fedcba9876543210",
  "message": "Session created. Please link your WhatsApp device via QR code or phone pairing code."
}
Respons Kuota Penuh (403 Forbidden)
{
  "error": "Limit kuota akun WhatsApp Anda telah tercapai (Maksimal 3 sesi). Silakan hubungi administrator untuk menambah kuota."
}
GET /api/user/sessions/:id/qr Bearer JWT

Mengambil data QR Code berupa base64 Data URL atau kode pairing 8 digit. Hanya dapat diakses oleh pemilik sesi tersebut. Retrieves QR Code base64 Data URL or 8-digit pairing code. Accessible strictly by the session owner.

cURL
curl -X GET "http://localhost:3000/api/user/sessions/<SESSION_ID>/qr" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>"
POST /api/user/sessions/:id/connect Bearer JWT

Mereset koneksi dan memulai siklus pembuatan QR code baru untuk dipindai melalui aplikasi WhatsApp HP Anda. Resets connection and triggers generation of a fresh QR code to scan from your phone.

cURL
curl -X POST "http://localhost:3000/api/user/sessions/<SESSION_ID>/connect" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>"
POST /api/user/sessions/:id/pair Bearer JWT

Meminta kode pairing 8-digit WhatsApp untuk ditautkan secara langsung menggunakan nomor handphone tanpa perlu kamera scan QR. Requests an 8-digit phone pairing code for camera-less linking on mobile devices.

cURL
curl -X POST "http://localhost:3000/api/user/sessions/<SESSION_ID>/pair" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "6281234567890"
  }'
PATCH /api/user/sessions/:id/settings Bearer JWT

Mengubah pengaturan sesi: watermark (> Developed by JSGDEV), toggle auto reply, serta server-side auto delete (hanya menghapus pesan di HP pengirim setelah delay detik yang ditentukan). Updates session operational settings: watermark text (> Developed by JSGDEV), auto reply toggle, and server-side auto-delete (deletes only on the server's phone after specified delay).

Request Body (JSON)
FieldTipeDeskripsi
watermark_enabledbooleanAktifkan footer watermark teks.
auto_reply_enabledbooleanAktifkan respon balas otomatis.
auto_delete_enabledbooleanAktifkan auto delete di sisi HP server.
auto_delete_delaynumberJeda waktu dalam detik (1 - 86400). Default: 30.
cURL
curl -X PATCH "http://localhost:3000/api/user/sessions/<SESSION_ID>/settings" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "watermark_enabled": false,
    "auto_reply_enabled": true,
    "auto_delete_enabled": true,
    "auto_delete_delay": 30
  }'
DELETE /api/user/sessions/:id Bearer JWT

Menghapus sesi WhatsApp milik Anda secara permanen. Menghapus sesi ini akan mengembalikan 1 slot kuota (used_sessions berkurang 1). Permanently deletes your WhatsApp session, freeing up 1 slot in your account quota (used_sessions decrements by 1).

cURL
curl -X DELETE "http://localhost:3000/api/user/sessions/<SESSION_ID>" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>"

Konfigurasi Webhook & Auto-Reply Klien Client Webhooks & Auto-Reply Rules

GET /api/user/sessions/:id/webhook Bearer JWT

Mengambil pengaturan webhook sesi Anda saat ini, termasuk daftar chain_urls. Fetches current webhook settings for your session, including configured chain_urls.

cURL
curl -X GET "http://localhost:3000/api/user/sessions/<SESSION_ID>/webhook" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>"
PATCH /api/user/sessions/:id/webhook Bearer JWT

Mengatur URL webhook penerima event. Mendukung chain_urls untuk meneruskan event ke beberapa webhook URL secara berurutan. Updates webhook destination URL. Supports chain_urls to broadcast event payloads to multiple backend servers.

cURL
curl -X PATCH "http://localhost:3000/api/user/sessions/<SESSION_ID>/webhook" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": true,
    "url": "https://api.mywebsite.com/wa/webhook",
    "secret": "mySuperSecretSignatureKey",
    "chain_urls": [
      "https://backup-api.mywebsite.com/wa/webhook"
    ]
  }'
GET /api/user/sessions/:id/auto-replies Bearer JWT

Melihat aturan auto reply pada sesi Anda. (Dapat juga diakses via gateway GET /api/auto-replies menggunakan API Token sesi). Lists auto reply keyword rules for your session. (Also accessible via gateway GET /api/auto-replies using API Token).

cURL
curl -X GET "http://localhost:3000/api/user/sessions/<SESSION_ID>/auto-replies" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>"
POST /api/user/sessions/:id/auto-replies Bearer JWT

Membuat aturan auto-reply baru pada sesi Anda. Format wildcard: *kata*. Creates an auto-reply rule on your session. Supports wildcards: *keyword*.

cURL
curl -X POST "http://localhost:3000/api/user/sessions/<SESSION_ID>/auto-replies" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "keyword": "*katalog*",
    "reply_text": "Katalog produk terbaru kami ada di https://katalog.example.com"
  }'
DELETE /api/user/auto-replies/:replyId Bearer JWT

Menghapus aturan auto-reply milik sesi Anda. Sistem memverifikasi kepemilikan aturan secara ketat. Deletes an auto reply rule. Enforces tenant ownership strictly.

cURL
curl -X DELETE "http://localhost:3000/api/user/auto-replies/1" \
  -H "Authorization: Bearer <YOUR_JWT_TOKEN>"

Gateway WhatsApp REST API (/api/*) WhatsApp Gateway REST API (/api/*)

Catatan Autentikasi Gateway: Seluruh endpoint di bawah ini menggunakan Session API Token statis (64 karakter) dalam header: Authorization: Bearer <SESSION_API_TOKEN>. Gateway Authentication Note: All endpoints below require your static 64-character Session API Token: Authorization: Bearer <SESSION_API_TOKEN>.
POST /api/send Bearer API Token

Mengirimkan pesan teks WhatsApp ke satu nomor atau array nomor tujuan. Mendukung proteksi anti-ban (simulasi pengetikan alami) dan opsi override auto-delete per pesan. Dispatches a plain text WhatsApp message to a single recipient or array of numbers. Features human typing simulation (anti-ban) and per-message auto-delete overrides.

Request Body (JSON)
FieldTipeWajib?Deskripsi
tostring | string[]Ya (Yes)Nomor tujuan (e.g. "628123456789" atau ["6281...", "6282..."]).
textstringYa (Yes)Isi teks pesan WhatsApp.
antiBanbooleanTidak (Opt)Simulasi pengetikan alami (Default: true).
autoDeletebooleanTidak (Opt)Override setting auto-delete di HP server untuk pesan ini.
autoDeleteDelaynumberTidak (Opt)Jeda auto-delete dalam detik (1 - 86400).
cURL - Single Recipient
curl -X POST "http://localhost:3000/api/send" \
  -H "Authorization: Bearer <YOUR_SESSION_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "628123456789",
    "text": "Halo! Pesan konfirmasi pesanan #1092 telah berhasil diproses."
  }'
Response (200 OK)
{
  "success": true,
  "message": "Message sent",
  "messageId": "3EB04F1A2B3C4D5E"
}
POST /api/send-media Bearer API Token

Mengirimkan media berupa gambar (image), dokumen PDF/Office (document), video, atau audio/Voice Note (PTT) melalui URL publik atau data base64 string. Sends rich media: images, PDF/Office documents, videos, or audio/voice notes (PTT) via remote URL or base64 string.

Request Body (JSON)
FieldTipeWajib?Deskripsi
tostringYa (Yes)Nomor tujuan penerima (e.g. "628123456789").
typestringYa (Yes)'image', 'video', 'document', atau 'audio'.
urlstringKondisionalURL publik file media (wajib jika tidak ada base64).
base64stringKondisionalBase64 encoded string (wajib jika tidak ada url).
captionstringTidak (Opt)Keterangan teks untuk gambar, video, atau dokumen.
fileNamestringTidak (Opt)Nama file untuk dokumen (e.g. "Invoice_2026.pdf").
mimetypestringTidak (Opt)MIME type spesifik (e.g. "application/pdf").
pttbooleanTidak (Opt)Set true untuk mengirim audio sebagai Push-To-Talk Voice Note.
cURL - Send Image via URL
curl -X POST "http://localhost:3000/api/send-media" \
  -H "Authorization: Bearer <YOUR_SESSION_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "628123456789",
    "type": "image",
    "url": "https://images.unsplash.com/photo-1579202673506-ca3ce28943ef",
    "caption": "Foto Produk Terbaru 2026"
  }'
cURL - Send PDF Document
curl -X POST "http://localhost:3000/api/send-media" \
  -H "Authorization: Bearer <YOUR_SESSION_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "628123456789",
    "type": "document",
    "url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
    "fileName": "Laporan_Keuangan_2026.pdf",
    "mimetype": "application/pdf",
    "caption": "Silakan unduh dokumen terlampir."
  }'
POST /api/broadcast Bearer API Token

Menyiarkan pesan teks atau media ke daftar nomor telepon secara berurutan. Gateway memvalidasi setiap nomor terlebih dahulu, menyimulasikan pengetikan, menerapkan jeda acak (jitter) untuk keamanan anti-ban, dan mengembalikan laporan audit pengiriman. Broadcasts text or media sequentially across an array of numbers. Validates each recipient, simulates typing, enforces randomized jitter delays for anti-spam safety, and returns a detailed delivery audit report.

Request Body (JSON)
FieldTipeWajib?Deskripsi
toNumbersstring[]Ya (Yes)Array nomor telepon target broadcast.
textstringKondisionalPesan teks broadcast.
mediaobjectKondisionalObjek media: { "type": "image", "url": "..." }.
delayMsnumberTidak (Opt)Jeda dasar antar pesan dalam milidetik (min: 1000, default: 2500).
cURL
curl -X POST "http://localhost:3000/api/broadcast" \
  -H "Authorization: Bearer <YOUR_SESSION_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "toNumbers": ["628123456789", "628987654321"],
    "text": "Pengumuman Pemeliharaan Server pada pukul 23:00 WIB.",
    "delayMs": 3000
  }'
Response (200 OK)
{
  "success": true,
  "successCount": 2,
  "failCount": 0,
  "errors": []
}
POST /api/validate-number Bearer API Token

Memeriksa apakah satu atau beberapa nomor telepon aktif terdaftar di WhatsApp. Validates whether one or more phone numbers are actively registered on WhatsApp.

cURL
curl -X POST "http://localhost:3000/api/validate-number" \
  -H "Authorization: Bearer <YOUR_SESSION_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "numbers": ["628123456789", "628999999999"]
  }'
Response (200 OK)
{
  "success": true,
  "results": [
    { "number": "628123456789", "exists": true, "jid": "628123456789@s.whatsapp.net" },
    { "number": "628999999999", "exists": false, "jid": null }
  ]
}
POST /api/typing Bearer API Token

Mengirimkan indikator mengetik (composing presence) ke chat penerima selama durasi tertentu (1000 - 30000 ms). Sends a composing typing indicator to the recipient chat for a bounded duration (1000 - 30000 ms).

cURL
curl -X POST "http://localhost:3000/api/typing" \
  -H "Authorization: Bearer <YOUR_SESSION_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "628123456789",
    "durationMs": 4000
  }'
GET /api/groups Bearer API Token

Mengambil daftar seluruh grup WhatsApp yang diikuti oleh nomor sesi ini. Fetches metadata for all WhatsApp groups joined by this session's phone number.

Response (200 OK)
{
  "success": true,
  "groups": [
    {
      "id": "1203630284918234@g.us",
      "subject": "Customer Community Group",
      "participants": 42
    }
  ]
}
POST /api/delete-message Bearer API Token

Menarik / menghapus pesan yang pernah dikirim untuk semua orang (Delete For Everyone). Revokes a previously sent message for everyone in the recipient chat.

cURL
curl -X POST "http://localhost:3000/api/delete-message" \
  -H "Authorization: Bearer <YOUR_SESSION_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "628123456789",
    "messageId": "3EB04F1A2B3C4D5E"
  }'
POST /api/disconnect Bearer API Token

Memutuskan koneksi socket WhatsApp dan menghapus kredensial autentikasi lokal sesi ini. Logs out and terminates the WhatsApp session, clearing its local authentication credentials.

cURL
curl -X POST "http://localhost:3000/api/disconnect" \
  -H "Authorization: Bearer <YOUR_SESSION_API_TOKEN>"
GET /api/qr Bearer API Token

Mengambil QR code atau pairing code secara langsung menggunakan API token sesi. Retrieves QR code image or pairing code authenticated via the session API token.

cURL
curl -X GET "http://localhost:3000/api/qr" \
  -H "Authorization: Bearer <YOUR_SESSION_API_TOKEN>"

Spesifikasi Payload Event Webhook Webhook Event Payload Specifications

Ketika webhook diaktifkan, server WA Gateway akan mengirimkan request HTTP POST dengan header Content-Type: application/json dan opsional X-Webhook-Secret jika Anda mengonfigurasi secret key. When webhooks are enabled, the WA Gateway server dispatches HTTP POST requests with Content-Type: application/json and optional X-Webhook-Secret headers.

1. Event: incoming (Pesan Masuk)
JSON Payload
{
  "event": "incoming",
  "sessionId": "b4a3c2d1-5678-90ab-cdef-1234567890ab",
  "message": {
    "id": "3EB048FBDD307A8CF5BCAE",
    "from": "628123456789@s.whatsapp.net",
    "fromMe": false,
    "text": "Halo, saya ingin menanyakan jam operasional toko.",
    "timestamp": 1788960613,
    "type": "text"
  }
}
2. Event: connected & disconnected
JSON Payload
{
  "event": "connected",
  "sessionId": "b4a3c2d1-5678-90ab-cdef-1234567890ab",
  "status": "connected"
}
3. Event: message_status (Tanda Terima Kirim / Baca)
JSON Payload
{
  "event": "message_status",
  "sessionId": "b4a3c2d1-5678-90ab-cdef-1234567890ab",
  "status": 3,
  "key": {
    "remoteJid": "628123456789@s.whatsapp.net",
    "id": "3EB048FBDD307A8CF5BCAE",
    "fromMe": true
  }
}