WA Bot

{{ loginError }}

Dashboard

{{ waStatus }}
WhatsApp Status
{{ stats.autoreply }}
Auto-Reply Rules
{{ stats.commands }}
Quick Commands
Scan QR Code
Open WhatsApp → Settings → Linked Devices
Setelah scan QR, tunggu beberapa menit sampai status berubah menjadi ready. Jangan refresh halaman selama proses loading.

QR Code expired

WhatsApp disconnected

Syncing WhatsApp Data {{ waLoadingPercent }}%
{{ waLoadingMessage || 'Syncing...' }}
Connection Activity Log

Messages

{{ selectedChatIds.length }} selected
{{ chat.name }} {{ formatTime(chat.timestamp) }}
{{ chat.lastMessage || 'No messages' }}
{{ chat.unreadCount }}
Loading chats...
{{ selectedChat.name }}
{{ msg.body }}
{{ formatTime(msg.timestamp) }}
{{ f.name }}

Auto-Reply Rules

Cara Kerja: Setiap pesan masuk akan dicocokkan dengan keyword di bawah. Jika cocok, bot akan membalas otomatis.

Default Auto-Reply: Buat rule dengan keyword default untuk membalas pesan yang tidak cocok dengan keyword manapun. Rule ini hanya dijalankan sebagai fallback jika tidak ada rule lain yang match. Match type pada rule default akan diabaikan.
KeywordMatchModeResponse / ScriptStatusActions
{{ r.keyword }} {{ r.matchType }} {{ r.mode === 'script' ? '⚔ Script' : 'šŸ’¬ Message' }} {{ r.mode === 'script' ? (r.script || '').substring(0, 60) + '...' : r.response }} {{ r.mediaUrls.length }} {{ r.enabled ? 'ON' : 'OFF' }}
No rules yet
Script Documentation
Function Signature
async function(client, args, axios, sheets) {
  // your code here
}
ParameterTipeDeskripsi
clientObjectObject untuk mengirim pesan ke chat
argsArrayArgument yang dikirim user setelah keyword, otomatis di-parse
axiosFunctionHTTP client untuk memanggil API eksternal
sheetsObject / nullGoogle Sheets helper (null jika service-account.json tidak ada)
client — Mengirim Pesan
MethodDeskripsiContoh
client.send(text) Kirim pesan ke chat yang sedang aktif (pengirim) client.send("Halo!")
return "text" Return string untuk langsung reply ke pengirim return `Halo ${args[0]}!`
args — Argument Parsing

Teks setelah keyword otomatis dipecah berdasarkan spasi. Gunakan tanda kutip ("..." atau '...') untuk argument yang mengandung spasi.

Pesan MasukKeywordHasil args
!sapa Budi !sapa ["Budi"] → args[0] = "Budi"
!kirim Budi halo bro !kirim ["Budi", "halo", "bro"]
!kirim Budi "halo bro" !kirim ["Budi", "halo bro"] — kutipan menjaga spasi
!cek !cek [] — kosong jika tidak ada argument
Contoh Script:
const nama = args[0] || "teman";
const pesan = args[1] || "apa kabar?";
return `Halo ${nama}, ${pesan}`;
sheets — Google Sheets Helper
Prasyarat: Pastikan file service-account.json sudah ada di root project, dan spreadsheet sudah di-share ke email service account tersebut.
MethodDeskripsi
sheets.readSheet(spreadsheetId, sheetName, numColumns) Baca data dari sheet. Return array of rows (header/baris pertama otomatis di-skip). numColumns opsional untuk membatasi jumlah kolom dari A.
sheets.writeSheet(spreadsheetId, range, values) Tulis/overwrite data ke range tertentu. values adalah array 2D [[row1col1, row1col2], [row2col1, ...]]
sheets.appendSheet(spreadsheetId, range, values) Tambah baris baru ke akhir sheet. values sama seperti writeSheet.
Contoh: Baca data dari Sheet
// Keyword: !stok
// Spreadsheet ID dari URL: https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit
const SHEET_ID = "1aBcDeFgHiJkLmNoPqRsTuVwXyZ";

const rows = await sheets.readSheet(SHEET_ID, "Sheet1", 3);
// rows = [["Baju", "50", "Rp100.000"], ["Celana", "30", "Rp150.000"], ...]

if (!rows.length) return "Data stok kosong.";

let result = "šŸ“¦ *Daftar Stok:*\n";
for (const [nama, qty, harga] of rows) {
  result += `\n• ${nama} — Qty: ${qty}, Harga: ${harga}`;
}
return result;
Contoh: Tulis data ke Sheet
// Keyword: !tambah (Match: startsWith)
// Pesan: !tambah Baju 50 Rp100.000
const SHEET_ID = "1aBcDeFgHiJkLmNoPqRsTuVwXyZ";

if (args.length < 3) return "Format: !tambah [nama] [qty] [harga]";

await sheets.appendSheet(SHEET_ID, "Sheet1!A:C", [
  [args[0], args[1], args[2]]
]);
return `āœ… Berhasil ditambahkan: ${args[0]} (${args[1]}x) @ ${args[2]}`;
Contoh: Update cell tertentu
// Update cell B2 dengan value baru
const SHEET_ID = "1aBcDeFgHiJkLmNoPqRsTuVwXyZ";

await sheets.writeSheet(SHEET_ID, "Sheet1!B2", [["100"]]);
return "āœ… Stok berhasil diupdate!";
axios — HTTP Requests

Gunakan axios untuk memanggil API eksternal (REST API, webhook, dll).

MethodDeskripsi
axios.get(url, config?)HTTP GET request
axios.post(url, data?, config?)HTTP POST request
axios.put(url, data?, config?)HTTP PUT request
axios.delete(url, config?)HTTP DELETE request
Contoh: Panggil API dan tampilkan hasilnya
// Keyword: !cuaca (Match: startsWith)
// Pesan: !cuaca Jakarta
const kota = args[0] || "Jakarta";
const { data } = await axios.get(
  `https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&q=${kota}`
);
return `🌤 Cuaca ${kota}: ${data.current.condition.text}, ${data.current.temp_c}°C`;
Contoh: Kirim data ke webhook
// Kirim notifikasi ke webhook (Discord, Slack, dll)
await axios.post("https://hooks.slack.com/services/xxx", {
  text: `Pesan baru dari WA: ${args.join(" ")}`
});
return "āœ… Notifikasi terkirim!";
Tips & Pola Umum
PolaContoh Code
Validasi argument wajib if (!args[0]) return "āŒ Masukkan nama! Contoh: !sapa Budi";
Default value const nama = args[0] || "teman";
Gabung semua argument jadi satu teks const pesan = args.join(" ");
Cek jumlah argument if (args.length < 2) return "Format: !cmd [arg1] [arg2]";
Kirim multi-line response return `Baris 1\nBaris 2\nBaris 3`;
Kirim pesan bold/italic (WhatsApp formatting) return `*Bold* _Italic_ ~Strikethrough~ \`\`\`Code\`\`\``;
Tanggal/waktu saat ini const now = new Date().toLocaleString("id-ID", { timeZone: "Asia/Jakarta" });
Random response const arr = ["Halo!", "Hai!", "Hey!"]; return arr[Math.floor(Math.random() * arr.length)];

Quick Commands

CommandModeReply / ScriptStatusActions
{{ c.command }} {{ c.mode === 'script' ? '⚔ Script' : 'šŸ’¬ Message' }} {{ c.mode === 'script' ? (c.script || '').substring(0, 60) + '...' : c.replyMessage }} {{ c.mediaUrls.length }} {{ c.enabled ? 'ON' : 'OFF' }}
No commands yet

OnMessage Hooks

Scripts that run on every incoming message.
#NameScript PreviewStatusActions
{{ idx + 1 }} {{ h.name }} {{ (h.script || '').substring(0, 80) }}{{ (h.script||'').length > 80 ? '...' : '' }} {{ h.enabled ? 'ON' : 'OFF' }}
No hooks yet. Add one to run custom code on every message.
Simulate: {{ simHook.name }}
{{ simResult.success ? 'āœ… Success' : 'āŒ Error' }} {{ simResult.duration }}ms
{{ simResult.error }}
Returned: {{ simResult.returned }}
Messages sent (simulated):
→ {{ s.to }}: {{ s.text }}
Hook ran without sending any message or returning a value.
ā„¹ļø Hook Script Context:
async function(client, msg, axios)
  • msg.body — message text
  • msg.from / msg.to — sender / recipient chat ID
  • msg.fromMe — boolean, true if you sent it
  • msg.chatId — the chat where message was sent
  • msg.type — message type (chat, image, etc.)
  • client.send(text) — reply to the same chat
  • client.sendTo(chatId, text) — send to any chat
  • return "text" — shorthand to reply to the chat
Hook Execution Log {{ hookLogEntries.length }}
TimeHookStatusDirMessagems
{{ formatLogTime(log.ts) }} {{ log.hookName }} OK ERR replied {{ log.fromMe ? '→ OUT' : '← IN' }} {{ log.msgBody }} {{ log.duration }}ms
No logs yet. Send a message to trigger hooks.

Categories

No categories yet. Create one above.
{{ cat }}
No members. Go to Messages → select chats → assign here.
{{ getChatName(chatId) }} {{ chatId }}

Queued API Requests

Messages sent via /api/send-message are queued with a 5s delay between each.
{{ queueList.length }}
Total
{{ queueList.filter(q=>q.status==='pending').length }}
Pending
{{ queueList.filter(q=>q.status==='sending').length }}
Sending
{{ queueList.filter(q=>q.status==='sent').length }}
Sent
{{ queueList.filter(q=>q.status==='failed').length }}
Failed
#Ref IDRecipientMessageStatusCreatedSent
{{ idx + 1 }} {{ q.reference_id.length > 12 ? q.reference_id.substring(0,12)+'…' : q.reference_id }}— {{ q.number }} {{ (q.message || '').substring(0, 80) }} Pending Sending Sent Failed {{ formatLogTime(q.createdAt) }} {{ q.sentAt ? formatLogTime(q.sentAt) : '-' }}
Queue is empty. Messages sent via API will appear here.
Check Message Status API

Check the delivery status of a queued message by its queue ID or reference_id.

GET /api/message-status/:id

The :id param can be the queue ID (UUID) returned by send-message, or your custom reference_id.

Example: cURL
curl {{ baseUrl }}/api/message-status/YOUR_REFERENCE_ID \
  -H "X-API-Key: YOUR_API_KEY"
Example: Fetch
fetch("{{ baseUrl }}/api/message-status/YOUR_REFERENCE_ID", {
  headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(r => r.json()).then(console.log);
Response
{
  "id": "uuid-queue-id",
  "reference_id": "your-custom-ref",
  "number": "6282146727409",
  "chatId": "6282146727409@c.us",
  "message": "Hello!",
  "status": "sent",   // pending | sending | sent | failed
  "error": null,
  "createdAt": 1709654400000,
  "sentAt": 1709654405000
}
šŸ’” Tip: Pass "reference_id" when calling /api/send-message to tag messages with your own ID for easy tracking.

Queue Hooks

Run custom JavaScript when a queued message is sent or fails. Available: msg, axios
onSent Hook
onFailed Hook
msg Object Reference
{
  id: "uuid-queue-id",
  reference_id: "your-custom-ref",  // or null
  number: "6282146727409",
  chatId: "6282146727409@c.us",
  message: "Hello!",
  status: "sent",        // "sent" or "failed"
  error: null,           // error message if failed
  createdAt: 1709654400000,
  sentAt: 1709654405000  // null if failed
}

Network Monitor

All HTTP requests to /api/* endpoints are logged here.
{{ networkLog.length }}
Total
{{ networkLog.filter(l=>l.statusCode>=200&&l.statusCode<300).length }}
2xx
{{ networkLog.filter(l=>l.statusCode>=400&&l.statusCode<500).length }}
4xx
{{ networkLog.filter(l=>l.statusCode>=500).length }}
5xx
#MethodURLStatusTimeIPDate
{{ idx + 1 }} {{ l.method }} {{ l.url }} {{ l.statusCode }} {{ l.duration }}ms {{ l.ip }} {{ formatLogTime(l.createdAt) }}
No requests logged yet.

Tools

Backup Data

Download all your settings as a JSON file: auto-reply rules, commands, hooks, categories, pinned chats, contact names, and main number.

Restore Data

Upload a previously downloaded backup JSON file to restore all settings. This will overwrite existing data.

{{ toolsResult.message }}
ā„¹ļø Backup includes:
  • Auto-Reply rules
  • Quick Commands
  • OnMessage Hooks
  • Categories & assignments
  • Pinned chats
  • Contact names
  • Main number setting

āš ļø Note: API key, password, and WhatsApp session are not included for security.

Pm2 Manager

Lihat proses PM2 dan jalankan stop, start, atau restart langsung dari panel.
{{ pm2Error }}
Name ID Status PID CPU Memory Uptime Restarts Actions
{{ proc.name }} {{ proc.pmId }} {{ proc.status }} {{ proc.pid || '—' }} {{ Number(proc.cpu || 0).toFixed(1) }}% {{ formatPm2Memory(proc.memory) }} {{ formatPm2Duration(proc.uptimeMs) }} {{ proc.restarts }}
No PM2 processes found.
Loading PM2 processes...

Scheduled Tasks

Kirim pesan atau update status terjadwal
Mode: Now = jalankan langsung, Specific Time = jalankan sekali di waktu tertentu, Daily = jalankan setiap hari pada jam tertentu, Weekly = jalankan setiap minggu pada hari & jam tertentu.
Timezone: Asia/Jakarta (WIB)
Type Mode Schedule Content Target Last Run Status Actions
{{ t.type === 'status' ? 'šŸ“¢ Status' : 'šŸ’¬ Message' }} {{ t.mode }} — {{ t.scheduledAt }} Every day {{ t.dailyTime }} {{ ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][t.weeklyDay] }} {{ t.weeklyTime }} {{ (t.message || '').substring(0, 40) }}{{ (t.message||'').length > 40 ? '...' : '' }} {{ t.mediaUrls.length }} {{ t.type==='status' ? '—' : (t.targetNumber || '—') }} {{ t.lastRunAt ? new Date(t.lastRunAt).toLocaleString('id-ID') : '—' }} {{ t.enabled ? 'ON' : 'OFF' }}
No scheduled tasks yet
Log: {{ schedLogTask.type }} — {{ schedLogTask.mode }}
{{ schedLogTask.log || 'No logs yet' }}

API Key

Use "main" as number in API calls to auto-resolve to this number.
Use * to allow all. Otherwise one number per line (e.g. 6282146727409). Numbers not listed will be rejected.

šŸ“” API Documentation

Base URL: {{ baseUrl }}

Send to a single number
curl -X POST {{ baseUrl }}/api/send-message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: {{ apiKeyValue }}" \
  -d '{"number": "6282146727409", "message": "Hello!"}'
fetch("{{ baseUrl }}/api/send-message", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "{{ apiKeyValue }}"
  },
  body: JSON.stringify({ number: "6282146727409", message: "Hello!" })
}).then(r => r.json()).then(console.log);
const axios = require('axios');
axios.post('{{ baseUrl }}/api/send-message', {
  number: '6282146727409',
  message: 'Hello!'
}, {
  headers: { 'X-API-Key': '{{ apiKeyValue }}' }
}).then(res => console.log(res.data));
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.post('{{ baseUrl }}/api/send-message',
  data: {'number': '6282146727409', 'message': 'Hello!'},
  options: Options(headers: {'X-API-Key': '{{ apiKeyValue }}'}),
);
print(response.data);
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
  Uri.parse('{{ baseUrl }}/api/send-message'),
  headers: {'Content-Type': 'application/json', 'X-API-Key': '{{ apiKeyValue }}'},
  body: jsonEncode({'number': '6282146727409', 'message': 'Hello!'}),
);
print(response.body);
Send to multiple numbers
curl -X POST {{ baseUrl }}/api/send-message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: {{ apiKeyValue }}" \
  -d '{
  "recipients": ["6282146727409", "628xxx"],
  "message": "Hello everyone!"
}'
fetch("{{ baseUrl }}/api/send-message", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "{{ apiKeyValue }}"
  },
  body: JSON.stringify({
    recipients: ["6282146727409", "628xxx"],
    message: "Hello everyone!"
  })
}).then(r => r.json()).then(console.log);
const axios = require('axios');
axios.post('{{ baseUrl }}/api/send-message', {
  recipients: ['6282146727409', '628xxx'],
  message: 'Hello everyone!'
}, {
  headers: { 'X-API-Key': '{{ apiKeyValue }}' }
}).then(res => console.log(res.data));
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.post('{{ baseUrl }}/api/send-message',
  data: {
    'recipients': ['6282146727409', '628xxx'],
    'message': 'Hello everyone!'
  },
  options: Options(headers: {'X-API-Key': '{{ apiKeyValue }}'}),
);
print(response.data);
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
  Uri.parse('{{ baseUrl }}/api/send-message'),
  headers: {'Content-Type': 'application/json', 'X-API-Key': '{{ apiKeyValue }}'},
  body: jsonEncode({
    'recipients': ['6282146727409', '628xxx'],
    'message': 'Hello everyone!'
  }),
);
print(response.body);
Send to group(s)
curl -X POST {{ baseUrl }}/api/send-message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: {{ apiKeyValue }}" \
  -d '{
  "recipients": ["120363xxx@g.us"],
  "message": "Hello group!"
}'
fetch("{{ baseUrl }}/api/send-message", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "{{ apiKeyValue }}"
  },
  body: JSON.stringify({
    recipients: ["120363xxx@g.us"],
    message: "Hello group!"
  })
}).then(r => r.json()).then(console.log);
const axios = require('axios');
axios.post('{{ baseUrl }}/api/send-message', {
  recipients: ['120363xxx@g.us'],
  message: 'Hello group!'
}, {
  headers: { 'X-API-Key': '{{ apiKeyValue }}' }
}).then(res => console.log(res.data));
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.post('{{ baseUrl }}/api/send-message',
  data: {
    'recipients': ['120363xxx@g.us'],
    'message': 'Hello group!'
  },
  options: Options(headers: {'X-API-Key': '{{ apiKeyValue }}'}),
);
print(response.data);
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
  Uri.parse('{{ baseUrl }}/api/send-message'),
  headers: {'Content-Type': 'application/json', 'X-API-Key': '{{ apiKeyValue }}'},
  body: jsonEncode({
    'recipients': ['120363xxx@g.us'],
    'message': 'Hello group!'
  }),
);
print(response.body);
Send to multiple groups + numbers
curl -X POST {{ baseUrl }}/api/send-message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: {{ apiKeyValue }}" \
  -d '{
  "recipients": [
    "6282146727409",
    "628xxx",
    "120363xxx@g.us",
    "120363yyy@g.us"
  ],
  "message": "Hello!"
}'
fetch("{{ baseUrl }}/api/send-message", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "{{ apiKeyValue }}"
  },
  body: JSON.stringify({
    recipients: [
      "6282146727409",
      "628xxx",
      "120363xxx@g.us",
      "120363yyy@g.us"
    ],
    message: "Hello!"
  })
}).then(r => r.json()).then(console.log);
const axios = require('axios');
axios.post('{{ baseUrl }}/api/send-message', {
  recipients: [
    '6282146727409',
    '628xxx',
    '120363xxx@g.us',
    '120363yyy@g.us'
  ],
  message: 'Hello!'
}, {
  headers: { 'X-API-Key': '{{ apiKeyValue }}' }
}).then(res => console.log(res.data));
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.post('{{ baseUrl }}/api/send-message',
  data: {
    'recipients': [
      '6282146727409',
      '628xxx',
      '120363xxx@g.us',
      '120363yyy@g.us'
    ],
    'message': 'Hello!'
  },
  options: Options(headers: {'X-API-Key': '{{ apiKeyValue }}'}),
);
print(response.data);
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
  Uri.parse('{{ baseUrl }}/api/send-message'),
  headers: {'Content-Type': 'application/json', 'X-API-Key': '{{ apiKeyValue }}'},
  body: jsonEncode({
    'recipients': [
      '6282146727409',
      '628xxx',
      '120363xxx@g.us',
      '120363yyy@g.us'
    ],
    'message': 'Hello!'
  }),
);
print(response.body);
Send to Main Number (use "main")
curl -X POST {{ baseUrl }}/api/send-message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: {{ apiKeyValue }}" \
  -d '{"number": "main", "message": "Hello!"}'
fetch("{{ baseUrl }}/api/send-message", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "{{ apiKeyValue }}"
  },
  body: JSON.stringify({ number: "main", message: "Hello!" })
}).then(r => r.json()).then(console.log);
const axios = require('axios');
axios.post('{{ baseUrl }}/api/send-message', {
  number: 'main',
  message: 'Hello!'
}, {
  headers: { 'X-API-Key': '{{ apiKeyValue }}' }
}).then(res => console.log(res.data));
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.post('{{ baseUrl }}/api/send-message',
  data: {'number': 'main', 'message': 'Hello!'},
  options: Options(headers: {'X-API-Key': '{{ apiKeyValue }}'}),
);
print(response.data);
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
  Uri.parse('{{ baseUrl }}/api/send-message'),
  headers: {'Content-Type': 'application/json', 'X-API-Key': '{{ apiKeyValue }}'},
  body: jsonEncode({'number': 'main', 'message': 'Hello!'}),
);
print(response.body);
Send Image / File from URL
curl -X POST {{ baseUrl }}/api/send-message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: {{ apiKeyValue }}" \
  -d '{
  "number": "6282146727409",
  "message": "Check this image!",
  "media": { "url": "https://example.com/photo.jpg" }
}'
fetch("{{ baseUrl }}/api/send-message", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "{{ apiKeyValue }}"
  },
  body: JSON.stringify({
    number: "6282146727409",
    message: "Check this image!",
    media: { url: "https://example.com/photo.jpg" }
  })
}).then(r => r.json()).then(console.log);
const axios = require('axios');
axios.post('{{ baseUrl }}/api/send-message', {
  number: '6282146727409',
  message: 'Check this image!',
  media: { url: 'https://example.com/photo.jpg' }
}, {
  headers: { 'X-API-Key': '{{ apiKeyValue }}' }
}).then(res => console.log(res.data));
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.post('{{ baseUrl }}/api/send-message',
  data: {
    'number': '6282146727409',
    'message': 'Check this image!',
    'media': { 'url': 'https://example.com/photo.jpg' }
  },
  options: Options(headers: {'X-API-Key': '{{ apiKeyValue }}'}),
);
print(response.data);
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
  Uri.parse('{{ baseUrl }}/api/send-message'),
  headers: {'Content-Type': 'application/json', 'X-API-Key': '{{ apiKeyValue }}'},
  body: jsonEncode({
    'number': '6282146727409',
    'message': 'Check this image!',
    'media': { 'url': 'https://example.com/photo.jpg' }
  }),
);
print(response.body);
Send File with Base64 Data
curl -X POST {{ baseUrl }}/api/send-message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: {{ apiKeyValue }}" \
  -d '{
  "number": "6282146727409",
  "message": "Here is the document",
  "media": {
    "data": "BASE64_ENCODED_DATA",
    "mimetype": "application/pdf",
    "filename": "document.pdf"
  }
}'
fetch("{{ baseUrl }}/api/send-message", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "{{ apiKeyValue }}"
  },
  body: JSON.stringify({
    number: "6282146727409",
    message: "Here is the document",
    media: {
      data: "BASE64_ENCODED_DATA",
      mimetype: "application/pdf",
      filename: "document.pdf"
    }
  })
}).then(r => r.json()).then(console.log);
const axios = require('axios');
const fs = require('fs');
const fileData = fs.readFileSync('document.pdf').toString('base64');
axios.post('{{ baseUrl }}/api/send-message', {
  number: '6282146727409',
  message: 'Here is the document',
  media: {
    data: fileData,
    mimetype: 'application/pdf',
    filename: 'document.pdf'
  }
}, {
  headers: { 'X-API-Key': '{{ apiKeyValue }}' }
}).then(res => console.log(res.data));
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
final dio = Dio();
final bytes = await File('document.pdf').readAsBytes();
final response = await dio.post('{{ baseUrl }}/api/send-message',
  data: {
    'number': '6282146727409',
    'message': 'Here is the document',
    'media': {
      'data': base64Encode(bytes),
      'mimetype': 'application/pdf',
      'filename': 'document.pdf'
    }
  },
  options: Options(headers: {'X-API-Key': '{{ apiKeyValue }}'}),
);
print(response.data);
import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
final bytes = await File('document.pdf').readAsBytes();
final response = await http.post(
  Uri.parse('{{ baseUrl }}/api/send-message'),
  headers: {'Content-Type': 'application/json', 'X-API-Key': '{{ apiKeyValue }}'},
  body: jsonEncode({
    'number': '6282146727409',
    'message': 'Here is the document',
    'media': {
      'data': base64Encode(bytes),
      'mimetype': 'application/pdf',
      'filename': 'document.pdf'
    }
  }),
);
print(response.body);
Send Media Only (no caption)
curl -X POST {{ baseUrl }}/api/send-message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: {{ apiKeyValue }}" \
  -d '{
  "number": "6282146727409",
  "media": { "url": "https://example.com/photo.jpg" }
}'
// Same as above examples, just omit the "message" field.
// Only "number" (or "recipients") + "media" is required.
šŸ“Œ Notes:
  • Use "number" for a single recipient or "recipients" array for multiple.
  • Use "main" as number to send to your configured Main Number ({{ mainNumber }}).
  • Phone numbers: use country code without + (e.g. 6282146727409).
  • Group IDs: use the full ID ending with @g.us (e.g. 120363xxx@g.us).
  • You can mix phone numbers and group IDs in the "recipients" array.
  • Media: Use "media": {"url": "..."} to send from a URL, or "media": {"data": "BASE64", "mimetype": "...", "filename": "..."} for base64.
  • "message" is optional when sending media — it becomes the caption. You can send media without text.
  • Either "message" or "media" (or both) must be provided.
  • Reference ID: Pass "reference_id" to tag messages with your own tracking ID.

šŸ” Check Message Status

Check the delivery status of a queued message by its queue ID or your custom reference_id.

GET /api/message-status/:id
Send with reference_id
curl -X POST {{ baseUrl }}/api/send-message \
  -H "Content-Type: application/json" \
  -H "X-API-Key: {{ apiKeyValue }}" \
  -d '{
  "number": "6282146727409",
  "message": "Hello!",
  "reference_id": "order-12345"
}'
fetch("{{ baseUrl }}/api/send-message", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "{{ apiKeyValue }}"
  },
  body: JSON.stringify({
    number: "6282146727409",
    message: "Hello!",
    reference_id: "order-12345"
  })
}).then(r => r.json()).then(console.log);
const axios = require('axios');
axios.post('{{ baseUrl }}/api/send-message', {
  number: '6282146727409',
  message: 'Hello!',
  reference_id: 'order-12345'
}, {
  headers: { 'X-API-Key': '{{ apiKeyValue }}' }
}).then(res => console.log(res.data));
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.post('{{ baseUrl }}/api/send-message',
  data: {
    'number': '6282146727409',
    'message': 'Hello!',
    'reference_id': 'order-12345'
  },
  options: Options(headers: {'X-API-Key': '{{ apiKeyValue }}'}),
);
print(response.data);
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
  Uri.parse('{{ baseUrl }}/api/send-message'),
  headers: {'Content-Type': 'application/json', 'X-API-Key': '{{ apiKeyValue }}'},
  body: jsonEncode({
    'number': '6282146727409',
    'message': 'Hello!',
    'reference_id': 'order-12345'
  }),
);
print(response.body);
Check status
curl {{ baseUrl }}/api/message-status/order-12345 \
  -H "X-API-Key: {{ apiKeyValue }}"
fetch("{{ baseUrl }}/api/message-status/order-12345", {
  headers: { "X-API-Key": "{{ apiKeyValue }}" }
}).then(r => r.json()).then(console.log);
const axios = require('axios');
axios.get('{{ baseUrl }}/api/message-status/order-12345', {
  headers: { 'X-API-Key': '{{ apiKeyValue }}' }
}).then(res => console.log(res.data));
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.get('{{ baseUrl }}/api/message-status/order-12345',
  options: Options(headers: {'X-API-Key': '{{ apiKeyValue }}'}),
);
print(response.data);
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.get(
  Uri.parse('{{ baseUrl }}/api/message-status/order-12345'),
  headers: {'X-API-Key': '{{ apiKeyValue }}'},
);
print(jsonDecode(response.body));
Response
{
  "id": "uuid-queue-id",
  "reference_id": "order-12345",
  "number": "6282146727409",
  "chatId": "6282146727409@c.us",
  "message": "Hello!",
  "status": "sent",   // pending | sending | sent | failed
  "error": null,
  "createdAt": 1709654400000,
  "sentAt": 1709654405000
}