Перейти к содержимому

Лимиты

Лимиты защищают вход и SMS от перебора. При превышении API отвечает 429 Too Many Requests и сообщает в заголовке Retry-After, через сколько секунд можно повторить запрос.

Метод Лимит
POST /v1/auth/refresh 30 запросов в минуту с одного IP
остальные методы /v1/auth/* 10 запросов в минуту с одного IP

Счётчик ведётся отдельно для каждого метода: 10 запросов к /v1/auth/login не расходуют лимит /v1/auth/login/start. Успешные ответы этих методов содержат заголовки X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset (секунды до сброса окна).

При превышении — 429 с кодом too_many_requests:

HTTP/1.1 429 Too Many Requests
Retry-After: 42
Content-Type: application/json
{
"error": {
"code": "too_many_requests",
"message": "Слишком много запросов. Повторите позже",
"requestId": "b6a1f0c2-8d3e-4b7a-9c5f-2e1d0a9b8c7d"
}
}

Лимиты считаются на пользователя (номер телефона), а не на IP, и действуют во всех сценариях, где отправляется код: регистрация, вход по SMS, восстановление пароля и повторная отправка.

Правило Ответ при нарушении
не чаще одного кода в 60 секунд 429 code_resend_too_soon, Retry-After — сколько секунд осталось
не больше 5 кодов в час 429 too_many_requests, Retry-After: 3600
5 неверных попыток ввода одного кода 429 code_attempts_exceeded, Retry-After: 900, блокировка на 15 минут

Каждый ответ с кодом (challengeId) сообщает, когда можно запросить следующий: поле resendIn в секундах. Показывайте обратный отсчёт по нему, а не по своей константе.

{
"error": {
"code": "code_resend_too_soon",
"message": "Новый код можно запросить через 37 с",
"details": { "retryAfter": 37 },
"requestId": "6c0e9a41-1f2b-4d8c-a7e3-5b9d2c4f6a80"
}
}

Код можно ввести неверно четыре раза — на каждую попытку API отвечает 401 invalid_code. Пятая неверная попытка возвращает 429 code_attempts_exceeded: этот код больше не принимается, даже правильный, и в течение 15 минут пользователю не отправляются новые коды.

  • Прочитайте Retry-After (в секундах) и не повторяйте запрос раньше. В браузере заголовок доступен скрипту — он открыт в CORS.
  • Не повторяйте запросы автоматически в цикле: каждая попытка входит в счётчик.
  • Покажите пользователю message — он уже содержит понятный текст на нужном языке.