Smerch — API интеграции для мерчантов
    • Быстрый старт
    • Авторизация и HMAC
    • Платежи
    • Балансы
    • Выводы (выплаты)
    • Возвраты
    • Вебхуки (исходящие колбэки)
    • Песочница, ошибки и go-live
    • Авторизация
      • Проверить, что API отвечает
        GET
    • Платежи
      • Список платежей
        GET
      • Создать платёж
        POST
      • Найти платёж по вашему external_id
        GET
      • Получить платёж по UUID
        GET
    • Рекуррентные платежи
      • Получить список рекуррентных мандатов
        GET
      • Создать рекуррентный СБП-мандат
        POST
      • Получить мандат по external_id
        GET
      • Получить мандат по UUID
        GET
      • Отменить рекуррентный мандат
        POST
    • Балансы
      • Посмотреть балансы
        GET
    • Выводы
      • Создать вывод средств
        POST
      • Посчитать вывод без списания
        GET
      • Получить вывод по UUID
        GET
    • Возвраты
      • Сделать возврат по платежу
        POST
    • Вебхуки
      • Посмотреть настройки webhook
      • Задать URL для колбэков
      • Журнал доставок webhook
      • Сменить secret подписи webhook
      • Отправить тестовый колбэк
      • Событие: изменился статус платежа
      • Событие: изменился статус вывода
      • Событие: изменился статус рекуррентного мандата
      • Событие: изменился статус возврата
    • Песочница
      • Песочница: создать тестовый платёж
      • Песочница: симулировать отказ оплаты
      • Песочница: список тестовых платежей
      • Песочница: отказ, затем запоздавшая оплата
      • Песочница: поиск платежа по external_id
      • Песочница: симулировать успешную оплату
      • Песочница: симулировать истечение платежа
      • Песочница: получить тестовый платёж
    • API v2
      • Авторизация
        • Проверить, что API v2 отвечает
      • Возвраты
        • Сделать возврат по платежу (API v2)
      • Рекуррентные платежи
        • Получить список рекуррентных мандатов
        • Создать рекуррентный СБП-мандат
        • Получить мандат по external_id
        • Получить мандат по UUID
        • Отменить рекуррентный мандат
      • Платежи
        • Список платежей (API v2)
        • Создать платёж (API v2)
    • Schemas
      • CreatePayoutRequest
      • CreatePaymentSubscriptionRequest
      • CreateRefundRequest
      • CreateTransactionRequest
      • CursorMeta
      • CursorPage
      • ErrorResponse
      • HealthResponse
      • ProblemDetails
      • V2CreateTransactionRequest
      • IntegrationBalancesResponse
      • V2HealthResponse
      • MerchantBalance
      • RefundResponse
      • V2RefundResponse
      • TransactionResponse
      • MerchantPaymentSubscriptionCallback
      • V2TransactionResponse
      • MerchantPayoutCallback
      • MerchantRefundCallback
      • MerchantTransactionCallback
      • RatesResponse
      • PaymentSubscriptionPage
      • PaymentSubscriptionResponse
      • PayoutQuoteResponse
      • StructuredError
      • PayoutResponse
      • TransactionCursorPage
      • ValidationErrorResponse
      • SandboxTransactionResponse

    Песочница, ошибки и go-live

    Песочница#

    Маршруты /api/v1/integration/sandbox/transactions/{transaction}/... симулируют колбэки провайдера:
    ДействиеСмысл
    payуспешная оплата
    failотказ
    timeoutистечение / expired
    out-of-orderсначала fail, потом запоздавший paid
    Песочница работает на том же API-домене, в том числе в production. В ЛК откройте «Настройки → Интеграция и API → Песочница» и создайте дополнительный test_ ключ. Его можно отдельно перевыпустить или отозвать; боевой ключ продолжит работать. Полный токен показывается один раз и используется одновременно как X-Api-Key и секрет HMAC. Все sandbox-запросы требуют HMAC, включая GET.
    1.
    Создайте платёж: POST /api/v1/integration/sandbox/transactions. Тело как у обычного создания платежа: amount в minor units, currency (RUB/USD), payment_method, external_id, description, необязательные metadata и callback_url.
    2.
    Используйте полученный uuid для сценариев выше. Реальные провайдеры не вызываются; payment_url, h2h_url, requisites и expires_at равны null. Истечение имитируется явно через timeout; комиссии в песочнице равны нулю.
    3.
    Проверьте состояние через GET /api/v1/integration/sandbox/transactions/{uuid}, поиск /by-external-id/{externalId} или GET списка /api/v1/integration/sandbox/transactions с cursor-пагинацией и фильтрами.
    4.
    Настройте и включите webhook кассы и его HMAC-секрет в ЛК. Смена статуса создаёт обычный transaction.status_updated webhook с дополнительным transaction.environment: test. Подпись проверяется webhook-секретом кассы, а не API-ключом. При необходимости передайте отдельный тестовый callback_url. Доставка использует существующие outbox и очередь webhooks: они должны работать.
    Ответы API содержат environment: test. Проверяйте transaction.environment в webhook: тестовые события не должны выдавать реальные товары. События и их повторы сохраняют свой webhook ID. Повтор сценария не создаёт новое событие. После paid поздние fail/timeout игнорируются; после failed/expired возможен поздний paid.
    Тестовые платежи хранятся отдельно, не попадают в боевые списки, оборот, баланс, выплаты или расчёты с провайдерами. external_id изолирован от боевых платежей: одинаковый запрос возвращает тот же sandbox-платёж, изменённое тело — 409. test_ ключ работает только с sandbox-маршрутами; live_ ключи не допускаются в sandbox. Возвраты, выплаты, подписки, реальная платёжная форма и H2H-реквизиты не симулируются.

    Ошибки#

    Типичные HTTP-коды:
    КодСмысл
    401не прошла аутентификация / HMAC
    403ключ ок, но действие запрещено (IP allowlist, disabled merchant, …)
    404сущность не найдена
    409конфликт идемпотентности
    422ошибка валидации полей
    429rate limit
    Для метода оплаты может действовать дневной лимит оборота по каждой валюте (календарные сутки по МСК, 00:00–24:00). В лимит входят платежи в статусах pending и paid; failed и expired лимит освобождают. Платёж, который превысил бы лимит, отклоняется с 422 и "message": "Daily turnover limit for this payment method is exceeded.", транзакция при этом не создаётся. Повтор того же платежа будет отклоняться, пока лимит не освободится или не начнутся следующие сутки.
    Для касс Telegram Stars платёж без Telegram ID покупателя отклоняется с 422 ("Telegram Stars payments require the buyer Telegram ID in metadata.userId." или, если формат не tg123456789, "metadata.userId must be the buyer Telegram ID in the format tg123456789."). Если Telegram ID заблокирован, возвращается 403 и "message": "Payments for this Telegram user are blocked."; повторять такой платёж бесполезно. Подробнее — в «Платежи».
    X-Request-Id/request_id — корреляционный идентификатор для поддержки; он не заменяет X-Smerch-Request-Id, входящий в HMAC-подпись.
    Если create завершился таймаутом или 5xx, исход операции неизвестен. Не создавайте новый бизнес-ID: повторите запрос с тем же external_id и тем же телом. Для платежа также доступен поиск по external_id; возврат повторяется с тем же Idempotency-Key. Изменение тела при повторе приводит к 409.
    В v2 ошибки ближе к Problem Details (RFC 9457). В v1 чаще JSON с message / errors.

    Чеклист перед боем#

    1.
    HMAC-подпись на всех Integration-запросах.
    2.
    API-ключ и webhook secret только на сервере.
    3.
    Webhook URL на HTTPS, проверка подписи включена.
    4.
    Обработка webhook идемпотентна.
    5.
    Суммы в минорных единицах.
    6.
    Для возвратов всегда Idempotency-Key.
    7.
    Sandbox прогнан: pay / fail / timeout / out-of-order; поздний paid после failed обработан корректно.
    8.
    IP allowlist (если включён) содержит ваши egress IP.
    Modified at 2026-10-20 12:21:49
    Previous
    Вебхуки (исходящие колбэки)
    Next
    Проверить, что API отвечает
    Built with