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

Independent of your API key tier, individual endpoints have their own rate limits. The more restrictive of the two (tier vs. endpoint) applies.

Public Endpoints

MethodEndpointLimitWindow
GET/v1/markets100 req1 min
GET/v1/markets/:id200 req1 min
AllAll other unlisted endpoints100 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

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/deploy5 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