Skip to main content
The Coinbase Advanced Trade API enforces rate limits to ensure fair access and platform stability for all users. Limits are applied per API key and vary depending on whether an endpoint is public or requires authentication. Understanding these limits — and building your integration to respect them — will prevent disruptions to your trading workflows and reduce the risk of temporary key restrictions.

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 HTTP 429 Too Many Requests response with a JSON body identifying the cause:
Do not immediately retry after receiving a 429. Sending additional requests while rate-limited will not reset your quota and may extend the cooldown window. Wait until the time indicated by X-RateLimit-Reset before resuming, or apply exponential backoff if that header is not present.

Retry Example with Exponential Backoff

The following Python example shows how to handle 429 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.
Switching from polling GET /api/v3/brokerage/best_bid_ask every second to a WebSocket subscription on the ticker channel eliminates that REST usage entirely and gives you lower-latency price data. See the WebSocket feed guide for connection and subscription details. WebSocket connections are the recommended approach for any use case requiring updates faster than once every few seconds.

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 the POST /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 as ratelimit to enforce an upper bound at the call site.