WAHA 2026.8 - Extend WAHA, Group Join Requests, Stickers
September 1, 2026 in Releases by devlikeapro5 minutes

🛠️ Extend WAHA - Apps, Modules, Plugins
Want to add your own functionality to WAHA - an integration with an external product, a region-specific behavior, a metric, a low-level tweak in the message flow?
We’ve documented how to extend WAHA - four extension layers, ordered from the most preferred to the last resort - pick the highest layer that fits:
- 🧩 Apps - new functionality on top of WAHA, attached per session - like ChatWoot or Brazilian Phone Numbers.
- 📦 Modules - a product-wide capability, enabled and configured via environment variables - like Prometheus metrics or Webhooks.
- 🔌 Plugins - a low-level tweak of how requests and events flow through a session.
- 🏭 Engines - a new core WhatsApp feature or an engine fix.
The guide builds the same Message Logger feature at every layer, with real code - folder structure, registration points, lifecycle hooks, migrations and the Dashboard part.
Right now extending WAHA means sending a pull request to the official WAHA - a PR that keeps its changes inside an app, a module or a plugin gets reviewed fast and is likely to be accepted.
Later we’re planning a more extensive way to contribute, like n8n community nodes:
you publish a @{scope}/waha-app-{name} or waha-module-{name} npm package,
and WAHA discovers and enables it automatically.
Read more: 🛠️ Development
🧩 Apps: Brazilian Phone Numbers
Brazilian numbers (country code 55) have the 9th digit problem -
the same contact exists with and without the extra 9, so messages end up in the wrong chat or get no reply at all.
Attach the new Brazilian Phone Numbers app to a session, and WAHA resolves the correct chat id automatically before sending. It’s also a small reference app to look at if you’re building your own.
Read more: Brazilian Phone Numbers — #2180
👥 Group Join Requests
You can now manage groups where admins must approve new members - read and update the setting via API:
PUT /api/{session}/groups/{groupId}/settings/security/membership-approval{
// true - admins must approve requests to join the group
// false - anyone can join the group
"newMembersApprovalRequired": true
}List the pending requests, then approve or reject them:
GET /api/{session}/groups/{groupId}/participants/join-requestsPOST /api/{session}/groups/{groupId}/participants/join-requests/approvePOST /api/{session}/groups/{groupId}/participants/join-requests/rejectAnd there’s a new group.v2.participants.join-request event when a request is created, rejected or revoked - so you can build auto-approval flows:
{
"event": "group.v2.participants.join-request",
"session": "default",
"payload": {
"group": {
"id": "123456789@g.us"
},
"action": "created",
"requesterId": "123456789@lid",
"requesterPn": "123456789@c.us",
"requestMethod": "invite_link",
"timestamp": 1666943582
}
}📤 Send Stickers
You can now send stickers:
POST /api/sendSticker{
"session": "default",
"chatId": "11111111111@c.us",
"file": {
"mimetype": "image/webp",
"url": "https://www.gstatic.com/webp/gallery/1.webp"
}
}The file must already be in WebP format (via URL or BASE64) - PNG and JPEG are not converted.
Read more: 📤 Send messages — #1287
🔍 Observability - Prometheus
WAHA can now expose Prometheus metrics - sessions and their statuses, engine and build info. The endpoint is disabled by default - enable it with an env var:
WAHA_PROMETHEUS_ENABLED=True
# Optional:
# WAHA_PROMETHEUS_PATH=/metrics
# WAHA_PROMETHEUS_METRIC_PREFIX=waha_
# WAHA_PROMETHEUS_TRACK_EVENTS=message.any
# WAHA_PROMETHEUS_HTTP_DURATION_BUCKETS=0.005,0.01,0.025,0.05,0.1,0.25,0.5,1,2.5,5,10,30
# WAHA_PROMETHEUS_USERNAME=admin
# WAHA_PROMETHEUS_PASSWORD=secretGET /metricsRead more: 🔍 Observability — #2245
🔎 Observability - Tracing
WAHA now uses OpenTelemetry trace context to correlate logs with HTTP requests:
every log line gets trace_id and span_id fields, and every HTTP response carries a traceparent header,
so you can find all the logs for a single API call
(if the client sends its own traceparent - WAHA continues that trace).
There’s no exporter and no extra infrastructure - it’s enabled by default:
traceparent: 00-b992d8568c2ea3d2d3b135cc0cd322a6-4e4d4694dcbc1938-01Read more: 🔍 Observability
📈 Message Capping and Timelock
WhatsApp enforces a per-cycle quota on how many new contacts an account may message -
once the account is capped, sends fail with server returned error 475 while the session looks perfectly fine.
WAHA now exposes the Message Capping state - fetch the current quota from WhatsApp on demand:
GET /api/sessions/{session}/capping{
"cappingStatus": "FIRST_WARNING",
"totalQuota": 1000,
"usedQuota": 640,
"cycleStart": 1782874800,
"cycleEnd": 1785553199
}You also get it in the me.messageCapping field and in session.status events when the state changes.
The ⏳ Reachout Timelock from 2026.7
got the same on-demand endpoint (GOWS, NOWEB, WEBJS),
and GOWS now refreshes the timelock state right when a send fails with error 463:
GET /api/sessions/{session}/timelockRead more: ⚙️ Sessions — #2186, #2219
🖼️ Media Download Control
You can now control media downloading separately for events (webhooks, websockets) and API calls - globally via env vars, per mimetype, and per request with query parameters:
WAHA_EVENTS_DOWNLOAD_MEDIA=true
WAHA_EVENTS_DOWNLOAD_MEDIA_MIMETYPES=audio,image/png
WAHA_API_DOWNLOAD_MEDIA=true
WAHA_API_DOWNLOAD_MEDIA_MIMETYPES=imageWhen media is not downloaded, you still get hasMedia: true and the media attributes
(mimetype, filename) - only media.url is null.
Read more: ⚙️ Configuration — #2211
🧩 Apps Updates
- Purge API - delete an app’s stored data but keep the app configured:
POST /api/apps/{id}/purge- Purge on logout -
POST /api/sessions/{session}/logoutaccepts{"apps": {"purge": true}}to purge apps’ storage on logout. - Unique apps - one instance per session for ChatWoot, Reject Calls and Brazilian Phone Numbers.
Read more: 🧩 Apps
🆕 Changelog
Check out the full list of updates in the 🆕 WAHA 2026.8 Changelog and stay tuned for more!