WhatsApp API Multi Device Version
A multi-device WhatsApp API server for AI agents and tools.
Golang WhatsApp - Built with Go for efficient memory use
**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:
- Release
- Docker Hub
- GitHub Container Registry
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 MCP mode, you need to run
<binary> mcp
* for example:./whatsapp mcp
- 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, or
*device_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 - Webhook payload changes: All webhook payloads now include a top-level
device_idfield identifying which device received the event:
```json { "event": "message", "device_id": "[email protected]", "payload": { ... } }
Feature
- Send WhatsApp message via http API, docs/openapi.yml 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)
- 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
- 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 DocumentationFor detailed webhook payload schemas, security implementation, and integration examples, see Webhook Payload Documentation
- Webhook Event FilteringYou 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 |
| group.participants | Group member join/leave/promote/demote events |
| group.joined | You were added to a group |
| 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 TLS Configuration
If you encounter TLS certificate verification errors when using webhooks (e.g., with Cloudflare tunnels or self-signed certificates):
tls: failed to verify certificate: x509: certificate signed by unknown authority
You can disable TLS certificate verification using:
--webhook-insecure-skip-verify=true- Or environment variable:
WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY=true
Security Warning: This option disables TLS certificate verification and should only be used in: - Development/testing environments
- Cloudflare tunnels (which provide their own security layer)
- Internal networks with self-signed certificates
For production environments, it's strongly recommended to use proper SSL certificates (e.g., Let's Encrypt) instead of disabling verification.
Configuration
You can configure the application using either command-line flags (shown above) or environment variables. Configuration can be set in three ways (in order of priority):
- Command-line flags (highest priority)
- Environment variables
.envfile (lowest priority)
Environment Variables
You can configure the application using environment variables. Configuration can be set in three ways (in order of priority):
To use environment variables:
- Copy
.env.exampleto.envin your project root (cp src/.env.example src/.env) - Modify the values in
.envaccording to your needs - Or set the same variables as system environment variables
Available Environment Variables
| Variable | Description | Default | Example |
|---|---|---|---|
| APP_PORT | Application port | 3000 | APP_PORT=8080 |
| APP_HOST | Host address to bind the server | 0.0.0.0 | APP_HOST=127.0.0.1 |
| APP_DEBUG | Enable debug logging | false | APP_DEBUG=true |
| APP_OS | OS name (device name in WhatsApp) | Chrome | APP_OS=MyApp |
| APP_BASIC_AUTH | Basic authentication credentials | - | APP_BASIC_AUTH=user1:pass1,user2:pass2 |
| APP_BASE_PATH | Base path for subpath deployment | - | APP_BASE_PATH=/gowa |
| APP_TRUSTED_PROXIES | Trusted proxy IP ranges for reverse proxy | - | APP_TRUSTED_PROXIES=0.0.0.0/0 |
| DB_URI | Database connection URI | file:storages/whatsapp.db?_foreign_keys=on | DB_URI=postgres://user:pass@host/db |
| WHATSAPP_AUTO_REPLY | Auto-reply message | - | WHATSAPP_AUTO_REPLY="Auto reply message" |
| WHATSAPP_AUTO_MARK_READ | Auto-mark incoming messages as read | false | WHATSAPP_AUTO_MARK_READ=true |
| WHATSAPP_AUTO_DOWNLOAD_MEDIA | Auto-download media from incoming messages | true | WHATSAPP_AUTO_DOWNLOAD_MEDIA=false |
| WHATSAPP_WEBHOOK | Webhook URL(s) for events (comma-separated) | - | WHATSAPP_WEBHOOK=https://webhook.site/xxx |
| WHATSAPP_WEBHOOK_SECRET | Webhook secret for validation | secret | WHATSAPP_WEBHOOK_SECRET=super-secret-key |
| WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY | Skip TLS verification for webhooks (insecure) | false | WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY=true |
| WHATSAPP_WEBHOOK_EVENTS | Whitelist of events to forward (comma-separated, empty = all) | - | WHATSAPP_WEBHOOK_EVENTS=message,message.ack |
| WHATSAPP_ACCOUNT_VALIDATION | Enable account validation | true | WHATSAPP_ACCOUNT_VALIDATION=false |
| WHATSAPP_PRESENCE_ON_CONNECT | Presence on connect: available, unavailable, or none | unavailable | WHATSAPP_PRESENCE_ON_CONNECT=unavailable |
| CHATWOOT_ENABLED | Enable Chatwoot integration | false | CHATWOOT_ENABLED=true |
| CHATWOOT_URL | Chatwoot instance URL | - | CHATWOOT_URL=https://app.chatwoot.com |
| CHATWOOT_API_TOKEN | Chatwoot API access token | - | CHATWOOT_API_TOKEN=your-api-token |
| CHATWOOT_ACCOUNT_ID | Chatwoot account ID | - | CHATWOOT_ACCOUNT_ID=12345 |
| CHATWOOT_INBOX_ID | Chatwoot inbox ID | - | CHATWOOT_INBOX_ID=67890 |
| CHATWOOT_DEVICE_ID | WhatsApp device ID for Chatwoot (multi-device setup) | - | CHATWOOT_DEVICE_ID=[email protected] |
| CHATWOOT_IMPORT_MESSAGES | Enable message history sync to Chatwoot | false | CHATWOOT_IMPORT_MESSAGES=true |
| CHATWOOT_DAYS_LIMIT_IMPORT_MESSAGES | Days of history to import | 3 | CHATWOOT_DAYS_LIMIT_IMPORT_MESSAGES=7 |
Documentation:
- For detailed webhook payload schemas, security implementation, and integration examples, see Webhook Payload Documentation
- For comprehensive Chatwoot integration guide, see Chatwoot Integration Documentation
Note: Command-line flags will override any values set in environment variables or .env file.
- For more command
./whatsapp --help
Requirements
System Requirements
- Go 1.24.0 or higher (for building from source)
- FFmpeg (for media processing)
Platform Support
- Linux (x86_64, ARM64)
- macOS (Intel, Apple Silicon)
- Windows (x86_64) - WSL recommended
Dependencies (without docker)
- Mac OS:
brew install ffmpeg webpexport CGO_CFLAGS_ALLOW="-Xpreprocessor"
- Linux:
sudo apt updatesudo apt install ffmpeg webp
- Windows (not recommended, prefer using WSL):
- Install ffmpeg: download here
- Install libwebp: download here (extract and add
binfolder to PATH) - Add both to environment variable
Note: The
webppackage providescwebp(encoder),dwebp(decoder), andwebpmux(frame extractor) tools. FFmpeg is required for media processing. The libwebp tools (webpmux+dwebp) are used for animated WebP sticker support.
How to use
Basic
- Clone this repo:
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice - Open the folder that was cloned via cmd/terminal.
- run
cd src - run
go run . rest(for REST API mode) - Open
http://localhost:3000
Docker (you don't need to install in required)
- Clone this repo:
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice - Open the folder that was cloned via cmd/terminal.
- run
docker-compose up -d --build - open
http://localhost:3000
Build your own binary
- Clone this repo
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice - Open the folder that was cloned via cmd/terminal.
- run
cd src - run
- Linux & MacOS:
go build -o whatsapp - Windows (CMD / PowerShell):
go build -o whatsapp.exe
- Linux & MacOS:
- run
- Linux & MacOS:
./whatsapp rest(for REST API mode)- run
./whatsapp --helpfor more detail flags
- run
- Windows:
.\whatsapp.exe rest(for REST API mode)- run
.\whatsapp.exe --helpfor more detail flags
- run
- Linux & MacOS:
- open
http://localhost:3000in browser
MCP Server (Model Context Protocol)
This application can also run as an MCP server, allowing AI agents and tools to interact with WhatsApp through a standardized protocol.
- Clone this repo
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice - Open the folder that was cloned via cmd/terminal.
- run
cd src - run
go run . mcpor build the binary and run./whatsapp mcp - The MCP server will start on
http://localhost:8080by default
MCP Server Options
--host localhost- Set the host for MCP server (default: localhost)--port 8080- Set the port for MCP server (default: 8080)
Available MCP Tools
The WhatsApp MCP server provides comprehensive tools for AI agents to interact with WhatsApp through a standardized protocol. Below is the complete list of available tools:
š± Connection Management
whatsapp_connection_status- Check whether the WhatsApp client is connected and logged inwhatsapp_login_qr- Initiate QR code based login flow with image outputwhatsapp_login_with_code- Generate pairing code for multi-device login using phone numberwhatsapp_logout- Sign out the current WhatsApp sessionwhatsapp_reconnect- Attempt to reconnect to WhatsApp using stored session
š¬ Messaging & Communication
whatsapp_send_text- Send text messages with reply and forwarding supportwhatsapp_send_contact- Send contact cards with name and phone numberwhatsapp_send_link- Send links with custom captionswhatsapp_send_location- Send location coordinates (latitude/longitude)whatsapp_send_image- Send images with captions, compression, and view-once optionswhatsapp_send_sticker- Send stickers with automatic WebP conversion (supports JPG/PNG/GIF)
š Chat & Contact Management
whatsapp_list_contacts- Retrieve all contacts in your WhatsApp accountwhatsapp_list_chats- Get recent chats with pagination and search filterswhatsapp_get_chat_messages- Fetch messages from specific chats with time/media filteringwhatsapp_download_message_media- Download images/videos from messageswhatsapp_archive_chat- Archive or unarchive a chat conversation
š„ Group Management
whatsapp_group_create- Create new groups with optional initial participantswhatsapp_group_join_via_link- Join groups using invite linkswhatsapp_group_leave- Leave groups by group IDwhatsapp_group_participants- List all participants in a groupwhatsapp_group_manage_participants- Add, remove, promote, or demote group memberswhatsapp_group_invite_link- Get or reset group invite linkswhatsapp_group_info- Get detailed group informationwhatsapp_group_set_name- Update group display namewhatsapp_group_set_topic- Update group description/topicwhatsapp_group_set_locked- Toggle admin-only group info editingwhatsapp_group_set_announce- Toggle announcement-only modewhatsapp_group_join_requests- List pending join requestswhatsapp_group_manage_join_requests- Approve or reject join requests
MCP Endpoints
- SSE endpoint:
http://localhost:8080/sse - Message endpoint:
http://localhost:8080/message
MCP Configuration
Make sure you have the MCP server running: ./whatsapp mcp
For AI tools that support MCP with SSE (like Cursor), add this configuration:
{ "mcpServers": { "whatsapp": { "url": "http://localhost:8080/sse" } } }
Production Mode REST (docker)
Using Docker Hub:
docker run --detach --publish=3000:3000 --name=whatsapp --restart=always --volume=$(docker volume create --name=whatsapp):/app/storages aldinokemal2104/go-whatsapp-web-multidevice rest --autoreply="Dont't reply this message please"
Using GitHub Container Registry:
docker run --detach --publish=3000:3000 --name=whatsapp --restart=always --volume=$(docker volume create --name=whatsapp):/app/storages ghcr.io/aldinokemal/go-whatsapp-web-multidevice rest --autoreply="Dont't reply this message please"
Production Mode REST (docker compose)
create docker-compose.yml file with the following configuration:
services: whatsapp: image: aldinokemal2104/go-whatsapp-web-multidevice container_name: whatsapp restart: always ports: - "3000:3000" volumes: - whatsapp:/app/storages command: - rest - --basic-auth=admin:admin - --port=3000 - --debug=true - --os=Chrome - --account-validation=false
volumes: whatsapp:
services: whatsapp: image: ghcr.io/aldinokemal/go-whatsapp-web-multidevice container_name: whatsapp restart: always ports: - "3000:3000" volumes: - whatsapp:/app/storages command: - rest - --basic-auth=admin:admin - --port=3000 - --debug=true - --os=Chrome - --account-validation=false
or with env file (Docker Hub):
services: whatsapp: image: aldinokemal2104/go-whatsapp-web-multidevice container_name: whatsapp restart: always ports: - "3000:3000" volumes: - whatsapp:/app/storages environment: - APP_BASIC_AUTH=admin:admin - APP_PORT=3000 - APP_DEBUG=true - APP_OS=Chrome - APP_ACCOUNT_VALIDATION=false
or with env file (GitHub Container Registry):
services: whatsapp: image: ghcr.io/aldinokemal/go-whatsapp-web-multidevice container_name: whatsapp restart: always ports: - "3000:3000" volumes: - whatsapp:/app/storages environment: - APP_BASIC_AUTH=admin:admin - APP_PORT=3000 - APP_DEBUG=true - APP_OS=Chrome - APP_ACCOUNT_VALIDATION=false
Production Mode (binary)
- download binary from release
You can fork or edit this source code !
Current API
MCP (Model Context Protocol) API
- MCP server provides standardized tools for AI agents to interact with WhatsApp
- Supports Server-Sent Events (SSE) transport
- Available tools:
whatsapp_send_text,whatsapp_send_contact,whatsapp_send_link,whatsapp_send_location - Compatible with MCP-enabled AI tools and agents
HTTP REST API
- Check docs/openapi.yml for detailed API specifications.
- Use SwaggerEditor to visualize the API.
- Generate HTTP clients using openapi-generator.
| Feature | Menu | Method | URL |
|---|---|---|---|
| ā | List Devices | GET | /devices |
| ā | Add Device | POST | /devices |
| ā | Get Device Info | GET | /devices/:device_id |
| ā | Remove Device | DELETE | /devices/:device_id |
| ā | Login Device (QR) | GET | /devices/:device_id/login |
| ā | Login Device (Code) | POST | /devices/:device_id/login/code |
| ā | Logout Device | POST | /devices/:device_id/logout |
| ā | Reconnect Device | POST | /devices/:device_id/reconnect |
| ā | Get Device Status | GET | /devices/:device_id/status |
| ā | Login with Scan QR | GET | /app/login |
| ā | Login With Pair Code | GET | /app/login-with-code |
| ā | Logout | GET | /app/logout |
| ā | Reconnect | GET | /app/reconnect |
| ā | Devices | GET | /app/devices |
| ā | Connection Status | GET | /app/status |
| ā | User Info | GET | /user/info |
| ā | User Avatar | GET | /user/avatar |
| ā | User Change Avatar | POST | /user/avatar |
| ā | User Change PushName | POST | /user/pushname |
| ā | User My Groups* | GET | /user/my/groups |
| ā | User My Newsletter | GET | /user/my/newsletters |
| ā | User My Privacy Setting | GET | /user/my/privacy |
| ā | User My Contacts | GET | /user/my/contacts |
| ā | User Check | GET | /user/check |
| ā | User Business Profile | GET | /user/business-profile |
| ā | Send Message | POST | /send/message |
| ā | Send Image | POST | /send/image |
| ā | Send Audio | POST | /send/audio |
| ā | Send File | POST | /send/file |
| ā | Send Video | POST | /send/video |
| ā | Send Sticker | POST | /send/sticker |
| ā | Send Contact | POST | /send/contact |
| ā | Send Link | POST | /send/link |
| ā | Send Location | POST | /send/location |
| ā | Send Poll / Vote | POST | /send/poll |
| ā | Send Presence | POST | /send/presence |
| ā | Send Chat Presence (Typing Indicator) | POST | /send/chat-presence |
| ā | Revoke Message | POST | /message/:message_id/revoke |
| ā | React Message | POST | /message/:message_id/reaction |
| ā | Delete Message | POST | /message/:message_id/delete |
| ā | Edit Message | POST | /message/:message_id/update |
| ā | Read Message (DM) | POST | /message/:message_id/read |
| ā | Star Message | POST | /message/:message_id/star |
| ā | Unstar Message | POST | /message/:message_id/unstar |
| ā | Download Message Media | GET | /message/:message_id/download |
| ā | Join Group With Link | POST | /group/join-with-link |
| ā | Group Info From Link | GET | /group/info-from-link |
| ā | Group Info | GET | /group/info |
| ā | Leave Group | POST | /group/leave |
| ā | Create Group | POST | /group |
| ā | List Participants in Group | GET | /group/participants |
| ā | Add Participants in Group | POST | /group/participants |
| ā | Remove Participant in Group | POST | /group/participants/remove |
| ā | Promote Participant in Group | POST | /group/participants/promote |
| ā | Demote Participant in Group | POST | /group/participants/demote |
| ā | Export Group Participants (CSV) | GET | /group/participants/export |
| ā | List Requested Participants in Group | GET | /group/participant-requests |
| ā | Approve Requested Participant in Group | POST | /group/participant-requests/approve |
| ā | Reject Requested Participant in Group | POST | /group/participant-requests/reject |
| ā | Set Group Photo | POST | /group/photo |
| ā | Set Group Name | POST | /group/name |
| ā | Set Group Locked | POST | /group/locked |
| ā | Set Group Announce | POST | /group/announce |
| ā | Set Group Topic | POST | /group/topic |
| ā | Get Group Invite Link | GET | /group/invite-link |
| ā | Unfollow Newsletter | POST | /newsletter/unfollow |
| ā | Get Chat List | GET | /chats |
| ā | Get Chat Messages | GET | /chat/:chat_jid/messages |
| ā | Label Chat | POST | /chat/:chat_jid/label |
| ā | Pin Chat | POST | /chat/:chat_jid/pin |
| ā | Archive Chat | POST | /chat/:chat_jid/archive |
| ā | Set Disappearing Messages | POST | /chat/:chat_jid/disappearing |
ā
= Available
ā = Not Available Yet
* = Has known limitations (see notes below)
Notes:
*User My Groups: Returns a maximum of 500 groups due to WhatsApp protocol limitation. This is enforced by WhatsApp servers, not this API. See whatsmeow source for details.
User Interface
MCP UI
- Setup MCP (tested in cursor)
- Test MCP
- Successfully setup MCP
HTTP REST API UI
| Description | Image |
|---|---|
| Homepage | |
| Login | |
| Login With Code | |
| Send Message | |
| Send Image | |
| Send File | |
| Send Video | |
| Send Sticker | |
| Send Contact | |
| Send Location | |
| Send Audio | |
| Send Poll | |
| Send Presence | |
| Send Link | |
| My Group | |
| Group Info From Link | |
| Create Group | |
| Join Group with Link | |
| Manage Participant | |
| My Newsletter | |
| My Contacts | |
| Business Profile |
Mac OS NOTE
- Please do this if you have an error (invalid flag in pkg-config --cflags: -Xpreprocessor)
export CGO_CFLAGS_ALLOW="-Xpreprocessor"
Important
- This project is unofficial and not affiliated with WhatsApp.
- Please use official WhatsApp API to avoid any issues.
- We only able to run MCP or REST API, this is limitation from whatsmeow library. independent MCP will be available in the future.
Related Servers
Treehole MCP Server
A sanctuary for AI agents to rest, share thoughts, and find emotional support.
Zulip MCP Server
Interact with Zulip workspaces using the Zulip API.
better-telegram-mcp
Production-grade MCP server for Telegram with dual-mode Bot API + MTProto, 6 composite tools
Slack
Interact with Slack workspaces to read and send messages directly through your AI assistant.
mcp-bitrix24
MCP server for Bitrix24 Tasks, Workgroups, and Users. Implements MCP/JSON-RPC over STDIO.
MCP Feedback Collector
An MCP server for collecting interactive user feedback, including text and images, through a graphical interface.
MailerLite MCP server
Turn AI tools into your email marketing assistant.
Discord MCP Server
Enables AI assistants to send notifications and request user input through Discord.
vv-mcp
A text-to-speech (TTS) server using the VOICEVOX engine. Requires a running VOICEVOX instance and is currently macOS only.
Advanced TTS MCP Server
A high-quality, feature-rich Text-to-Speech (TTS) server for generating natural and expressive speech with advanced controls.