# Лимиты запросов

Лимиты считаются на четырёх уровнях: `app-user`, `app`, `user` и, для публичного ключа, `publishable-ip` — посетитель сайта (по его адресу). Первые три уровня считаются отдельно для секретных ключей и для публичного: сайт не тратит лимит бота, и наоборот. Каждый ответ после проверки ключа называет действующие уровни и остаток по каждому.

| уровень (`policy`) | что считает | запросов в минуту |
|---|---|---|
| `app-user` | приложение × стример | 600 |
| `app` | приложение по всем стримерам | 6000 |
| `user` | стример по всем приложениям | 1200 |
| `publishable-ip` | публичный ключ × адрес посетителя | 60 |

Уровни `app-user`, `app` и `user` считаются отдельно для секретных ключей и для публичного ключа: сайт не
тратит бюджет бота, и наоборот. Все секретные ключи стримера делят один бюджет.

Каждый ответ после успешной проверки ключа несёт заголовки по форме
draft-ietf-httpapi-ratelimit-headers-08:

```
RateLimit-Policy: "app-user";q=600;w=60, "app";q=6000;w=60, "user";q=1200;w=60
RateLimit: "app-user";r=599;t=42, "app";r=5999;t=42, "user";r=1199;t=42
```

`q` — квота окна, `w` — окно в секундах, `r` — остаток, `t` — секунды до нового окна. Превышение —
`429` с `Retry-After` и `"policy"` в теле. Ответы до проверки ключа (401, `wrong_token_type`,
`token_in_query`, `origin_not_allowed`) и описание OpenAPI заголовков лимита не несут.

## Что делать после 429

1. Прочитайте `Retry-After` в ответе: столько секунд не отправляйте запросы. В теле ответа поле `policy` называет исчерпанный уровень.
2. Повторите запрос после паузы. Если ждать приходится снова, увеличивайте паузу каждый раз.
3. Уменьшите частоту: храните ответ у себя и обновляйте его реже, читайте за запрос максимум записей (`limit`), не опрашивайте API чаще, чем меняются данные.

Новый секретный ключ лимит не снимет: все секретные ключи стримера делят один бюджет. Публичный ключ упирается в лимит на посетителя, например при частом обновлении страницы: храните ответ на стороне сайта.

Заголовки лимита приходят только в ответах, которые прошли проверку ключа. В 401, `wrong_token_type`, `token_in_query` и `origin_not_allowed` их нет. Страница ошибки: [rate_limited](https://developers.staging.donatty.com/errors/rate_limited.md).
