Payout

HTTP API

Прямой HTTP-контракт Payout API (Payment Easy).

HTTP API

Base URL: {baseUrl}/api/v1/payment-easy/{username}

Payout не использует JSON-конверт Payin Classic — транспорт XML, авторизация по RSA.

Краткая сводка по операциям

МетодТело запросаНазначение
POST<request><balance /></request>Получить баланс
POST<request><payment .../></request>Создать выплату (карта или СБП)
POST<request><status id="..." /></request>Получить статус выплаты

Все три операции отправляются на один и тот же URL. Действие определяется корневым элементом в теле.


Заголовки и подпись

ЗаголовокЧто внутри
Content-Typeapplication/xml
SignatureRSA-подпись тела в base64 (PKCS#1 v1.5, SHA-1)
username идёт в URL, а не в заголовке. Key-Id в Payout не используется — идентификация по username + валидной подписи.

Алгоритм подписи

  1. Возьмите тело запроса как есть (точные байты XML).
  2. Посчитайте SHA-1.
  3. Подпишите RSA приватным ключом в режиме PKCS#1 v1.5.
  4. Закодируйте подпись в base64.
  5. Положите в заголовок Signature.

Ответы сервера при наличии публичного ключа сервера подписываются тем же алгоритмом — заголовок Signature в ответе.

Ключи и формат PEM описаны в Ключи для Payout.


Операции

Баланс

Тело запроса:

<request><balance /></request>

Успешный ответ:

<response>
  <balance balance="1500000" overdraft="0" />
</response>

Также допустим «голый» вариант:

<balance balance="1500000" overdraft="0" />
АтрибутТипОписание
balanceint64Доступный баланс в копейках
overdraftint64Овердрафт в копейках

Ошибка:

<error>invalid signature</error>

Выплата

Тело запроса (карта):

<request>
  <payment id="unique-tx-id" sum="100000" service="24" account="4277255555555555" date="2026-04-24T12:00:00+0300">
    <attribute name="phone" value="79999999999" />
  </payment>
</request>

Тело запроса (СБП — по номеру телефона):

<request>
  <payment id="sbp-tx-id" sum="50000" service="26" account="79876543210" date="2026-04-24T12:00:00+0300">
    <attribute name="phone" value="79999999999" />
    <attribute name="payee_bank_code" value="100000000111" />
  </payment>
</request>

Атрибуты <payment>

АтрибутТипОбяз.Описание
idstringдаУникальный ID транзакции (до 64 байт)
sumint64даСумма в копейках
serviceintдаТип сервиса (см. ниже)
accountstringдаНомер карты / телефона / кошелька
datestringдаДата транзакции в формате 2006-01-02T15:04:05-0700

Вложенные <attribute>

nameЗначениеОбяз.Когда
phoneТелефон плательщикадаВсегда
payee_bank_codeКод банка получателяусловноТолько для service=26 (СБП)

Список кодов банков — см. bank_codes.go в SDK (238 банков).

Ответ — выплата в процессе (final="0" — статус ещё не финальный):

<response>
  <result id="unique-tx-id" code="1" state="40" final="0" trans="gateway-tx-id">
    <attribute name="fee" value="100" />
  </result>
</response>

Ответ — выплата завершена успешно (final="1"):

<response>
  <result id="unique-tx-id" code="0" state="60" final="1" trans="gateway-tx-id">
    <attribute name="fee" value="100" />
  </result>
</response>
АтрибутТипОписание
idstringВаш ID транзакции
codeintКод результата (см. Коды ошибок Payout)
stateintСостояние платежа
finalint1 — финальный статус, 0 — ещё в процессе
transstringID транзакции на стороне шлюза

Вложенные <attribute>:

nameЗначение
feeКомиссия в копейках (может отсутствовать)
error-descriptionТекст ошибки, если code указывает на сбой

Ошибка транспорта/подписи:

<error>signature verification failed</error>

Статус выплаты

Тело запроса:

<request><status id="unique-tx-id" /></request>

Ответ: тот же формат <response><result .../></response>, что и у выплаты.

Платёж опрашивается до тех пор, пока final не станет 1. Матрица финальных состояний — в Кодах ошибок Payout.


Сервисы (service)

КодНазваниеЧто в account
24Банковские картыНомер карты
25Кошельки QIWIНомер кошелька
26СБПНомер телефона получателя (+ payee_bank_code)
28Мобильные телефоныНомер телефона

Валюта и суммы

  • Валюта — всегда RUB.
  • sum передаётся в копейках (int64). Сумма 1000.00 ₽100000.

Лимиты по заявкам

Каскадное решение готово работать от 1 000 до 100 000 ₽ по СБП и по картам (т.е. sum от 100000 до 10000000 копеек). Можно зафиксировать любой более узкий диапазон под ваши процессы — согласуется с менеджером.


Webhooks

У Payout нет собственного webhook — отдельного URL для уведомлений о выплатах настроить нельзя. Получение статуса:

  1. После создания выплаты (<request><payment .../></request>) опрашивайте <request><status id="..." /></request>.
  2. Повторяйте, пока в ответе не появится final="1".
  3. Финальный статус определяется по комбинации code / state (см. Коды ошибок Payout).

Тайминги и расписание

ПараметрЗначение
Среднее время выплаты~60 минут (от приёма заявки до финального статуса)
РасписаниеКруглосуточно, 24/7 — отдельных банковских окон по умолчанию нет
Часовой поясМСК (UTC+3) — присылайте date с офсетом +0300

Гарантированный максимум по времени выплаты не фиксируется и зависит от загрузки каскада и ответа банка-эквайера. Для критичных кейсов согласуйте отдельные SLA с менеджером.


Идемпотентность

  • id — ваш уникальный идентификатор операции. Сервер ассоциирует его с конкретной выплатой.
  • Повторный вызов <payment> с тем же id не создаёт новую выплату — вернётся текущее состояние.
  • Для опроса статуса используйте <status>, а не повторную отправку <payment>.

SDK

Если не хотите собирать XML вручную, используйте официальные SDK: Go, Node.js, Python, PHP.

Copyright © 2026