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

    Авторизация и HMAC

    Каждый запрос к /api/v1/integration/* (кроме GET /health) должен быть подписан.

    API-ключ#

    Для интеграции нужен один API-ключ. Отдельного секрета нет: этим же ключом подписываются запросы.
    ЧтоКак выглядитГде используется
    API-ключlive_... (боевой) или test_... (песочница)заголовок X-Api-Key и ключ для HMAC-подписи
    Подписьlowercase hex HMAC-SHA256заголовок X-Signature
    Ключ создаётся в ЛК: «Настройки → Интеграция и API».
    Полный ключ показывается один раз — при создании или перевыпуске. Потом в ЛК виден только его префикс.
    Потеряли ключ — перевыпустите его в ЛК и обновите на своём сервере.
    Ключ хранится только на вашем backend: не передавайте его в мобильное приложение, браузер или фронтенд.

    Заголовки#

    ЗаголовокПримерОбязателен
    X-Api-Keylive_AbC...да
    X-Timestamp1710000000да (Unix seconds)
    X-Smerch-Request-IdUUIDда, уникальный на каждый запрос
    X-Signature-Versionv2да, всегда v2
    X-Signaturehexда
    Content-Typeapplication/jsonдля запросов с телом
    Idempotency-Keyсвой ключдля возвратов и части create в /api/v2
    X-Timestamp принимается в окне примерно ±300 секунд от серверного времени.
    X-Smerch-Request-Id нельзя повторять (anti-replay, окно около 10 минут).
    Не путать с X-Request-Id: тот только для correlation в логах/ответах и не входит в подпись (прокси часто его переписывают).

    Как собрать подпись#

    1.
    Возьмите сырое тело запроса ровно как отправите (для GET/HEAD тело = пустая строка).
    2.
    Посчитайте bodyHash = SHA256(rawBody) → hex.
    3.
    Соберите path как path info без query (например /api/v1/integration/transactions).
    4.
    Соберите canonical query:
    нет query → пустая строка;
    иначе отсортируйте ключи (SORT_STRING), для каждого:
    скаляр: rawurlencode(key)=rawurlencode(value);
    массив: value = json_encode(..., JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES), затем rawurlencode;
    склейте через &.
    5.
    Соберите canonical string из шести строк, разделённых \n:
    METHOD
    path
    canonicalQuery
    requestId
    timestamp
    bodyHash
    METHOD — в верхнем регистре (POST, GET, …).
    6.
    Подпись — HMAC-SHA256, где ключ подписи — тот же API-ключ, что в X-Api-Key:
    X-Signature = HMAC_SHA256(apiKey, canonicalString)  → lowercase hex

    Пример (псевдокод)#

    apiKey = live_AbC...            # то же значение, что в X-Api-Key
    METHOD = POST
    path = /api/v1/integration/transactions
    canonicalQuery =            # пусто, если query нет
    requestId = 550e8400-e29b-41d4-a716-446655440000
    timestamp = 1710000000
    rawBody = {"amount":10000,"currency":"RUB",...}
    bodyHash = sha256(rawBody)
    
    canonical =
    POST
    /api/v1/integration/transactions
    
    550e8400-e29b-41d4-a716-446655440000
    1710000000
    <bodyHash>
    
    signature = hmac_sha256_hex(apiKey, canonical)

    Частые ошибки 401#

    СимптомЧто проверить
    Invalid signaturepath с query / другой body / другой порядок JSON / подписано не тем ключом, что в X-Api-Key
    Timestamp skewсинхронизация часов сервера (NTP)
    Request id already usedгенерируйте новый X-Smerch-Request-Id на каждый HTTP-вызов
    HMAC v2 request signature is requiredдобавьте X-Signature-Version: v2 и X-Smerch-Request-Id

    Практика безопасности#

    Храните API-ключ только на backend (KMS / secrets manager / env).
    Не логируйте API-ключ и полный X-Signature вместе с телом.
    Перевыпускайте ключ при утечке.
    Для мерчанта может быть включён IP allowlist — добавляйте egress IP ваших серверов.
    Modified at 2026-10-20 12:21:03
    Previous
    Быстрый старт
    Next
    Платежи
    Built with