Skip to content
Last updated

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.

Rate Limit Basics

Default Limits

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)

HTTP API Rate Limiting

Rate Limit Headers

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

Rate Limit Exceeded Response

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
}

Example: Handling Rate Limits in HTTP Requests

// 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}")
        raise

WebSocket Rate Limiting

Rate Limit Exceeded Response

When 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
    }
  }
}