Create an instance
One instance holds one WhatsApp number.
Link a number
Open WhatsApp on the sending phone, go to Linked devices, and have the scanner ready before you request the code — it expires in about 30 seconds.
Scan within 30 seconds
Your instances
State refreshes every 15 seconds.
| Name | State | Number | |
|---|---|---|---|
| Loading… | |||
Text message
Up to 4096 characters.
Photo, video or file
Upload from this machine, or point at a public URL.
Message history
Every send, whether it came from this console or the API.
| When | To | Type | Status | Via | Took | Problem |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Create a key
For scripts, servers and agents. The full value is shown once and never again — only a hash is stored.
Existing keys
Revoking takes effect immediately.
| Name | Prefix | Used | Status | |
|---|---|---|---|---|
| Loading… | ||||
Authentication
Two ways in. The browser console uses a bearer token; everything else uses an API key. Create one on the API keys tab.
export WAG_URL="http://localhost:8099"
export WAG_KEY="wag_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# every request carries the key in this header
curl -s "$WAG_URL/health" \
-H "X-API-Key: $WAG_KEY"
Endpoints
Numbers accept any format. A 10-digit value gets the default country code prepended, so 9876543210 and +91 98765-43210 are equivalent.
Responses and errors
Every failure comes back in the same shape, with a request id you can grep the logs for.
# success
{"ok":true,"id":"...","instance":"production-1","number":"919876543210",
"message_type":"text","message_id":"3EB0...","status":"sent",
"duration_ms":842,"request_id":"a1b2c3d4"}
# failure
{"ok":false,"error":"instance_not_connected",
"message":"Instance 'production-1' is 'close', not 'open'. Scan its QR code before sending.",
"detail":{"instance":"production-1","state":"close"},
"request_id":"a1b2c3d4"}
| Status | Error | What to do |
|---|---|---|
| 401 | not_authenticated | Missing or wrong X-API-Key |
| 403 | permission_denied | The key lacks the scope this endpoint needs |
| 404 | not_found | Instance name is wrong, or it was deleted |
| 404 | number_not_on_whatsapp | Recipient has no WhatsApp account |
| 409 | instance_not_connected | Scan the QR code |
| 422 | validation_error | Check detail for the offending field |
| 429 | rate_limited | Back off; see the Retry-After header |
| 502 | upstream_error | Evolution returned an error — check its logs |
| 503 | upstream_unavailable | Evolution is unreachable |