Перейти к основному содержимому

Rate limiting и управление трафиком

Публичный контракт не фиксирует универсальные лимиты для всех клиентов и окружений. Рабочий подход: проектировать клиент так, чтобы он корректно переживал 429 и временные ошибки.

Текущие лимиты

EndpointЛимитОкно
GET /v3/streams60 запросов1 минута
GET /v2/mini-player/stream120 запросов1 минута
GET /v2/mini-player/online60 запросов1 минута
GET /v3/translation/quick-state300 запросов1 минута

При превышении лимита API возвращает HTTP 429 Too Many Requests с заголовком Retry-After.

warning

Лимиты могут корректироваться без предварительного уведомления. Рекомендуем закладывать запас и кэшировать ответы на своей стороне.

Что проверять в рантайме

  1. HTTP-код ответа.
  2. status внутри envelope.
  3. Заголовок 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).