Skip to main content

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:
HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix 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

EndpointPAYGEnterprise
POST /api/v1/messages/sms100/minCustom
POST /api/v1/messages/whatsapp80/minCustom
POST /api/v1/messages/email200/minCustom
POST /api/v1/messages/rcs50/minCustom
POST /api/v1/messages/viber50/minCustom
POST /api/v1/messages/messenger80/minCustom
POST /api/v1/messages/line80/minCustom
POST /api/v1/messages/telegram80/minCustom
POST /api/v1/messages/group (MMS)60/minCustom
POST /api/v1/messages/fax20/minCustom
GET /api/v1/messages120/minCustom
GET /api/v1/messages/{id}120/minCustom

Voice

EndpointPAYGEnterprise
POST /api/v1/voice/calls60/minCustom
GET /api/v1/voice/calls120/minCustom
POST /api/v1/voice/calls/{id}/hangup60/minCustom

Agents

EndpointPAYGEnterprise
POST /api/v1/agents/{id}/chat20/minCustom
POST /api/v1/agents20/minCustom
GET /api/v1/agents60/minCustom

Numbers

EndpointPAYGEnterprise
GET /api/v1/numbers/available60/minCustom
POST /api/v1/numbers60/minCustom
GET /api/v1/numbers120/minCustom

Contacts & Campaigns

EndpointPAYGEnterprise
POST /api/v1/contacts60/minCustom
GET /api/v1/contacts120/minCustom
POST /api/v1/campaigns30/minCustom

Billing & Webhooks

EndpointPAYGEnterprise
GET /api/v1/billing/*120/minCustom
POST /api/v1/webhooks30/minCustom
GET /api/v1/webhooks60/minCustom

Handling Rate Limits

Best Practices

  1. Check headers proactively. Monitor X-RateLimit-Remaining and slow down before hitting zero.
  2. Implement exponential backoff. When receiving a 429, wait retry_after seconds, then retry with increasing delays.
  3. Queue and batch. For high-volume sends, queue messages and send in controlled batches.
  4. 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.