Skip to main content

Rate Limiting

Every authenticated request to a /v1/* endpoint counts against a per-project request limit. It protects the platform from bursts; it is not a sending quota. The daily ceilings per channel, the per-recipient SMS cooldown and the monthly allowances are separate rules with separate error codes. They are covered in Sending limits and summarized at the end of this page.

Request Limits

A limit that Zavu set for your account by hand is never lowered by these automatic steps, and neither is a limit that is already higher.
Counting is per project: each project has its own window and its own headers. The tier itself is set for every project in the team at once.

How to Increase Your Limit

1

Complete Business Verification (KYB)

In the dashboard, go to Compliance and open Business verification. When it is approved, every project in the team moves to 1,200 requests/min.
2

Register a 10DLC brand (US SMS)

Register your brand for 10DLC. When the registry verifies it, every project in the team moves to 2,400 requests/min. The campaign is not what raises the request limit; it is what lets you send SMS to US numbers.
The increase is applied the moment the verification is approved. Nothing changes in your code: the new limit shows up in X-RateLimit-Limit on your next request.

Rate Limit Headers

Every /v1/* response includes headers to help you track your usage:

Checking Rate Limits with the SDK

Call .withResponse() on the request to get the parsed result together with the raw HTTP response:

Rate Limit Exceeded (429)

When a project exceeds its limit, the API returns 429 Too Many Requests with a Retry-After header (in seconds) and this body:
details.retryAfter is the same instant as X-RateLimit-Reset, in Unix milliseconds. If the rate limiter itself cannot be reached, requests are refused with this same response and a 60-second Retry-After rather than let through unchecked.

Handling Rate Limits

The TypeScript SDK retries a 429 on its own, up to 2 times by default, waiting for the Retry-After the API sent. Set maxRetries higher for bursty traffic; handle the error yourself only once the retries are exhausted. For the other SDKs, check the status on the API error the same way the SDK overview does.

How It Works

The limit is a sliding window over the last 60 seconds: at any moment, a project may have at most its limit of requests in the previous minute. There is no wall-clock reset. Capacity comes back as older requests age out of the window, so a burst that hits the limit at 12:00:30 is not cleared at 12:01:00; it clears as the requests from 12:00:30 onward fall out of the window.
X-RateLimit-Remaining tells you how many requests fit right now; waiting a full 60 seconds always empties the window.

Other 429 responses that are not rate limits

POST /v1/messages and POST /v1/calls also answer 429 for limits on what you send, not on how fast you call the API. They are different rules with different codes, and none of them is raised by the request limit above.

Best Practices

Monitor Headers

Check X-RateLimit-Remaining to avoid hitting the limit unexpectedly.

Honor Retry-After

Wait the seconds in the Retry-After header, or until details.retryAfter, before retrying.

Use Broadcasts

For bulk sending, use the Broadcasts API instead of individual requests.

Use Idempotency Keys

Include idempotencyKey in requests to safely retry without duplicates.

Bulk Sending Example

For sending many messages from your own loop, pace on the headers:
For sending to more than 100 recipients, use the Broadcasts API instead. Broadcasts send in paced batches and report progress. Each recipient still counts against your daily sending ceiling.

Summary

Next Steps

Sending Limits

Daily ceilings and destination rules per account level

Broadcasts API

Send to many recipients efficiently