Лимиты и квоты
Сколько запросов можно делать и что происходит, когда лимит исчерпан.
Лимиты зависят от тарифа и считаются отдельно для каждого API-ключа.
Запросы в минуту#
Скользящее окно в одну минуту на ключ. Каждый успешный ответ содержит X-RateLimit-Remaining — сколько запросов осталось в текущем окне. Сверх лимита приходит 429 rateLimited с error.retryAfter в секундах.
X-RateLimit-Remaining: 59{
"error": {
"code": "rateLimited",
"message": "Rate limit exceeded",
"retryAfter": 12
}
}Месячная квота#
У каждого ключа есть месячная квота запросов, которая сбрасывается 1-го числа каждого месяца в 00:00 UTC. Когда она заканчивается, запросы возвращают 429 rateLimited с error.reason = quota до следующего месяца.
{
"error": {
"code": "rateLimited",
"message": "Monthly quota exceeded",
"reason": "quota"
}
}Сканы в день#
Вызов POST /scans, который действительно запускает скан, тратит один скан из дневного лимита тарифа — общего со сканами, которые ты запускаешь в приложении. Чтение отчётов и вызовы скана, возвращающие свежий отчёт из кеша, лимит сканов не тратят (но считаются запросами к API).
Лимиты по тарифам#
| Тариф | Запросов / мин | Запросов / мес |
|---|---|---|
Pro | 60 | 100 000 |
Полезные практики#
- Кешируй отчёты на своей стороне — отчёт остаётся свежим несколько минут.
- При 429 подожди
retryAfterсекунд, затем повторяй с экспоненциальной задержкой и случайным разбросом. - Опрашивай сканы раз в 3–5 секунд, а не в плотном цикле.
- Распределяй пакетные задачи во времени, а не запускай их параллельно.