Лимиты запросов
Rate limiting, заголовки лимитов и best practices для работы с ограничениями.
Лимиты по умолчанию
Каждый API-ключ имеет ограничение на количество запросов в минуту (RPM). Лимиты применяются per API key, а не per IP или per user. По умолчанию лимит составляет 60 запросов в минуту на ключ.
Когда лимит исчерпан, последующие запросы получают ошибку 429 RATE_LIMITED до обновления окна (60 секунд).
Заголовки rate limit
Ответы на запросы к Inference API содержат заголовки с информацией о квотах. При превышении лимита запросов возвращается 429 с заголовком Retry-After, указывающим количество секунд до следующей попытки.
| Заголовок | Тип | Описание |
|---|---|---|
X-Quota-Global-Limit | integer | Общий лимит квоты для текущего биллингового периода |
X-Quota-Global-Remaining | integer | Оставшаяся квота в текущем биллинговом периоде |
X-Quota-Period-End | string (ISO 8601) | Дата и время окончания текущего биллингового периода |
Retry-After | integer | Секунды до повторной попытки (только в ответах 429) |
Пример ответа 429
http
HTTP/1.1 429 Too Many RequestsRetry-After: 12Content-Type: application/json
{ "request_id": "550e8400-e29b-41d4-a716-446655440000", "error": { "code": "RATE_LIMITED", "message": "Rate limit exceeded. Please retry after 12 seconds.", "details": { "retry_after_seconds": 12 } }}Best practices
- Отслеживайте заголовки — проверяйте
X-Quota-Global-Remainingв ответах billing-эндпоинтов и снижайте частоту запросов при приближении к лимиту - Уважайте Retry-After — при получении 429 всегда ждите указанное количество секунд перед повторной попыткой
- Exponential backoff — если после ожидания
Retry-Afterзапрос снова возвращает 429, увеличивайте задержку экспоненциально - Пакетная обработка — по возможности группируйте операции, чтобы снизить общее количество запросов
- Кеширование — кешируйте результаты для идентичных запросов на стороне клиента
- Распределение нагрузки — если у вас несколько API-ключей в организации, распределяйте запросы между ними
Пример обработки rate limit
typescript
async function requestWithRetry(url: string, options: RequestInit, maxRetries = 3) { for (let attempt = 0; attempt <= maxRetries; attempt++) { const response = await fetch(url, options);
if (response.status !== 429) { return response; }
const retryAfter = response.headers.get('Retry-After'); const waitSeconds = retryAfter ? parseInt(retryAfter, 10) : Math.pow(2, attempt);
await new Promise((resolve) => setTimeout(resolve, waitSeconds * 1000)); }
throw new Error('Rate limit exceeded after max retries');}Подробнее об ошибке 429 RATE_LIMITED и других кодах ошибок читайте в разделе Обработка ошибок.