x-api-key или, если API-ключ не передан, IP-адрес клиента. Каждая область ведёт независимый счётчик со скользящим окном 60 секунд.
Идентификатор и исключения
Промежуточное ПО выбирает идентификатор для ограничения частоты в следующем порядке:- Заголовок
x-api-key→ счётчик, привязанный к ключу. - Первый хоп
X-Forwarded-For→ счётчик, привязанный к IP-адресу. REMOTE_ADDR→ счётчик, привязанный к IP-адресу.
- Внутренний
DIDIT_WEBAPP_API_KEY(используется только консолью Didit). - Эндпоинты, защищённые разрешением
IsValidSession(трафик встроенных сессий и сессий SDK). GET /system/healthcheck(обрабатываетсяHealthMiddlewareдо этого стека).- Webhook’и провайдеров: Stripe, AML-скрининг, callback-вызовы верификации лиц, изменение списков KYC.
Глобальные лимиты
Каждый аутентифицированный запрос также помещается в общую область в зависимости от HTTP-метода, поэтому любой новый маршрут получает разумное значение по умолчанию:
Создание транзакций и приём событий учитываются в области
ingest-write, а не в generic-write: интеграция с высоким объёмом приёма данных получает 600 запросов в минуту на каждый API-ключ и не расходует бюджет своих остальных операций записи.
Лимиты для отдельных endpoint’ов (следующий раздел) применяются в дополнение к глобальному лимиту. Первая область, в которой превышен лимит, вызывает ответ 429.
Лимиты для отдельных endpoint’ов
Middleware определяет более строгие области для самых критичных маршрутов:GET /v3/session/<id>/decision/ обслуживается SessionV3RetrieveView и не входит в область session-decision. Для него действует только общий потолок generic-get 600 в минуту. Ограничение 100 в минуту по решению распространяется только на пути решений v1 и v2.Формат ответа 429
Если вы превысили лимит в любой области, вы получите HTTP-ответ429 с таким телом и заголовками:
Заголовки
X-RateLimit-* возвращаются только в ответе 429: успешные ответы сейчас их не содержат. Используйте значение Retry-After (или X-RateLimit-Reset - now) как задержку перед следующей попыткой.
Рекомендации для клиента
- Учитывайте
Retry-Afterкак минимальную задержку перед повторной попыткой. Поверх неё добавьте экспоненциальную задержку с джиттером (5s → 10s → 20s → 40s ± random), чтобы два клиента, получившие429одновременно, не синхронизировались. - Прекращайте повторные попытки после небольшого предела (например, 5 попыток). Передайте ошибку вызывающему коду и оповестите свою команду: постоянные ответы 429 обычно означают неконтролируемый цикл, а не кратковременный всплеск.
- Используйте один идентификатор на каждую нагрузку. Если один
x-api-keyиспользуется сразу многими бэкендами, они попадают в один счётчик, и один «шумный» сосед может лишить остальных доступа к лимиту. Создавайте отдельное приложение (а значит, и отдельныйapi_key) для каждой среды, бренда или клиента. См. Программная регистрация. - Кэшируйте результаты запросов решений. Endpoint’ы
/decision/не предназначены для частого опроса в тесных циклах. Если нужны обновления в реальном времени, используйте webhook, аGET /v3/session/<id>/decision/вызывайте только для догрузки данных или аудита. - Генерируйте PDF офлайн. Рендеринг PDF нагружает процессор и ограничен 50 запросами в минуту. Запускайте его из очереди после того, как сессия перейдёт в конечный статус, а не при каждом просмотре страницы.
Пример клиента с обработкой 429
Нужен больший запас?
Если 600 сессий в минуту недостаточно, например при маркетинговом запуске или догрузке данных, напишите на support@didit.me, указав UUID вашегоapplication и ожидаемые постоянную и пиковую интенсивности запросов. Переопределения настраиваются для каждого приложения.