The Fig Markets API implements rate limiting to ensure fair usage and protect our services. Rate limits are currently applied only to the HTTP API endpoints.
Currently all HTTP API endpoints have equal weighting and are subject to the same rate limit.
- Rate Limit: 1000 requests per minute per user/IP
- Time Window: 1 minute (sliding window)
Every HTTP response includes rate limit information in the headers:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 950
X-RateLimit-Reset: 1640995200- X-RateLimit-Limit: Maximum requests allowed in the time window
- X-RateLimit-Remaining: Number of requests remaining in the current window
- X-RateLimit-Reset: Unix timestamp when the rate limit window resets
When you exceed the rate limit, you'll receive a 429 Too Many Requests response:
{
"error": "Rate limit exceeded",
"message": "Too many requests",
"limit": 100,
"window": "1m0s",
"reset": 1640995200
}// JavaScript/Node.js example
async function makeApiRequest(url, options = {}) {
try {
const response = await fetch(url, options);
// Check rate limit headers
const limit = response.headers.get('X-RateLimit-Limit');
const remaining = response.headers.get('X-RateLimit-Remaining');
const reset = response.headers.get('X-RateLimit-Reset');
console.log(`Rate limit: ${remaining}/${limit} requests remaining`);
console.log(`Reset time: ${new Date(reset * 1000)}`);
if (response.status === 429) {
const error = await response.json();
console.log('Rate limit exceeded:', error);
// Wait until reset time
const waitTime = (reset * 1000) - Date.now();
if (waitTime > 0) {
console.log(`Waiting ${waitTime}ms for rate limit reset`);
await new Promise(resolve => setTimeout(resolve, waitTime));
}
// Retry the request
return makeApiRequest(url, options);
}
return response;
} catch (error) {
console.error('Request failed:', error);
throw error;
}
}# Python example
import requests
import time
from datetime import datetime
def make_api_request(url, headers=None):
try:
response = requests.get(url, headers=headers)
# Check rate limit headers
limit = response.headers.get('X-RateLimit-Limit')
remaining = response.headers.get('X-RateLimit-Remaining')
reset = response.headers.get('X-RateLimit-Reset')
print(f"Rate limit: {remaining}/{limit} requests remaining")
print(f"Reset time: {datetime.fromtimestamp(int(reset))}")
if response.status_code == 429:
error = response.json()
print('Rate limit exceeded:', error)
# Wait until reset time
wait_time = (int(reset) * 1000) - int(time.time() * 1000)
if wait_time > 0:
print(f"Waiting {wait_time}ms for rate limit reset")
time.sleep(wait_time / 1000)
# Retry the request
return make_api_request(url, headers)
return response
except Exception as e:
print(f"Request failed: {e}")
raiseWhen you exceed the WebSocket rate limit, you'll receive a JSON-RPC error response:
{
"jsonrpc": "2.0",
"id": "your_request_id",
"error": {
"code": -32603,
"message": "Rate limit exceeded",
"data": {
"limit": 100,
"window": "1m0s",
"reset": 1640995200
}
}
}