WhatsApp API Multi Device Version

A multi-device WhatsApp API server for AI agents and tools.

GoWA Logo

Golang WhatsApp - Built with Go for efficient memory use

Patreon **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!


release version Build Image Binary Release

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> rest instead of <binary>
      * for example: ./whatsapp rest instead of ./whatsapp
    • For MCP mode, you need to run <binary> mcp
      * for example: ./whatsapp mcp
  • 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 /devices for managing multiple devices
    • Device scoping required: All device-scoped REST API calls now require either:
      * X-Device-Id header, or
      * device_id query 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_id field 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
  • 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
  • Compress image before send
  • Compress video before send
  • Change OS name become your app (it's the device name when connect via mobile)
    • --os=Chrome or --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)
  • 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 |
      | group.participants | Group member join/leave/promote/demote events |
      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):

  1. Command-line flags (highest priority)
  2. Environment variables
  3. .env file (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:

  1. Copy .env.example to .env in your project root (cp src/.env.example src/.env)
  2. Modify the values in .env according to your needs
  3. Or set the same variables as system environment variables

Available Environment Variables

VariableDescriptionDefaultExample
APP_PORTApplication port3000APP_PORT=8080
APP_HOSTHost address to bind the server0.0.0.0APP_HOST=127.0.0.1
APP_DEBUGEnable debug loggingfalseAPP_DEBUG=true
APP_OSOS name (device name in WhatsApp)ChromeAPP_OS=MyApp
APP_BASIC_AUTHBasic authentication credentials-APP_BASIC_AUTH=user1:pass1,user2:pass2
APP_BASE_PATHBase path for subpath deployment-APP_BASE_PATH=/gowa
APP_TRUSTED_PROXIESTrusted proxy IP ranges for reverse proxy-APP_TRUSTED_PROXIES=0.0.0.0/0
DB_URIDatabase connection URIfile:storages/whatsapp.db?_foreign_keys=onDB_URI=postgres://user:pass@host/db
WHATSAPP_AUTO_REPLYAuto-reply message-WHATSAPP_AUTO_REPLY="Auto reply message"
WHATSAPP_AUTO_MARK_READAuto-mark incoming messages as readfalseWHATSAPP_AUTO_MARK_READ=true
WHATSAPP_AUTO_DOWNLOAD_MEDIAAuto-download media from incoming messagestrueWHATSAPP_AUTO_DOWNLOAD_MEDIA=false
WHATSAPP_WEBHOOKWebhook URL(s) for events (comma-separated)-WHATSAPP_WEBHOOK=https://webhook.site/xxx
WHATSAPP_WEBHOOK_SECRETWebhook secret for validationsecretWHATSAPP_WEBHOOK_SECRET=super-secret-key
WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFYSkip TLS verification for webhooks (insecure)falseWHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY=true
WHATSAPP_WEBHOOK_EVENTSWhitelist of events to forward (comma-separated, empty = all)-WHATSAPP_WEBHOOK_EVENTS=message,message.ack
WHATSAPP_ACCOUNT_VALIDATIONEnable account validationtrueWHATSAPP_ACCOUNT_VALIDATION=false

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
    • export CGO_CFLAGS_ALLOW="-Xpreprocessor"
  • Linux:
    • sudo apt update
    • sudo apt install ffmpeg
  • Windows (not recomended, prefer using WSL):
    • install ffmpeg, download here
    • add to ffmpeg to environment variable

How to use

Basic

  1. Clone this repo: git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice
  2. Open the folder that was cloned via cmd/terminal.
  3. run cd src
  4. run go run . rest (for REST API mode)
  5. Open http://localhost:3000

Docker (you don't need to install in required)

  1. Clone this repo: git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice
  2. Open the folder that was cloned via cmd/terminal.
  3. run docker-compose up -d --build
  4. open http://localhost:3000

Build your own binary

  1. Clone this repo git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice
  2. Open the folder that was cloned via cmd/terminal.
  3. run cd src
  4. run
    1. Linux & MacOS: go build -o whatsapp
    2. Windows (CMD / PowerShell): go build -o whatsapp.exe
  5. run
    1. Linux & MacOS: ./whatsapp rest (for REST API mode)
      1. run ./whatsapp --help for more detail flags
    2. Windows: .\whatsapp.exe rest (for REST API mode)
      1. run .\whatsapp.exe --help for more detail flags
  6. open http://localhost:3000 in 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.

  1. Clone this repo git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice
  2. Open the folder that was cloned via cmd/terminal.
  3. run cd src
  4. run go run . mcp or build the binary and run ./whatsapp mcp
  5. The MCP server will start on http://localhost:8080 by 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 in
  • whatsapp_login_qr - Initiate QR code based login flow with image output
  • whatsapp_login_with_code - Generate pairing code for multi-device login using phone number
  • whatsapp_logout - Sign out the current WhatsApp session
  • whatsapp_reconnect - Attempt to reconnect to WhatsApp using stored session
πŸ’¬ Messaging & Communication
  • whatsapp_send_text - Send text messages with reply and forwarding support
  • whatsapp_send_contact - Send contact cards with name and phone number
  • whatsapp_send_link - Send links with custom captions
  • whatsapp_send_location - Send location coordinates (latitude/longitude)
  • whatsapp_send_image - Send images with captions, compression, and view-once options
  • whatsapp_send_sticker - Send stickers with automatic WebP conversion (supports JPG/PNG/GIF)
πŸ“‹ Chat & Contact Management
  • whatsapp_list_contacts - Retrieve all contacts in your WhatsApp account
  • whatsapp_list_chats - Get recent chats with pagination and search filters
  • whatsapp_get_chat_messages - Fetch messages from specific chats with time/media filtering
  • whatsapp_download_message_media - Download images/videos from messages
  • whatsapp_archive_chat - Archive or unarchive a chat conversation
πŸ‘₯ Group Management
  • whatsapp_group_create - Create new groups with optional initial participants
  • whatsapp_group_join_via_link - Join groups using invite links
  • whatsapp_group_leave - Leave groups by group ID
  • whatsapp_group_participants - List all participants in a group
  • whatsapp_group_manage_participants - Add, remove, promote, or demote group members
  • whatsapp_group_invite_link - Get or reset group invite links
  • whatsapp_group_info - Get detailed group information
  • whatsapp_group_set_name - Update group display name
  • whatsapp_group_set_topic - Update group description/topic
  • whatsapp_group_set_locked - Toggle admin-only group info editing
  • whatsapp_group_set_announce - Toggle announcement-only mode
  • whatsapp_group_join_requests - List pending join requests
  • whatsapp_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

  • API Specification Document.
  • Check docs/openapi.yml for detailed API specifications.
  • Use SwaggerEditor to visualize the API.
  • Generate HTTP clients using openapi-generator.
FeatureMenuMethodURL
βœ…List DevicesGET/devices
βœ…Add DevicePOST/devices
βœ…Get Device InfoGET/devices/:device_id
βœ…Remove DeviceDELETE/devices/:device_id
βœ…Login Device (QR)GET/devices/:device_id/login
βœ…Login Device (Code)POST/devices/:device_id/login/code
βœ…Logout DevicePOST/devices/:device_id/logout
βœ…Reconnect DevicePOST/devices/:device_id/reconnect
βœ…Get Device StatusGET/devices/:device_id/status
βœ…Login with Scan QRGET/app/login
βœ…Login With Pair CodeGET/app/login-with-code
βœ…LogoutGET/app/logout
βœ…ReconnectGET/app/reconnect
βœ…DevicesGET/app/devices
βœ…Connection StatusGET/app/status
βœ…User InfoGET/user/info
βœ…User AvatarGET/user/avatar
βœ…User Change AvatarPOST/user/avatar
βœ…User Change PushNamePOST/user/pushname
βœ…User My GroupsGET/user/my/groups
βœ…User My NewsletterGET/user/my/newsletters
βœ…User My Privacy SettingGET/user/my/privacy
βœ…User My ContactsGET/user/my/contacts
βœ…User CheckGET/user/check
βœ…User Business ProfileGET/user/business-profile
βœ…Send MessagePOST/send/message
βœ…Send ImagePOST/send/image
βœ…Send AudioPOST/send/audio
βœ…Send FilePOST/send/file
βœ…Send VideoPOST/send/video
βœ…Send StickerPOST/send/sticker
βœ…Send ContactPOST/send/contact
βœ…Send LinkPOST/send/link
βœ…Send LocationPOST/send/location
βœ…Send Poll / VotePOST/send/poll
βœ…Send PresencePOST/send/presence
βœ…Send Chat Presence (Typing Indicator)POST/send/chat-presence
βœ…Revoke MessagePOST/message/:message_id/revoke
βœ…React MessagePOST/message/:message_id/reaction
βœ…Delete MessagePOST/message/:message_id/delete
βœ…Edit MessagePOST/message/:message_id/update
βœ…Read Message (DM)POST/message/:message_id/read
βœ…Star MessagePOST/message/:message_id/star
βœ…Unstar MessagePOST/message/:message_id/unstar
βœ…Download Message MediaGET/message/:message_id/download
βœ…Join Group With LinkPOST/group/join-with-link
βœ…Group Info From LinkGET/group/info-from-link
βœ…Group InfoGET/group/info
βœ…Leave GroupPOST/group/leave
βœ…Create GroupPOST/group
βœ…List Participants in GroupGET/group/participants
βœ…Add Participants in GroupPOST/group/participants
βœ…Remove Participant in GroupPOST/group/participants/remove
βœ…Promote Participant in GroupPOST/group/participants/promote
βœ…Demote Participant in GroupPOST/group/participants/demote
βœ…Export Group Participants (CSV)GET/group/participants/export
βœ…List Requested Participants in GroupGET/group/participant-requests
βœ…Approve Requested Participant in GroupPOST/group/participant-requests/approve
βœ…Reject Requested Participant in GroupPOST/group/participant-requests/reject
βœ…Set Group PhotoPOST/group/photo
βœ…Set Group NamePOST/group/name
βœ…Set Group LockedPOST/group/locked
βœ…Set Group AnnouncePOST/group/announce
βœ…Set Group TopicPOST/group/topic
βœ…Get Group Invite LinkGET/group/invite-link
βœ…Unfollow NewsletterPOST/newsletter/unfollow
βœ…Get Chat ListGET/chats
βœ…Get Chat MessagesGET/chat/:chat_jid/messages
βœ…Label ChatPOST/chat/:chat_jid/label
βœ…Pin ChatPOST/chat/:chat_jid/pin
βœ…Archive ChatPOST/chat/:chat_jid/archive
βœ…Set Disappearing MessagesPOST/chat/:chat_jid/disappearing
βœ… = Available
❌ = Not Available Yet

User Interface

MCP UI

  • Setup MCP (tested in cursor)Setup MCP
  • Test MCPTest MCP
  • Successfully setup MCPSuccess MCP

HTTP REST API UI

DescriptionImage
HomepageHomepage
LoginLogin
Login With CodeLogin With Code
Send MessageSend Message
Send ImageSend Image
Send FileSend File
Send VideoSend Video
Send StickerSend Sticker
Send ContactSend Contact
Send LocationSend Location
Send AudioSend Audio
Send PollSend Poll
Send PresenceSend Presence
Send LinkSend Link
My GroupMy Group
Group Info From LinkGroup Info From Link
Create GroupCreate Group
Join Group with LinkJoin Group with Link
Manage ParticipantManage Participant
My NewsletterMy Newsletter
My ContactsMy Contacts
Business ProfileBusiness 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