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

    Платежи

    Раздел OpenAPI: Платежи.

    Типичный сценарий#

    1.
    POST /api/v1/integration/transactions — создать платёж.
    2.
    Получить в ответе ссылку или данные для оплаты.
    3.
    Дождаться webhook со статусом (см. «Вебхуки (исходящие колбэки)»).
    4.
    При необходимости подтвердить чтением:
    GET /api/v1/integration/transactions/{uuid}
    GET /api/v1/integration/transactions/by-external-id/{externalId}
    Не делайте polling единственным источником истины.

    Создание платежа#

    Передайте сумму в минорных единицах, валюту, метод оплаты и свой external_id.
    external_id должен быть уникален в рамках мерчанта: так вы сможете безопасно повторять create при сетевых сбоях и потом найти платёж без UUID Smerch.
    Точный набор полей — в OpenAPI (integrationCreateTransaction).

    Идентификатор плательщика#

    Если у выбранного метода в личном кабинете есть плашка «Особые требования», передайте стабильный идентификатор плательщика из вашей системы в каноническом поле metadata.userId:
    {
      "metadata": {
        "userId": "customer-12345"
      }
    }
    Это не UUID пользователя Smerch. Используйте одно и то же значение для одного плательщика. Имя поля для новых и действующих интеграций — metadata.userId.

    IP-адрес плательщика#

    Если вы создаёте платежи со своего сервера, передавайте публичный IP плательщика в metadata.clientIp. Smerch передаёт его платёжному провайдеру; без него провайдер видит только IP вашего сервера. Международному карточному эквайрингу нужен реальный IP плательщика, чтобы выдать прямую ссылку на оплату, — без него платёж может быть отклонён.
    {
      "metadata": {
        "clientIp": "203.0.113.24"
      }
    }
    Используются только корректные IPv4/IPv6-адреса; другое значение игнорируется, и провайдеру уходит IP запроса на создание платежа.

    Кассы Telegram Stars#

    Если касса продаёт Telegram Stars (признак выставляет менеджер Smerch, в личном кабинете он виден в разделе «Методы оплаты»), для каждого платежа обязательно передавайте в metadata.userId Telegram ID покупателя в формате tg<числовой ID>:
    {
      "metadata": {
        "userId": "tg123456789"
      }
    }
    Это ID аккаунта, на который зачисляются звёзды, а не username (@name) и не ваш внутренний идентификатор.
    Без metadata.userId или в другом формате (123456789, TG123, @name) платёж отклоняется с HTTP 422.
    Telegram ID показывается покупателю на платёжной форме с предупреждением о мошенниках: если ссылку на оплату прислал другой человек, покупатель не должен платить.
    Мы передаём этот идентификатор платёжным провайдерам и отслеживаем аномалии (много платежей СБП на один Telegram ID, много разных устройств и IP-адресов). Telegram ID, по которому выявлено мошенничество, может быть заблокирован: новые платежи для него отклоняются с HTTP 403 Payments for this Telegram user are blocked.

    Валюта и рублёвый рельс (СБП)#

    ЗапросЧто происходит
    currency=RUB, amount в копейкахПлательщик оплачивает рублёвую сумму, ledger отражает рублёвое списание.
    payment_method=cryptoКлиент оплачивает поддерживаемым криптоактивом в выбранной сети. Используйте payment_url или requisites из ответа.
    После создания платежа используйте данные из ответа API: ссылку для редиректа или объект requisites.

    Платежи через СБП#

    Для СБП передавайте payment_method=sbp, currency=RUB и сумму в копейках.
    В ответе используйте payment_url для редиректа. Финальный статус подтверждайте webhook-ом.

    Crypto-платежи#

    Для crypto-сценария создайте платёж с payment_method=crypto. Если API возвращает payment_url, перенаправьте клиента на него. Если возвращается объект requisites, используйте адрес, сеть, сумму и срок действия из ответа API.
    Что важно:
    сеть и актив должны совпадать с данными из ответа;
    сумма и precision берутся из ответа/API-схемы;
    статус подтверждайте только webhook-ом или контрольным GET;
    не меняйте адрес, сеть или сумму на своей стороне после создания платежа.

    Комиссия за счёт покупателя#

    Если по методу часть комиссии или вся комиссия перекладывается на покупателя, она добавляется к сумме счёта (gross_amount). Провайдеры удерживают свою комиссию со всей суммы счёта, включая эту надбавку, поэтому надбавка увеличивается на ставку провайдера, а итоговая сумма округляется вверх до целого рубля (доллара). Точная разбивка приходит в merchant_fee_customer_amount и merchant_fee_merchant_amount; сумма, которую получит мерчант (net_amount), от этого не меняется.

    Статусы#

    Статусы асинхронные: pending, paid, failed, expired, refunded, chargeback. Ориентируйтесь на финальные значения из webhook/GET.
    Промежуточные статусы нормальны: платёж может «висеть», пока провайдер не подтвердит оплату.

    Список платежей#

    GET /api/v1/integration/transactions — cursor-пагинация. Фильтр status принимает только значения из таблицы выше. Используйте список для сверки и кабинета, не как замену webhook.

    Реквизиты «как есть» (H2H)#

    GET /api/v1/integration/transactions/{uuid}/h2h
    Нужен, когда вы сами показываете плательщику реквизиты (QR/счёт/инструкцию), без редиректа на чужую форму.
    Если у метода есть redirect URL — часто достаточно редиректа, H2H не обязателен.
    В OpenAPI это названо «реквизиты для оплаты на вашей стороне», не «магический H2H».

    Рекуррентные платежи (СБП)#

    Рекуррентный платёж состоит из двух независимых сущностей: мандата (согласия плательщика) и обычных транзакций списания. Создание мандата само по себе не списывает деньги и ничего не зачисляет.

    1. Создание мандата#

    POST /api/v1/integration/subscriptions принимает сумму в копейках, только currency=RUB и один из интервалов:
    Возможность должна быть заранее включена для мерчанта администратором Smerch; иначе create вернёт 403.
    Рекуррентный СБП — отдельный метод sbp_recurring со своим тарифом (комиссия, распределение комиссии, hold), который администратор Smerch настраивает независимо от обычного СБП. Изменение тарифа обычного СБП не влияет на рекурренты. Каждый мандат сохраняет тариф на момент создания, поэтому последующие изменения применяются только к новым мандатам. Через POST /integration/transactions метод sbp_recurring недоступен — только через API подписок.
    intervalДопустимый interval_countПример
    day1–31каждые 7 дней
    week1–4каждые 2 недели
    month1–12каждый месяц
    year1–3каждый год
    {
      "external_id": "membership-1001",
      "amount": 50000,
      "currency": "RUB",
      "email": "customer@example.com",
      "interval": "month",
      "interval_count": 1,
      "description": "Premium membership",
      "metadata": { "customer_id": "customer-42" },
      "callback_url": "https://merchant.example/webhooks/smerch"
    }
    external_id должен быть стабильным и уникальным внутри мерчанта. Повтор запроса с тем же external_id и тем же телом вернёт тот же мандат; другое тело с уже занятым external_id вернёт 409 Conflict.
    Передайте email, если хотите сразу начать оформление согласия. Если не передать email, Smerch автоматически вернёт payform_url: наша форма соберёт email плательщика. collect_email_on_payform: true остаётся необязательным явным переключателем этого режима. Ссылка содержит случайный токен, действует 30 минут и не раскрывает секрет мерчанта. interval_count по умолчанию равен 1, а description можно не передавать.
    Если email передан, в ответе будет confirmation_url — откройте его плательщику, чтобы он подтвердил согласие в своём банке. Если email не передан (или collect_email_on_payform=true), отправьте плательщика на payform_url: форма запросит email и сама перенаправит его на подтверждение. Если all_providers_unavailable=true, confirmation_url будет null: сейчас оформить согласие нельзя, мандат останется pending_agreement — создайте новый мандат позже. Финальное согласие подтверждается только webhook-событием subscription.status_updated или последующим GET.

    2. Состояния мандата#

    СтатусЗначение
    creatingвнутреннее создание ещё выполняется
    pending_agreementожидается подтверждение плательщика
    activeмандат активен, будущие списания разрешены
    past_dueочередное списание не прошло; проверьте транзакцию
    cancelledбудущие списания остановлены
    failedмандат завершился ошибкой
    creation_unknownпровайдер мог принять запрос, но ответ потерян; не создавайте новый мандат с другим external_id, обратитесь в поддержку

    3. Списания и выдача товара#

    Каждое плановое списание публикуется как обычная транзакция. Поле subscription_uuid связывает её с мандатом. Выдавайте товар только после transaction.status_updated со статусом paid; статус active у мандата не означает, что конкретное списание оплачено.
    Сохраняйте и дедуплицируйте X-Webhook-Id. Если webhook задержался, восстановите состояние через GET /integration/subscriptions/{uuid} и GET /integration/transactions; GET — средство сверки, а не замена webhook.

    4. Получение и отмена#

    Мандат можно получить по UUID или external_id, вывести списком через GET /integration/subscriptions и идемпотентно отменить через POST /integration/subscriptions/{uuid}/cancel. Для scoped API-ключей нужны права subscriptions:read и/или subscriptions:write.
    Modified at 2026-10-20 12:21:30
    Previous
    Авторизация и HMAC
    Next
    Балансы
    Built with