A WhatsApp HTTP API + dashboard you actually own. Ship a Go binary, point your n8n / Zapier / curl at it, done. No SaaS bill. No vendor lock-in.
# 1. run it — one prebuilt image, gateway + dashboard $ docker run -d -p 3000:3000 \ -e ADMIN_PASS=strong-pass \ -v waapi_data:/app/storages \ ghcr.io/mecaca-global-inc/waapi-gateway:latest # 2. login → get an API key $ curl -sX POST http://localhost:3000/api/login \ -H 'Content-Type: application/json' \ -d '{"username":"admin","password":"strong-pass"}' {"api_key":"8604c43f-d6b3-4305-b77f-8888d519ab07"} # 3. send a message $ curl -sX POST http://localhost:3000/api/sendText \ -H "Authorization: Bearer $KEY" \ -H 'Content-Type: application/json' \ -d '{"session":"main","chat_id":"6281234567890","text":"hello 👋"}' {"id":"3EB0...","timestamp":1747100000}▍
A single binary. A pretty dashboard. Everything you'd build yourself, but on day one.
Run multiple WhatsApp accounts inside one process. Routed by session name.
Login by scanning a QR or entering an 8-digit code on your phone.
Text, image, video, voice (PTT), file, location, contact (vCard).
HMAC-SHA256 signed. Retries with backoff. Filter by event.
Auto-matches the chat's disappearing-messages timer. No "old version" warnings.
WebSocket /ws pushes events to the dashboard in realtime.
Create groups, add/remove/promote members, rename, lock, invite links — full REST surface.
Next.js UI baked into the binary. One URL: send playground, webhooks, embedded Swagger.
SQLite by default. Drop a postgres URL into DB_URI for prod.
Gateway + dashboard in a single 60 MB image. docker run and you're live.
Set DEVICE_NAME — the WhatsApp Linked Devices screen shows your label.
Weak-password boot guard, login rate-limit, hashed API keys, constant-time compares.
One prebuilt image. Gateway and dashboard in the same container — no separate frontend to host, no CORS to wrangle.
ghcr.io/mecaca-global-inc/waapi-gateway — multi-arch, amd64 + arm64.ADMIN_PASS — boot refuses weak defaults./app/storages so sessions survive restarts.# bare docker $ docker run -d -p 3000:3000 \ -e ADMIN_PASS=strong-pass \ -v waapi_data:/app/storages \ ghcr.io/mecaca-global-inc/waapi-gateway:latest # or any container PaaS — Zeabur, Railway, # Render, Fly, Coolify: add the image as a # service, set ADMIN_PASS, mount a volume. # dashboard + API + docs all on one URL: http://localhost:3000
{
"session": "default",
"chat_id": "6281234567890",
"text": "hello"
}
{
"session": "default",
"chat_id": "...@lid",
"url": "https://.../pic.jpg",
"caption": "check this"
}
{
"event": "message",
"session": "default",
"payload": {
"chat": "...@lid",
"body": "hi",
"from_me": false
}
}
No microservice maze. A 33 MB Go binary, a SQLite file, an env file. scp and you're live.
Go on the back, Next.js on the front, Tailwind for paint. Nothing exotic to learn at 3 a.m.
Refuses to boot with weak admin creds. Rate-limited login. Constant-time compares. Hashed key storage. HMAC-signed webhooks.
MIT-licensed. Your data lives on your disk. Switch off the server — you keep the code, the SQLite, and the sessions.
No. Independent open-source project. For commercial use, also consider the official WhatsApp Business API.
WhatsApp can ban any unofficial client at any time. Don't spam. Don't blast cold lists. Respect from_me=false filters in your automations to avoid reply loops.
Yes. Multi-arch Docker (amd64 + arm64) builds in CI. SQLite default keeps the footprint tiny.
Point a webhook at your n8n / Zapier / FastAPI / Express server. Filter event=="message" & from_me==false. POST back to /api/sendText with chat_id = payload.chat.
Email security@waapi.link. Don't open a public issue for vulns.
Self-host in 60 seconds. Star the repo if it saved you a SaaS subscription.