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.
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 returns429 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 theRetry-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:Summary
Next Steps
Sending Limits
Daily ceilings and destination rules per account level
Broadcasts API
Send to many recipients efficiently
