Documentation / Complete
Rate limits (per number, per account, per key)
POST /v1/messages
Building with AI? Connect it to your account over MCP: it checks your setup, creates webhooks and templates with your confirmation and writes the code for you. See how →
Three limits, each one counted separately. Per number (connection), POST /v1/messages only: the pace Meta gives that number — Coexistence 20 per second, Cloud API 80 per second, with a one-second burst. One number at full speed does not slow down the others of your account. Per account (account), POST /v1/messages only, per minute by plan: trial 600, Starter 1,200, Studio 2,400, Agencia 4,800, Escala 9,600; custom plan, no cap; never below 600 per active key. Per key (key): everything else in /v1, 600 requests per minute. A send does not use the key's 600.
curl -i -X POST https://api.waiaconnect.com/v1/messages \
-H "Authorization: Bearer wc_live_YOUR_API_KEY" \
-H "Idempotency-Key: 7c0e…-same-on-every-retry" \
-H "Content-Type: application/json" \
-d '{"connectionId":"conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","to":"5493511234567","type":"text","text":{"body":"Hi"}}'
# 202 → X-RateLimit-Scope: connection X-RateLimit-Limit: 20 X-RateLimit-Remaining: 19
# 429 → Retry-After: 1
# { "error": { "code": "RATE_LIMITED", "limit": "connection", "connectionId": "conn_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
# "retryAfterSeconds": 1, "details": { "limitPerSecond": 20, "burst": 20 } } }The 429: the code is the usual RATE_LIMITED. It adds error.limit (connection, account or key: which one stopped you), error.connectionId (only when it was the number's) and error.retryAfterSeconds, equal to the Retry-After header. For account and key the figure is in details.limitPerMinute; for connection, in details.limitPerSecond and details.burst.
Every /v1 response carries X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (seconds until it is full again) and X-RateLimit-Scope, for the limit that is tightest at that moment.
How to build your queue: one limiter per number (up to 20/s on Coexistence, 80/s on the Cloud API), all of them under your account's per-minute figure. On a 429, wait Retry-After and retry with the same Idempotency-Key: a 429 creates nothing, so the retry is safe. With limit: "connection" pause only that number; with account or key, everything.
Accepted is not delivered: after a 202 the queue hands each message to Meta at its own pace and loses none. GET /v1/usage/by-connection counts messages, not requests: a 429 does not show up there.
Need a different account figure for a special case? Write to us: it is set account by account.