Install
openclaw skills install gowaInteract with WhatsApp via GOWA (Go WhatsApp Web Multi-Device) REST API for personal automation. Supports sending messages with ghost mentions (@everyone), images, documents, group management, and more. Always use REST mode (http://localhost:3000) for production.
openclaw skills install gowaInteract with WhatsApp through GOWA (Go WhatsApp Web Multi-Device) REST API for personal automation tasks.
GOWA is available at: https://github.com/aldinokemal/go-whatsapp-web-multidevice
Go to the releases page and download the zip matching your OS and architecture.
Release files are named: whatsapp_VERSION_OS_ARCH.zip
Available platforms: linux (amd64/arm64/386), darwin (amd64/arm64), windows (amd64/386)
./gowa rest
The server starts on http://localhost:3000 by default.
Open http://localhost:3000 in a browser, scan the QR code with WhatsApp on your phone to link the device.
GOWA runs in REST mode:
http://localhost:3000X-Device-Id header needed for single-device setups.⚠️ Important: Use REST API (port 3000) only. Do NOT use MCP mode - all schedulers and automation depend on REST.
curl -X POST http://localhost:3000/send/message \
-H "Content-Type: application/json" \
-d '{
"phone": "120363040656010581@g.us",
"message": "Important announcement",
"mentions": ["@everyone"]
}'
curl -X POST http://localhost:3000/send/message \
-H "Content-Type: application/json" \
-d '{"phone": "628123456789", "message": "Hello!"}'
curl -X POST http://localhost:3000/send/image \
-F "phone=628xxx" \
-F "caption=Photo" \
-F "image=@/path/to/image.jpg"
curl http://localhost:3000/app/status | jq .
Send Text with Ghost Mention:
POST /send/message{"phone": "group@g.us", "message": "text", "mentions": ["@everyone"]}Reply to Message:
{"phone": "...", "message": "...", "reply_message_id": "msg_id"}Disappearing Message:
{"phone": "...", "message": "...", "duration": 86400} (seconds)Forward Message:
{"phone": "...", "message": "...", "is_forwarded": true}Send Image:
POST /send/imagephone, caption, image (file), compress (bool)Send Document:
POST /send/filephone, caption, fileSend Video:
POST /send/videophone, caption, video, compress (bool)Send Audio:
POST /send/audiophone, audioSend Sticker:
POST /send/stickerphone, sticker (auto-converts to WebP)Send Contact:
POST /send/contact{"phone": "...", "contact_name": "...", "contact_phone": "..."}Send Location:
POST /send/location{"phone": "...", "latitude": 0.0, "longitude": 0.0}Send Link:
POST /send/link{"phone": "...", "link": "...", "caption": "..."}Send Poll:
POST /send/poll{"phone": "...", "question": "...", "options": ["A", "B"]}Get Status:
GET /app/status{"is_connected": true, "is_logged_in": true}Reconnect:
GET /app/reconnectLogout:
GET /app/logoutGet QR Code (for login):
GET /app/loginLogin with Pairing Code:
GET /app/login-with-code?phone=628xxxList My Groups:
GET /user/my/groups{results: {data: [...]}} - groups array is at .results.datacurl ... | jq '.results.data[] | {Name, JID, Members: .Participants | length}'Get Group Info:
GET /group/info?group_jid=xxx@g.usCreate Group:
POST /group{"name": "Group Name", "participants": ["628xxx@s.whatsapp.net"]}Get Group Participants:
GET /group/participants?group_jid=xxx@g.usAdd Participant:
POST /group/participants{"group_jid": "...", "participants": ["628xxx@s.whatsapp.net"]}Remove Participant:
POST /group/participants/remove{"group_jid": "...", "participants": ["628xxx@s.whatsapp.net"]}Promote to Admin:
POST /group/participants/promote{"group_jid": "...", "participants": ["628xxx@s.whatsapp.net"]}Demote from Admin:
POST /group/participants/demote{"group_jid": "...", "participants": ["628xxx@s.whatsapp.net"]}Leave Group:
POST /group/leave{"group_jid": "..."}Set Group Photo:
POST /group/photogroup_jid, photoSet Group Name:
POST /group/name{"group_jid": "...", "name": "..."}Set Group Description:
POST /group/topic{"group_jid": "...", "topic": "..."}Get Invite Link:
GET /group/invite-link?group_jid=xxx@g.usJoin via Link:
POST /group/join-with-link{"link": "https://chat.whatsapp.com/..."}List Contacts:
GET /user/my/contactsGet Chats:
GET /chatsGet User Info:
GET /user/info?phone=628xxxCheck if User Exists:
GET /user/check?phone=628xxxRevoke/Delete Message:
POST /message/{message_id}/revokeReact to Message:
POST /message/{message_id}/reaction{"emoji": "👍"}Edit Message:
POST /message/{message_id}/update{"message": "edited text"}Mark as Read:
POST /message/{message_id}/readStar Message:
POST /message/{message_id}/starDownload Media:
GET /message/{message_id}/download628123456789@s.whatsapp.net120363040656010581@g.us628123456789 (without +)How it works:
"mentions": ["@everyone"] in /send/messageExample for schedulers:
curl -s -X POST http://localhost:3000/send/message \
-H 'Content-Type: application/json' \
-d '{"phone": "120363040656010581@g.us", "message": "Reminder text", "mentions": ["@everyone"]}' | jq .
Full OpenAPI 3.0 spec available at:
X-Device-Id header when running multiple devices