Guides
Rate limits
Limits protect your number's quality rating and keep the API fast for everyone.
How limits work
- Limits are counted per credential: each API key or OAuth token has its own budget (requests without one are counted per IP).
- The current budget is 2,000 requests per minute per credential, in a one-minute window. Read it from
x-ratelimit-limitrather than hard-coding it. - Need more for a migration or a large integration? Talk to us and we can raise it.
Response headers
x-ratelimit-limit | Requests allowed in the current window. |
x-ratelimit-remaining | Requests left in the window. |
x-ratelimit-reset | Seconds until the window resets. |
retry-after | Sent with 429: seconds to wait before retrying. |
When you hit the limit
The API answers 429 with the standard error envelope:
429 Too Many Requests
{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after 12s.",
"details": {
"limit": 2000,
"remainingMs": 12000
}
},
"requestId": "a1f4c2e0-9b6d-4a1e-8c3f-2d7e5b9a0c11",
"timestamp": "2026-07-12T09:30:00.000Z",
"path": "/api/public/v1/messages",
"method": "POST"
}Best practices
- Wait for
retry-after, then retry with exponential backoff and jitter. - Sending to many people? Create a broadcast instead of looping over
POST /messages— one call, and inaiy paces delivery for you. - Use webhooks instead of polling message status.
- Use the
fieldsandlimitquery parameters to fetch only what you need.
WhatsApp limits are separate
Meta also limits how many new customers a number can message per day (messaging tiers). Those limits apply to the WhatsApp number, whichever API or tool you send from.