Rate Limits
Orbit enforces rate limits to ensure platform stability and fair usage. Limits are applied per API key at the endpoint level. PAYG accounts use the standard limits below; Enterprise accounts receive higher limits negotiated in their rate card.
Overview
Every API response includes rate limit headers:
| Header | Description |
|---|
X-RateLimit-Limit | Maximum requests allowed in the current window |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
When you exceed a rate limit, Orbit returns 429 Too Many Requests with the RATE_LIMITED error code.
{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 12 seconds.",
"status": 429,
"details": {
"retry_after": 12,
"limit": 100,
"window": "60s"
}
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-03-08T12:00:00Z"
}
}
Limits by Endpoint
Messaging
| Endpoint | PAYG | Enterprise |
|---|
POST /api/v1/messages/sms | 100/min | Custom |
POST /api/v1/messages/whatsapp | 80/min | Custom |
POST /api/v1/messages/email | 200/min | Custom |
POST /api/v1/messages/rcs | 50/min | Custom |
POST /api/v1/messages/viber | 50/min | Custom |
POST /api/v1/messages/messenger | 80/min | Custom |
POST /api/v1/messages/line | 80/min | Custom |
POST /api/v1/messages/telegram | 80/min | Custom |
POST /api/v1/messages/group (MMS) | 60/min | Custom |
POST /api/v1/messages/fax | 20/min | Custom |
GET /api/v1/messages | 120/min | Custom |
GET /api/v1/messages/{id} | 120/min | Custom |
Voice
| Endpoint | PAYG | Enterprise |
|---|
POST /api/v1/voice/calls | 60/min | Custom |
GET /api/v1/voice/calls | 120/min | Custom |
POST /api/v1/voice/calls/{id}/hangup | 60/min | Custom |
Agents
| Endpoint | PAYG | Enterprise |
|---|
POST /api/v1/agents/{id}/chat | 20/min | Custom |
POST /api/v1/agents | 20/min | Custom |
GET /api/v1/agents | 60/min | Custom |
Numbers
| Endpoint | PAYG | Enterprise |
|---|
GET /api/v1/numbers/available | 60/min | Custom |
POST /api/v1/numbers | 60/min | Custom |
GET /api/v1/numbers | 120/min | Custom |
| Endpoint | PAYG | Enterprise |
|---|
POST /api/v1/contacts | 60/min | Custom |
GET /api/v1/contacts | 120/min | Custom |
POST /api/v1/campaigns | 30/min | Custom |
Billing & Webhooks
| Endpoint | PAYG | Enterprise |
|---|
GET /api/v1/billing/* | 120/min | Custom |
POST /api/v1/webhooks | 30/min | Custom |
GET /api/v1/webhooks | 60/min | Custom |
Handling Rate Limits
Best Practices
- Check headers proactively. Monitor
X-RateLimit-Remaining and slow down before hitting zero.
- Implement exponential backoff. When receiving a
429, wait retry_after seconds, then retry with increasing delays.
- Queue and batch. For high-volume sends, queue messages and send in controlled batches.
- Use webhooks instead of polling. Subscribe to status webhooks rather than polling
GET /api/v1/messages/{id}.
Retry Example
async function sendWithRetry(params, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await orbit.messages.send(params)
} catch (error) {
if (error.status === 429 && attempt < maxRetries - 1) {
const retryAfter = error.details?.retry_after ?? Math.pow(2, attempt)
await new Promise(r => setTimeout(r, retryAfter * 1000))
continue
}
throw error
}
}
}
import time
def send_with_retry(params, max_retries=3):
for attempt in range(max_retries):
try:
return orbit.messages.send(**params)
except OrbitError as e:
if e.status == 429 and attempt < max_retries - 1:
retry_after = e.details.get("retry_after", 2 ** attempt)
time.sleep(retry_after)
continue
raise
Global Per-Second Limit
In addition to the per-minute endpoint limits above, a single global limiter caps every API key at 50 requests per second as a platform safety net. This ceiling is applied uniformly to all callers regardless of plan — it is not a separate per-plan tier and there is no burst queue.
Requests beyond 50 req/sec receive 429 Too Many Requests immediately; they are not queued or delayed before rejection. In practice the per-minute endpoint limits above are the binding constraint for normal usage, so this global ceiling is rarely the limit you hit first. Apply the same exponential-backoff handling described above when you do.
Requesting Higher Limits
Enterprise customers can request custom rate limits. Contact your account manager or reach out to support@devotel.io.
If you consistently hit rate limits, consider upgrading your plan or optimizing your integration to use webhooks and batching.