A headless multi-session WhatsApp gateway with multi-device support, easy to set up using Docker.
- Multi-device support
- Multi-session / multiple phone numbers
- Send text messages, images, videos, and documents
- Webhook integration
📌 Also see: wa-multi-session
- Docker & Docker Compose installed 👉 Install Docker
Create a new folder for your application at ~/app/wa-gateway and navigate into it:
mkdir -p ~/app/wa-gateway
cd ~/app/wa-gatewayUse the nano editor to create the file:
nano docker-compose.yamlPaste the following content into the editor to create docker-compose.yaml
# docker-compose.yaml
services:
wa-gateway:
container_name: "wa-gateway"
restart: unless-stopped
image: mimamch/wa-gateway:latest
volumes:
- ./wa_credentials:/app/wa_credentials
- ./media:/app/media
ports:
- "5001:5001"
environment:
- KEY= # make your own api key (optional)Run the following command in the same directory as your docker-compose.yaml:
docker compose up -dVisit this URL to scan the QR code from your WhatsApp device:
http://localhost:5001/session/start?session=mysession
Replace
localhostwith your server's IP or domain if not running locally.
Replace
mysessionwith your desired session name.
Example to send a text message:
http://localhost:5001/message/send-text?session=mysession&to=628123456789&text=Hello
All API endpoints remain the same as the NodeJS version. Here's a quick reference:
GET /session/start?session=NEW_SESSION_NAMEor
POST /session/start
{
"session": "NEW_SESSION_NAME"
}POST /message/send-textBody fields:
| Field | Type | Required | Description |
|---|---|---|---|
| session | string | Yes | The session name you created |
| to | string | Yes | Target phone number (e.g. 628123456789) |
| text | string | Yes | The text message |
| is_group | boolean | No | True if target is a group |
POST /message/send-imageBody includes all of the above plus image_url.
POST /message/send-documentBody includes:
document_urldocument_name
POST /message/send-videoBody fields:
| Field | Type | Required | Description |
|---|---|---|---|
| session | string | Yes | The session name you created |
| to | string | Yes | Target phone number (e.g. 628123456789) |
| text | string | No | Caption for the video (optional) |
| video_url | string | Yes | URL of the video file |
| is_group | boolean | No | True if target is a group |
GET /session/logout?session=SESSION_NAMETo receive real-time events, set your webhook URL using the environment variable:
WEBHOOK_BASE_URL="http://yourdomain.com/webhook"Example webhook endpoints:
- Session:
POST /webhook/session - Message:
POST /webhook/message
Media files are stored inside the ./media directory in the container. You can access them via:
http://localhost:5001/media/FILE_NAME
To update to the latest version:
cd ~/app/wa-gateway
docker compose pull
docker compose down
docker compose up -dFor full documentation, examples, and guides, visit: 👉 https://github.com/mimamch/wa-gateway
Let me know if you need configuration examples with environment variables (like webhook setup) or a multi-service deployment!