Autentikasi
/api/v1/...
Cara Mendapatkan API Token
Semua endpoint API v1 menggunakan autentikasi **Bearer Token (Sanctum)**. Token dapat dibuat melalui halaman **Profil → API Token** di dashboard. Sertakan token pada setiap request menggunakan header `Authorization: Bearer <token>`. Token bersifat personal dan tidak boleh dibagikan kepada pihak lain.
Headers
Authorization
*
Bearer {your_token}
Token API pribadi Anda dari halaman Profil
Accept
*
application/json
Wajib disertakan agar response berformat JSON
Content-Type
application/json
Untuk request dengan JSON body
Perangkat
/api/v1/devices
Daftar Perangkat
Mengambil seluruh perangkat WhatsApp milik akun Anda beserta statusnya. Gunakan `id` perangkat yang statusnya `active` sebagai nilai `device_id` saat mengirim pesan.
Headers
Authorization
*
Bearer {your_token}
Token API Anda
Accept
*
application/json
Contoh Kode
curl -X GET "http://whatsapp.test/api/v1/devices" \
-H "Authorization: Bearer {your_token}" \
-H "Accept: application/json"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://whatsapp.test/api/v1/devices");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer {your_token}',
'Accept: application/json',
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
const response = await fetch('http://whatsapp.test/api/v1/devices', {
method: 'GET',
headers: {
'Authorization': 'Bearer {your_token}',
'Accept': 'application/json',
},
});
const data = await response.json();
console.log(data);
import requests
response = requests.get(
'http://whatsapp.test/api/v1/devices',
headers={
'Authorization': 'Bearer {your_token}',
'Accept': 'application/json',
}
)
print(response.json())
Response Sukses 200
{
"status": true,
"message": "Berhasil mengambil data devices",
"data": [
{
"id": 1,
"name": "Nomor Utama",
"number": "6281234567890",
"status": "active",
"session_id": "wa_session_abc123"
}
]
}
Response Error
{
"message": "Unauthenticated."
}
{
"status": false,
"message": "Langganan Anda tidak aktif."
}
Rotator
/api/v1/rotators
Daftar Rotator Aktif
Mengambil seluruh rotator milik akun Anda yang sedang aktif. Rotator adalah grup perangkat yang digunakan untuk mendistribusikan pengiriman pesan secara otomatis. Gunakan `id` rotator sebagai nilai `rotator_id` saat mengirim pesan.
Headers
Authorization
*
Bearer {your_token}
Token API Anda
Accept
*
application/json
Contoh Kode
curl -X GET "http://whatsapp.test/api/v1/rotators" \
-H "Authorization: Bearer {your_token}" \
-H "Accept: application/json"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://whatsapp.test/api/v1/rotators");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer {your_token}',
'Accept: application/json',
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
const response = await fetch('http://whatsapp.test/api/v1/rotators', {
method: 'GET',
headers: {
'Authorization': 'Bearer {your_token}',
'Accept': 'application/json',
},
});
const data = await response.json();
import requests
response = requests.get(
'http://whatsapp.test/api/v1/rotators',
headers={
'Authorization': 'Bearer {your_token}',
'Accept': 'application/json',
}
)
print(response.json())
Response Sukses 200
{
"status": true,
"message": "Berhasil mengambil data rotators",
"data": [
{
"id": 1,
"name": "Rotator CS",
"mode": "round_robin",
"active_devices_count": 3
}
]
}
Response Error
{
"message": "Unauthenticated."
}
{
"status": false,
"message": "Langganan Anda tidak aktif."
}
Pesan
/api/v1/messages/send
Kirim Pesan Teks
Mengirim pesan teks ke nomor WhatsApp tujuan melalui perangkat atau rotator milik Anda. Anda wajib menyertakan salah satu dari `device_id` atau `rotator_id`. Nomor tujuan dapat diawali dengan `0` (otomatis dikonversi ke format `62`) atau langsung menggunakan format internasional.
Headers
Authorization
*
Bearer {your_token}
Token API Anda
Accept
*
application/json
Content-Type
*
application/json
Wajib saat mengirim JSON body
Body Parameters
device_id
integer
ID perangkat pengirim. Wajib jika rotator_id tidak disertakan.
Contoh:
1
rotator_id
integer
ID rotator pengirim. Wajib jika device_id tidak disertakan.
Contoh:
1
target
*
string
Nomor WhatsApp tujuan. Format: 628xxx atau 08xxx.
Contoh:
6281234567890
message
*
string
Isi pesan teks yang akan dikirim.
Contoh:
Halo, pesanan Anda telah dikonfirmasi!
scheduled_at
string
Opsional. Waktu penjadwalan (format: YYYY-MM-DD HH:mm:ss). Jika diisi, pesan akan masuk antrian.
Contoh:
2026-10-01 10:00:00
Contoh Kode
curl -X POST "http://whatsapp.test/api/v1/messages/send" \
-H "Authorization: Bearer {your_token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"device_id": 1,
"target": "6281234567890",
"message": "Halo, pesanan Anda telah dikonfirmasi!"
}'
<?php
$data = [
'device_id' => 1,
'target' => '6281234567890',
'message' => 'Halo, pesanan Anda telah dikonfirmasi!',
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://whatsapp.test/api/v1/messages/send");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer {your_token}',
'Accept: application/json',
'Content-Type: application/json',
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
const response = await fetch('http://whatsapp.test/api/v1/messages/send', {
method: 'POST',
headers: {
'Authorization': 'Bearer {your_token}',
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
device_id: 1,
target: '6281234567890',
message: 'Halo, pesanan Anda telah dikonfirmasi!',
}),
});
const data = await response.json();
console.log(data);
import requests
response = requests.post(
'http://whatsapp.test/api/v1/messages/send',
headers={
'Authorization': 'Bearer {your_token}',
'Accept': 'application/json',
},
json={
'device_id': 1,
'target': '6281234567890',
'message': 'Halo, pesanan Anda telah dikonfirmasi!',
}
)
print(response.json())
Response Sukses 200
{
"status": true,
"message": "Pesan berhasil diproses.",
"used_device": {
"id": 1,
"name": "Nomor Utama",
"number": "6281234567890"
}
}
Response Error
{
"status": false,
"message": "Sertakan device_id atau rotator_id."
}
{
"status": false,
"message": "Device WhatsApp sedang tidak aktif."
}
{
"status": false,
"message": "Anda telah mencapai batas kuota pesan (1000 pesan) untuk bulan ini."
}
{
"status": false,
"message": "Plan langganan Anda tidak mendukung penggunaan fitur API."
}
{
"status": false,
"message": "Validasi gagal.",
"errors": {
"target": [
"The target field is required."
]
}
}
/api/v1/messages/send
Kirim Pesan dengan Attachment (File)
Mengirim pesan beserta lampiran file (gambar, PDF, dll.) ke nomor tujuan. Gunakan `multipart/form-data` sebagai Content-Type. Ukuran file maksimal **10 MB**. Plan Anda harus memiliki fitur **Pesan attachment** yang aktif.
Headers
Authorization
*
Bearer {your_token}
Token API Anda
Accept
*
application/json
Content-Type
*
multipart/form-data
Wajib untuk pengiriman file
Body Parameters
device_id
integer
ID perangkat pengirim. Wajib jika rotator_id tidak ada.
Contoh:
1
rotator_id
integer
ID rotator. Wajib jika device_id tidak ada.
Contoh:
1
target
*
string
Nomor WhatsApp tujuan.
Contoh:
6281234567890
message
string
Caption atau teks pendamping file.
Contoh:
Silakan lihat faktur terlampir.
file
*
file
File yang akan dikirim. Maks 10 MB.
Contoh:
invoice.pdf
Contoh Kode
curl -X POST "http://whatsapp.test/api/v1/messages/send" \
-H "Authorization: Bearer {your_token}" \
-H "Accept: application/json" \
-F "device_id=1" \
-F "target=6281234567890" \
-F "message=Silakan lihat faktur terlampir." \
-F "file=@/path/to/invoice.pdf"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://whatsapp.test/api/v1/messages/send");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'device_id' => 1,
'target' => '6281234567890',
'message' => 'Silakan lihat faktur terlampir.',
'file' => new CURLFile('/path/to/invoice.pdf'),
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer {your_token}',
'Accept: application/json',
]);
$response = curl_exec($ch);
curl_close($ch);
const form = new FormData();
form.append('device_id', '1');
form.append('target', '6281234567890');
form.append('message', 'Silakan lihat faktur terlampir.');
form.append('file', fileInput.files[0]);
const response = await fetch('http://whatsapp.test/api/v1/messages/send', {
method: 'POST',
headers: { 'Authorization': 'Bearer {your_token}', 'Accept': 'application/json' },
body: form,
});
const data = await response.json();
import requests
with open('/path/to/invoice.pdf', 'rb') as f:
response = requests.post(
'http://whatsapp.test/api/v1/messages/send',
headers={
'Authorization': 'Bearer {your_token}',
'Accept': 'application/json',
},
data={'device_id': 1, 'target': '6281234567890', 'message': 'Lihat faktur terlampir.'},
files={'file': f}
)
print(response.json())
Response Sukses 200
{
"status": true,
"message": "Pesan berhasil diproses.",
"used_device": {
"id": 1,
"name": "Nomor Utama",
"number": "6281234567890"
}
}
Response Error
{
"status": false,
"message": "Plan langganan Anda tidak mendukung pengiriman attachment\/media."
}
/api/v1/messages/send
Kirim Pesan dengan Attachment (URL)
Mengirim pesan dengan media yang diambil dari URL publik. Server akan mengunduh file dari URL tersebut lalu meneruskannya ke WhatsApp. Pastikan URL dapat diakses secara publik tanpa autentikasi. Fitur ini memerlukan plan dengan **Pesan attachment** aktif.
Headers
Authorization
*
Bearer {your_token}
Token API Anda
Accept
*
application/json
Content-Type
*
application/json
Body Parameters
device_id
integer
ID perangkat pengirim.
Contoh:
1
rotator_id
integer
ID rotator pengirim.
Contoh:
1
target
*
string
Nomor WhatsApp tujuan.
Contoh:
6281234567890
message
string
Caption atau teks pendamping.
Contoh:
Foto produk terbaru kami!
url
*
string
URL publik file media yang akan dikirim.
Contoh:
https://example.com/image.jpg
Contoh Kode
curl -X POST "{$baseUrl}/api/v1/messages/send" \
-H "Authorization: Bearer {your_token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"device_id": 1,
"target": "6281234567890",
"message": "Foto produk terbaru kami!",
"url": "https://example.com/image.jpg"
}'
<?php
$data = [
'device_id' => 1,
'target' => '6281234567890',
'message' => 'Foto produk terbaru kami!',
'url' => 'https://example.com/image.jpg',
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "{$baseUrl}/api/v1/messages/send");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer {your_token}',
'Accept: application/json',
'Content-Type: application/json',
]);
$result = json_decode(curl_exec($ch), true);
const response = await fetch('{$baseUrl}/api/v1/messages/send', {
method: 'POST',
headers: {
'Authorization': 'Bearer {your_token}',
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
device_id: 1,
target: '6281234567890',
message: 'Foto produk terbaru kami!',
url: 'https://example.com/image.jpg',
}),
});
const data = await response.json();
import requests
response = requests.post(
'{$baseUrl}/api/v1/messages/send',
headers={'Authorization': 'Bearer {your_token}', 'Accept': 'application/json'},
json={
'device_id': 1, 'target': '6281234567890',
'message': 'Foto produk terbaru kami!',
'url': 'https://example.com/image.jpg',
}
)
print(response.json())
Response Sukses 200
{
"status": true,
"message": "Pesan berhasil diproses.",
"used_device": {
"id": 1,
"name": "Nomor Utama",
"number": "6281234567890"
}
}
Response Error
{
"status": false,
"message": "Gagal mengunduh file dari URL."
}
{
"status": false,
"message": "Plan langganan Anda tidak mendukung pengiriman attachment\/media."
}
/api/send-message
Kirim Pesan via Device Token
Mengirim pesan teks/media langsung menggunakan **Token Perangkat (Device Token)**. API ini berguna jika Anda tidak ingin menggunakan _Personal Access Token_ (Sanctum), melainkan menggunakan token spesifik dari perangkat WhatsApp Anda. Anda dapat menemukan token ini di menu **Device** pada dashboard.
Headers
Authorization
*
Bearer {device_token}
Token spesifik perangkat dari menu Device
Accept
*
application/json
Content-Type
application/json
Jika mengirim request body berupa JSON
Body Parameters
target
*
string
Nomor tujuan (08xxx atau 628xxx).
Contoh:
6281234567890
message
string
Isi pesan atau caption.
Contoh:
Pesan dari Device Token.
url
string
URL media opsional.
Contoh:
https://example.com/image.jpg
file
file
Atau file media (multipart/form-data).
Contoh Kode
curl -X POST "{$baseUrl}/api/send-message" \
-H "Authorization: Bearer {device_token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"target": "6281234567890",
"message": "Pesan dari Device Token."
}'
<?php
$data = ['target' => '6281234567890', 'message' => 'Pesan dari Device Token.'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "{$baseUrl}/api/send-message");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer {device_token}',
'Accept: application/json',
'Content-Type: application/json',
]);
$result = json_decode(curl_exec($ch), true);
const response = await fetch('{$baseUrl}/api/send-message', {
method: 'POST',
headers: {
'Authorization': 'Bearer {device_token}',
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
target: '6281234567890',
message: 'Pesan dari Device Token.',
}),
});
const data = await response.json();
import requests
response = requests.post(
'{$baseUrl}/api/send-message',
headers={'Authorization': 'Bearer {device_token}', 'Accept': 'application/json'},
json={'target': '6281234567890', 'message': 'Pesan dari Device Token.'}
)
print(response.json())
Response Sukses 200
{
"status": true,
"message": "Pesan berhasil dikirim."
}
Response Error
{
"status": false,
"message": "Token tidak valid."
}
{
"status": false,
"message": "Device WhatsApp sedang tidak aktif \/ disconnected."
}
Broadcast
/api/v1/broadcasts
Kirim Broadcast Massal
Mengirim satu pesan ke banyak nomor tujuan sekaligus dengan jeda antar pengiriman. Nomor tujuan dipisahkan dengan baris baru (`\n`). Anda dapat menyertakan media melalui multipart upload. Pengiriman broadcast diproses secara antrian (queue) di background. Fitur ini memerlukan plan dengan **Broadcast** aktif.
Headers
Authorization
*
Bearer {your_token}
Token API Anda
Accept
*
application/json
Content-Type
*
multipart/form-data
Gunakan multipart jika menyertakan media, atau application/json jika tidak
Body Parameters
device_id
integer
ID perangkat pengirim. Wajib jika rotator_id tidak ada.
Contoh:
1
rotator_id
integer
ID rotator. Wajib jika device_id tidak ada.
Contoh:
1
name
*
string
Nama/label broadcast untuk identifikasi.
Contoh:
Promo Lebaran 2025
target_numbers
*
string
Daftar nomor tujuan dipisah baris baru.
Contoh:
6281234567890
6289876543210
message
*
string
Isi pesan broadcast.
Contoh:
Promo spesial hari ini! Diskon 50% untuk semua produk.
delay
*
integer
Jeda antar pengiriman dalam detik (min: 0).
Contoh:
3
media
file
File media opsional. Format: jpg, jpeg, png, pdf. Maks 5 MB.
Contoh:
banner.jpg
list_message_id
integer
ID list message untuk broadcast dengan tombol interaktif.
Contoh:
2
Contoh Kode
curl -X POST "http://whatsapp.test/api/v1/broadcasts" \
-H "Authorization: Bearer {your_token}" \
-H "Accept: application/json" \
-F "device_id=1" \
-F "name=Promo Lebaran 2025" \
-F "target_numbers=6281234567890" \
-F "message=Promo spesial hari ini! Diskon 50%." \
-F "delay=3"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://whatsapp.test/api/v1/broadcasts");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'device_id' => 1,
'name' => 'Promo Lebaran 2025',
'target_numbers' => "6281234567890\n6289876543210",
'message' => 'Promo spesial hari ini! Diskon 50%.',
'delay' => 3,
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer {your_token}',
'Accept: application/json',
]);
$result = json_decode(curl_exec($ch), true);
const form = new FormData();
form.append('device_id', '1');
form.append('name', 'Promo Lebaran 2025');
form.append('target_numbers', '6281234567890\n6289876543210');
form.append('message', 'Promo spesial hari ini! Diskon 50%.');
form.append('delay', '3');
const response = await fetch('http://whatsapp.test/api/v1/broadcasts', {
method: 'POST',
headers: { 'Authorization': 'Bearer {your_token}', 'Accept': 'application/json' },
body: form,
});
const data = await response.json();
import requests
response = requests.post(
'http://whatsapp.test/api/v1/broadcasts',
headers={
'Authorization': 'Bearer {your_token}',
'Accept': 'application/json',
},
data={
'device_id': 1,
'name': 'Promo Lebaran 2025',
'target_numbers': '6281234567890\n6289876543210',
'message': 'Promo spesial hari ini! Diskon 50%.',
'delay': 3,
}
)
print(response.json())
Response Sukses 200
{
"status": true,
"message": "Broadcast berhasil dijadwalkan. Pesan sedang diproses.",
"data": {
"broadcast_id": 42,
"total_recipients": 250
}
}
Response Error
{
"message": "Pilih device atau rotator pengirim."
}
{
"message": "Gagal: Broadcast ini membutuhkan 250 kuota pesan. Sisa kuota bulan ini tidak mencukupi."
}
{
"message": "Plan langganan Anda tidak mendukung fitur Broadcast."
}
Pesan Berkala
/api/v1/recurring-messages
Daftar Pesan Berkala
Mengambil daftar pesan berkala (Recurring Message) milik akun Anda.
Headers
Authorization
*
Bearer {your_token}
Token API Anda
Accept
*
application/json
Response Sukses 200
{
"status": true,
"data": [
{
"id": "uuid",
"name": "Tagihan Bulanan",
"target": "6281234567890",
"schedule_type": "Monthly",
"schedule_time": "08:00:00"
}
]
}
/api/v1/recurring-messages
Buat Pesan Berkala
Membuat pesan berkala (Recurring Message). Pesan ini akan dikirim secara otomatis pada interval waktu tertentu (Daily, Weekly, Monthly, Yearly).
Headers
Authorization
*
Bearer {your_token}
Token API Anda
Accept
*
application/json
Content-Type
*
multipart/form-data
Wajib jika menyertakan media
Body Parameters
device_id
*
integer
ID perangkat pengirim.
Contoh:
1
name
*
string
Nama/label pesan berkala.
Contoh:
Tagihan Bulanan
target
*
string
Nomor tujuan.
Contoh:
6281234567890
message
*
string
Isi pesan berkala.
Contoh:
Tagihan Anda bulan ini sebesar Rp100.000
timezone
*
string
Timezone. Pilih: Asia/Jakarta, Asia/Makassar, Asia/Jayapura.
Contoh:
Asia/Jakarta
schedule_type
*
string
Pilih: Daily, Weekly, Monthly, Yearly.
Contoh:
Monthly
schedule_time
*
string
Format jam pengiriman: HH:mm.
Contoh:
08:00
media
file
File media opsional.
is_active
boolean
Status aktif (1) atau tidak (0).
Contoh:
1
Response Sukses 200
{
"status": true,
"message": "Recurring Message berhasil dibuat."
}
/api/v1/recurring-messages/{id}
Hapus Pesan Berkala
Menghapus pesan berkala berdasarkan ID-nya.
Headers
Authorization
*
Bearer {your_token}
Token API Anda
Accept
*
application/json
Response Sukses 200
{
"status": true,
"message": "Recurring Message berhasil dihapus."
}
Webhook
{your_webhook_url}
Penerimaan Pesan (Webhook)
Jika Anda mengatur **Webhook URL** pada halaman edit perangkat, setiap pesan masuk ke nomor perangkat tersebut akan diteruskan secara _real-time_ ke URL Anda menggunakan metode HTTP POST. Anda dapat menggunakan payload JSON berikut untuk memproses pesan masuk di sistem internal Anda (misalnya membalas otomatis menggunakan AI). Fitur ini membutuhkan langganan plan yang mendukung Webhook.
Headers
Content-Type
*
application/json
Sistem kami akan mengirim request dengan header ini
Contoh Kode
<?php
// Contoh cara menerima webhook di PHP
$payload = file_get_contents('php://input');
$data = json_decode($payload, true);
$sender = $data['sender'];
$message = $data['message'];
// Lakukan sesuatu dengan pesan tersebut
file_put_contents('webhook.log', "Pesan dari {$sender}: {$message}\n", FILE_APPEND);
// Wajib merespon dengan HTTP 200 OK agar server kami tahu webhook berhasil diterima
http_response_code(200);
echo json_encode(['status' => 'success']);
const express = require('express');
const app = express();
app.use(express.json());
app.post('/webhook', (req, res) => {
const data = req.body;
console.log(`Pesan dari ${data.sender}: ${data.message}`);
// Lakukan proses bisnis Anda di sini
res.status(200).json({ status: 'success' });
});
app.listen(3000, () => console.log('Listening on port 3000'));
Response Sukses 200
{
"device": "6281234567890",
"session_id": "wa_session_abc123",
"sender": "6289876543210",
"sender_name": "Budi Santoso",
"message": "Halo, apakah produk ini masih tersedia?",
"timestamp": "2026-09-26 21:00:00"
}