Лимиты запросов
Узнайте о лимитах запросов API FreeFileTools и как обрабатывать их в вашем приложении.
Лимиты бесплатного плана
| Лимит | Значение |
|---|---|
| Запросов в час | 50 |
| Максимальный размер файла на запрос | 25 MB |
| Окно лимита запросов | Rolling 1 hour |
Лимит запросов применяется на каждый API key. Каждый ключ имеет свой независимый счетчик, который сбрасывается на скользящей почасовой основе.
Когда лимиты запросов превышены
Когда вы превышаете лимит запросов, API возвращает ответ 429 Too Many Requests:
{
"error": "Rate limit exceeded",
"message": "You have exceeded the rate limit of 50 requests per hour. Please try again later.",
"retryAfter": 1742
}Поле retryAfter указывает количество секунд ожидания перед следующим запросом.
Заголовки ответа лимита запросов
Каждый ответ API включает заголовки, помогающие отслеживать использование лимита запросов:
| Заголовок | Описание |
|---|---|
X-RateLimit-Limit | Максимальное количество запросов в час (50) |
X-RateLimit-Remaining | Количество оставшихся запросов в текущем окне |
Retry-After | Секунд ожидания перед повторной попыткой (только для ответов 429) |
Пример заголовков ответа
HTTP/1.1 200 OK
Content-Type: image/jpeg
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 42Советы по соблюдению лимитов
Проверяйте оставшиеся запросы
Отслеживайте заголовок X-RateLimit-Remaining, чтобы знать, сколько запросов у вас осталось.
Реализуйте экспоненциальную задержку
При получении ответа 429 подождите и повторите попытку с увеличивающимися задержками, а не бомбардируйте API.
Кэшируйте результаты
Если вы обрабатываете одни и те же файлы повторно, кэшируйте результаты локально, чтобы избежать ненужных вызовов API.
Группируйте с умом
Для пакетной обработки распределяйте запросы по времени, а не отправляйте все сразу.
Пример: Обработка лимитов запросов в JavaScript
async function apiCall(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get("Retry-After") || "60");
console.log(`Rate limited. Waiting ${retryAfter} seconds...`);
await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
continue;
}
return response;
}
throw new Error("Max retries exceeded");
}