Go Whatsapp Web Multidevice
GOWA - WhatsApp REST API with support for UI, Multi Account, Webhooks, and MCP, and Chatwoot. Built with Golang for efficient memory use.
Install / Use
npx skills add aldinokemal/go-whatsapp-web-multideviceInstalls into whichever agent you are using.
README
Golang WhatsApp - Built with Go for efficient memory use
</div>
If you're using this tools to generate income, consider supporting its development by becoming a Patreon member!
Your support helps ensure the library stays maintained and receives regular updates!
Support for ARM & AMD Architecture along with MCP Support
Download:
Support n8n package (n8n.io)
- n8n package
- Go to Settings -> Community Nodes -> Input
@aldinokemal2104/n8n-nodes-gowa-> Install
Breaking Changes
-
v6- For REST mode, you need to run
<binary> restinstead of<binary>- for example:
./whatsapp restinstead of ~~./whatsapp~~
- for example:
- For MCP mode, you need to run
<binary> mcp- for example:
./whatsapp mcp
- for example:
- For REST mode, you need to run
-
v7- Starting version 7.x we are using goreleaser to build the binary, so you can download the binary from release
-
v8-
Multi-device support: You can now connect and manage multiple WhatsApp accounts simultaneously in a single server instance
-
New Device Management API: New endpoints under
/devicesfor managing multiple devices -
Device scoping required: All device-scoped REST API calls now require either:
X-Device-Idheader, ordevice_idquery parameter- If only one device is registered, it will be used as the default
-
WebSocket device scoping: Connect to
/ws?device_id=<id>to scope WebSocket to a specific device -
Remote UI support: CORS allows the
AuthorizationandX-Device-Idheaders, so a standalone web UI (e.g. gowa-ui) hosted on another origin can call the API directly.GET /app/infoexposes version and media size limits. Since browsers cannot set headers on WebSocket connections, pass/ws?device_id=<id>&authorization=<base64(user:pass)>when basic auth is enabled (use TLS — the credential is visible in the URL) -
Webhook payload changes: All webhook payloads now include a top-level
device_idfield identifying which device received the event:```json { "event": "message", "device_id": "628123456789@s.whatsapp.net", "payload": { ... } } ```
-
-
v9- UI moved to a separate repository: The web dashboard is no longer bundled in this repo. It now lives at
aldinokemal/gowa-ui and ships as a single self-contained
gowa-ui.html. This server is now a pure API backend that downloads the latest dashboard release at startup, verifies its sha256 digest, caches it understorages/ui/, and serves it at/. See Web dashboard (gowa-ui) for theAPP_UI_*settings, supply-chain pinning, and air-gapped deployment.
- UI moved to a separate repository: The web dashboard is no longer bundled in this repo. It now lives at
aldinokemal/gowa-ui and ships as a single self-contained
Feature
-
Send WhatsApp message via http API, docs/openapi.yaml for more details
-
MCP (Model Context Protocol) Server Support - Integrate with AI agents and tools using standardized protocol
-
Mention someone
@phoneNumber- example:
Hello @628974812XXXX, @628974812XXXX
-
Ghost Mentions (Mention All) - Mention group participants without showing
@phonein message text- Pass phone numbers in
mentionsfield to mention users without visible@in message - Use special keyword
@everyoneto automatically mention ALL group participants - UI checkbox available in Send Message modal for groups
- Pass phone numbers in
-
Post Whatsapp Status
-
Send Stickers - Automatically converts images to WebP sticker format
- Supports JPG, JPEG, PNG, WebP, and GIF formats
- Automatic resizing to 512x512 pixels
- Preserves transparency for PNG images
- Animated WebP stickers are supported but must meet WhatsApp requirements:
- Must be exactly 512x512 pixels
- Must be under 500KB file size
- Maximum 10 seconds duration
- If your animated sticker doesn't meet these requirements, please resize it before uploading using tools like ezgif.com
-
Compress image before send
-
Compress video before send
-
Change OS name become your app (it's the device name when connect via mobile)
--os=Chromeor--os=MyApplication
-
Basic Auth (able to add multi credentials)
--basic-auth=kemal:secret,toni:password,userName:secretPassword, or you can simplify-b=kemal:secret,toni:password,userName:secretPassword
-
Subpath deployment support
--base-path="/gowa"(allows deployment under a specific path like/gowa/sub/path)
-
Customizable port and debug mode
--port 8000--debug true
-
Auto reply message
--autoreply="Don't reply this message"
-
Auto mark read incoming messages
--auto-mark-read=true(automatically marks incoming messages as read)
-
Auto download media from incoming messages
--auto-download-media=false(disable automatic media downloads, default:true)
-
Auto reject incoming calls
--auto-reject-call=trueorWHATSAPP_AUTO_REJECT_CALL=true(see Webhook Payload for call events)
-
Configurable presence on connect
--presence-on-connect=unavailableorWHATSAPP_PRESENCE_ON_CONNECT=unavailableavailable— mark as online (suppresses phone notifications)unavailable— register pushname without going online (default, preserves phone notifications)none— skip presence entirely (pushname won't be registered, contacts may see "-" as name)
-
Daily presence pulse
--presence-pulse-enabled=trueorWHATSAPP_PRESENCE_PULSE_ENABLED=true(default:true)--presence-pulse-interval=24hcontrols how often each connected device is pulsed--presence-pulse-duration=5mcontrols how long the account staysavailablebefore returning tounavailable
-
Webhook for received message
--webhook="http://yourwebhook.site/handler", or you can simplify-w="http://yourwebhook.site/handler"- for more detail, see Webhook Payload Documentation
-
Per-Device Webhook - Each device can have its own webhook URL
- Set via API:
PATCH /devices/:device_id/webhookwith{"webhook_url": "https://device-webhook.site/handler"} - Get via API:
GET /devices/:device_id/webhook - When a device has a custom webhook, events for that device are sent to the device-specific URL
- When no device webhook is set, events fall back to the global webhook (
--webhook) - Set to empty string
""via PATCH to clear and use global webhook
- Set via API:
-
Webhook Secret Our webhook will be sent to you with an HMAC header and a sha256 default key
secret.You may modify this by using the option below:
--webhook-secret="secret"
-
Webhook Payload Documentation For detailed webhook payload schemas, security implementation, and integration examples, see Webhook Payload Documentation
-
Webhook Event Filtering You can filter which events are forwarded to your webhook using:
--webhook-events="message,message.ack"(comma-separated list)- Or environment variable:
WHATSAPP_WEBHOOK_EVENTS=message,message.ack
Available Webhook Events:
| Event | Description | |----------------------|-----------------------------------------------| |
message| Text, media, contact, location messages | |message.reaction| Emoji reactions to messages | |message.revoked| Deleted/revoked messages | |message.edited| Edited messages | |message.ack| Delivery and read receipts | |message.deleted| Messages deleted for the user | |chat_presence| Typing and recording indicators from contacts | |group.participants| Group member join/leave/promote/demote events | |group.joined| You were added to a group | |label.edit| WhatsApp label metadata changed | |label.association| Label applied to or removed from a chat | |newsletter.joined| You subscribed to a newsletter/channel | |newsletter.left| You unsubscribed from a newsletter | |newsletter.message| New message(s) posted in a newsletter | |newsletter.mute| Newsletter mute setting changed | |call.offer| Incoming call received |If not configured (empty), all events will be forwarded.
-
Webhook JID Filtering
You can skip events for specific chats or senders (e.g. mute all groups) before they are forwarded:
--webhook-ignore-jids="@g.us,628123456789@s.whatsapp.net"(comma-separated list)- Or environment variable: `WHATSAPP_WEBHOOK_IGNO
Related Skills
healthcheck
385.5kAudit/harden OpenClaw hosts: SSH, firewall, updates, exposure, backups, disk encryption, gateway security.
node-connect
385.5kDiagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.
skill-creator
385.5kCreate, edit, audit, tidy, validate, or restructure AgentSkills and SKILL.md files.
taskflow
385.5kCoordinate multi-step detached tasks as one durable TaskFlow job with owner context, state, waits, and child tasks.
