Предсказуемая обработка ошибок.

Создавайте идемпотентные повторы и решайте на сервере, когда повторять запрос.

HTTP-коды статуса

КодЗначениеДействие
201Платёж создан или возвращён идемпотентный повторЧитайте payment_url; details возвращает актуальный статус.
401Данные доступа отсутствуют или неверныПроверьте заголовок X-API-Key.
403Создание приостановлено, бета ожидает активации / истекла или квота исчерпанаПроверьте limits и обратитесь в поддержку.
404Платёж не найденПроверьте ID платежа и аккаунт.
409Незавершённый заказ на адресе; другой мерчант; нет вебхука; конфликт идемпотентности; отмена недоступнаПрочитайте detail и устраните конфликт состояния.
413Тело запроса превышает 64 KiBУменьшите тело запроса.
422Некорректные поля или адрес вебхукаИсправьте ошибки валидации.
429Ограничение частоты запросовПодождите и соблюдайте Retry-After, если он указан.
503Инфраструктура временно недоступнаПовторяйте с увеличением задержки и тем же ключом идемпотентности.

Ответ ошибки

409 Conflict
{"detail":"Finish the current payment with this amount on this address first"}

Ошибки доступа только к созданию возвращают 403 с объектом в detail: code и message. Коды: beta_not_activated, beta_expired, creation_paused, total_quota_exhausted или daily_quota_exhausted; одновременная блокировка всего аккаунта может вернуть account_inactive. Перед повтором проверьте GET /api/v1/merchant/limits. Неактивные аккаунты обычно не проходят аутентификацию с 401. Сохранённый идемпотентный повтор в сроке хранения возвращает исходный ответ даже после истечения беты или квоты, но учитывается в техническом лимите частоты.

Ошибки валидации возвращают список в detail с некорректным полем и причиной. Не создавайте новый заказ в ответ на любую ошибку.

Доступ к созданию и квоты

Создание новых платежей может ограничиваться неактивированной / истёкшей бетой, паузой оператора, общей или суточной квотой UTC. Проверяйте состояние доступа и квоты создания через GET /api/v1/merchant/limits. Существующие платежи и вебхуки продолжают работу; технические лимиты частоты независимы.

Ограничения частоты по методам

Это настроенные стандартные значения. Счётчики приложения используют Redis и фиксированное окно 60 секунд с первого запроса. Следующие запросы не продлевают окно. Все API-ключи одного мерчанта делят лимиты.

МетодЗапросы / окноСчётчик
GET /api/v1/payments/{payment_id}/webhooks120 / 60 собщие чтения · на мерчанта
POST /api/v1/merchant/webhook/events/{event_id}/retry5 / 3600 сручной повтор · на мерчанта · 3600 секунд
POST /api/v1/payments30 / 60 ссоздание · на мерчанта
POST /api/v1/payments/{payment_id}/cancel60 / 60 сотмена · на мерчанта
GET /api/v1/payments120 / 60 собщие чтения · на мерчанта
GET /api/v1/payments/page120 / 60 собщие чтения · на мерчанта
GET /api/v1/payments/{payment_id}/details120 / 60 собщие чтения · на мерчанта
GET /api/v1/merchant/limits120 / 60 собщие чтения · на мерчанта
GET /api/v1/merchant/webhook120 / 60 собщие чтения · на мерчанта
PUT /api/v1/merchant/webhook10 / 60 собщие настройки вебхука · на мерчанта
POST /api/v1/merchant/webhook/rotate-key10 / 60 собщие настройки вебхука · на мерчанта
POST /api/v1/merchant/rotate-key5 / 60 сротация API-ключа · на секрет ротации
GET /api/v1/payments/{public_token}120 / 60 спубличный статус · на токен платежа

Метод ручного повтора вебхука имеет отдельное окно 3600 секунд с первого запроса. Все методы чтения вместе допускают 120 запросов на мерчанта за окно, а не по 120 каждый. Обновление URL вебхука и ротация ключа подписи вместе допускают 10. Создание и отмена имеют отдельные счётчики. Ротация API-ключа не сбрасывает счётчики мерчанта. Идемпотентные повторы создания расходуют технический лимит частоты, хотя не расходуют квоту платежей. Прошедшие валидацию запросы учитываются, даже если дальнейшая обработка завершилась ошибкой; превышающие лимит попытки тоже учитываются, не продлевая окно. Ротация учитывается по переданному непустому секрету, включая неверные секреты.

Публичный статус имеет отдельный счётчик токена платежа, общий для всех посетителей. Видимая страница оплаты опрашивает статус каждые 3.8–4 секунды в PENDING или CHECKING (около 15 запросов в минуту на посетителя). Скрытые страницы приостанавливают опрос и обновляются сразу после появления. Сетевые ошибки увеличивают задержку до 30 секунд; событие online вызывает немедленную проверку.

Дополнительные лимиты nginx по IP клиента

Запросы к https://api.dedyx.com также проходят общие IP-лимиты публичного шлюза. nginx использует постоянную частоту с запасом всплеска, а не фиксированное окно приложения; разрешённые всплески проходят сразу.

ОбластьПостоянная частотаЗапас всплеска
Все запросы /api/v1/ вместе10 запросов / секунду30; 10 для ротации API-ключа
Публичный статус платежа, дополнительно к IP-лимиту API5 запросов / секунду20
Ротация API-ключа, дополнительно к IP-лимиту API1 запрос / минуту3
Страницы и статические ресурсы20 запросов / секунду50
Одновременно активные запросы / соединения30 на IP—

Клиенты с одним публичным IP делят счётчики nginx, включая разных мерчантов и токены платежей. Любой из двух уровней может отклонить запрос с 429.

Обработка 429

Лимит приложения · пример
HTTP/1.1 429 Too Many Requests
Retry-After: 17
Content-Type: application/json

{"detail":"Rate limit exceeded"}

Ответы приложения содержат Retry-After в секундах до конца окна. Подождите не меньше этого срока, добавьте случайную задержку и используйте исходные ключ и тело при повторе создания. Ответы nginx 429 сейчас не содержат Retry-After и могут быть HTML; проверяйте HTTP-статус до разбора JSON и используйте экспоненциальную задержку, если заголовка нет. При отказе ограничителя возвращается 503, а не разрешаются неограниченные запросы.

Восстановление после неопределённого ответа

  1. Сохраняйте один ключ идемпотентности на логический заказ.
  2. При потере ответа создания повторяйте с теми же телом и ключом.
  3. До выполнения заказа читайте защищённый details платежа.
  4. Атомарно исключайте повторные ID событий вебхука.