WA Bot

{{ loginError }}

Dashboard

{{ waStatus }}
WhatsApp Status
{{ stats.autoreply }}
Auto-Reply Rules
{{ stats.commands }}
Quick Commands
Scan QR Code
Open WhatsApp → Settings → Linked Devices

WhatsApp disconnected

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

KeywordMatchModeResponse / ScriptStatusActions
{{ r.keyword }} {{ r.matchType }} {{ r.mode === 'script' ? '⚡ Script' : 'đŸ’Ŧ Message' }} {{ r.mode === 'script' ? (r.script || '').substring(0, 60) + '...' : r.response }} {{ r.enabled ? 'ON' : 'OFF' }}
No rules yet

Quick Commands

CommandModeReply / ScriptStatusActions
{{ c.command }} {{ c.mode === 'script' ? '⚡ Script' : 'đŸ’Ŧ Message' }} {{ c.mode === 'script' ? (c.script || '').substring(0, 60) + '...' : c.replyMessage }} {{ 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
#RecipientMessageStatusCreatedSent
{{ idx + 1 }} {{ 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.

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.

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);
📌 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.