Self-hosted WhatsApp gateway
Your WhatsApp number, now with an API.
Scan a QR code, copy your token, and send order updates, invoices and reminders straight from your backend. Replies land on your webhook, or you can answer them yourself in the web inbox.
- Setup
- ~2 minutes
- Media
- Up to 16 MB
- Per message
- $0
curl https://your-host/api/send \ -H "Authorization: Bearer $WAAPI_TOKEN" \ -H "Content-Type: application/json" \ -d '{"to": "923001234567", "text": "Order #1042 has shipped š"}'
await fetch("https://your-host/api/send", { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" }, body: JSON.stringify({ to: "923001234567", text: "Order #1042 has shipped š" }), });
Http::withToken($token) ->post('https://your-host/api/send', [ 'to' => '923001234567', 'text' => 'Order #1042 has shipped š', ]) ->throw();
import requests requests.post("https://your-host/api/send", headers={"Authorization": f"Bearer {token}"}, json={"to": "923001234567", "text": "Order #1042 has shipped š"})
Everything happens on the number you already have.
waapi links as a device, the same way WhatsApp Web does. Your phone keeps working, customers see your usual name and photo, and the whole thing runs on your own server.
A shared inbox in the browser
Every chat on the number shows up live, including messages sent from the phone. Reply with text or files and watch the read ticks turn blue.
- SKSana KhanBefore Friday?
- BHBilal H.invoice-1039.pdf
- MRMaria R.Thanks š
Linked in one scan
Settings ā Linked devices ā Link a device. No Meta review, no business verification. Prefer a code? Use the 8-digit pairing code instead.
Webhooks you can trust
Incoming messages are POSTed to your URL as JSON, signed with HMAC-SHA256 and a timestamp so replays get rejected. Failed deliveries are retried.
X-WaApi-Signature: sha256=9f2cā¦e1 { "event": "message", "from": "923339876543", "push_name": "Sana", "type": "text", "text": "Great, can I get it before Friday?" }
Sends at a human pace
Messages from one number go out one at a time with a random 1.5ā4 second gap, under a daily cap you set. Your code fires and forgets; the queue does the waiting.
How it works
From sign-up to first message before your coffee cools.
-
01
Add a number
Create an account and click Add number. You can run a few numbers from one account, each with its own token.
-
02
Scan from your phone
Point WhatsApp at the QR code. The session is saved, so it reconnects by itself after restarts.
-
03
Call
/api/sendFrom PHP, Node, Python, a cron job or a no-code tool. Anything that can make an HTTP request works.
The honest part
Great for some jobs. Wrong for others.
waapi isn't Meta's official Business API. That's why it's free and takes minutes to set up, but it also means WhatsApp can ban numbers that act like spammers. Use it for messages people are expecting.
Use it for
- Order and delivery updates
- Appointment and payment reminders
- Invoices and receipts as PDFs
- Replying to customers who wrote first
Don't use it for
- Marketing blasts and broadcasts
- Cold messages to bought lists
- Login codes you can't afford to lose
- Anything you'd hate to receive