Rate Limits
Per-wallet rate limiting for order operations and API requests.
Overview
Rate limiting is enforced per wallet using a fixed-window algorithm. Limits are applied to:
- Order placements (
POST /order,POST /perp-order) - Order cancellations (
DELETE /order) - API requests (general endpoint usage)
Limits reset every 60 seconds.
Default Limits
| Tier | Orders/min | Cancels/min | API Requests/min | Max Open Orders | Max Positions |
|---|---|---|---|---|---|
| Default | 60 | 120 | 600 | 100 | 50 |
| Tier 1 | 30 | 60 | 300 | 50 | 20 |
| Tier 2 | 120 | 300 | 1,200 | 500 | 200 |
| Market Maker | 600 | 1,200 | 6,000 | 2,000 | Unlimited |
New wallets receive default limits. Contact support for tier upgrades.
Rate Limit Response
When a rate limit is exceeded, the API returns 429 Too Many Requests:
{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded for OrderPlacement: 60 per minute, retry after 45 seconds",
"retry_after_secs": 45,
"limit": 60
}
Response Headers
All rate-limited endpoints include these headers on both success and error responses:
| Header | Description | Example |
|---|---|---|
X-RateLimit-Limit | Maximum requests allowed per window | 60 |
X-RateLimit-Remaining | Requests remaining in current window | 42 |
X-RateLimit-Reset | Unix timestamp when the window resets | 1737312060 |
Retry-After | Seconds until retry (only on 429) | 45 |
Example Response Headers
Successful request:
HTTP/1.1 200 OK
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 42
X-RateLimit-Reset: 1737312060
Rate limited request:
HTTP/1.1 429 Too Many Requests
Retry-After: 45
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1737312060
Rate Limit Categories
Rate limits are tracked separately for each action type:
Order Placement
Applies to:
POST /order(options orders)POST /perp-order(perpetual orders)POST /orders(bulk orders - each order in batch counts)
Order Cancellation
Applies to:
DELETE /orderPOST /orders/cancel(bulk cancels - each cancel counts)
API Requests
Applies to general API usage across all authenticated endpoints.
Position and Order Limits
In addition to rate limits, wallets have maximum open order and position limits:
| Limit Type | Description | Rejection |
|---|---|---|
| Max Open Orders | Maximum concurrent open orders | Order rejected before reaching engine |
| Max Positions | Maximum unique positions (-1 = unlimited) | Order rejected if would create new position |
When limits are exceeded:
{
"error": "limit_exceeded",
"message": "Maximum open orders limit exceeded (100)"
}
Best Practices
Handling Rate Limits
- Monitor headers: Track
X-RateLimit-Remainingproactively - Respect Retry-After: Wait the specified duration before retrying
- Implement backoff: Use exponential backoff on repeated 429s
import time
def place_order_with_retry(order, max_retries=3):
for attempt in range(max_retries):
response = api.place_order(order)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
time.sleep(retry_after)
continue
return response
raise RateLimitError("Max retries exceeded")
Optimizing Request Usage
- Use bulk endpoints:
POST /ordersfor multiple orders in one request - Batch cancels:
POST /orders/cancelinstead of multipleDELETE /order - WebSocket for updates: Subscribe to order updates instead of polling
GET /orders
Monitoring
Track these client-side metrics:
- Request rate per action type
X-RateLimit-Remainingtrends- 429 response frequency
- Average
Retry-Afterdurations
Error Reference
| HTTP Status | Error Code | Description |
|---|---|---|
| 429 | rate_limit_exceeded | Rate limit exceeded, retry after specified time |
See Errors for the full error reference.