Rate limiting и управление трафиком
Публичный контракт не фиксирует универсальные лимиты для всех клиентов и окружений. Рабочий подход: проектировать клиент так, чтобы он корректно переживал 429 и временные ошибки.
Текущие лимиты
| Endpoint | Лимит | Окно |
|---|---|---|
GET /v3/streams | 60 запросов | 1 минута |
GET /v2/mini-player/stream | 120 запросов | 1 минута |
GET /v2/mini-player/online | 60 запросов | 1 минута |
GET /v3/translation/quick-state | 300 запросов | 1 минута |
При превышении лимита API возвращает HTTP 429 Too Many Requests с заголовком Retry-After.
warning
Лимиты могут корректироваться без предварительного уведомления. Рекомендуем закладывать запас и кэшировать ответы на своей стороне.
Что проверять в рантайме
- HTTP-код ответа.
statusвнутри envelope.- Заголовок
Retry-After, если пришёл.
Базовая retry-стратегия
- повторять только идемпотентные
GET; - не ретраить ошибки валидации/авторизации (
400-класс без429); - использовать backoff с jitter;
- ограничить число повторов.
Пример задержек: 1s -> 2s -> 4s (+ случайный jitter 100-300ms).
Рекомендуемые интервалы обновления UI
- каталог
/v3/streams: 15-60 секунд в зависимости от сценария; - live-статус
/v3/translation/quick-state: 3-10 секунд; - mini-player
/v2/mini-player/online: 10-30 секунд, если нужен индикатор "сейчас в эфире".
Минимальный JS-шаблон
async function requestWithRetry(url, { retries = 3 } = {}) {
for (let attempt = 0; attempt <= retries; attempt += 1) {
const response = await fetch(url, { headers: { Accept: 'application/json' } });
if (response.ok) {
return response.json();
}
if (response.status !== 429 || attempt === retries) {
throw new Error(`HTTP ${response.status}`);
}
const retryAfter = Number(response.headers.get('Retry-After') ?? 1);
const jitter = Math.floor(Math.random() * 300);
await new Promise((r) => setTimeout(r, retryAfter * 1000 + jitter));
}
}
Операционная практика
- логируйте частоту
429и долю повторных запросов; - кэшируйте ответы каталога на своей стороне;
- при всплесках трафика переключайтесь на деградированный режим (реже poll, проще UI).