Rate Limits

Rate Limits

Overview of Skytells API rate limits — how they work, headers, and how to handle them gracefully.

Rate Limits

The Skytells API enforces per-account rate limits to ensure fair usage and platform stability. When you exceed a limit, the API returns a 429 Too Many Requests response with an error_id of RATE_LIMIT_EXCEEDED.

Rate limits are applied at the account level across all API keys belonging to the same account, measured over a rolling time window.

Yes No Request Under limit? Process 429 RATE_LIMIT_EXCEEDED Response

The Retry-After Header

Every 429 response includes a Retry-After header containing the number of seconds to wait before retrying:

HTTP/1.1 429 Too Many Requests
Retry-After: 12

Handling Rate Limits

The recommended strategy is exponential backoff with jitter — wait progressively longer between retries, with a small random offset to spread out requests from multiple clients.

Retry with exponential backoff

TypeScript
async function fetchWithRetry(url: string, options: RequestInit, retries = 5) {
  for (let attempt = 0; attempt < retries; attempt++) {
    const res = await fetch(url, options);
    if (res.status !== 429) return res;

    const retryAfter = Number(res.headers.get('Retry-After') ?? 1);
    const jitter = Math.random() * 500;
    await new Promise(r => setTimeout(r, retryAfter * 1000 + jitter));
  }
  throw new Error('Max retries exceeded');
}

General Best Practices

PracticeWhy
Read Retry-After headerAvoid guessing wait durations
Use exponential backoffSpread retry load over time
Add random jitterPrevent synchronized retries from multiple clients
Cache GET /v1/modelsModel listings change infrequently — avoid polling
Poll predictions at 2–5 s intervalsFast polling is the most common cause of hitting limits

Limits by Surface

How is this guide?

On this page