Rate limits
Limits apply per API key, over a sliding one-minute window:
| Endpoint | Requests per minute |
|---|---|
POST /v1/sms/send | 60 |
GET /v1/sms/status/{message_id} and GET /v1/sms/batches/{batch_id} (shared) | 120 |
GET /v1/sms/balance | 30 |
A request counts towards the limit even if it then fails validation.
Headers
Every response includes:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests allowed per window for this endpoint |
X-RateLimit-Remaining | Requests left in the current window |
X-RateLimit-Reset | Unix time (seconds) when the next request will be accepted |
When you go over the limit you get 429 rate_limit_exceeded with a Retry-After header (seconds to wait).
Staying within the limits
- Send lists, not loops. One request can carry up to 10,000 numbers — far better than thousands of single sends.
- Use webhooks instead of polling
/status. Delivery reports come to you. - On
429, wait forRetry-Afterand retry. Don't retry immediately in a tight loop. - If a system needs more capacity, give it its own key — limits are per key.