API / Auth / MCP

RateLimit Headers (draft-ietf-httpapi-ratelimit-headers)

Стандартные HTTP-заголовки для информирования AI-агентов о лимитах запросов: RateLimit-Limit, RateLimit-Remaining.

Что такое RateLimit Headers?

RateLimit Headers — стандартные HTTP-заголовки ответа (IETF draft draft-ietf-httpapi-ratelimit-headers), сообщающие клиенту о текущих лимитах запросов. AI-агенты используют эти заголовки для самостоятельной адаптации темпа запросов без ошибок 429 Too Many Requests.

HTTP/1.1 200 OK
RateLimit-Policy: "sliding";q=100;w=60
RateLimit: "sliding";r=87;t=42
Retry-After: 30

Зачем нужны RateLimit Headers?

AI-агенты, работающие автономно, могут генерировать большое количество запросов за короткое время. Без RateLimit-заголовков агент узнаёт о лимите только по ошибке 429 — уже после блокировки.

Заголовки дают агенту три возможности:

  1. Замедлиться превентивно — при приближении к лимиту (поле r = remaining).
  2. Планировать повтор — точное время ожидания через Retry-After или поле t (reset).
  3. Выбирать стратегию — параллельные или последовательные запросы в зависимости от квоты.

Особенно важно для MCP-серверов и API с тарифными планами.

Как реализовать RateLimit Headers?

Современная спецификация использует структурированные заголовки (RFC 8941). Два основных заголовка:

ЗаголовокСодержимоеПример
RateLimit-PolicyОпределение политики (quota, window)"sliding";q=100;w=60
RateLimitТекущее состояние (remaining, reset)"sliding";r=87;t=42

Пример для Express (middleware):

app.use((req, res, next) => {
  const remaining = rateLimiter.getRemaining(req.ip);
  const resetIn = rateLimiter.getResetSeconds(req.ip);

  res.set('RateLimit-Policy', '"sliding";q=100;w=60');
  res.set('RateLimit', `"sliding";r=${remaining};t=${resetIn}`);

  if (remaining <= 0) {
    res.set('Retry-After', String(resetIn));
    return res.status(429).json({ error: 'Too Many Requests' });
  }
  next();
});

Как мы проверяем RateLimit Headers?

Сканер отправляет HEAD-запрос к корню сайта (/) и ищет современные структурированные заголовки:

УсловиеРезультат
Оба: RateLimit-Policy + RateLimitpass
Только один из двухpass (с рекомендацией добавить второй)
Оба отсутствуютneutral (информационный)

Отсутствие заголовков не считается ошибкой: многие сайты осознанно их скрывают. Проверка выполняется только для корня сайта — заголовки на API-эндпоинтах не проверяются.

Источники и спецификации