Sending API limits
The sending API does not impose a hard per-second request rate limit, but it does enforce per-request recipient limits that you must respect when batching outbound messages.
For campaigns larger than these limits, split your recipients across multiple sequential or concurrent API calls.
A
200 response does not mean every message was dispatched. Check the rejected array in the response body to identify any recipients that were not accepted within a single call. Rejected entries do not count against rate limits — you can retry them immediately after resolving the underlying issue (such as topping up credit).Verify API rate limits
The Verify API implements multi-level rate limiting to prevent abuse and protect both your account and individual users. Limits are enforced simultaneously at two levels:- Per-account (tenant): Caps the total number of new validation sessions your account can start within a rolling time window. This protects your overall quota.
- Per-phone-number: Prevents a single phone number from being flooded with verification codes by limiting how many sessions can be started for that number within a time window.
HTTP 429 response with one of the following error codes in the response body:
Handling rate limits
When you receive a429 response, you should not retry immediately. Use exponential backoff with jitter to spread out retries and avoid thundering-herd conditions.
Python — retry with exponential backoff
Python — retry with exponential backoff
Node.js — retry with exponential backoff
Node.js — retry with exponential backoff
Verification attempt limits
Each validation session (started viaPOST /v1/validations) allows a limited number of code verification attempts before it is locked.
Once a session reaches the maximum number of failed attempts, subsequent
POST /v1/validations/{token}/verify calls return HTTP 429 with the message "Too many attempts". At that point, you must start a new validation session.