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:
| Tier | Requests/sec | Burst | Daily Limit |
|---|---|---|---|
| Free | 1 | 5 | 1,000 |
| Standard | 10 | 50 | 50,000 |
| Professional | 50 | 200 | 500,000 |
| Enterprise | 200 | 1,000 | Unlimited |
Response Headers
Every API response includes rate limit headers so you can monitor your usage:
| Header | Description | Example |
|---|---|---|
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
- Monitor rate limit headers — Check
X-RateLimit-Remainingproactively to avoid hitting limits - Use exponential backoff — Never retry immediately after a 429 response
- Cache responses — Cache data that doesn't change frequently (vehicle info, driver profiles)
- Use feed endpoints — For real-time data, use the
/feedendpoints with cursors instead of polling list endpoints - Batch requests — Use pagination with larger
limitvalues to reduce the number of requests
Need higher limits?
Contact your EZToTrack account manager to discuss upgrading your rate limit tier.