Skip to main content

Rate Limits

Rate limits protect the API from abuse and ensure fair usage. Limits are enforced per API key using a Redis-backed sliding window.

Limits by Key Scope

ScopeRequests / MinuteBest For
read1,000Dashboards, analytics, read-only bots
write2,000Trading bots, data pipelines
admin5,000Platform integrations, key management

Unauthenticated Requests

Public endpoints (/v1/health, /v1/ready) allow 100 requests per minute per IP, no key required.

Response Headers

Every response includes rate limit headers:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 994
HeaderDescription
X-RateLimit-LimitYour per-minute limit
X-RateLimit-RemainingRequests remaining in current window

When Rate Limited

You’ll receive 429 Too Many Requests:
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Too many requests"
  }
}

Strategies to Stay Under Limits

Use WebSocket for real-time data

WebSocket connections don’t count against your rate limit. Instead of polling /v1/price every second, subscribe to the trade stream:
{"action": "subscribe", "channel": {"type": "trades"}}

Cache responses

DataSuggested TTL
Market metadata5 minutes
Orderbook snapshot10 seconds
Price data1–2 seconds
OHLCV candlesMatch the resolution (1m candle → 60s cache)

Batch intelligently

Instead of fetching 100 markets individually, use:
GET /v1/markets?active=true&limit=100

Use appropriate candle resolutions

Don’t fetch 1m candles for a weekly chart:
ResolutionUse Case
1mLive trading UI
5m / 15mIntraday charts
1hDaily overview
4h / 1dMulti-day analysis

Implement backoff on 429

async function fetchWithRetry(url: string, retries = 3): Promise<Response> {
  for (let i = 0; i < retries; i++) {
    const res = await fetch(url, { headers: { "X-API-Key": key } });
    if (res.status !== 429) return res;

    const waitMs = Math.min(1000 * Math.pow(2, i), 60000);
    await new Promise((r) => setTimeout(r, waitMs));
  }
  throw new Error("Rate limited after retries");
}

IP Blocking

IPs with excessive failed authentication attempts or abusive patterns may be temporarily blocked. Blocked IPs receive 403 Forbidden with:
{
  "error": {
    "code": "IP_BLOCKED",
    "message": "Your IP has been blocked"
  }
}
Blocks may have an expiry. If you believe you were blocked incorrectly, contact support.