需要手机上的 WhatsApp 扫码登录才能开始发消息;chatId 要用不带 + 的国际号码加 @c.us 后缀;从源码开发需 node>=22 并额外安装 Bun、Rust nightly 和 wasm-pack

waha
devlikeaproApache-2.0活跃维护把 WhatsApp 封装成可一键配置的 HTTP REST API,内置 WEBJS、NOWEB、GOWS、WPP 多种引擎,方便接聊天机器人和自动化流程。
WAHA - WhatsApp HTTP API (REST API) that you can configure in a click! Multiple engines: WEBJS (browser based), NOWEB (websocket nodejs), GOWS (websocket go), WPP (browser)
docker pull devlikeapro/waha
docker run -it --rm -p 3000:3000/tcp --name waha devlikeapro/wahaREADME 未说明硬件要求,只要求已安装 Docker
自托管 WhatsApp HTTP API,用 REST 接口收发消息,几分钟内跑起来
把 WhatsApp 封装成可一键配置的 HTTP REST API,内置 WEBJS、NOWEB、GOWS、WPP 多种引擎,方便接聊天机器人和自动化流程。
核心能力
- 用 REST 接口管理会话并发送文本消息
- 支持多引擎:WEBJS、NOWEB、GOWS、WPP
- 单个容器内可启动多个 WhatsApp 账号会话
- 通过截图接口获取二维码并扫码登录
- 内置 Swagger 文档和 Dashboard 页面
容易踩的坑
- 2026.10.1最新正式版2026-10-28 · 2026-10-28 09:15 UTC
🆕 New
2026.10.1- 🏷️ Labels -typeandisActivefields.2026.10.1- 👥 Groups - member tags API,group.v2.participants.tagevent - #2300
🧩 ChatWoot
2026.10.1- Add member tag for group messages - #2300
🛠️ Fixes
2026.10.1- GOWS - useFAILEDon connection failures (ban, client outdated, etc) - #23182026.10.1- GOWS - swap link preview headers - #23222026.10.1- GOWS - fix setting status (about) - #23262026.10.1- GOWS - fix missing video preview (ffmpegpartial file) - #19422026.10.1- GOWS - fixGET /api/{session}/lids/{lid}returning own phone number for@lid- #2241, #22992026.10.1- GOWS - reduce noisy logs for retry receipts - #19422026.10.1- S3 - fix saving media with non-ASCII and double spaces in file name - URL-encoded filename - #2279 - #23082026.10.1- GOWS - fix sending non-disappearing messages to chats with disappearing messages enabled (@lidvs@c.uschats)2026.10.1- GOWS - fix labels sync - #22902026.10.1- 🏷️ Labels - a bunch of small fixes2026.10.1- WEBJS - fix updating and deleting 🏷️ Labels2026.10.1- 🏷️ Labels - sort labels by id2026.10.1- 🏷️ Labels - label name - max 100 lenght2026.10.1- NOWEB - fix sending non-disappearing messages to chats with disappearing messages enabled2026.10.1- NOWEB - fix app state sync - #2298, #2297 - #23042026.10.1- NOWEB - fixGET /api/{session}/lids/countreturning500on PostgreSQL - #2306 - #23072026.10.1- NOWEB - fix missing@lidto phone number pairs the engine already knows - #23052026.10.1- 👥 Groups - fix setting empty group subject - #22942026.10.1- Validateeventfield inPOST /api/{session}/events- #23032026.10.1- Redactx-api-keyfrom websocket connection logs - #23012026.10.1- Reject non-stringx-api-keyvalues (arrays, objects) in header and query
📊 Dashboard
⚙️ Updates
2026.10.1- Node.js - fix CVE-2026-111497 (Brotli decoder RCE) - #23242026.10.1-file-type- fix CVE-2026-31808 (media parser infinite loop on malformed ASF header) - [#23
- 2026.9.22026-10-02 · 2026-10-02 06:09 UTC
查看更新说明
🆕 New
🛠️ Fixes
2026.9.2- NOWEB - fix delete channel message - #2038 - #22842026.9.2- NOWEB - fix edit media caption in channels2026.9.2- NOWEB - fix update contact - #22852026.9.2- GOWS - fix update contact2026.9.2- WEBJS - fix forward message - #22782026.9.2- WEBJS - fix get and revoke group invite code2026.9.2- WEBJS - fix create group2026.9.2- WEBJS - fix set profile name2026.9.2- WEBJS - fix hiding “What’s new” modal on start - use the app’s cooldown days
📊 Dashboard
2026.9.2- Dashboard - fix chat not refreshing on new messages (@lidvs@c.uschats)
⚙️ Updates
2026.9.2- WPP - up engine2026.9.2- GOWS - up engine
What's Changed
- [core] fix(NOWEB): reuse original message id when deleting channel messages - fix #2038 by @BrianB3 in https://github.com/devlikeapro/waha/pull/2284
New Contributors
- @BrianB3 made their first contribution in https://github.com/devlikeapro/waha/pull/2284
Full Changelog: https://github.com/devlikeapro/waha/compare/2026.9.1...2026.9.2
- 2026.9.12026-09-22 · 2026-09-22 03:45 UTC
查看更新说明
🧩 Apps
2026.9.1- Phone Numbers - resolve numbers to the WhatsApp chatId before sending, with optional regexp rules (^52(\d{10})$=>521$1)2026.9.1- Phone Numbers: Argentina - resolve numbers with or without the mobile9(54.../549...) - #22602026.9.1- Phone Numbers: Mexico - resolve numbers with or without the old1after the country code (52.../521...)
🧩 ChatWoot
2026.9.1- Show delivered and read ticks in Chatwoot on messages agents send from Chatwoot (conversations.syncMessageStatus) - 🧩 ChatWoot - #22642026.9.1- Show messages you send from the WhatsApp app or API as regular outgoing messages (conversations.outgoing: private-note | message) - #22492026.9.1- Update names of existing Chatwoot contacts from your phone book (wa/contacts pull --update-names no|if-raw|always) - #12452026.9.1- Deleting a message with attachments in Chatwoot deletes every part in WhatsApp, not only the last one
🛠️ Fixes
2026.9.1- WEBJS - Fix sending media -Data passed to getter must include an id property- #2271, #22732026.9.1- WEBJS - Joining a group via invite link failed with500on current WhatsApp Web2026.9.1- WEBJS - Getting and subscribing to presence failed with500on current WhatsApp Web - #22622026.9.1- WEBJS -presence.updateevents were missing on current WhatsApp Web2026.9.1- GOWS - Clearing a group description with an empty string hung - #22572026.9.1- Setting an empty group subject returns400instead of hanging - #22572026.9.1- Sending a poll with empty or duplicate options returns4002026.9.1- NOWEB - Fix downloadinginteractiveMessageTemplatewith"templateMessage" message is not a media message- #22752026.9.1- NOWEB - Downloading media expired on WhatsApp servers asks the phone to re-upload it instead of failing2026.9.1- GOWS - Downloading media expired on WhatsApp servers asks the phone to re-upload it in more cases (404/410)2026.9.1- NOWEB - Messages from history sync now have image thumbnails (jpegThumbnail) for newly linked sessions2026.9.1- Dashboard - Chat media thumbnails didn’t show for NOWEB sessions
What's Changed
- fix(mcp): add default limit to chats-list pagination by @jperquin in https://github.com/devlikeapro/waha/pull/2254
- [core] Expose mentions in the OpenAPI spec by @Jeparre in https://github.com/devlikeapro/waha/pull/2270
New Contributors
- @jperquin made their first contribution in https://github.com/devlikeapro/waha/pull/2254
- @Jeparre made their first contribution in https://github.com/devlikeapro/waha/pull/2270
Full Changelog: https://github.com/devlikeapro/waha/compare/2026.8.2...2026.9.1
- 2026.8.22026-09-01 · 2026-09-01 08:42 UTC
查看更新说明
Full Changelog: https://github.com/devlikeapro/waha/compare/2026.8.1...2026.8.2
🆕 New
2026.8.2- API -POST /api/sendSticker- send stickers (WebP) - 📤 Send messages - #1287, #22402026.8.2- Media - granular download control for events and API - ⚙️ Configuration - #22112026.8.2- Groups - approve new members setting -GET/PUT /api/{session}/groups/{id}/settings/security/membership-approval- 👥 Groups - #22002026.8.2- Groups - join requests API -GET /api/{session}/groups/{id}/participants/join-requests+/approveand/reject- 👥 Groups2026.8.2- Groups -group.v2.participants.join-requestevent - a request to join a group is created, rejected or revoked - 👥 Groups2026.8.2- OpenTelemetry trace context -trace_id/span_idin logs,traceparentresponse header, no export by default - 🔍 Observability2026.8.2- Prometheus metrics -GET /metrics(optional) - 🔍 Observability - #22452026.8.2- Docs - how to extend WAHA with apps, modules and session plugins - 🛠️ Development
🧩 Apps
2026.8.2- Brazilian Phone Numbers - resolves the 9th digit for Brazilian numbers - #21802026.8.2- Purge API -POST /api/apps/{id}/purge- delete the app’s stored data, keep the app configured - 🧩 Apps2026.8.2- Logout purge -POST /api/sessions/{session}/logoutaccepts{"apps": {"purge": true}}to purge apps’ storage on logout2026.8.2- Unique apps - one instance per session for ChatWoot, Reject Calls and Brazilian Phone Numbers
🧩 ChatWoot
2026.8.2- match existing contacts by resolved phone number for@lidchats and backfill missingphone_number- #22082026.8.2- name LID contacts by push name instead of raw@lidid - #1493
🛠️ Fixes
2026.8.2- WEBJS, NOWEB - Channels -reply_towas silently ignored when sending messages to channels - #22332026.8.2- WEBJS - Channels - deleting a message in a channel failed - #22362026.8.2- WEBJS - first incoming message triggered events 2-3 times - #22352026.8.2- GOWS -fromMemessages mirrored to the wrong contact/conversation - #22412026.8.2- GOWS - unable to retrieve WhatsApp groups - #22342026.8.2- GOWS - group messages carrying a new sender key in@lidgroups were silently lost - #22422026.8.2- GOWS - undecryptable messages are logged aterrorlevel instead of being silently dropped2026.8.2- Media - keep the o
- 2026.8.12026-08-14 · 2026-08-14 12:09 UTC
查看更新说明
🆕 New
2026.8.1- GOWS -storage.contactsandstorage.messageSecretssession config flags to disable contact and message secret storage - GOWS - #22072026.8.1- Message Capping -GET /api/sessions/{session}/capping,me.messageCappingandsession.statusevents - #21862026.8.1- Reachout Timelock -GET /api/sessions/{session}/timelock(GOWS, NOWEB, WEBJS) + GOWS refreshesme.reachoutTimelockon463send errors - #22192026.8.1- NOWEB -WAHA_NOWEB_WA_VERSION=auto-web|auto-baileys- fetch the latest WhatsApp Web version on start - NOWEB2026.8.1- GOWS -WAHA_GOWS_KEEPALIVE_INTERVAL_MIN|MAX- keepalive ping interval for proxies reaping idle tunnels - GOWS - devlikeapro/gows-plus#3
🧩 ChatWoot
2026.8.1- populate the WhatsApp JID attribute for@lidcontacts from the message payload - #22082026.8.1- do not save full attachment content in the task result - #2201, #2202
🛠️ Fixes
2026.8.1- GOWS - disabling allgows.storageflags was silently ignored and data was stored anyway - #22072026.8.1- GOWS -check-existsreturns the phone number in the newpnfield (chatIdcan be a@lid) - #22082026.8.1- GOWS - fill the phone number (_data.Info.SenderAlt) from the LID store in message payloads - #22082026.8.1- GOWS - Lids API resolves unknown@lid→ phone number via a server query - #22082026.8.1- Groups - set the phone number inparticipant.pnfor@lidparticipants when available2026.8.1- WEBJS - phantomAUTHENTICATED/READYstatuses after logout and message id binding race - #22222026.8.1- WEBJS - session stuck inSTARTINGstatus2026.8.1- WEBJS - hide “What’s new on WhatsApp Web” popup - #22172026.8.1- WEBJS - send button reply - #21832026.8.1- WEBJS - set group description - #21992026.8.1- WEBJS - fix adding group participants2026.8.1- WPP - fix promoting group participant to admin2026.8.1- NOWEB - fix leaving a group viagroup.v2.leave- #2206, #22092026.8.1- NOWEB - fix presence chat issue2026.8.1- S3 - setContentTypeon uploaded media objects2026.8.1- reliable session stop and process shutdown (WEBJS kills Chrome, NOWEB stops cleanly, GOWS gets SIGKILL if hanged)
Full Changelog: https://github.com/devlikeapro/waha/compare/2026.7.1...2026.8.1
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
WAHA
WAHA - WhatsApp HTTP API (REST API) that you can install on your own server and run in less than 5 minutes!
- Documentation: https://waha.devlike.pro/
- Dashboard Example: https://waha.devlike.pro/dashboard
- Swagger Example: https://waha.devlike.pro/swagger
Tables of Contents
Quick start
Requirements
Only thing that you must have - installed docker. Please follow the original instruction how to install docker ->.
When you are ready - come back and follows the below steps to send the first text message to WhatsApp via HTTP API!
Send your first message
Let's go over steps that allow you to send your first text message via WhatsApp HTTP API!
1. Download image
Assuming you have installed Docker, let's download the image.
docker pull devlikeapro/waha
Looking for WAHA Plus? It's now part of the main devlikeapro/waha image - all Plus features are included.
Read more: WAHA 2026.6 - Plus is now Core
2. Run WhatsApp HTTP API
Run WhatsApp HTTP API:
docker run -it --rm -p 3000:3000/tcp --name waha devlikeapro/waha
# It prints logs and the last line must be
# WhatsApp HTTP API is running on: http://[::1]:3000
Open the link in your browser http://localhost:3000/ and you'll see API documentation (Swagger).
3. Start a new session
To start a new session you should have your mobile phone with installed WhatsApp application close to you.
Please go and read how what we'll need to a bit later: How to log in - the instruction on WhatsApp site
When your ready - find POST /api/sessions, click on Try it out, then Execute a bit below.
The example payload:
{
"name": "default"
}
By using the request with different name values you can start multiple sessions (WhatsApp accounts) inside the single docker container.
4. Get and scan QR
Find GET /api/screenshot and execute it, it shows you QR code.
Scan the QR with your cell phone's WhatsApp app.
5. Get the screenshot
Execute GET /api/screenshot after a few seconds after scanning the QR - it'll show you the screenshot of you Whatsapp
instance. If you can get the actual screenshot - then you're ready to start sending messages!
6. Send a text message
Let's send a text message - find POST /api/sendText in swagger and change chatId this
way: use a phone international phone number without + symbol and add @c.us at the end.
For phone number 12132132131 the chatId is [email protected].
The example payload:
{
"chatId": "[email protected]",
"text": "Hi there!",
"session": "default"
}
Also, you can use curl and send POST request like this:
# Phone without +
export PHONE=12132132130
curl -d "{\"chatId\": \"${PHONE}@c.us\", \"text\": \"Hello from WhatsApp HTTP API\" }" -H "Content-Type: application/json" -X POST http://localhost:3000/api/sendText
What is next?
Go and read the full documentation!
Development
Start the project
- Clone the repository
- Make sure you're using node>=22 (check .nvmrc to get the version)
- Install the whatsapp-rust-bridge prerequisites:
# Bun runtime used by whatsapp-rust-bridge prepare scripts
curl -fsSL https://bun.sh/install | bash -s -- bun-v1.3.9
# Rust nightly toolchain used for whatsapp-rust-bridge
curl -fsSL https://sh.rustup.rs | bash -s -- -y --default-toolchain nightly-2026-01-30
rustup target add wasm32-unknown-unknown
cargo install wasm-pack --vers 0.14.0 --locked
- Run the following commands:
# Install dependencies
yarn install
# Fetch and compile proto files
yarn gows:proto
# Run
yarn start
# open http://localhost:3000