To ensure the stability and availability of our API for all users, AutoTechJobs implements rate limiting on API requests. This page explains how our rate limiting works and how to handle rate limit errors.
Rate limits are applied on a per-API key basis. Different endpoints may have different rate limits depending on their resource intensity. When you exceed a rate limit, the API will return a 429 Too Many Requests response.
Important: Rate limits may vary based on your subscription plan. Higher tier plans have higher rate limits.
All API responses include headers that provide information about your current rate limit status:
| Header | Description |
|---|---|
| X-RateLimit-Limit | The maximum number of requests you're permitted to make per hour |
| X-RateLimit-Remaining | The number of requests remaining in the current rate limit window |
| X-RateLimit-Reset | The time at which the current rate limit window resets in UTC epoch seconds |
HTTP/1.1 200 OK Content-Type: application/json X-RateLimit-Limit: 5000 X-RateLimit-Remaining: 4999 X-RateLimit-Reset: 1617724800
Rate limits vary based on your subscription plan. Here are the default rate limits for each plan:
| Plan | Rate Limit (requests per hour) | Burst Limit (requests per minute) |
|---|---|---|
| Free | 1,000 | 60 |
| Basic | 5,000 | 120 |
| Professional | 10,000 | 300 |
| Enterprise | Custom | Custom |
Some endpoints may have different rate limits due to their resource intensity. For example, search endpoints may have lower limits to prevent excessive load on our search infrastructure.
When you exceed a rate limit, the API will return a 429 Too Many Requests response with a JSON error body. The response will also include the rate limit headers mentioned above, which tell you when the rate limit will reset.
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1617724800
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Please try again after 2025-04-10T21:00:00Z",
"documentation_url": "https://api.autotechjobs.co.uk/docs/api/rate-limiting"
}
}async function fetchWithRetry(url, options = {}, maxRetries = 5) {
let retries = 0;
while (retries < maxRetries) {
try {
const response = await fetch(url, options);
// Check if rate limited
if (response.status === 429) {
const resetTime = response.headers.get('X-RateLimit-Reset');
const waitTime = resetTime ? (new Date(resetTime * 1000) - new Date()) : (1000 * Math.pow(2, retries));
console.log(`Rate limited. Waiting ${waitTime/1000} seconds before retry.`);
await new Promise(resolve => setTimeout(resolve, waitTime));
retries++;
continue;
}
return response;
} catch (error) {
const waitTime = 1000 * Math.pow(2, retries);
console.log(`Error: ${error.message}. Retrying in ${waitTime/1000} seconds.`);
await new Promise(resolve => setTimeout(resolve, waitTime));
retries++;
if (retries >= maxRetries) {
throw new Error(`Maximum retries (${maxRetries}) exceeded.`);
}
}
}
}If you find that the default rate limits are not sufficient for your use case, you have several options: