Rate Limit Tiers
Endpoints are divided into two tiers based on their sensitivity and resource cost. Your request budget is tracked separately for each tier.Public Endpoints (Market Data)
Public endpoints return market-wide data such as product listings, order book snapshots, candles, and ticker prices. Because they do not require authentication, they carry a higher rate limit to support a wide range of use cases including analytics, dashboards, and price feeds.- Limit: 30 requests per second
- Authentication required: No
- Examples:
GET /api/v3/brokerage/products,GET /api/v3/brokerage/market/product-book
Private Endpoints (Orders and Accounts)
Private endpoints interact with your account data and can execute real trades. Because they carry financial risk and consume more server resources, they are subject to stricter limits. These limits are enforced per authenticated API key.- Limit: 10 requests per second
- Authentication required: Yes (JWT Bearer token)
- Examples:
POST /api/v3/brokerage/orders,GET /api/v3/brokerage/accounts,GET /api/v3/brokerage/orders/historical/batch
Rate limits are applied on a per-API-key basis. If you run multiple instances of your application sharing the same key, their requests are pooled together against the same quota. Use separate API keys for separate workloads if you need independent rate limit budgets.
Rate Limit Headers
Every API response includes headers that tell you your current quota status. Read these headers on every response — not just on errors — so you can proactively slow down before hitting the limit.What Happens When You Exceed the Limit
When your request rate exceeds the allowed threshold, the API returns an HTTP429 Too Many Requests response with a JSON body identifying the cause:
Retry Example with Exponential Backoff
The following Python example shows how to handle429 responses using exponential backoff with random jitter. The jitter component prevents the “thundering herd” problem that occurs when multiple clients synchronize their retries at exactly the same moment.
Best Practices
Staying within rate limits requires more than just counting requests — it means designing your integration to be efficient from the ground up.Use WebSocket for Real-Time Data
Polling REST endpoints for prices, order book updates, or order status burns through your quota quickly and introduces latency. The WebSocket Advanced Trade feed pushes updates to you the moment they occur, with no per-message cost against your REST rate limit.Cache Static and Semi-Static Data
Product definitions, fee tiers, and account metadata do not change frequently. Fetch them once at startup and refresh on a long interval (for example, every 5–10 minutes) rather than on every order cycle:Batch Order Cancellations
If you need to cancel multiple open orders, use thePOST /api/v3/brokerage/orders/batch_cancel endpoint instead of sending one DELETE request per order. A single batch cancel request can cancel up to 100 orders simultaneously, reducing both latency and quota consumption:
Spread Requests Evenly
Avoid bursting all your requests at the start of each second. Spread them evenly across the window using a simple token-bucket or leaky-bucket approach. Many HTTP client libraries offer built-in rate-limiting middleware — or you can use a lightweight Python library such asratelimit to enforce an upper bound at the call site.