WA Gateway
Disconnected
...
user
Dashboard
Logout
Main
Dashboard
Send Message
Bulk Messages
My Groups
Broadcast
Message Logs
Developer
API Docs
Apps Script
Webhooks
System
Activity Log
Settings
Dashboard
WhatsApp Gateway overview
Sent Today
Total Sent (All-Time)
WA Status
Session
WhatsApp Connection
Disconnected
Not connected — scan QR to connect
Click Start Session
QR Code

Steps to connect:
1. Start Session click karo
2. QR code wait karo (~5s)
3. WhatsApp → Linked Devices
4. Link a Device → QR scan karo

Manage Your API Key
Go to Settings → API Key section to view, copy, or regenerate
Send Message
Single message — global 25s rate limit applies
India: 91 + 10 digit mobile number
🔒 Anti-ban policy: Server enforces minimum 25 seconds between any two messages. Same rate limit applies to media.
Recent Messages

No messages sent yet

Bulk Messages
Multiple contacts — anti-ban delays built-in (server-side queue)
Anti-Ban Delay Policy (locked)
25s
Between Each Message
20
Messages per Batch
2 min
Rest After Each Batch
⚡ Sab messages zarur jaayenge — server queue mein process honge. Dashboard band karne se queue nahi rukti.
0 numbers
My Groups
WhatsApp groups you are part of
All Groups
Group NameGroup IDMembersActions
Click Refresh to load your groups
About Group Messaging
📋
Group JID Format
Format: XXXXXXXXXX@g.us — yeh WhatsApp ka internal group identifier hai
💬
Send to Single Group
Each group ke "Send" button se direct message bhej sakte ho
📢
Broadcast to Multiple
Broadcast tab pe jao — multiple groups select karke ek hi message sabko ek saath bhejo
Broadcast to Groups
Multiple groups mein ek saath message bhejo
Step 1 — Select Groups
Click Reload to load groups
Selected: 0 groups
Step 2 — Message
Max 4096 characters. Same message will be sent to all selected groups.
Anti-Ban Delays (server-enforced)
25s
PER MESSAGE
20
BATCH SIZE
2 min
BATCH REST
Message Logs
All sent messages — kisko gaya, kya gaya, kab gaya
Total Messages
Sent
Failed
Today
Recent Messages
TimeTypeToMessageStatus
Loading messages...
API Documentation
Send WhatsApp messages programmatically — simple REST API
Quick Start (60 seconds)
Step 1: Get your API key from Settings → API Key
Step 2: Add header x-api-key: YOUR_KEY to every request
Step 3: POST JSON to base URL endpoints → done!
# Send your first message — copy + paste in terminal curl -X POST \ -H "Content-Type: application/json" \ -H "x-api-key: YOUR_API_KEY" \ -d '{"phone":"919876543210","message":"Hello from WA Gateway!"}'
Base URL & Authentication
Base URL
Required Header
x-api-key: YOUR_API_KEY

⚠ Without this header, all requests fail with 401 Unauthorized

📤 Send Messages
POST/send-messageText to a contact
POST/send-mediaImage, PDF, or document to a contact
POST/send-groupText to a group
POST/send-media-groupImage, PDF, or document to a group
POST/send-bulkBulk send to multiple contacts (max 500)
POST/broadcastSame message to multiple groups (max 100)
📊 Status & Data
GET/statusConnection status + daily/total counts
GET/qrGet QR code for connecting WhatsApp
GET/groupsList all groups you are part of
GET/messagesRecent message logs + stats
🔗 Webhooks
POST/wh/in/<trigger_token>🔥 Incoming — external services trigger WhatsApp send
GET/webhookGet outgoing webhook config
PUT/webhookConfigure outgoing webhook URL + events
POST/webhook/testFire test webhook event
GET/webhook/deliveriesRecent webhook delivery log
⚙️ Account & Session
POST/change-passwordChange your password (needs current)
POST/api-key/regenerateGet a new API key (needs password)
POST/trigger-token/regenerateGet a new trigger URL (needs password)
POST/restartRestart your WhatsApp session
POST/logoutLogout WhatsApp + clear session files
POST /send-message
ParameterTypeRequiredDescription
phonestringRequiredCountry code + number (e.g. 919876543210)
messagestringRequiredText, max 4096 chars
typing_delaybooleanOptionalShow typing indicator (default: true)
random_delaybooleanOptional1-3s human delay (default: true)
// Request body { "phone": "919876543210", "message": "Hello!" } // Success response { "success": true, "messageId": "ABC123", "sent_by": "username" } // Error response { "error": "WhatsApp not connected" }
POST /send-group
// Send message to a single group { "group_id": "123456789-987654321@g.us", "group_name": "My Family Group", "message": "Hello everyone! 👋" } // Success response { "success": true, "messageId": "ABC123", "group_id": "...@g.us" }
POST /send-media (image / PDF / document)
ParameterTypeRequiredDescription
phonestringRequiredCountry code + number
typestringRequiredimage, document, pdf, or video
media_urlstringOne of thesePublic URL of the file
media_base64stringOne of theseBase64-encoded file data
filenamestringOptionalFilename (for documents)
mimetypestringOptionale.g. application/pdf
captionstringOptionalCaption text shown with file
// Image via URL (easiest for Apps Script — use public link) { "phone": "919876543210", "type": "image", "media_url": "https://example.com/photo.jpg", "caption": "Check this out! 📸" } // PDF via base64 (for local files) { "phone": "919876543210", "type": "pdf", "media_base64": "JVBERi0xLjQKJ...", "filename": "invoice.pdf", "caption": "Your invoice" } // Same format for groups → use /send-media-group with group_id
POST /send-bulk
{ "contacts": [ { "phone": "919876543210", "name": "Rahul" }, { "phone": "918765432109", "name": "Priya" } ], "message": "Hello {{name}}, order ready hai! 🎉", "delay_sec": 3 }
POST /broadcast
// Broadcast same message to multiple groups { "groups": [ { "id": "123-456@g.us", "name": "Family" }, { "id": "789-012@g.us", "name": "Office" } ], "message": "Important announcement! 📢", "delay_sec": 5 }
GET /messages
// Query params (all optional): ?type=single|group|broadcast&status=sent|failed&limit=200 { "success": true, "stats": { "total":42, "sent":40, "failed":2, "today":12 }, "messages": [ { "id":"m_abc", "type":"single", "to":"919...", "toName":"+919...", "message":"Hi!", "status":"sent", "timestamp":"2026-..." } ] }
Google Apps Script
Ready-made integration code
Step 1 — Config + Library
// ═══════════════════════════════════ // WA Gateway — Apps Script Library // ═══════════════════════════════════ const WA = { url: , key: "apni_api_key_yahan" }; function _wa(m, p, b) { var o = { method:m, headers:{ "x-api-key":WA.key, "Content-Type":"application/json" }, muteHttpExceptions:true }; if(b) o.payload = JSON.stringify(b); return JSON.parse(UrlFetchApp.fetch(WA.url+"/api/v1"+p, o).getContentText()); } function waStatus() { return _wa("get","/status"); } function waGroups() { return _wa("get","/groups"); } function waMessages() { return _wa("get","/messages"); } function waSend(phone,msg) { return _wa("post","/send-message",{phone,message:msg}); } function waSendImage(phone,url,cap) { return _wa("post","/send-media",{phone,type:"image",media_url:url,caption:cap||""}); } function waSendPDF(phone,url,name,cap){ return _wa("post","/send-media",{phone,type:"pdf",media_url:url,filename:name,caption:cap||""}); } function waSendGroup(gid,msg) { return _wa("post","/send-group",{group_id:gid,message:msg}); } function waBulk(contacts,msg,d) { return _wa("post","/send-bulk",{contacts,message:msg,delay_sec:d||3}); } function waBroadcast(groups,msg,d) { return _wa("post","/broadcast",{groups,message:msg,delay_sec:d||5}); }
Step 2 — Test karo
function testWA() { var s = waStatus(); Logger.log("Connected: " + s.connected + " | Sent today: " + s.daily_sent); if(!s.connected) { Logger.log("❌ QR scan karo pehle"); return; } var r = waSend("919876543210", "Hello! Test from Apps Script 🎉"); Logger.log(r.success ? "✅ Sent!" : "❌ "+r.error); }
Step 3 — Google Sheet se bulk bhejo

Sheet: Column A = phone number, Column B = name

function sendFromSheet() { var rows = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getDataRange().getValues(); var contacts = []; for(var i=1; i<rows.length; i++) { if(rows[i][0]) contacts.push({ phone: rows[i][0].toString().trim(), name: rows[i][1]||"there" }); } Logger.log(contacts.length + " contacts found"); var r = waBulk(contacts, "Hello {{name}}, aapka message ready hai! 🎉", 4); Logger.log("Queued: " + r.queued); }
Step 4 — Daily Auto Trigger (roz 9 baje)
function setDailyTrigger() { ScriptApp.newTrigger("dailyMsg").timeBased().everyDays(1).atHour(9).create(); Logger.log("Daily trigger set for 9 AM!"); } function dailyMsg() { if(!waStatus().connected) { Logger.log("WA not connected"); return; } waSend("919876543210", "Good morning! Aaj ka update: " + new Date().toLocaleDateString("en-IN")); Logger.log("Daily message sent!"); }
Webhooks
Trigger URL (incoming) + Event Webhooks (outgoing)
Your Trigger URL Incoming

Yeh tumhari personal URL hai — bilkul API key ki tarah auto-generated. External services (Razorpay, Shopify, Forms, Zapier, n8n) is URL pe POST karenge → automatically WhatsApp message bhej dega.

POST to this URL — sends WhatsApp message
Loading...
📨 How to Use
Step 1: Copy the URL above
Step 2: Paste in your external service (Razorpay webhook, Shopify, n8n, etc.)
Step 3: External service POSTs JSON to URL → WhatsApp message goes out
Step 4: If URL leaks, click Regenerate to get a new one
Body Format (flexible field names):
// Send to a phone number { "phone": "919876543210", "message": "Hello! New order received 🎉" } // Send to a group { "group_id": "123-456@g.us", "message": "Team update!" } // Field aliases supported: // phone = to | number | recipient | mobile // message = text | body | content | msg
// cURL example curl -X POST YOUR_URL \ -H "Content-Type: application/json" \ -d '{"phone":"919876543210","message":"Hi from trigger URL!"}'
Event Webhook Outgoing
Loading...

Server tumhare URL pe events POST karega — message sent/received/read/delivered/connection status.

When events happen, server POSTs JSON to this URL
If set, each request includes X-Webhook-Signature: sha256=... header
Select which events should trigger your webhook. Leave all unchecked to receive ALL events.
Recent Deliveries
TimeEventStatusCodeAttempt
Loading...
Webhook Payload Format
// Every webhook request looks like this: { "event": "message.received", "timestamp": "2026-05-14T10:30:00.000Z", "userId": "usr_abc123", "data": { /* event-specific data */ } } // Headers included with every request: Content-Type: application/json X-Webhook-Event: message.received X-Webhook-Id: wh_abc12345 X-Webhook-Timestamp: 1715680800000 X-Webhook-Signature: sha256=... // only if secret is set
Event Examples
📥 message.received (Receiver)
{ "event": "message.received", "data": { "message_id": "ABC123", "from": "919876543210", "from_jid": "919876543210@s.whatsapp.net", "from_name": "Rahul", "is_group": false, "group_id": null, "type": "text", "text": "Hello!", "media": null, "received_at": "2026-05-14T10:30:00Z" } }
📤 message.sent (Sender)
{ "event": "message.sent", "data": { "message_id": "XYZ789", "to": "919876543210", "type": "single", "content": "Hi there!" } }
✓✓ message.delivered / 👁 message.read
{ "event": "message.read", "data": { "message_id": "XYZ789", "to": "919876543210", "is_group": false } }
🔌 connection.connected / connection.disconnected
{ "event": "connection.connected", "data": { "phone_number": "919876543210", "name": "My Name" } }
Signature Verification (Node.js)
const crypto = require('crypto'); function verifyWebhook(rawBody, signature, secret) { const expected = 'sha256=' + crypto.createHmac('sha256', secret) .update(rawBody).digest('hex'); return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected)); } // In Express: app.post('/webhook', express.raw({type:'*/*'}), (req, res) => { const sig = req.headers['x-webhook-signature']; if (!verifyWebhook(req.body, sig, 'YOUR_SECRET')) { return res.status(401).send('invalid signature'); } const payload = JSON.parse(req.body); // Handle payload.event... res.json({received: true}); });
Manage Users
Admin panel — user access control
All Users
UsernameRoleAPI KeyTodayTotalActions
Loading...
Manage Panel
Admin control center — coupons, settings, analytics
Total Users
Active Sessions
Total Messages
Active Coupons
Create New Coupon
For %: 1-100. For others: any number
All Coupons
CodeTypeValueUsed / MaxValid UntilStatusActions
Loading...
Settings
Manage your profile, security, and preferences
Profile
Username
Role
User ID
Total Messages Sent
API Key
Personal

API key requests authenticate karne ke liye hai. Use as x-api-key header.

Your API Key
••••••••••••••••••••••••••••••••••
Trigger URL (Incoming Webhook)
Personal

External services POST karte hain is URL pe → WhatsApp message bhejti hai. Settings/Webhooks tab dekho details ke liye.

Change Password
Appearance
Activity Log
Real-time session activity
● Live
No activity yet