ExpressPay API

Ошибки и лимиты

Формат ошибок, полный список кодов и ограничения, о которые можно споткнуться на бою.

Формат

HTTP/1.1 402 Payment Required
X-Request-Id: req_ab12cd34ef56

{
  "error": {
    "code": "insufficient_balance",
    "message": "недостаточно средств на балансе",
    "request_id": "req_ab12cd34ef56",
    "required_usdt": "17.330692",
    "balance_usdt": "4.020000"
  }
}

Ориентируйтесь на code, а не на текст message — тексты мы можем менять. request_id есть в каждом ответе, включая успешные; приложите его к обращению в поддержку, и мы сразу найдём запрос в логах.

Отклонённый платёж — это не ошибка запроса Если платёж создан, но не прошёл, вы получите 200 и объект платежа со статусом failed, а причина будет в поле error. Коды ниже относятся к запросам, которые мы не приняли вовсе.

Коды

HTTPКодЧто делать
400invalid_requestПоправить тело запроса
400missing_idempotency_keyДобавить заголовок Idempotency-Key
400invalid_qrСсылка не похожа на QR СБП или просрочена
400unsupported_qrQR подписки/привязки — оплатить нельзя
400unsupported_variable_amountQR без фиксированной суммы
400amount_mismatchВаша сумма не совпала с суммой в QR — проверьте, тот ли это QR
400amount_limit_exceededСумма выше лимита на один платёж
401unauthorizedКлюч неверен, отозван или не передан
402insufficient_balanceПополнить баланс
403partner_suspendedДоступ приостановлен — написать в поддержку
403ip_not_allowedАдрес не в вашем списке разрешённых
403recipient_blockedОплата этому получателю запрещена
403daily_limit_exceededИсчерпан суточный лимит
404not_foundПлатёж не найден или принадлежит другому аккаунту
409idempotency_conflictТот же ключ с другим телом — взять новый ключ
409duplicate_qr_in_flightПо этому QR уже идёт платёж — дождаться его исхода
409qr_changedДанные QR изменились с момента проверки — получить QR заново
422qr_unresolvableНе удалось получить реквизиты — повторить позже
429rate_limitedСнизить темп, см. Retry-After
503rate_unavailableКурс устарел, платежи временно закрыты — повторить через минуту
503gateway_unavailableШлюз недоступен — повторить позже
503gateway_busyСлишком много одновременных платежей — повторить
503maintenanceПлановая пауза
500internal_errorСообщить нам request_id

Как повторять запросы

Ошибки 429 и 503 — временные, их можно повторять с задержкой (разумно начать с 2 секунд и удваивать). Повторяйте с тем же Idempotency-Key — иначе рискуете оплатить один QR дважды.

Ошибки 4xx, кроме 429, повторять бессмысленно: запрос надо исправить.

Обрыв связи — не повод создавать новый платёж Если соединение оборвалось и вы не знаете исход, повторите тот же запрос с тем же ключом идемпотентности или запросите GET /v1/payments/{id}. Новый ключ создаст второй платёж по тому же QR.

Лимиты

ОграничениеЗначение по умолчанию
Минимальная сумма платежа10 ₽
Максимальная сумма платежа100 000 ₽
Оборот в суткине ограничен
Создание платежей3 запроса в секунду, всплеск до 10
Остальные запросы20 запросов в секунду
Одновременных платежей2
Время ответа POST /v1/paymentsдо 90 секунд

Лимиты сумм повышаются индивидуально — напишите в поддержку, когда объёмы вырастут.

Безопасность ключа