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-limit rather 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-limitRequests allowed in the current window.
x-ratelimit-remainingRequests left in the window.
x-ratelimit-resetSeconds until the window resets.
retry-afterSent 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 fields and limit query 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.