Rate Limits

Rate Limits by Tier

TierRequests/secChainsBurst
Free100220
Pro1,000All200
EnterpriseUnlimitedAllUnlimited

Rate Limit Headers

Every response includes:

HeaderDescription
X-RateLimit-LimitMax requests per second
X-RateLimit-RemainingRequests remaining in window
X-RateLimit-ResetUnix timestamp of window reset

Handling 429 Responses

When rate limited, the API returns HTTP 429 with a Retry-After header (seconds).

Best Practices

  • Use WebSocket subscriptions instead of polling
  • Cache chain status and block numbers locally
  • Batch bundle submissions where possible
  • Implement exponential backoff on 429s
  • Upgrade to Pro tier for production workloads

Rate Limit Handling Example

async function apiCall(
  url: string,
  options: RequestInit,
  retries = 3
) {
  const res = await fetch(url, options);

  if (res.status === 429 && retries > 0) {
    const retryAfter = res.headers.get("Retry-After");
    const delay = parseInt(retryAfter || "1") * 1000;

    console.log(`Rate limited. Retry in ${delay}ms`);
    await new Promise((r) => setTimeout(r, delay));
    return apiCall(url, options, retries - 1);
  }

  // Log rate limit state
  console.log({
    limit: res.headers.get("X-RateLimit-Limit"),
    remaining: res.headers.get("X-RateLimit-Remaining"),
    reset: res.headers.get("X-RateLimit-Reset"),
  });

  return res.json();
}
Edit this page