EZToTrack Developers

Rate Limits

Understand and handle API rate limiting.

Rate Limit Tiers

Each API key is assigned a rate limit tier. Limits are applied per API key:

TierRequests/secBurstDaily Limit
Free151,000
Standard105050,000
Professional50200500,000
Enterprise2001,000Unlimited

Response Headers

Every API response includes rate limit headers so you can monitor your usage:

HeaderDescriptionExample
X-RateLimit-Limit Your rate limit (requests per second) 10
X-RateLimit-Remaining Remaining requests in current window 7
X-RateLimit-Reset UTC epoch timestamp when window resets 1706792400

Handling 429 Too Many Requests

When you exceed your rate limit, the API returns 429 Too Many Requests with a Retry-After header indicating how long to wait (in seconds).

HTTP/1.1 429 Too Many Requests
Retry-After: 2
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1706792402

{
  "message": "Rate limit exceeded. Retry after 2 seconds.",
  "requestId": "0HN8ABC456"
}

Exponential Backoff

Implement exponential backoff when you receive 429 responses:

import time
import requests

def api_request(url, headers, max_retries=5):
    for attempt in range(max_retries):
        response = requests.get(url, headers=headers)

        if response.status_code != 429:
            return response

        # Use Retry-After header if available
        retry_after = int(response.headers.get("Retry-After", 1))
        wait = max(retry_after, 2 ** attempt)
        print(f"Rate limited. Retrying in {wait}s...")
        time.sleep(wait)

    raise Exception("Max retries exceeded")
async function apiRequest(url, headers, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, { headers });

    if (response.status !== 429) {
      return response;
    }

    // Use Retry-After header if available
    const retryAfter = parseInt(
      response.headers.get("Retry-After") || "1"
    );
    const wait = Math.max(retryAfter, 2 ** attempt) * 1000;
    console.log(`Rate limited. Retrying in ${wait}ms...`);
    await new Promise(r => setTimeout(r, wait));
  }

  throw new Error("Max retries exceeded");
}

Best Practices

Need higher limits?
Contact your EZToTrack account manager to discuss upgrading your rate limit tier.