SkillAgentSearch skills...

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-multidevice

Installs into whichever agent you are using.

README

<!-- markdownlint-disable MD041 --> <!-- markdownlint-disable-next-line MD033 --> <div align="center"> <!-- markdownlint-disable-next-line MD033 --> <img src="gallery/gowa.svg" alt="GoWA Logo" width="200" height="200">

Golang WhatsApp - Built with Go for efficient memory use

</div>

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:

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

    • Remote UI support: CORS allows the Authorization and X-Device-Id headers, so a standalone web UI (e.g. gowa-ui) hosted on another origin can call the API directly. GET /app/info exposes 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_id field 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 under storages/ui/, and serves it at /. See Web dashboard (gowa-ui) for the APP_UI_* settings, supply-chain pinning, and air-gapped deployment.

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 @phone in message text

    • Pass phone numbers in mentions field to mention users without visible @ in message
    • Use special keyword @everyone to automatically mention ALL group participants
    • UI checkbox available in Send Message modal for groups
  • 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=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)
  • Auto reject incoming calls

    • --auto-reject-call=true or WHATSAPP_AUTO_REJECT_CALL=true (see Webhook Payload for call events)
  • Configurable presence on connect

    • --presence-on-connect=unavailable or WHATSAPP_PRESENCE_ON_CONNECT=unavailable
    • available — 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=true or WHATSAPP_PRESENCE_PULSE_ENABLED=true (default: true)
    • --presence-pulse-interval=24h controls how often each connected device is pulsed
    • --presence-pulse-duration=5m controls how long the account stays available before returning to unavailable
  • 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/webhook with {"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
  • 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

View on GitHub
GitHub Stars4.4k
CategoryCustomer
Updated2m ago
Forks1.1k

Languages

Go

Security Score

100/100

Audited on Aug 8, 2026

No findings