# ratelimit-headers

## Что такое RateLimit Headers?

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

```http
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-серверов](/glossary/mcp-server-card) и API с тарифными планами.

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

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

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

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

```typescript
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-эндпоинтах не проверяются.

[← Все термины глоссария](/glossary)
