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 — уже после блокировки.
Заголовки дают агенту три возможности:
- Замедлиться превентивно — при приближении к лимиту (поле
r= remaining). - Планировать повтор — точное время ожидания через
Retry-Afterили полеt(reset). - Выбирать стратегию — параллельные или последовательные запросы в зависимости от квоты.
Особенно важно для 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 + RateLimit | pass |
| Только один из двух | pass (с рекомендацией добавить второй) |
| Оба отсутствуют | neutral (информационный) |
Отсутствие заголовков не считается ошибкой: многие сайты осознанно их скрывают. Проверка выполняется только для корня сайта — заголовки на API-эндпоинтах не проверяются.