Rate Limits

Rate limits protect the platform from abuse and ensure fair access for all users. Limits are enforced per-IP for unauthenticated requests and per-API-key for authenticated requests.

API Key Tiers

Each API key is assigned a rate limit tier that governs the overall request throughput:

TierLimitDescription
standard10 req/sDefault for new keys
premium50 req/sPremium integrations
market_maker100 req/sHigh-frequency market makers

Administrators can also set per-key custom overrides via the rate_limit_override field. Custom overrides take precedence over the tier default. The override is a JSON object:

{ "requests": 200, "window_seconds": 1 }

Per-Endpoint Limits

Individual endpoints have their own rate limits. These per-endpoint limits apply to anonymous (per-IP) and session traffic. For HMAC API-key traffic the tier limit replaces the per-endpoint default on every endpoint - a market_maker key gets its 100 req/s ceiling on each endpoint it calls (per endpoint, per key; the tier is not an aggregate account budget).

Public Endpoints

MethodEndpointLimitWindow
GET/v1/markets100 req1 min
GET/v1/markets/:id200 req1 min
AllAll other unlisted endpoints30 req1 min

Authentication Endpoints

MethodEndpointLimitWindow
POST/v1/auth/privy10 req1 min
POST/v1/auth/callback10 req1 min
GET/v1/auth/oauth/:provider10 req1 min
POST/v1/auth/refresh5 req1 min
POST/v1/auth/revoke10 req1 min
POST/v1/auth/revoke-all5 req1 min
GET/v1/wallets/link/nonce10 req1 min
POST/v1/wallets/link10 req1 min

Fiat Endpoints

MethodEndpointLimitWindow
POST/v1/user/fiat/offramp/sessions5 req1 min
POST/v1/user/fiat/onramp/sessions10 req1 min
POST/v1/user/fiat/onramp/sessions/:id/complete20 req1 min

Trading Endpoints

MethodEndpointLimitWindow
POST/v1/orders10 req1 sec
DELETE/v1/orders/:hash20 req1 sec
GET/v1/orders/:hash20 req1 sec
POST/v1/orders/cancel-replace10 req1 sec
PUT/v1/orders/:hash/amend10 req1 sec

Market makers: the 10/s in this table is the anonymous/session default. An API key's tier limit replaces it - a market_maker key gets 100/s on single-order POST /v1/orders (and 100/s on each other endpoint, per endpoint). POST /v1/orders/batch (up to 15 orders per call) still multiplies placement throughput per request and is the recommended way to quote.

Batch Trading Endpoints

MethodEndpointLimitWindow
POST/v1/orders/batch5 req1 sec
DELETE/v1/orders/batch5 req1 sec
DELETE/v1/orders/cancel-all2 req1 sec
DELETE/v1/orders/cancel-market2 req1 sec
POST/v1/orders/heartbeat1 req1 sec

Deployment Endpoints

MethodEndpointLimitWindow
POST/v1/markets/:id/deploy20 req1 min
POST/v1/markets/batch-deploy20 req1 min

Admin Endpoints

MethodEndpointLimitWindow
POST/admin/markets10 req1 min
POST/admin/markets/:id/resolve5 req1 min

Response Headers

Every response includes rate limit information:

HeaderDescription
X-RateLimit-LimitMaximum requests per window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when window resets

Exceeded Limits

When you exceed your rate limit, the API returns 429 Too Many Requests:

{
  "error": "rate limit exceeded"
}

Back off and retry after the X-RateLimit-Reset timestamp.

Best Practices

  • Use batch endpoints to reduce request count (up to 15 orders per batch - see /api/v1/batch-operations)
  • Cache market data locally and use WebSocket for real-time updates
  • Monitor headers - check X-RateLimit-Remaining to avoid hitting limits
  • Use cancel-all instead of individual cancels when unwinding positions
  • Upgrade your tier - contact support if you need higher limits
  • Use heartbeat wisely - the 1 req/s heartbeat limit is intentional; send exactly one per second