WhatsApp has no simple, self-hostable API for developers — official integrations go through the Business Platform with its own pricing and approval flow. WAHA (WhatsApp HTTP API) fills the gap: it runs a WhatsApp session you control and exposes it as REST endpoints and webhooks.
How it works
WAHA runs the NOWEB engine — it connects to WhatsApp like a linked device does (scan a QR code or use a pairing code), then keeps that session alive on your instance. From there:
- Your backend calls REST endpoints to send messages, images, and manage chats
- WAHA fires webhooks back at your app for incoming messages and session events
A session in three steps
- Start a session — create one through the dashboard or the API (the default session is usually enough)
- Link the device — scan the QR with the WhatsApp account you want to use, like linking WhatsApp Web
- Call the API — send your first message:
curl -X POST https://your-pod-address/api/sendText \
-H "Content-Type: application/json" \
-H "X-Api-Key: your-api-key" \
-d '{
"session": "default",
"chatId": "1234567890@c.us",
"text": "hello from WAHA"
}'
Webhooks for the inbound side
Register a webhook URL and WAHA pushes events to your app — new messages, delivery receipts, session status changes. That’s how you build notification bots, order updates, or support flows without polling.
What about costs and limits
WAHA itself doesn’t charge per message — you run the session, you use your account. The real cost is running it: the engine keeps a persistent WhatsApp session, which means the instance it lives on has to stay up, and session data must survive restarts. That makes it a poor fit for serverless and a good fit for a dedicated always-on instance.
The Pod card below runs WAHA for you — dashboard, persistent session storage, and its own Address so your webhooks and API calls have a stable HTTPS home.