Не подтверждён; используйте полный payment_url из API
Документация
https://api.absolutpay.com
API base URL подтверждён 25.10.2026: https://api.absolutpay.com (без /api/v2). HTTPS и /livez доступны; проверенные GET /api/v2/banks и GET /api/v2/balance возвращают 503. Доступность бизнес-операций не подтверждена. Адрес не означает разрешение реальных переводов; подключение магазина и методов согласуется отдельно. Origin платёжной формы не подтверждён. Портал не отправляет API-запросы.
Начало работы
Интеграция выполняется с вашего сервера. Плательщик получает реквизиты либо открывает платёжную форму; API token и secret остаются на сервере мерчанта.
Что получить от Absolut Pay
Данные
Назначение
Адрес API для согласованного окружения
Точный BASE_URL, без добавленного /api/v2
API token и API secret магазина
Один магазин определяется его проверенными ключами; shop_id в запросе не передаётся
Подтверждение разрешённых исходящих IP
Публичные адреса вашего backend; пустой список запрещает доступ
Разрешённые методы, валюты и тип трафика
Не все сочетания словаря доступны каждому магазину
Адрес вашего приёмника webhook
Доступный HTTPS endpoint для уведомлений, без редиректов
Согласованный канал поддержки
Передавайте request_id и свой номер заказа, а не секреты и полные платёжные ссылки
Подтверждённый API base URL: https://api.absolutpay.com, без добавленного /api/v2. Например, полный адрес чтения баланса — https://api.absolutpay.com/api/v2/balance. Проверено 25.10.2026: HTTPS и /livez доступны; GET /api/v2/banks и GET /api/v2/balance возвращают HTTP 503. Доступность бизнес-операций не подтверждена; рабочие ключи, разрешённые IP и активация магазина согласуются отдельно. Проверка health не подтверждает готовность платежей. Origin hosted payment page пока не подтверждён: используйте только полный payment_url, возвращённый API.
Рекомендуемый порядок
Сохраните ключи в серверном хранилище секретов и согласуйте IP вашего backend.
Настройте точное формирование подписи и синхронизацию системных часов.
Реализуйте собственную таблицу платежных попыток с merchant_order_id, полученным id, текущим состоянием и историей обработки.
Реализуйте проверку webhook и устойчивую обработку повторов.
Создайте одну тестовую заявку. Проверьте чтение по своему номеру и по выданному id.
Проверьте потерю ответа и повторные уведомления. В локальном контуре merchant webhook подавлен: его формат проверяется отдельными подписанными примерами, не ожиданием доставки после тестового POST.
Пройдите согласованный полный сценарий на предоставленном окружении перед включением реального приёма.
Первый запрос
Файл examples/create-payin.json содержит тестовый запрос. Замените номер заказа и данные плательщика своими тестовыми значениями. Адрес webhook в файле — заполнитель: в окружении с доставкой укажите ваш настоящий HTTPS endpoint.
Задайте ABSOLUT_API_BASE_URL=https://api.absolutpay.com, ABSOLUT_API_TOKEN, ABSOLUT_API_SECRET в окружении серверного процесса. Не записывайте реальные значения в файлы примеров, историю команд, исходники или клиентский JavaScript.
sh
# Команды выполняются из папки merchant-v2.
node examples/client.mjs create --body examples/create-payin.json
node examples/client.mjs result shop-order-0001
node examples/client.mjs get ord_123
ord_123 — условный идентификатор, замените его значением реального ответа. Создание выполняется только по явной команде create; примеры не повторяют POST автоматически. Полный ответ может содержать конфиденциальную ссылку или реквизиты: не направляйте вывод примера в общие логи.
Два режима выдачи
mode
Результат
h2h
API возвращает requisite; ваш интерфейс отображает реквизиты
payment_form
API возвращает payment_url; откройте именно эту ссылку
В текущем локальном контуре реквизиты имеют тип mock и значение TEST-ONLY-NOT-PAYABLE. По ним нельзя отправлять деньги. Возможности живых реквизитов согласуются после подключения реального провайдера.
Успешное создание HTTP 201 означает выдачу платежа, а не факт оплаты. Выдавайте оплаченный товар/услугу только после проверенного статуса 2 и собственной защищённой обработки результата.
Подключение выплат
Для выплат согласуйте отдельные условия магазина и способ исполнения. Прочитайте Выплаты клиентам, получите наш bank_id из справочника, проверьте доступный USDT-баланс и подготовьте отдельный уникальный номер поручения. Условия приёма не определяют курс и комиссию выплаты.
Аутентификация запросов
Каждый запрос Payin API v2 подписывает ваш сервер. Для магазина выдаётся пара api_token и api_secret; она определяет магазин, от имени которого выполняется запрос. Передавать shop_id в теле не требуется и не допускается.
Настройте адрес API, выданный Absolut Pay для вашего подключения. Наличие примеров в документации не означает, что тестовый или рабочий адрес уже активирован. В проверенной версии API доступен в локальном тестовом окружении; рабочее подключение согласовывается отдельно.
Что необходимо перед первым запросом
Токен и секрет нужного магазина.
Добавленные в разрешённый список исходящие IP-адреса вашего сервера.
Синхронизированное время на сервере.
Активный магазин и разрешённые условия приёма для создания новых платежей.
Храните секрет в серверном хранилище конфигурации. Не передавайте его в браузер, мобильное приложение, query string или тело запроса. Не записывайте секрет, токен и полный набор подписанных заголовков в обычные логи.
Заголовки
Каждый заголовок должен присутствовать ровно один раз.
Заголовок
Значение
X-API-Token
Выданный токен магазина: pt_ и 64 строчных шестнадцатеричных символа
X-Timestamp
Текущее Unix-время в секундах, десятичная строка без пробелов и ведущих нулей
X-Nonce
Новый UUID версии 4 для этого HTTP-запроса
X-Signature
HMAC-SHA512, 128 строчных шестнадцатеричных символов
Content-Type
application/json для JSON-запроса создания платежа
Сервер принимает время запроса в пределах ±300 секунд от своего текущего времени. Миллисекунды вместо секунд не подходят. Рекомендуем использовать обычную строчную запись UUID; если вы используете другую допустимую запись, подпись должна содержать именно отправленную строку.
Строка для подписи
Соедините пять компонентов в таком порядке, используя байт перевода строки LF, \n:
Ключ HMAC — буквальная строка выданного api_secret. Не декодируйте её из Base64 или Base64URL, даже если её вид напоминает такую кодировку. Не заменяйте исходное тело его хешем.
POST с JSON
Сначала сериализуйте объект в UTF-8 байты один раз. Эти же байты используйте для подписи и отправки.
Здесь \n обозначает один LF; многоточие показывает сокращение примера и не является допустимым телом запроса. Полный JSON нужно взять из описания создания платежа.
Изменение порядка JSON-полей, пробелов, экранирования или добавление перевода строки после подписи даст другие байты. Если HTTP-библиотека автоматически сериализует объект, убедитесь, что она отправляет именно подписанную сериализацию; проще передавать подготовленные байты.
GET с query string
Для поиска платежа по вашему номеру заказа сначала сформируйте полный закодированный путь. Например:
После этого LF дополнительных байтов нет. Это не произвольный завершающий перевод строки: он нужен перед пустым пятым компонентом.
Подписывайте query string после URL-кодирования. Не меняйте порядок параметров, + на %20, %2f на %2F или другие байты между подписью и отправкой. Для этого маршрута разрешён ровно один параметр merchant_order_id; дополнительные и повторяющиеся параметры не принимаются.
IP-адреса и область доступа
Разрешённый список относится к исходящему сетевому адресу вашего API-сервера. Поле payer.ip — IP плательщика для обработки заявки; оно не определяет доступ вашего сервера к API.
Пустой разрешённый список запрещает все запросы. Если сервер работает за NAT или использует несколько исходящих адресов, согласуйте фактические адреса заранее. Произвольные X-Forwarded-For и X-Real-IP, отправленные клиентом, не дают доступ с другого IP.
Ключи одного магазина не позволяют читать платежи другого магазина. Для создания новых платежей магазин и его группа должны быть активны. Чтение уже созданных платежей и результатов остаётся доступным после отключения приёма, пока действительны ключи и разрешён исходящий IP.
Повторы и восстановление результата
Для каждого нового HTTP-запроса, включая повтор и поиск результата, создавайте новый UUID v4, свежий timestamp и новую подпись. Уже принятый nonce нельзя использовать повторно, даже если ответ потерялся.
Nonce защищает HTTP-запрос от повторного воспроизведения. merchant_order_id защищает создание платежа от дублирования. Это разные значения с разным назначением:
Значение
Поведение
X-Nonce
Новое для каждого запроса
merchant_order_id
Один устойчивый номер для конкретного платежа в магазине
При тайм-ауте или потере ответа на создание ищите результат по прежнему merchant_order_id новым подписанным GET. Не создавайте другую заявку под новым номером, пока исходный результат не выяснен. Подробный порядок восстановления приведён в описании Payin API.
Смена ключей
При ротации токен и секрет магазина заменяются. Обновляйте их на своём сервере одной парой. Новые запросы со старой парой будут отклонены; запрос, уже принятый до ротации, может продолжить обработку.
Тот же секрет используется для проверки уведомлений о платежах. Согласуйте ротацию с обработчиком webhook: новый запрос уведомления подписывается текущим секретом, но уже начатая отправка может завершиться со старым. Правила короткого переходного периода проверки описаны в руководстве по webhook.
Ошибки и диагностика
HTTP и код
Что проверить
401 authentication_failed
Заголовки, время, UUID v4, свежий nonce, актуальность пары ключей и точные байты подписи
403 ip_not_allowed
Фактический исходящий IP и разрешённый список магазина
403 shop_disabled
Активность магазина/группы для создания новых платежей
503 internal_error
Сохранить контекст запроса и получить результат новым подписанным чтением; не создавать другой платёж вслепую
Причины ошибок подписи, неизвестного токена и повторного nonce объединены в authentication_failed; API не раскрывает внутреннюю причину. Для обращения в поддержку сохраните request_id, свой merchant_order_id, время, метод и маршрут. Секрет и токен в обращение не включайте.
Ограничения подписанного запроса: тело до 1 МиБ UTF-8, путь с query string до 8192 байтов. GET с непустым телом не принимается.
Методы оплаты и валюты
Для приёма выберите как платит клиент — method_id, и в каких денежных единицах задана сумма — currency. Это два разных поля. Например, method_id: 2 означает оплату картой, а currency: "UZS" — сумму в узбекских сумах. Такая комбинация работает только после подключения для вашего магазина.
Методы приёма: какой method_id передавать
method_id — целое число в запросе POST /api/v2/payins. Передавайте 2, а не "2", "card" или название банка.
method_id
Название
Что означает для клиента
Что передаёт мерчант
1
СБП
Оплата через Систему быстрых платежей
method_id: 1, согласованную валюту и сумму. Банк и реквизиты приёма выдаёт сервер; bank_id при создании не передаётся
2
Банковская карта
Оплата по карточным реквизитам
method_id: 2, согласованную валюту и сумму. Номер карты плательщика в Create Payin не запрашивается
3
QR
Оплата с использованием QR
method_id: 3, согласованную валюту и сумму. QR не означает конкретный банк или платёжную систему: формат выдачи должен поддерживать подключённый провайдер
4
Мобильный платёж
Метод мобильного платежа
method_id: 4, согласованную валюту и сумму. Оператор, страна и способ исполнения определяются подключением; отдельного поля выбора оператора в текущем Create Payin нет
5
Трансграничный перевод
Отдельный метод cross_border для перевода между странами
ID согласован; проектируемая возможность. В текущий API пока не передавать
Методы 1–4 входят в текущий серверный контракт. За Трансграничным переводом (cross_border) по согласованию закреплён method_id: 5. Поддержка на сервере ещё не реализована: текущий API отклонит 5. Произвольные другие номера не допускаются. Подробнее — Трансграничный перевод.
Названия в таблице объясняют назначение методов, а не подтверждают живое подключение: текущий Payin-контур возвращает только mock / TEST-ONLY-NOT-PAYABLE. Нельзя обещать настоящие карту, QR или мобильные реквизиты до проверки провайдера. У карточного метода нет публичных отдельных ID для Visa, Mastercard, HUMO или Uzcard; не подставляйте чужие номера методов.
Как показать оплату клиенту
mode определяет интерфейс, а не новый метод оплаты. Оба значения передаются отдельно от method_id:
mode
Что возвращает сервер
Что сделать на своей стороне
h2h
requisite — реквизиты
Отобразить выданные реквизиты и срок; не придумывать отсутствующие поля. Текущие mock-реквизиты неплатёжные
payment_form
payment_url — полный URL
Открыть полученный URL; не собирать ссылку из ID или домена документации
Для всех методов используйте один запрос создания приёма, одну схему подписи и проверку статуса. Получение HTTP 201 означает создание, а подтверждённая оплата — status_id: 2.
Валюты и суммы
В currency передаётся строка с кодом в верхнем регистре. Числового currency_id в текущем Merchant API v2 нет.
Код currency
Название
Денежная единица
Пример amount
Что означает пример
RUB
Российский рубль
Рубли
"1500.00"
1 500 рублей
AZN
Азербайджанский манат
Манаты
"1500.00"
1 500 манатов
KZT
Казахстанский тенге
Тенге
"1500.00"
1 500 тенге
KGS
Кыргызский сом
Сомы
"1500.00"
1 500 сомов
UZS
Узбекский сум
Сумы
"1500.00"
1 500 сумов
Все пять кодов принимаются валидаторами приёма и выплат, но разрешённые пары для магазина настраиваются отдельно по каждому направлению. Примеры показывают единицы, а не эквивалентные суммы или допустимые лимиты. Код валюты не подтверждает страну отправителя/получателя и не включает трансграничный перевод.
amount — сумма в основных единицах валюты, не в копейках и не в USDT."1500.00" RUB означает 1 500 рублей, а не 15 рублей. Не умножайте сумму на 100 перед отправкой. KGS и UZS — разные валюты; их названия «сом» и «сум» не взаимозаменяемы.
Правило
Приём
Выплата
Тип amount
Decimal-строка, например "1500.00"
Decimal-строка, например "1500.00"
Значение
Больше нуля
Больше нуля
Формат
Без знака, экспоненты, запятой и пробелов; до 80 символов
До 18 цифр целой части и до 2 после точки
Дробная часть
Валидатор не задаёт единый предел 2 знака; точность и денежные лимиты согласуются для пары магазина/терминала
Не более 2 знаков для всех пяти кодов в текущей реализации
Расчёты в вашей системе
Строки/Decimal, без binary float
Строки/Decimal, без binary float
USDT — валюта учётного баланса и расчётных полей. Её нельзя передать в currency Create Payin/Create Payout. GET /api/v2/balance возвращает USDT независимо от валюты платежа; значения баланса имеют 8 знаков после точки. USD, EUR, RUR и строчные rub текущими валидаторами не принимаются.
Как подключить нужную валюту
Определите направление: приём оплаты от клиента или выплата клиенту.
Выберите метод и валюту отдельно. Например, для приёма картой в UZS это method_id: 2 и currency: "UZS".
Получите подтверждение подключения этой пары для вашего магазина и окружения: активные условия, минимальная/максимальная сумма, точность, комиссия, курс, режим выдачи и исполнитель. В текущем API нет метода, который вернёт полную доступную матрицу; её предоставляет команда подключения.
Для приёма заполните сумму в выбранной валюте, payer, traffic_type, mode и адрес webhook. Сохраните уникальный merchant_order_id до отправки, подпишите фактически отправляемые байты.
Для выплаты используйте строковый method и реквизиты получателя из таблицы ниже. Проверьте отдельные условия выплат, канонический банк и достаточный USDT-баланс.
После отправки обработайте ответ, webhook и lookup. Проверяйте валюту и подтверждённую сумму, не выдавайте товар по факту создания заявки и не повторяйте POST при timeout.
Изменение только currency в прежнем запросе не конвертирует сумму. Если было "1500.00" RUB и вы заменили код на UZS, теперь вы запросили 1 500 UZS. Для новой намеренной операции используйте новый номер; после неизвестного результата старой сначала выполните lookup.
Пример: приём картой в UZS
Пример формата после согласования пары карта + UZS. Он не подтверждает подключение провайдера или достаточность суммы для лимитов. Текущий sandbox не выдаёт платёжных реквизитов.
Здесь клиенту предлагается оплатить 150 000 UZS. Сохраните JSON в файл, задайте ключи и выданный API origin в серверном окружении, отправьте тем же клиентом:
sh
node examples/client.mjs create --body request-uzs.json
node examples/client.mjs result 'shop-card-uzs-0001'
При сформированном платеже откройте полученный payment_url. Для H2H поменяйте mode на h2h до создания новой операции и обрабатывайте requisite. Для AZN/KZT/KGS используется тот же маршрут и схема запроса; сумма уже должна быть рассчитана именно в выбранной валюте, а пара с методом — отдельно подключена. Алгоритм подписи от валюты не меняется.
Выплаты: какой метод и реквизиты передавать
Выплаты используют POST /api/v2/payouts и строковое поле method, а не числовой method_id. Не копируйте тело приёма в выплату.
method
Назначение
Обязательные реквизиты recipient
bank_id
sbp
Выплата по СБП
phone_number в международном формате с + и customer_name
Обязателен, из справочника Absolut Pay
card
Выплата на карту
card_number: 12–19 цифр без пробелов; customer_name
Необязателен по схеме; требования и маршрут согласуются. Без банка — авторизованный ручной путь
Необязателен по схеме; текущий путь исполнения ручной
Передавайте ровно один вид реквизита выбранного метода. Для выплаты нет публичных методов qr и mobile. Во всех вариантах amount — сумма получателю в указанной currency; курс и комиссию в запросе вы не задаёте.
Пример формата выплаты на счёт в KZT после согласования отдельной пары account + KZT. Номер счёта и получатель синтетические, не предназначены для реального перевода:
Это поручение на 15 000 KZT, а резерв рассчитывается в USDT. HTTP 201 не означает перечисление. Без webhook проверяйте результат через подписанный API. Поля и ошибки создания выплаты · Получить банки.
Как связаны валюта клиента и USDT
Приём: rate — сколько единиц валюты платежа приходится на 1 USDT. Для UZS это UZS за USDT; для RUB — RUB за USDT. fee — проценты. Сохраняйте исходный amount и фактический success_paid отдельно.
Выплата: rate_fiat_per_usdt имеет то же направление — единиц валюты выплаты за 1 USDT. Сервер возвращает principal_usdt, fee_usdt, total_usdt; не пересчитывайте резерв по текущему курсу. Условия приёма не задают курс и комиссию выплаты.
Курс UZS/USDT не является курсом RUB/UZS. Приём в UZS сам по себе не означает, что отправитель платит RUB. Две валюты отправителя и получателя относятся к отдельному проекту трансграничного метода.
Если выбранная пара не работает
Ошибка
Что проверить
invalid_request / invalid_amount
В приёме: точные имена полей, числовой ID 1–4, код валюты и decimal-строку
unsupported_payment_configuration
В приёме: активные условия именно выбранной пары и режима. Не подменяйте метод/валюту автоматически
no_requisite
Реквизиты не выданы. Проверьте lookup исходного запроса и подключение; это не успешная оплата
invalid_payout_request
В выплате: строковый method, валюту, точность суммы, один тип реквизитов и канонический bank_id
payout_configuration_disabled
Отдельные активные условия выплат для пары
insufficient_funds
Доступный USDT-баланс должен покрывать основную стоимость и комиссию
Полные объяснения и правила повторов — Ошибки. Не пробуйте другую валюту, ID или новый номер заказа как автоматический обход отказа.
Что фактически доступно
Приём проверен в локальном sandbox. Публичный API origin подтверждён, но доступность бизнес-операций, production-сочетаний и реальных коридоров этой публикацией не подтверждается. У выплат реализованы создание, учётный резерв и ручное исполнение; настоящий автоматический провайдер не подтверждён. Настройки магазина и терминала должны разрешать конкретную пару; справочник банков не заменяет эту проверку.
Матрица реализации в JSON фиксирует ограничения версии. Адреса API и платёжной формы выдаются отдельно от домена документации.
Справочник и выбор банка
Получите ID из справочника Absolut Pay. Выбор банка через bank_id относится к выплатам, не к созданию входящего платежа. Наш ID не является кодом НСПК, БИК или кодом провайдера. Он не меняется при переименовании банка и не назначается другому банку.
Список банков и платёжных организаций
Ниже — все 250 записей предоставленного справочника от 08.10.2026: банки, кошельки и мобильные операторы. Повторяющиеся названия сохранены: исходные записи нельзя автоматически объединять.
Это справочный список, а не перечень подключённых банков. Активные записи и канонические ID вашего окружения возвращает API. Страны и типы в исходнике не подтверждены. Старые коды и внутренние сопоставления шлюзов здесь не публикуются.
Записей: 250
Название
Название в исходнике
bank_id Absolut Pay
Газпромбанк
Газпромбанк
Получить через API
Банк Синара
Банк Синара
Получить через API
Т-Банк
Т-Банк
Получить через API
АК БАРС БАНК
АК БАРС БАНК
Получить через API
Райффайзенбанк
Райффайзен Банк
Получить через API
Альфа-Банк
Альфа-Банк
Получить через API
Промсвязьбанк (PSB)
Промсвязьбанк (PSB)
Получить через API
РНКБ Банк
РНКБ филиал ВТБ
Получить через API
РОСБАНК
РОСБАНК
Получить через API
Совкомбанк
Совкомбанк
Получить через API
Банк Русский Стандарт
Банк Русский Стандарт
Получить через API
Банк ОТКРЫТИЕ
Банк ОТКРЫТИЕ
Получить через API
Почта Банк
Почта Банк
Получить через API
МТС-Банк
МТС-Банк
Получить через API
ОТП Банк
ОТП Банк
Получить через API
Россельхозбанк
Россельхозбанк
Получить через API
НКО ЮМани
НКО ЮМани
Получить через API
Хоум кредит
Хоум кредит
Получить через API
МОСКОВСКИЙ КРЕДИТНЫЙ БАНК (MKB)
МОСКОВСКИЙ КРЕДИТНЫЙ БАНК (MKB)
Получить через API
БАНК УРАЛСИБ
БАНК УРАЛСИБ
Получить через API
Кредит Европа Банк (Россия)
Кредит Европа Банк (Россия)
Получить через API
АКБ АВАНГАРД
АКБ АВАНГАРД
Получить через API
Банк Санкт-Петербург
Банк Санкт-Петербург
Получить через API
ЮниКредит Банк
ЮниКредит Банк
Получить через API
КБ УБРиР
КБ УБРиР
Получить через API
КБ Ренессанс Кредит
КБ Ренессанс Кредит
Получить через API
ТКБ БАНК
ТРАНСКАПИТАЛБАНК(ТКБ)
Получить через API
ГЕНБАНК
ГЕНБАНК
Получить через API
Банк ФИНАМ
Банк ФИНАМ
Получить через API
БКС Банк
БКС Банк
Получить через API
КБ ЮНИСТРИМ
КБ ЮНИСТРИМ
Получить через API
Газэнергобанк
Газэнергобанк
Получить через API
Экспобанк
Экспобанк
Получить через API
Банк ЗЕНИТ
Банк ЗЕНИТ
Получить через API
Металлинвестбанк
Металлинвестбанк
Получить через API
АКБ Абсолют Банк
АКБ Абсолют Банк
Получить через API
Банк ВБРР
Банк ВБРР
Получить через API
КБ Кубань Кредит
КБ Кубань Кредит
Получить через API
Банк Левобережный
Банк Левобережный
Получить через API
Бланк банк
Бланк банк
Получить через API
КБ Хлынов
КБ Хлынов
Получить через API
ВЛАДБИЗНЕСБАНК
ВЛАДБИЗНЕСБАНК
Получить через API
КБ Центр-инвест
КБ Центр-инвест
Получить через API
НОКССБАНК
НОКССБАНК
Получить через API
Кредит Урал Банк
Кредит Урал Банк
Получить через API
Точка ФК Открытие
Точка ФК Открытие
Получить через API
Земский банк
Земский банк
Получить через API
КБ Новый век
КБ Новый век
Получить через API
СДМ-Банк
СДМ-Банк
Получить через API
Датабанк
Датабанк
Получить через API
НС Банк
НС Банк
Получить через API
Ингосстрах Банк (Инго)
Ингосстрах Банк (Инго)
Получить через API
АКБ Алмазэргиэнбанк
АКБ Алмазэргиэнбанк
Получить через API
АКБ Форштадт
АКБ Форштадт
Получить через API
Банк ДОМ.РФ
Банк ДОМ.РФ
Получить через API
Дальневосточный банк
Дальневосточный банк
Получить через API
РосДорБанк
РосДорБанк
Получить через API
ПНКО ЭЛПЛАТ
ПНКО ЭЛПЛАТ
Получить через API
Банк ПСКБ
Банк ПСКБ
Получить через API
СКБ Приморья Примсоцбанк
СКБ Приморья Примсоцбанк
Получить через API
Банк Екатеринбург
Банк Екатеринбург
Получить через API
БАНК СНГБ
БАНК СНГБ
Получить через API
БыстроБанк
БыстроБанк
Получить через API
Углеметбанк
Углеметбанк
Получить через API
ЧЕЛЯБИНВЕСТБАНК
ЧЕЛЯБИНВЕСТБАНК
Получить через API
АБ РОССИЯ
АБ РОССИЯ
Получить через API
Уралфинанс
Уралфинанс
Получить через API
КБ РостФинанс
КБ РостФинанс
Получить через API
КБ Модульбанк
КБ Модульбанк
Получить через API
Банк Агророс
Банк Агророс
Получить через API
КБ Пойдём!
КБ Пойдём!
Получить через API
Эс-Би-Ай Банк
Эс-Би-Ай Банк
Получить через API
ЧЕЛИНДБАНК
ЧЕЛИНДБАНК
Получить через API
АКИБАНК
АКИБАНК
Получить через API
Азиатско-Тихоокеанский Банк
Азиатско-Тихоокеанский Банк
Получить через API
КБ Москоммерцбанк
КБ Москоммерцбанк
Получить через API
Сбербанк
Сбербанк
Получить через API
КБ Гарант-Инвест
КБ Гарант-Инвест
Получить через API
АКБ Алеф-Банк
АКБ Алеф-Банк
Получить через API
НИКО-БАНК
НИКО-БАНК
Получить через API
ПроБанк
ПроБанк
Получить через API
КБ АГРОПРОМКРЕДИТ
КБ АГРОПРОМКРЕДИТ
Получить через API
КБ Солидарность
КБ Солидарность
Получить через API
ИК Банк
ИК Банк
Получить через API
БАНК ОРЕНБУРГ
БАНК ОРЕНБУРГ
Получить через API
ГОРБАНК
ГОРБАНК
Получить через API
Банк Саратов
Банк Саратов
Получить через API
Хакасский муниципальный банк
Хакасский муниципальный банк
Получить через API
КБ Ситибанк
КБ Ситибанк
Получить через API
КБ АРЕСБАНК
КБ АРЕСБАНК
Получить через API
Автоградбанк
Автоградбанк
Получить через API
ББР Банк
ББР Банк
Получить через API
НБД-Банк
НБД-Банк
Получить через API
Банк Акцепт
Банк Акцепт
Получить через API
МЕТКОМБАНК
МЕТКОМБАНК
Получить через API
Первый Дортрансбанк
Первый Дортрансбанк
Получить через API
Тойота Банк
Тойота Банк
Получить через API
КБ ЭНЕРГОТРАНСБАНК
КБ ЭНЕРГОТРАНСБАНК
Получить через API
МБ Банк
МБ Банк
Получить через API
УРАЛПРОМБАНК
УРАЛПРОМБАНК
Получить через API
Тимер Банк
Тимер Банк
Получить через API
КОШЕЛЕВ-БАНК
КОШЕЛЕВ-БАНК
Получить через API
КБ СИНКО-БАНК
КБ СИНКО-БАНК
Получить через API
ГУТА-БАНК
ГУТА-БАНК
Получить через API
Яндекс Банк
Яндекс
Получить через API
КБ Урал ФД
КБ Урал ФД
Получить через API
Тольяттихимбанк
Тольяттихимбанк
Получить через API
Банк Венец
Банк Венец
Получить через API
Банк Аверс
Банк Аверс
Получить через API
Банк ИТУРУП
Банк ИТУРУП
Получить через API
АКБ Энергобанк
АКБ Энергобанк
Получить через API
ЮГ-Инвестбанк
ЮГ-Инвестбанк
Получить через API
КБ ЛОКО-Банк
КБ ЛОКО-Банк
Получить через API
Снежинский
Снежинский
Получить через API
Русьуниверсалбанк
Русьуниверсалбанк
Получить через API
СИБСОЦБАНК
СИБСОЦБАНК
Получить через API
АКБ ЕВРОФИНАНС МОСНАРБАНК
АКБ ЕВРОФИНАНС МОСНАРБАНК
Получить через API
МП Банк
МП Банк
Получить через API
Банк Интеза
Банк Интеза
Получить через API
МОРСКОЙ БАНК
МОРСКОЙ БАНК
Получить через API
Банк Развитие-Столица
Банк Развитие-Столица
Получить через API
Таврический Банк
Таврический Банк
Получить через API
Первый Инвестиционный Банк
Первый Инвестиционный Банк
Получить через API
АКБ ТЕНДЕР-БАНК
АКБ ТЕНДЕР-БАНК
Получить через API
МОСКОМБАНК
МОСКОМБАНК
Получить через API
АКБ НОВИКОМБАНК
АКБ НОВИКОМБАНК
Получить через API
Кубаньторгбанк
Кубаньторгбанк
Получить через API
Автоторгбанк
Автоторгбанк
Получить через API
Банк Объединенный капитал
Банк Объединенный капитал
Получить через API
Газтрансбанк
Газтрансбанк
Получить через API
АКБ НРБанк
АКБ НРБанк
Получить через API
Нацинвестпромбанк
Нацинвестпромбанк
Получить через API
Банк РЕСО Кредит
Банк РЕСО Кредит
Получить через API
ТАТСОЦБАНК
ТАТСОЦБАНК
Получить через API
КБЭР Банк Казани
КБЭР Банк Казани
Получить через API
Банк МБА-МОСКВА
Банк МБА-МОСКВА
Получить через API
КБ СТРОЙЛЕСБАНК
КБ СТРОЙЛЕСБАНК
Получить через API
КБ РУСНАРБАНК
КБ РУСНАРБАНК
Получить через API
Кузнецкбизнесбанк
Кузнецкбизнесбанк
Получить через API
Инбанк
Инбанк
Получить через API
АКБ Трансстройбанк
АКБ Трансстройбанк
Получить через API
Экономбанк
Экономбанк
Получить через API
ИШБАНК
ИШБАНК
Получить через API
АКБ СЛАВИЯ
АКБ СЛАВИЯ
Получить через API
Банк Кремлевский
Банк Кремлевский
Получить через API
Норвик Банк
Норвик Банк
Получить через API
АКБ МЕЖДУНАРОДНЫЙ ФИНАНСОВЫЙ КЛУБ
АКБ МЕЖДУНАРОДНЫЙ ФИНАНСОВЫЙ КЛУБ
Получить через API
Банк Заречье
Банк Заречье
Получить через API
Томскпромстройбанк
Томскпромстройбанк
Получить через API
Северный Народный Банк
Северный Народный Банк
Получить через API
Банк АЛЕКСАНДРОВСКИЙ
Банк АЛЕКСАНДРОВСКИЙ
Получить через API
КБ Крокус-Банк
КБ Крокус-Банк
Получить через API
Джей энд Ти Банк
Джей энд Ти Банк
Получить через API
ВУЗ-банк
ВУЗ-банк
Получить через API
Банк Финсервис
Банк Финсервис
Получить через API
АКБ ФОРА-БАНК
АКБ ФОРА-БАНК
Получить через API
Севергазбанк
Севергазбанк
Получить через API
УКБ Новобанк
УКБ Новобанк
Получить через API
СОЦИУМ-БАНК
СОЦИУМ-БАНК
Получить через API
УКБ Белгородсоцбанк
УКБ Белгородсоцбанк
Получить через API
АКБ Приморье
АКБ Приморье
Получить через API
Банк БКФ
Банк БКФ
Получить через API
Прио-Внешторгбанк
Прио-Внешторгбанк
Получить через API
МС Банк Рус
МС Банк Рус
Получить через API
АКБ Солид
АКБ Солид
Получить через API
ЦентроКредит
ЦентроКредит
Получить через API
РЕАЛИСТ БАНК
РЕАЛИСТ БАНК
Получить через API
НК Банк
НК Банк
Получить через API
БАНК МОСКВА-СИТИ
БАНК МОСКВА-СИТИ
Получить через API
АКБ Держава
АКБ Держава
Получить через API
Банк ИПБ
Банк ИПБ
Получить через API
Банк Национальный стандарт
Банк Национальный стандарт
Получить через API
АКБ Ланта-Банк
АКБ Ланта-Банк
Получить через API
банк Раунд
банк Раунд
Получить через API
КБ ВНЕШФИНБАНК
КБ ВНЕШФИНБАНК
Получить через API
Драйв Клик Банк
Драйв Клик Банк
Получить через API
Авто Финанс Банк
Авто Финанс Банк
Получить через API
АИКБ Енисейский объединенный банк
АИКБ Енисейский объединенный банк
Получить через API
Вайлдберриз Банк
Вайлдберриз Банк
Получить через API
Банк БЖФ
Банк БЖФ
Получить через API
Цифра банк
Цифра банк
Получить через API
банк Элита
банк Элита
Получить через API
Ставропольпромстройбанк
Ставропольпромстройбанк
Получить через API
КБ Долинск
КБ Долинск
Получить через API
НКО Мобильная карта
НКО Мобильная карта (ЦУПИС)
Получить через API
Хайс Банк
Хайс Банк
Получить через API
Озон Банк (Ozon)
Озон Банк (Ozon)
Получить через API
ФИНСТАР БАНК
ФИНСТАР БАНК
Получить через API
ЦМРБанк
ЦМРБанк
Получить через API
Банк Точка
Банк Точка
Получить через API
Банк Оранжевый
Банк Оранжевый
Получить через API
РНКО Платежный конструктор
РНКО Платежный конструктор
Получить через API
МТС Деньги (ЭКСИ Банк)
МТС Деньги (ЭКСИ Банк)
Получить через API
ИКБР ЯРИНТЕРБАНК
ИКБР ЯРИНТЕРБАНК
Получить через API
ЖИВАГО БАНК
ЖИВАГО БАНК
Получить через API
Плайт
Плайт
Получить через API
Цифра Банк
Цифра Банк
Получить через API
Роял Кредит Банк
Роял Кредит Банк
Получить через API
РОКЕТБАНК
РОКЕТБАНК
Получить через API
Т-мобайл
Т-мобайл
Получить через API
ДБО Фактура
ДБО Фактура
Получить через API
Авито
Авито
Получить через API
Билайн
Билайн
Получить через API
Akipay
Alipay
Получить через API
Банк Россия
Банк Росия
Получить через API
QPlus
QPlus
Получить через API
Амра-банк
Амра-банк
Получить через API
Банк 131
Банк 131
Получить через API
Амра-банк
Амра-банк
Получить через API
БалтИнвестБанк
БалтИнвестБанк
Получить через API
БАНК ВОЛОГЖАНИН
БАНК ВОЛОГЖАНИН
Получить через API
БМ-Банк
БМ-Банк
Получить через API
РГС Банк
РГС Банк
Получить через API
Запсибкомбанк
Запсибкомбанк
Получить через API
Еком Банк
Еком Банк
Получить через API
Веста
Веста
Получить через API
НБС
НБС
Получить через API
Кузбассхимбанк
Кузбассхимбанк
Получить через API
Космос
Космос
Получить через API
ВБРР
ВБРР
Получить через API
Мотив
Мотив
Получить через API
YOTA
YOTA
Получить через API
А-Мобаил
А-Мобаил
Получить через API
Банк Йошкар-Ола
Банк Йошкар-Ола
Получить через API
Multitransfer
Multitransfer
Получить через API
Сургунтнефтегаз
Сургунтнефтегаз
Получить через API
Мегафон
Мегафон
Получить через API
T2 cards
T2 cards
Получить через API
Банк ВТБ
ВТБ
Получить через API
Свой Банк
Свой Банк
Получить через API
ПАО Банк "Кузнецкий"
Кузнецкий
Получить через API
Tele2
Tele2
Получить через API
Мегафон
Мегафон
Получить через API
МТС
МТС mobile
Получить через API
Alif Bank
Alif Bank
Получить через API
Душанбе Сити
Душанбе Сити
Получить через API
Telcell Wallet
Telcell Wallet
Получить через API
Kapital Bank
Kapital Bank
Получить через API
Idbank
Idbank
Получить через API
Ориёнбанк
Ориёнбанк
Получить через API
Арванд
Арванд
Получить через API
BIDV
BIDV
Получить через API
Матин
Матин
Получить через API
Babilon-Mobile Таджикистан
Babilon-Mobile Таджикистан
Получить через API
ACBОтображаемое название требует сверки
ACB
Получить через API
BIDVОтображаемое название требует сверки
BIDV
Получить через API
MB BankОтображаемое название требует сверки
MB Bank
Получить через API
TechcombankОтображаемое название требует сверки
Techcombank
Получить через API
VietcombankОтображаемое название требует сверки
Vietcombank
Получить через API
VietinBankОтображаемое название требует сверки
VietinBank
Получить через API
Совпадений нет. Попробуйте другое название или запросите актуальный список через API.
Чтобы получить рабочий ID: найдите название в таблице, запросите GET /api/v2/banks?q=... с URL-кодированным названием и передайте items[].id выбранной записи в bank_id выплаты. При нескольких совпадениях уточните банк и страну; не выбирайте автоматически первую запись. Если список пуст, согласуйте подключение банка. Не создавайте ID самостоятельно.
GET /api/v2/banks
Запрос выполняется с вашего сервера и подписывается теми же четырьмя заголовками, что Payin API. Тело GET пустое. В подпись входит точный путь с закодированными параметрами:
bank_1 — пример, а не гарантированный ID Т-Банка. Всегда используйте фактический items[].id своего окружения. Не переносите ID из чужого справочника или другой установки.
Параметр
Правило
country_code
Необязательный двухбуквенный код страны в верхнем регистре, например RU
q
Необязательная подстрока original_name, до 200 UTF-8 байт; подпишите после URL-кодирования
after
Значение next_after предыдущей страницы; остальные фильтры сохраняются
Не передавайте дополнительные или повторяющиеся параметры. Страница содержит не более 100 записей в порядке ID. При next_after: null чтение закончено. Пустой items — корректный результат: например, нет активных банков, соответствующих фильтру.
original_name — согласованное название, которое показывается плательщику. country_code может быть null, если страна не задана. kind различает банк (bank), кошелёк (wallet), мобильного оператора (mobile) и другой тип (other). Названия и технические коды отдельных шлюзов клиенту не передаются.
Наличие банка в справочнике не означает, что он настроен для каждого магазина, метода или терминала. Разрешённые сочетания подтверждаются для вашего подключения.
Банк при приёме платежа
В POST /api/v2/payins поле bank_idне передаётся. Банк определяется по фактически выданным шлюзом реквизитам и проверенному сопоставлению. Когда банк установлен, ответ содержит bank_id и bank_name для обоих режимов; в H2H эта пара также указана в requisite.
bank_name — сохранённый original_name, а не произвольное название провайдера. Hosted form показывает это же название. Переименование банка не переписывает уже выданную заявку. Неизвестное значение провайдера требует сверки: не считайте отсутствие реквизитов доказательством отсутствия операции у провайдера.
Банк при выплате
В POST /api/v2/payouts передайте bank_id из этого справочника. Полный запрос, правила методов, получатель, резервирование и повторы описаны в разделе Выплаты клиентам. ID обязателен для СБП; для карты и счёта требования исполнителя подтверждаются отдельно.
ID передаётся отдельно от карты или телефона получателя. Не передавайте вместо него название банка, код провайдера или числовую часть ID. original_name и внутренние сопоставления вы не задаёте. Сетл мерчанту и выплата его клиенту — разные операции.
sh
node examples/client.mjs banks
# Если next_after не null, подставьте возвращённое значение:
node examples/client.mjs banks --after bank_100
Публичный API origin подтверждён; доступность операций не подтверждена (проверенный GET /api/v2/banks возвращает 503). Локальные тесты приёма используют неплатёжный sandbox. Поддержка справочника не включает настоящий провайдерский адаптер или автоматическое исполнение выплат через реальный шлюз.
Создание и проверка платежа
Все три API-запроса подписываются по протоколу аутентификации. Магазин определяется ключами. Для нового запроса нужна новая подпись с новым nonce, даже если вы читаете тот же платёж.
Это пример формата, не рабочий адрес webhook. IP в примере относится к плательщику и не заменяет IP вашего сервера в allowlist.
Обязательные поля
Поле
Формат и значение
merchant_order_id
Ваш уникальный номер попытки оплаты внутри магазина. До 128 UTF-8 байт; без пробелов по краям и управляющих символов
amount
Положительная десятичная строка, до 80 символов. Например "15000.00"; без экспоненты, знака, запятой и разделителей тысяч
currency
RUB, AZN, KZT, KGS, UZS; сочетание должно быть настроено для магазина
method_id
Число: 1 СБП, 2 карта, 3 QR, 4 мобильный платёж
mode
h2h или payment_form
traffic_type
primary или secondary, согласно согласованной политике магазина
payer.id
Устойчивый идентификатор плательщика в вашей системе, до 128 UTF-8 байт
payer.ip
IPv4/IPv6 плательщика без zone identifier
Не меняйте payer.id при каждом платеже одного клиента: он участвует в проверках трафика и ограничений. Не передавайте произвольный тип трафика ради обхода настроек.
Необязательные поля
Поле
Правило
payer.email
Валидный email, до 254 UTF-8 байт
payer.phone
Непустая строка, до 32 UTF-8 байт
payer.user_agent
До 1024 UTF-8 байт
payer.fingerprint
До 256 UTF-8 байт
metadata
JSON-объект до 16384 UTF-8 байт. Не передавайте секреты и лишние персональные данные
webhook_url
HTTPS URL до 2048 UTF-8 байт. Имеет приоритет над настройкой магазина
redirect_urls.success/failure/return
HTTPS URL до 2048 UTF-8 байт каждый. Поля сохраняются, но текущая hosted form не выполняет автоматические переходы по ним
При отсутствии необязательного значения опускайте поле. Не используйте null как универсальную замену. Неизвестные поля, повторяющиеся JSON-ключи и другие написания имён отклоняются. Не передавайте shop_id, is_test, live, status, курс или комиссию: клиент не задаёт эти значения.
Если нет webhook_url, используется адрес магазина, сохранённый при подготовке заявки. Если отсутствуют оба, запрос заканчивается 422 webhook_required, а merchant_order_id остаётся занятым. Добавление URL позже не перезапускает этот запрос.
Ответ создания
POST ожидает выдачи реквизитов и фиксации условий до 30 секунд. HTTP 201 возвращает объект платежа напрямую, без обёртки data:
Пример условный и неплатёжный. Не требуйте именно два знака после точки: сервер может вернуть другую точную десятичную запись. В режиме payment_form вместо requisite приходит payment_url. Эти поля взаимно исключаются.
Поле ответа
Значение
id
Выданный платформой идентификатор платежа. Передавайте его без изменений
rate
Сохранённый курс: единицы исходной валюты за 1 USDT
fee
Сохранённая комиссия в процентах; "2" означает 2%, не 2 RUB/USDT
created_at
Время выдачи реквизитов, а не время получения исходного HTTP-запроса
expires_at
Фактический срок платежа; используйте это поле, не собственный таймер «10 минут»
is_test
В текущем контракте всегда true; реальный платёжный режим не активирован
success_paid, paid_at
Появляются только при status_id=2: подтверждённая сумма в исходной валюте и время оплаты
close_reason
Появляется при status_id=4
bank_id, bank_name
При проверенном сопоставлении ответа шлюза — ID банка и сохранённый original_name, в обоих режимах. В H2H эта пара также есть в requisite
Даты API — ISO 8601 UTC, возможны доли секунды. Для отображения преобразуйте их в выбранный часовой пояс; подпись и данные запроса не меняйте. Деньги и курс сохраняйте как строки/Decimal, без binary float.
Статусы платежа
status_id
Значение
Действие мерчанта
1
Создан, реквизиты выданы
Ожидать подтверждения; создание не означает оплату
2
Оплачен
Проверить сумму и выполнить ваше бизнес-действие ровно один раз
3
Срок истёк
Не выдавать товар/услугу как оплаченную; сохранять возможность позднего подтверждения
4
Отменён
Учитывать причину; отмена не даёт права игнорировать последующее подтверждение уже состоявшейся оплаты
Подтверждённая поздняя оплата может перевести 3 в 2, а некоторые причины отмены — 4 в 2. Применяйте ответы POST/GET и webhook с проверкой актуального состояния вашего заказа. Уже сохранённый успех 2 нельзя перезаписать задержанным ответом со статусом 1, 3 или 4. Опрос API и webhook должны использовать общий ключ однократной выдачи товара или услуги.
Автоматический callback провайдера принимается только при численном равенстве подтверждённой и исходной суммы. Например, "15000" и "15000.00" равны; сравнивайте точные десятичные значения, а не текстовую запись или binary float. Другая сумма в callback требует сверки и сама по себе не переводит платёж в успех с зачислением.
Ручное подтверждение фактической суммы
Уполномоченный сотрудник может отдельно подтвердить фактически оплаченную сумму с доказательством и аудитом. Тогда status_id=2, исходный amount сохраняется, а success_paid может отличаться. Курс rate и ставка fee остаются сохранёнными условиями заявки; текущие настройки не применяются. Это отдельное подтверждение, а не автоматическое принятие произвольной частичной оплаты и не второе начисление.
Условный пример результата GET для той же тестовой заявки после ручного подтверждения 12000 RUB вместо исходных 15000 RUB; пример не свидетельствует о реальном платеже:
В уведомлении те же суммы называются amount и successPaid. Сохраните обе суммы; не подменяйте фактическую оплату исходной суммой заказа. При расхождении приостановите автоматическую выдачу полного товара или услуги и выполните сверку через API и поддержку по вашим правилам обработки недоплаты или переплаты. Само расхождение сумм не означает недействительную подпись или ошибочный статус. После сверки используйте общий для API и webhook ключ однократного бизнес-действия.
Потерянный ответ: GET /api/v2/payins/result
text
GET /api/v2/payins/result?merchant_order_id=shop-order-0001
При URL-кодировании номера подпишите тот же точный path/query, который отправляете. Ответ HTTP 200:
Запрос принят и обрабатывается; продолжайте проверку результата
completed
Платёж сформирован; объект payin содержит его текущий status_id. Это не обязательно оплата
failed
Формирование завершилось ошибкой, error_code содержит безопасную причину; объекта payin нет
review_required
Требуется сверка неопределённого результата; не запускайте новую оплату того же поручения
После потери ответа, HTTP 409, 503 или 504 проверяйте этот маршрут. Новый nonce нужен на каждый GET. Интервал опроса согласуйте для выданного окружения; общего обещанного лимита или расписания здесь нет.
merchant_order_id уникален внутри магазина после принятия запроса, в том числе после терминальной ошибки. Повтор POST возвращает 409 duplicate_merchant_order_id, а не первоначальный успешный ответ. Нет заголовка Idempotency-Key в текущем контракте.
HTTP 404 при проверке означает отсутствие видимой записи в данный момент. Он не доказывает, что ранее отправленный POST не может ещё завершиться. Сначала завершите сверку; не создавайте другой номер для той же покупки с неопределённым исходом. Новая намеренная попытка после подтверждённого завершения предыдущей получает новый merchant_order_id и связь с покупкой в вашей системе.
Чтение сформированного платежа: GET /api/v2/payins/{id}
text
GET /api/v2/payins/ord_123
HTTP 200 возвращает тот же объект платежа. Пока он не сформирован, используйте поиск по merchant_order_id. Неизвестный или принадлежащий другому магазину id возвращает 404.
Платёжная форма
Открывайте только payment_url, полученный от сервера. Не собирайте его из id или домена админки: ссылка содержит секретный capability-токен. Не публикуйте её в общих логах/аналитике, не добавляйте посторонние query-параметры. При открытии новой вкладки используйте noopener и noreferrer.
Повторное открытие не создаёт новый платёж. Форма показывает текущее состояние, результат оплаты либо истечение срока. При наличии настроенных действий загрузка чека и «Я оплатил» передают информацию, не подтверждают оплату. Переход браузера, сообщение пользователя и скриншот не заменяют проверенный статус API/webhook.
Выплаты клиентам
Клиентская выплата — перевод получателю по поручению магазина. Это отдельная операция от входящего платежа и сетла мерчанту. Запрос создаёт сохранённую заявку и резервирует USDT; он не означает, что получатель уже получил деньги.
У магазина должны быть активированы отдельные условия выплат для метода и валюты: курс в единицах валюты за 1 USDT и комиссия магазина. Условия приёма платежей не подставляются автоматически. Перед первым запросом согласуйте доступные методы, валюты, банк и способ исполнения с Absolut Pay.
POST /api/v2/payouts
JSON-запрос подписывается четырьмя заголовками из раздела «Подпись запросов». Секрет хранится на сервере мерчанта. Подписывайте точные байты тела, не меняя их после вычисления подписи.
bank_1 — пример. Получите фактический ID из GET /api/v2/banks. Не отправляйте наш ID как код НСПК напрямую в API другого провайдера.
Поле
Обязательность и проверка
merchant_order_id
Обязательно: уникальный номер поручения в пределах магазина, 1–128 UTF-8 байт, без управляющих символов и пробелов по краям
amount
Обязательно: положительная десятичная строка, не более двух знаков после точки; сумма в валюте получателя
currency
Обязательно: RUB, AZN, KZT, KGS или UZS; наличие в перечне не заменяет активные условия магазина
method
Обязательно: sbp, card или account; банк и исполнитель должны поддерживать этот метод
bank_id
Обязательно для sbp, необязательно для других методов; строковый ID активной записи справочника
recipient
Обязательно: объект получателя по правилам ниже
webhook_url
Необязательно: HTTPS URL без userinfo и fragment, порт 443 или без явного порта, до 2000 байт. Если отсутствует, используется URL магазина; если оба отсутствуют, уведомления не создаются
metadata
Необязательно: ваш JSON-объект, до 16 KiB, без секретов. Возвращается при чтении поручения; в уведомление не включается
Для всех методов обязательно recipient.customer_name: имя получателя, 1–200 UTF-8 байт. Остальные поля зависят от метода:
Метод
Реквизиты
sbp
Только phone_number: международный формат + и 8–15 цифр, первая цифра не 0. Например, +79991112233. Обязателен bank_id
card
Только card_number: строка из 12–19 цифр. Не передавайте CVV, срок действия, PIN или данные входа в банк
account
Только account_number: 8–34 символа, заглавные латинские буквы и цифры
Нельзя передавать карту одновременно с телефоном или счётом. Неизвестные поля, дубли ключей, null, повторные параметры URL и числовое JSON-значение вместо суммы отклоняются. Метод account в этой версии доступен для ручного исполнения; автоматический адаптер для него не подключён.
Магазин определяется подписанным API-токеном. Не передавайте shop_id, курс, комиссию или желаемый финансовый статус в публичном запросе.
Расчёт и резерв
При создании система сохраняет сумму, валюту, банк и его название, реквизиты получателя, курс, комиссию и версию условий. Изменение условий магазина или названия банка не переписывает созданную выплату.
Округление выполняется до ближайшего значения с восемью знаками; точная половина округляется вверх. Для положительной суммы, которая округляется в нулевую основную сумму USDT, создание отклоняется. Сумма и курс рассчитываются точной десятичной арифметикой.
Резерв равен total_usdt и уменьшает доступный баланс. При подтверждённом успехе списываются основная сумма и комиссия; при подтверждённом отказе или отмене до отправки резерв освобождается. Неопределённый результат сохраняет резерв до сверки. Для разделённой выплаты каждая часть имеет собственный резерв; отмена оставшейся части не возвращает уже исполненную сумму.
HTTP 201 означает, что поручение и резерв сохранены:
amount остаётся исходной суммой. paid_amount — сумма подтверждённых успешных частей, remainder — исходная сумма минус оплаченные части. Остаток в этом поле не означает, что сумма доступна для повторной отправки: неотправленные, отказанные и неизвестные части различаются внутренними состояниями. Для следующего действия используйте актуальный статус и сверку с поддержкой.
Статусы и чтение
status
Значение
queued
Создана, средства зарезервированы, ещё не отправлена
processing
Есть отправленная часть, ожидается подтверждение
unknown
Есть неопределённый результат; резерв удерживается, выполняется сверка
success
Все части исполнены; исходная сумма полностью оплачена
partial
Все части завершены; часть суммы оплачена, остальные части завершились отказом или отменой
failed
Все неуспешные части завершены отказом; успешных частей нет
cancelled
Выплата отменена без исполнения; успешных частей нет
processing может содержать уже исполненные части: их сумма указана в paid_amount. partial — завершение со смешанным результатом. Перед отдельным поручением на неполученную сумму сверяйте результат; не создавайте его автоматически по одному уведомлению. Внутренние исполнители, терминалы, ключи и доказательства сотрудника не возвращаются публичным API.
text
GET /api/v2/payouts/b7a09187-553b-4d11-bc28-a725192653fc
GET /api/v2/payouts/result?merchant_order_id=PAYOUT-2026-000042
Оба запроса подписанные, тело пустое. Первый возвращает объект выплаты; второй возвращает результат регистрации номера:
При creating поле payout равно null: номер зарегистрирован, окончательный результат требует проверки. При rejected поле payout равно null, дополнительно возвращается error_code; этот номер также нельзя использовать заново. HTTP 404 означает, что запись не найдена в вашем магазине; при потерянном ответе на создание сначала повторите чтение с новой подписью и свяжитесь с поддержкой, не создавая другое поручение автоматически.
Повторы и изменение поручения
merchant_order_id резервируется постоянно после принятия корректного запроса. Параллельные и повторные POST с тем же номером не создают новый резерв; ответ — HTTP 409 duplicate_merchant_order_id. Другой магазин имеет отдельное пространство номеров.
После тайм-аута, обрыва ответа или 5xx обращайтесь к /payouts/result с тем же номером и новыми X-Timestamp/X-Nonce/X-Signature. Если запись остаётся creating, требуется разбор, а не новая отправка. При подтверждённом rejected исправленное поручение требует нового согласованного номера.
Публичных методов изменения суммы, дробления или отмены нет. Сотрудник может разделить только полностью неотправленную выплату; после отправки изменение реквизитов, курса и повторное создание частей запрещены. Ручное исполнение требует отдельного права, суммы и валюты результата, доказательства и уникального номера фактического перевода. Это подтверждение уполномоченного сотрудника, не автоматическая проверка банка или блокчейна.
GET /api/v2/balance
Подписанный запрос без тела и параметров возвращает USDT-баланс магазина, которому принадлежит API-токен:
Предварительное чтение баланса не резервирует деньги и не гарантирует следующую выплату. Проверка средств и резервирование выполняются атомарно при создании. total включает зарезервированные средства.
Уведомления о выплатах
Payout webhook — отдельный JSON-формат с типом payout.updated. Подпись: HMAC-SHA512 от X-Webhook-Timestamp + "." + сырые байты тела, тот же алгоритм проверки, что у уведомлений приёма. Не используйте SHA512 от склеенных сортированных полей.
Проверьте подпись по сырым байтам и свежесть заголовка, затем форму сообщения.
В одной транзакции сохраните event_id, примените только новую revision для этого поручения и зафиксируйте свой эффект. Повторный event_id не исполняйте второй раз.
Ответьте HTTP 200 после надёжного сохранения. Тело 1 не требуется. Ответы 201/202/204 не подтверждают доставку.
Доставка выполняется как минимум один раз. При потере HTTP-ответа платформа может повторить уже принятую вами запись. Повтор сохраняет event_id и байты тела; подпись и timestamp обновляются для текущей попытки. Не используйте updated_at как ключ дедупликации.
Всего до восьми попыток. Интервалы после неуспеха: 5 секунд, 30 секунд, 2 минуты, 10 минут, 30 минут, 2 часа, 12 часов. После исчерпания попыток сверяйте статус через GET. Работает отдельный worker с MERCHANT_WEBHOOKS_ENABLED=true; наличие URL без запущенного worker не обеспечивает доставку. Ошибка уведомления не меняет выплату и не освобождает резерв.
Дата API — ISO 8601 с часовым поясом; сравнивайте абсолютные моменты. Представление времени в кабинете — московское, независимо от часового пояса браузера.
Доступность первой версии
Рабочий серверный цикл включает создание, резервирование, чтение, разделение до отправки и ручное подтверждение/отказ с аудитом. Исполняемые автоматические подключения пока только тестовые: внесение реального токена в терминал само по себе не подключает шлюз. Перед запуском согласуйте фактический исполнительный адаптер, проверки его результата и доступность worker; тестовое подключение не перечисляет деньги.
Absolut Pay отправляет webhook на ваш сервер после изменения статуса сформированного платежа. Уведомление позволяет надёжно обновить заказ в вашей системе; переход браузера и нажатие плательщиком «Я оплатил» не заменяют подтверждённый результат.
Payin API v2 и Merchant Webhook v1 — два разных формата. Запросы API используют merchant_order_id, method_id и даты ISO 8601. Уведомления сохраняют clientOrderID, methodID и Unix-время. Версия webhook не означает наличие платёжных маршрутов /api/v1.
В текущем локальном sandbox тестовые платежи помечены is_test: true: их события сохраняются без внешней доставки и без финансовых зачислений. Отсутствие webhook в таком тесте ожидаемо. Доставку на ваш адрес и рабочее подключение нужно подтвердить отдельно; этот документ описывает реализованный протокол уведомлений, а не активацию production.
Адрес доставки
Укажите HTTPS-адрес в webhook_url при создании платежа или настройте адрес по умолчанию для магазина. Адрес из запроса имеет приоритет. Система сохраняет выбранный адрес для заявки; последующее изменение настроек магазина не меняет адрес старой заявки.
Если адрес отсутствует в обоих местах, создание завершается ошибкой webhook_required до формирования платежа. Его merchant_order_id остаётся зарезервированным. У такого отказа нет сформированного платежа и webhook о его отмене.
Приёмник должен быть доступен по публичному HTTPS-адресу с действительным TLS-сертификатом. Перенаправления не выполняются. Private, loopback, link-local и служебные сетевые адреса для доставки запрещены. Адрес для webhook — серверный обработчик, а не страница возврата браузера.
Заголовки и подпись
http
POST /payments/absolut-pay/webhook HTTP/1.1
Content-Type: application/json
X-Webhook-Timestamp: UNIX_SECONDS
X-Webhook-Signature: LOWERCASE_HMAC_SHA512_HEX
Значения UNIX_SECONDS и LOWERCASE_HMAC_SHA512_HEX — обозначения для примера. Подпись проверяется по формуле:
Используется буквальная строка секрета API соответствующего магазина; декодировать её из Base64/Base64URL не нужно. Отдельный webhook-secret не выдаётся. В подпись не входят метод, путь, nonce или токен API. Заголовки X-API-Token и X-Nonce в уведомлении не передаются.
Проверьте подпись до доверенного использования JSON. Получите точные исходные байты тела, добавьте к ним строку timestamp и точку, вычислите HMAC и сравните подписи способом с постоянным временем. Повторная JSON-сериализация после разбора тела не подходит: пробелы и порядок полей могут измениться.
Для вашего приёмника рекомендуем проверку свежести X-Webhook-Timestamp в пределах ±300 секунд и синхронизацию времени. Это рекомендуемая защита на вашей стороне: Absolut Pay не настраивает допустимое окно в вашем приложении. Timestamp относится к конкретной попытке доставки. Старый платёж может иметь старые createdAt и paidAt, но свежее время и подпись уведомления.
Свежесть и подпись не заменяют защиту от дублирования: корректно подписанное уведомление может прийти повторно.
Поля уведомления
Поле
Тип
Значение
id
string
ID платежа Absolut Pay, например ord_10428
orderType
string
payin
status_id
integer
2 — успех, 3 — срок истёк, 4 — отмена
amount
decimal string
Исходная сумма платежа в currency
currency
string
Код валюты, например RUB
methodID
integer
1 — СБП, 2 — карта, 3 — QR, 4 — мобильный платёж
rate
decimal string
Сохранённый курс: единиц валюты платежа за 1 USDT
fee
decimal string
Сохранённая ставка комиссии в процентах; это не денежная сумма
clientOrderID
string
Ваш merchant_order_id
createdAt
integer
Unix-секунды выдачи платёжных инструкций
expiredAt
integer
Unix-секунды окончания срока оплаты
successPaid
decimal string
Подтверждённая сумма в currency; присутствует только при успехе
paidAt
integer
Unix-секунды подтверждённого времени оплаты; только при успехе
closeReason
string
Причина отмены; присутствует только при status_id: 4
Текущий протокол отправляет события успеха, истечения срока и отмены. Webhook о создании со статусом 1 не отправляется. Публичного event_id в теле нет. Не ожидайте реквизитов, данных плательщика или текущего баланса в этом сообщении.
Суммы, курс и комиссия передаются строками, чтобы сохранить точность. Не преобразуйте их через обычные дробные числа с плавающей точкой. Unix-время означает момент независимо от часового пояса; переводите его для отображения, сохраняя исходное значение.
amount — исходная сумма заказа, а successPaid — фактически подтверждённая оплаченная сумма. Автоматический callback провайдера требует численного совпадения с исходной суммой: "15000" и "15000.00" означают одну сумму; расхождение само по себе не создаёт успешного зачисления. Уполномоченный сотрудник может отдельно подтвердить другую фактическую сумму с доказательством и аудитом. Тогда amount сохраняется, а successPaid может отличаться; начисление рассчитывается по замороженным курсу и комиссии этой заявки, без применения текущих настроек и без повторного зачисления. Это не автоматическая поддержка произвольной частичной оплаты. При расхождении сохраните обе суммы и проверьте результат через API и поддержку; не подменяйте successPaid исходным amount.
Подтверждённая оплата
Пример структуры уведомления, не свидетельство реального платежа:
Для status_id: 3 поля successPaid и paidAt отсутствуют. Для status_id: 4 они также отсутствуют, но добавляется closeReason, например merchant_cancelled. Не ожидайте нулевых значений вместо отсутствующих полей.
Надёжный приём
Обрабатывайте уведомление в таком порядке:
Выберите секрет магазина по серверной конфигурации своего обработчика. Не определяйте секрет по непроверенным данным платежа.
Проверьте заголовки, допустимое время и подпись исходных байтов.
Разберите JSON и сверьте id, clientOrderID, валюту и сумму с сохранённым заказом.
В транзакции запишите событие с уникальным ключом (id, status_id). При общем обработчике нескольких магазинов добавьте идентификатор магазина в локальный ключ и проверьте область доступа.
Обновите состояние заказа и сохраните необходимую внутреннюю задачу на выдачу товара или услуги.
Зафиксируйте транзакцию и верните HTTP 200.
Корректный повтор уже сохранённого события также подтверждайте HTTP 200, не выполняя выдачу повторно. Не используйте timestamp или подпись как ключ события: на повторной попытке они изменяются.
Если выдача услуги требует обращения к другой системе, сохраните внутреннюю задачу вместе с событием и выполняйте её отдельно с защитой от повторов. HTTP 200 нужно отправлять после надёжного сохранения, а не после долгой внешней операции. Если запись не завершена или данные противоречат заказу, не подтверждайте успешный приём; сохраните безопасную диагностическую информацию для сверки.
Поздняя оплата и порядок событий
Срок мог истечь, а провайдер позже подтвердил оплату: тогда после 3 может прийти 2. Подтверждённая оплата также может следовать после отмены с причиной client_declined, merchant_cancelled или admin_cancelled. Отмена уже выданной заявки не доказывает, что деньги не поступят позже.
Обрабатывайте первую подтверждённую оплату один раз. Принятый успех 2 нельзя понизить до 3 или 4 из-за запоздавшего сообщения. Уведомление об истечении срока и уведомление об успехе — отдельные события одной заявки; поэтому дедупликация только по id без статуса ошибочно потеряет поздний успех.
Система упорядочивает отправки одной заявки, однако задержки сети и обработки на вашей стороне всё равно требуют защиты от устаревшего состояния. Если пришли противоречащие сохранённым данным события, проверьте текущий результат подписанным API-запросом.
Подтверждение и повторные попытки
Доставка считается успешной только при HTTP 200. Тело ответа не учитывается. 201, 202, 204, редирект и любой другой код не подтверждают доставку. На один запрос отведено 2 секунды.
Попытка
Время, начиная с создания события
1
0 секунд
2
10 секунд
3
30 секунд
4
60 секунд
5
120 секунд
Это сроки доступности попыток, а не гарантия точного времени получения. Предыдущее событие, остановка обработчика доставки или сетевые задержки могут сдвинуть фактическую отправку позже. Отсчёт не начинается заново после каждого неуспешного ответа.
Во всех попытках тело и адрес остаются прежними; timestamp и подпись формируются заново. Доставка допускает повторы: даже после сохранённого вами события ответ HTTP 200 может потеряться. После пяти неудачных попыток автоматическая доставка считается исчерпанной. Ошибка уведомления не отменяет оплату и не откатывает финансовый результат.
Используйте подписанное чтение платежа для сверки при недоступности webhook. Возвращение браузера, отсутствие сообщения или исчерпание доставки сами по себе не определяют финансовый статус.
Ротация секрета
Каждая новая попытка подписывается текущим секретом магазина. Уже начатая отправка может завершиться с предыдущим секретом. Согласуйте ротацию: обновите подпись своих API-запросов новой парой ключей и предусмотрите на приёмнике короткий ограниченный переходный период для старого секрета, если это требуется вашей схемой развёртывания.
Продолжительность переходного периода и удаление старого секрета определяются вашей политикой и проверкой уже начатых отправок; сервер не передаёт в webhook идентификатор ключа и не обещает фиксированное окно совместимости. Проверки свежести, принадлежности заказа и защиты от повторов действуют для обеих допустимых подписей. Старый секрет нельзя сохранять как бессрочный обход ротации.
Отключение приёма новых платежей магазина не отменяет обязанность доставить уведомления по существующим платежам.
Обрабатывайте error.code, а не английский message. request_id нужен поддержке; это не номер платежа и не ключ идемпотентности. Все повторы подписывайте заново: новые timestamp, nonce и signature, те же согласованные байты бизнес-запроса.
Справочник errors.json содержит те же объяснения. HTTP 200 в таблице означает вложенный error_code результата lookup, а не ошибку HTTP. У приёма он появляется при state: failed, у выплаты — при status: rejected. processing/creating и review_required требуют дальнейшего чтения или сверки; HTTP 200 сам по себе не означает оплату.
Доступ и формат запроса
Код / HTTP
Где возникает
Что означает
Что делать
Повтор
authentication_failed / 401
Все подписанные операции
Сервер не подтвердил подлинность запроса: заголовки, ключ, подпись, время или nonce не прошли проверку. Точная причина намеренно не раскрывается.
Проверить выданный ключ, часы, UUID v4 и подпись реально отправленных байтов. После потери ответа POST сначала выполнить lookup.
Только после исправления; новые timestamp, nonce и signature. Не повторять старые заголовки.
ip_not_allowed / 403
Все подписанные операции
Исходящий IP вашего backend не входит в разрешённый список магазина.
Согласовать фактический адрес с учётом NAT/proxy. Не менять IP для обхода ограничений.
После исправления allowlist; для неизвестного POST сначала lookup.
shop_disabled / 403, 422, 200
Создание приёма/выплаты; lookup приёма
Магазин или его группа недоступны для создания. HTTP 403 — отказ доступа; HTTP 422 — приём отклонён после резервирования номера; HTTP 200 — причина failed в lookup.
Уточнить активацию у менеджера. Сохранённые операции читать действующим ключом. При 422 номер уже занят.
Не автоматически. После активации проверить прежний результат; занятый номер не переиспользовать.
invalid_request / 400
Приём и банки
Неверный JSON, поля, query или идентификатор: неизвестные/повторные параметры, недопустимый IP/URL либо параметры справочника.
Сравнить запрос со схемой конкретной операции. У GET по ID и POST приёма query не допускается; lookup требует один merchant_order_id.
После исправления запроса. Если ранее был неизвестный результат POST — сначала lookup.
invalid_amount / 400
Создание приёма
Сумма не соответствует разрешённому формату или границам.
Передать положительную точную decimal-строку согласно схеме; не JSON-число. Не округлять деньги через float.
После исправления; неизвестный предыдущий POST сначала проверить lookup.
invalid_payout_request / 400
Выплаты и баланс
Некорректные поля, сумма, реквизиты, bank_id, UUID или query. При выплате bank_id должен указывать на активный канонический банк.
Проверить схему выплаты и тип реквизитов, получить bank_id из справочника. У баланса query запрещён. Ошибка может возникнуть и после занятия номера выплаты.
После исправления сначала lookup по прежнему номеру; если номер занят, не переиспользовать.
method_not_allowed / 405
Маршрутизация /api/v2
HTTP-метод не поддерживается по указанному пути.
Использовать метод и путь из OpenAPI; заново подписать исправленный запрос.
После исправления. Если это повтор после timeout, сначала выяснить исход первой операции.
Поиск и конфликт номера
Код / HTTP
Где возникает
Что означает
Что делать
Повтор
payin_not_found / 404
Получение/lookup приёма; неизвестный маршрут /api/v2
Приём или запрос с таким номером не найден в данном магазине; этот код также используется для неизвестного пути v2.
Проверить путь, магазин и идентификатор. Пока Payin не сформирован, искать по merchant_order_id. После потерянного ответа повторить чтение и при неопределённости обратиться в поддержку.
Повтор чтения допустим с новой подписью. Один 404 не разрешает повтор POST или создание нового номера.
payout_not_found / 404
Получение/lookup выплаты; чтение баланса
Объект не найден или не принадлежит магазину ключа. При балансе не найдена строка учёта магазина; это не нулевой баланс.
Проверить магазин, UUID/merchant_order_id; при балансе обратиться в поддержку. После потерянного POST выяснить исход по прежнему номеру.
Повтор GET допустим. Один 404 после timeout не доказывает, что можно создать перевод снова.
duplicate_merchant_order_id / 409
Создание приёма и выплаты
Номер бизнес-запроса уже занят в данном магазине, в том числе после отказа. Повтор POST не возвращает старый успешный ответ.
Читать /payins/result или /payouts/result по исходному номеру. Не заменять номер автоматически.
Повторять lookup, не POST. Новый перевод — только отдельное бизнес-решение после выяснения исхода.
payout_action_unavailable / 409
Создание выплаты: конфликт согласованности
При записи обнаружен конфликт идентичности/состояния выплаты. Общая классификация ошибок БД может вернуть этот код публичному созданию.
Проверить lookup по исходному номеру и передать request_id в поддержку. Это не маршрут изменения выплаты мерчантом.
Не повторять POST автоматически; сначала сверка.
Условия и отказ формирования
Код / HTTP
Где возникает
Что означает
Что делать
Повтор
payout_configuration_disabled / 403, 200
Создание и lookup выплаты
Нет активных отдельных условий выплаты для метода/валюты либо магазин/группа отключены. В lookup HTTP 200 это причина rejected.
Согласовать и активировать условия выплат. Условия приёма не заменяют условия выплат. Номер может быть уже занят.
После исправления проверить lookup; отвергнутый занятый номер остаётся занят.
insufficient_funds / 422, 200
Создание и lookup выплаты
Доступного USDT недостаточно для резерва основной стоимости и комиссии. В lookup HTTP 200 это причина rejected.
Прочитать баланс, учесть reserved и полную стоимость по условиям выплат. Согласовать пополнение доступного остатка; прежний номер уже занят.
Не повторять прежний POST после пополнения. Новый запрос только как новое подтверждённое бизнес-действие.
webhook_required / 422, 200
Создание и lookup приёма
До формирования не найден webhook_url ни в запросе, ни в настройках магазина. Номер уже зарезервирован.
Настроить публичный HTTPS endpoint для будущих запросов. Проверить failed через lookup. Добавление URL не возобновит этот запрос.
Этот POST не повторять; новый номер только для осознанно нового запроса после проверки исхода.
traffic_type_not_allowed / 422, 200
Создание и lookup приёма
Тип трафика не разрешён условиями магазина. Номер сохранён.
Согласовать тип трафика и настройки; не подменять классификацию ради обхода ограничения.
Не повторять сохранённый запрос. После согласования возможен отдельный новый бизнес-запрос.
payer_restricted / 422, 200
Создание и lookup приёма
Для плательщика действует ограничение. Номер запроса сохранён.
Уточнить причину и порядок разблокировки у менеджера; не менять ID плательщика для обхода.
Автоматический повтор запрещён; сначала решение по ограничению и сверка результата.
unsupported_payment_configuration / 422, 200
Создание и lookup приёма
Сочетание метода, валюты и режима не поддерживается действующими условиями магазина.
Сверить матрицу и согласованные настройки; наличие значения в enum не гарантирует доступность.
После согласования — отдельный новый запрос; прежний зарезервированный номер не повторять.
no_requisite / 422, 200
Создание и lookup приёма
Каскад не выдал реквизиты. Сохранённый запрос не стал сформированным Payin и не означает оплату.
Проверить failed через lookup, показать пользователю отсутствие реквизитов и возможность обратиться в поддержку.
Не повторять POST автоматически; новая попытка только как отдельное согласованное бизнес-действие.
payment_processing_failed / 422, 200
Создание и lookup приёма
Формирование не завершилось; внутренняя причина скрыта за общим публичным кодом.
Получить lookup по исходному номеру, сохранить request_id и обратиться в поддержку. Не угадывать причину по тексту message.
Повтор чтения допустим; POST с занятым номером не повторять.
Неизвестный результат и восстановление
Код / HTTP
Где возникает
Что означает
Что делать
Повтор
payment_requires_reconciliation / 503
Создание приёма
Исход формирования требует сверки; отсутствие Payin в ответе не является доказательством отсутствия операции.
Прочитать lookup; при review_required дождаться сверки поддержки по исходному номеру.
Не повторять POST и не создавать автоматически новый номер; разрешён polling.
payment_processing_timeout / 504
Создание приёма
Истекло ожидание HTTP-ответа; долговечная обработка может продолжаться.
Выполнить lookup по исходному merchant_order_id с новой подписью. Для processing продолжать чтение с задержкой.
Только чтение до известного результата; автоматический retry POST выключить.
internal_error / 503
Все подписанные операции
Результат временно недоступен: хранилище, аудит, ключи или обработчик не позволили завершить ответ. Это не финальный денежный статус.
Для POST сначала lookup по сохранённому номеру. Для GET повторить чтение с задержкой; при сохранении ошибки передать request_id поддержке.
GET — с ограниченным backoff и новой подписью. POST — без автоматического повтора при неизвестном исходе.
creation_requires_review / 200
Только error_code в lookup выплаты
Создание выплаты завершилось отклонённым запросом, требующим проверки причины; публичный обработчик не раскрывает внутреннюю ошибку.
Проверить status и payout в lookup, передать номер и request_id поддержке. Номер зарезервирован, даже когда payout равен null.
Повторять только чтение. Не превращать rejected в автоматическое повторное создание.
Потерян ответ POST: безопасный порядок
Сохраните исходный merchant_order_id, направление, магазин и время попытки.
Выполните соответствующий подписанный GET /api/v2/payins/result?merchant_order_id=... или /api/v2/payouts/result?merchant_order_id=....
Если запрос ещё обрабатывается, продолжайте чтение с задержкой. При требовании сверки обратитесь в поддержку. Один 404 не исключает гонку с незавершённым первым запросом.
Если заявка найдена, обрабатывайте её состояние однократно вместе с webhook. Создание заявки не означает оплату.
При окончательном отказе номер остаётся занят. Новый номер означает новое бизнес-действие, а не транспортный retry: его нельзя назначать автоматически, пока исход прежнего запроса не установлен.
Отключите автоматический retry POST в HTTP-клиенте и балансировщике. Здесь нет обещания универсального интервала polling или Retry-After: используйте согласованные ограничения окружения. Если ответ не соответствует JSON-оболочке (например, ответ внешнего proxy), сохраните безопасные HTTP-метаданные и действуйте как при неизвестном исходе; не придумывайте error.code.
Если подпись не проходит
Используйте secret как выданную строку без декодирования. Подписывайте METHOD в верхнем регистре, path/query без hostname, с неизменными порядком query и percent-encoding. JSON должен уйти ровно теми байтами, которые подписаны, включая пробелы и конечный LF. Для GET тело пустое, последний разделитель LF сохраняется. Проверьте часы и UUID v4; принятый nonce нельзя использовать повторно. Внутренние причины вроде invalid_nonce не публикуются как отдельные коды: снаружи это authentication_failed.
Если webhook не приходит
Неоплаченная заявка и отсутствие уведомления — разные факты. В текущем тестовом приёме доставка merchant webhook не выполняется. В окружении с доставкой проверьте публичный HTTPS URL, сертификат/DNS, отсутствие редиректа и ответ именно HTTP 200 за отведённое время. Не размещайте получатель на localhost или частном IP. После исчерпания попыток сверяйте результат через API.
Подпись входящего webhook отличается от подписи запроса API. Проверяйте исходное тело безопасным сравнением и объединяйте webhook с polling через однократное бизнес-действие.
Данные для поддержки
Передавайте request_id, направление, безопасное имя маршрута, HTTP/code, время и ваш номер заказа. Не отправляйте secret, заголовки авторизации, полные тела с персональными данными или capability-ссылки в общие логи.
Каталог ограничен Merchant API. Коды административных операций с исполнителями, ручной проверкой доказательств, ревизиями и экспортом сюда не перенесены. Внутренние причины live_adapter_required и provider_reconciliation_required скрыты lookup приёма: клиент получает state: review_required без этих кодов.
Публичная платёжная форма и H2H
Режим h2h возвращает реквизиты в requisite, режим payment_form — полный payment_url. Выбор режима не подтверждает деньги и не создаёт второй платёж. Текущий контур приёма возвращает неплатёжные mock-реквизиты.
Каноническая ссылка
Сервер выдаёт полный URL существующей заявки с публичным токеном /p/{token}. Токен отличается от внутреннего ID. Не собирайте адрес из домена документации, API, admin или id. Открытие и повторное открытие ссылки не создают заявку.
Не передавайте capability-ссылку в аналитику, Referer, общие логи или службы сокращения ссылок. Для новой вкладки используйте rel="noopener noreferrer". Не размещайте API-ключи в платёжной форме.
Состояния и реквизиты
Состояние сервера
Что показывать
Создана, срок не истёк
Выданные реквизиты и фактический expires_at
Оплачена
Результат оплаты; повторная отправка денег не предлагается
Истекла или отменена
Завершённое состояние; сверка при фактической поздней оплате
Ссылка не найдена
Понятное сообщение и обращение к мерчанту
Срок не вычисляется заново при открытии. Банковские сведения в ответе приёма описывают выданные реквизиты; они не превращают bank_id в поле создания приёма.
Обработчик hosted form поддерживает «Я оплатил» и загрузку чека, если действия разрешены сохранёнными настройками заявки и форма включена в окружении. Исторические настройки выключают оба действия. Они сохраняют свидетельство плательщика, но не меняют статус оплаты, срок, Ledger, баланс или очередь уведомлений мерчанта. Сервер проверяет исходный срок, состояние и CSRF; точный повтор уже принятого свидетельства не создаёт вторую запись. Фактическое включение формы и действий в production здесь не проверено. Сохранённые redirect_urls не означают автоматический переход текущей формы. Только проверенный API/webhook и однократное бизнес-действие мерчанта завершают интеграцию.
Получить баланс и показать его клиенту
Absolut Pay передаёт мерчанту баланс его магазина через GET /api/v2/balance. Мерчант может получить эти данные на своём сервере и показать их уполномоченному пользователю своего кабинета. Это передача информации об остатке, а не перевод средств.
Под «клиентом» в этом сценарии понимается мерчант или пользователь его кабинета с правом видеть баланс магазина. Этот endpoint не возвращает личный кошелёк плательщика и не вычисляет баланс конкретного payer.id. Если вашему продукту нужен баланс конечного покупателя, он ведётся в вашей системе отдельно; общий остаток магазина нельзя выдавать за его личный баланс.
Что мы возвращаем
Запрос читает один магазин по проверенному API-токену, а не все магазины мерчанта. В запросе нет shop_id, payer_id, currency или других query-параметров. Тело пустое, запрос подписывается четырьмя стандартными заголовками.
Общий остаток, включает резерв: available + reserved
Всего: 1 000 USDT
Все три суммы имеют 8 знаков после точки. Сохраняйте исходные строки; форматируйте для отображения средствами точной десятичной арифметики. Не складывайте available и total: резерв уже входит в total. Запрос не изменяет деньги и не резервирует средства.
Как передать баланс в свой кабинет
text
Пользователь кабинета мерчанта
→ ваш backend: вход и проверка права на магазин
→ Absolut Pay: подписанный GET /api/v2/balance
→ ваш backend: проверка ответа и выбор публичных полей
→ кабинет: available / reserved / total / USDT
На вашем backend сохраните выданные API origin, token и secret магазина. Ключи не передаются в браузер, мобильное приложение, Telegram WebView или публичную платёжную форму.
При открытии страницы баланса проверьте вход пользователя и его право видеть конкретный магазин. Связь «пользователь → магазин → ключи» определяется вашим сервером; не выбирайте произвольные ключи по неподтверждённому ID из браузера.
Ваш сервер формирует подписанный GET без тела, получает HTTP 200 и проверяет типы полей. Для каждого запроса используйте новые timestamp, nonce и signature.
Передайте в свой frontend только currency, available, reserved, total. Не передавайте токен, секрет и подписанные заголовки. Если у пользователя нет права на общий баланс магазина, не отдавайте эти данные.
Покажите три значения с разными подписями. Защитите собственный ответ от общего кэширования, например Cache-Control: private, no-store; общий CDN-кэш между клиентами недопустим.
Собственный маршрут вашего кабинета, его авторизация и оформление реализуются у мерчанта. Они не являются дополнительными маршрутами Merchant API Absolut Pay. Для нескольких магазинов используются их отдельные ключи и отдельные запросы; этот endpoint не возвращает агрегат по всем магазинам.
Быстрая проверка с сервера
Используйте скачиваемый клиент Node.js. Задайте ABSOLUT_API_BASE_URL, ABSOLUT_API_TOKEN, ABSOLUT_API_SECRET в серверном окружении и выполните:
Пример Node.js 20+ использует prepareRequest из client.mjs. Сохраните функцию рядом с этим файлом. Вызывайте её только после проверки вашей пользовательской сессии и права на магазин. В credentials передавайте конфигурацию из серверного хранилища, а не входной JSON клиента.
javascript
import { randomUUID } from 'node:crypto';
import { prepareRequest } from './client.mjs';
export async function readShopBalance(credentials) {
const request = prepareRequest({
baseUrl: credentials.baseUrl,
token: credentials.token,
secret: credentials.secret,
method: 'GET',
target: '/api/v2/balance',
rawBody: Buffer.alloc(0),
timestamp: String(Math.floor(Date.now() / 1000)),
nonce: randomUUID(),
});
const response = await fetch(request.url, {
...request.options,
signal: AbortSignal.timeout(10000),
});
if (!response.ok) {
// Не возвращайте клиенту подписанные заголовки или секреты.
throw new Error('Balance is temporarily unavailable');
}
const data = await response.json();
const decimal = /^(0|[1-9][0-9]*)\.[0-9]{8}$/;
if (data?.currency !== 'USDT' ||
!['available', 'reserved', 'total'].every(
key => typeof data[key] === 'string' && decimal.test(data[key])
)) {
throw new Error('Unexpected balance response');
}
// Только эти поля передаются авторизованному frontend.
return {
currency: data.currency,
available: data.available,
reserved: data.reserved,
total: data.total,
};
}
Тайм-аут 10 секунд в примере — выбранный лимит вашего клиента, не обещание SLA Absolut Pay. Обработчик вашего приложения должен перехватить ошибку и вернуть безопасное сообщение. Не заменяйте ошибку нулевым балансом.
Когда обновлять баланс
Получайте баланс при открытии раздела и по действию «Обновить». После подтверждённого события приёма/выплаты можно повторно прочитать баланс, но не рассчитывайте актуальный остаток простым прибавлением суммы из webhook: существуют комиссии, резервы и другие операции.
Отдельного webhook «баланс изменился» в текущем Merchant API нет. Уведомления приёма и выплат не содержат полный снимок баланса. Если нужен фоновый polling, согласуйте частоту для своего окружения; фиксированного общего интервала или квоты документация не обещает.
Ситуация
Что показать пользователю
Первый запрос выполняется
«Загружаем баланс…», без выдуманных чисел
HTTP 200 и все суммы равны нулю
Реальный нулевой остаток; это корректные данные
Получен успешный ответ
Три суммы и время последнего получения данных вашим сервером
Ошибка или timeout
«Не удалось обновить баланс» и повтор чтения; при наличии прошлого снимка явно показать, что он устарел
Нет права на магазин
Отказ доступа без раскрытия его баланса
В ответе Absolut Pay нет updated_at или времени снимка. Метку «Получено в…» формирует ваш backend; она означает время получения ответа, а не время последней денежной операции. Не добавляйте её в наш контракт как якобы существующее поле.
Можно ли на основании баланса отправлять выплату
available помогает отобразить доступные средства, но не гарантирует следующую выплату: между GET и POST остаток мог измениться. Сравнивайте с полной стоимостью выплаты в USDT, а не с суммой клиента в RUB/KZT/другой валюте. Окончательную проверку средств и резервирование сервер выполняет атомарно при создании выплаты.
При insufficient_funds не переотправляйте POST автоматически. Проверяйте сохранённый результат поручения и правила ошибок. При неизвестном результате выплаты сначала выполните её lookup; новое чтение баланса само по себе не доказывает исход конкретного перевода.
Направление курса
Приём: rate — единицы исходной валюты за 1 USDT; fee — проценты. Условия фиксируются при выдаче реквизитов и не берутся из новых настроек при подтверждении. Исходный amount и подтверждённый success_paid сохраняются отдельно; webhook использует имя successPaid.
Выплата: rate_fiat_per_usdt — единицы валюты получателя за 1 USDT. principal_usdt, fee_usdt и total_usdt возвращают сохранённые суммы учёта; комиссия выплаты добавляется к основной стоимости. Резерв при неопределённом результате не означает списание без подтверждения и не освобождается по timeout клиента.
Деньги и курсы храните точными decimal-строками или Decimal. Не используйте JavaScript Number / binary float для денежных итогов. Суммы USDT учитываются с точностью 8 знаков. Не пересчитывайте серверный резерв по текущему курсу.
Рыночный курс для нового формирования проверяется на свежесть: основной до 60 секунд, fallback до 300 секунд того же провайдера, будущее наблюдение не более 30 секунд. Договорной фиксированный курс терминала имеет отдельные правила. Эти проверки не меняют условия уже сформированной заявки.
Трансграничный перевод
Проектируемая возможность. «Трансграничный перевод» (cross_border) получает согласованный числовой method_id: 5 как отдельный метод. ID закреплён в проекте контракта; серверная поддержка ещё не реализована. Метод пока не принимается рабочим Merchant API. Наличие UZS в enum не означает доступность RU → UZ. Не добавляйте предлагаемые поля в запросы приёма или выплат.
Например, отправитель в России платит RUB, а получатель в Узбекистане получает UZS. Это две отдельные суммы и валюты. Сначала определяется направление операции Absolut Pay — приём или выплата, затем способ доставки: карта, счёт, телефон и платёжная система. Отдельный метод трансграничного перевода сохраняет детализацию доставки: rail, тип реквизита и платёжная система передаются отдельно в предлагаемой модели.
Что должно быть определено
Почему это отдельно
Отдельный method_id и код cross_border
Согласованный ID — 5; существующие IDs 1–4 сохраняются
Страны отправления и получения, коридор
Валюта не определяет географию
Сумма и валюта отправителя; сумма и валюта получателя
RUB и UZS нельзя подменить одним currency
Кто конвертирует и кто гарантирует сумму
Курс сам по себе не обещает сумму получателю
Котировка, источник, срок и комиссии
Условия фиксируются до отправки, не меняются незаметно
Курс UZS за RUB и расчётный курс fiat за USDT
Перевод клиенту и расчёт с мерчантом/исполнителем — разные расчёты
Терминал, тип реквизита, система и проверенный банк
Коридор не означает доступность любого исполнителя
Для этого нужны согласованные изменения API, снимков условий, терминалов, маршрутизации и адаптера провайдера. Старые запросы должны сохранить действующее поведение и ID методов. При неизвестном результате требуется lookup исходной попытки; повторная отправка на другой терминал может создать двойной перевод.
Полный проект расширения включает предлагаемые поля, совместимость, этапы и открытые решения. Он требует согласования и не входит в контракт реализованных операций.
Проверка перед запуском
Документация описывает контракт. Включение реальных платежей требует подтверждённого окружения, ключей и методов магазина. Текущий локальный mock не является доказательством реальной интеграции провайдера.
Контрольные сценарии
Проверка
Ожидаемый результат
Корректная подпись POST и GET
Ответ соответствует OpenAPI; каждый запрос имеет новые timestamp/nonce
Получение справочника
Подписанный GET возвращает активные ID и original_name; внутренние сопоставления не выдаются
Неизвестное значение банка от провайдера
Нет выдачи неподтверждённого банка; нужна сверка по исходной заявке
Переименование после выдачи
Название старой заявки и формы не меняется
Изменение подписанного тела, query или подписи
Запрос отклонён; он не запускает самостоятельную оплату
Повтор принятого nonce
Аутентификация отклонена
Повтор merchant_order_id с новой подписью
409; повторная заявка не создаётся, результат читается по исходному номеру
Потеря ответа создания
Восстановление через result; нет автоматического нового POST/номера
Статус 1 и state=completed
Товар/услуга ещё не выдаётся как оплаченная
Проверенный success
Сумма проверена, бизнес-действие выполнено один раз
Два одинаковых webhook
Оба получают 200 после устойчивой обработки; бизнес-действие одно
Сбой после записи webhook
Восстановление приводит к обработке; нет потерянного или второго исполнения
Поздний success после overdue/cancel
Возможная оплата не теряется; задержанные API-ответы и webhook со статусом 1/3/4 не понижают success
Отсутствующий webhook URL
422; занятый номер не возобновляется после изменения настроек
Ключ другого магазина
Нет доступа к первому магазину/его платежам
Ротация ключей
Новые запросы подписаны новым secret; приём webhook учитывает согласованный переход ключей
ISO даты API и Unix даты webhook
Правильно преобразуются; срок берётся из ответа
Несовпадение подтверждённой и исходной суммы
Нет автоматического успеха/выдачи; расхождение отправляется на сверку. Равенство сравнивается точно, независимо от числа знаков после точки
Для локального контура проверки webhook выполняются подписанными fixtures/примером приёмника. Фактическую доставку, живые реквизиты, финансовое зачисление и провайдерскую сверку проверяют отдельно после подключения соответствующего окружения. Не отмечайте их выполненными только по локальному mock.
Ваш сервер
API token и secret доступны только backend; шифрование/хранилище секретов и контроль доступа настроены.
Исходящие IP согласованы, часы синхронизированы.
JSON подписывается и отправляется одними байтами, query не перестраивается после подписи.
Суммы хранятся точно; ответ API и исходный номер сохраняются устойчиво.
Webhook проверяется до применения, подтверждается после надёжного сохранения, бизнес-эффект защищён транзакцией/очередью.
Все источники результата используют одно правило однократного исполнения: webhook, polling, ручная сверка.
Есть очередь/задача сверки неопределённых запросов, оповещение о длительном ожидании и согласованный контакт поддержки.
Логи и мониторинг не раскрывают секреты, реквизиты, персональные данные и платёжные capability-ссылки.
Согласовать до реального включения
Адрес и версия API, разрешённые методы/валюты/режимы/трафик, тариф, лимиты и допустимый опрос, webhook/ротация ключей, тестовые сценарии и контакт поддержки. Документация не обещает конкретный SLA, квоты, автоматические возвраты или сроки поддержки, пока они не выданы отдельно. Если вам нужна обработка неполной или избыточной оплаты, согласуйте отдельный процесс: в текущий контракт он не входит.
Выплаты клиентам и чтение баланса магазина входят в API v2; их маршруты, резервирование и статусы описаны в разделе «Выплаты клиентам». Реальная отправка провайдеру требует отдельного подключения и проверки. Сетлы, отчётные API, апелляции и публичная отмена не представлены как доступные операции этого контракта. Получение «Я оплатил», файла чека или браузерного redirect не подтверждает оплату в вашей системе.
Дополнительные проверки выплат
Отдельные курс и комиссия активированы для согласованного метода и валюты.
bank_id взят из активного справочника этого окружения; телефон, карта и счёт не смешиваются.
Создание резервирует основную сумму USDT и комиссию; повтор номера не создаёт нового резерва.
Тайм-аут POST восстанавливается через GET результата, без повторной отправки.
Неопределённое исполнение удерживает резерв; отменяется только неотправленная часть.
Для ручного успеха сохранены фактическая сумма, валюта, доказательство и уникальный номер перевода.
Worker доставки включён; приёмник проверяет event_id и revision и подтверждает HTTP 200 после сохранения.
Реальный провайдер проверен отдельно; тестовый адаптер не выполняет переводов.
Версии и материалы интеграции
25 октября 2026 · документация 2.4.0
База реализации 82b3e33: денежная цепочка 5514c2c и аудит безопасности. Портал не меняет серверный контракт. Приёмка выпуска по CI и проверки реальных провайдеров остаются отдельными условиями запуска.
Комплект содержит реализованный OpenAPI с подтверждённым API origin https://api.absolutpay.com в servers, Postman collection/environment с пустыми ключами и серверные примеры Node.js/Python. Остальные поля OpenAPI совпадают с серверным контрактом. Доступность бизнес-операций не подтверждена; проверенные GET банков и баланса возвращают 503. Версия OpenAPI сохраняется как в источнике; версия документации не повышает версию API.
Маршруты и примеры старого v1-портала не относятся к текущему Merchant API. Внешние руководства использованы для сравнения полноты; их авторизация, банковские коды и денежные единицы не заменяют Absolut Pay.
Работа с Postman
Используйте локальное desktop-окружение с синтетическими ключами и изолированным API. Не сохраняйте реальные ключи в экспортируемом environment или облачной коллекции. Портал не принимает ключи, не выполняет запросы к API и не хранит секреты в браузере. Отправка POST всегда явная; после неизвестного результата используйте lookup с тем же номером заказа.
Техническое сравнение с внешними API
Это сравнительный обзор для планирования интеграции, а не список доступных операций Absolut Pay. Наличие функции в чужой документации не разрешает отправлять её поля или маршруты в наш API. Изменения денежного контракта требуют отдельного согласования.
Сверка выполнена 18.10.2026 по PDF «Руководство по интеграции v5.3.pdf» (32 физические страницы), BasicPay ReDoc и Postman Main API Collection. На странице BasicPay заголовок API — Xpay Merchant API 1.27.3; Postman показывает Main API Collection. Принадлежность этих источников и PDF к Euphoria не подтверждена их прочитанным содержимым, поэтому ниже они названы по наблюдаемым названиям. Euphoria не исключена из ориентиров; нельзя приписывать ей возможности другого источника без подтверждения.
Подтверждённые технические пробелы
Возможность во внешнем источнике
Что реализовано в Absolut Pay
Чего нам не хватает
PDF, стр.18: /api/orders_stats, количество заказов и оплат за период
Чтение отдельного платежа, lookup по номеру; внутренние отчёты
Публичного merchant API агрегатов за период. Нужны разрешённый набор метрик, пагинация/период, ограничения нагрузки и контракт доступности
Прикрепление свидетельства на платёжной форме не является тикетом; внутренние процессы отдельно
Публичного merchant ticket lifecycle, истории переписки и безопасного скачивания вложений. Это отдельный продукт с правами, аудитом и сроками хранения
Xpay: раздел Disputes и операции /v1/merchant-api/disputes; PDF: тикеты
Нет опубликованного Merchant API споров
Публичного dispute workflow. Тикет и спор о деньгах надо определить отдельно; финансовая коррекция требует своего согласованного основания
PDF, стр.13 и31: приём по счёту и банковские реквизиты account_number/БИК
Приём: СБП, карта, QR, мобильный платёж. Выплата на счёт есть отдельно
Метода приёма по счёту, его реквизитов, банковского mapping и адаптера. Payout account не закрывает этот пробел
PDF, стр.14: повторная выдача активного заказа с is_repeated и repeat_count
Постоянная уникальность merchant_order_id, conflict при повторном create и lookup после timeout
Отдельного продукта повторной выдачи активной заявки. Это не дефект идемпотентности: сначала надо согласовать, когда переиспользовать реквизиты безопасно
PDF, стр.13: channel и is_vip
Настройки магазина и каскада; поля отсутствуют в merchant request
Публичного выбора канала и VIP-признака с проверенной семантикой. Нельзя передавать эти поля как обход лимитов или антифрода
PDF, стр.14: возврат клиента на success/failure/return
redirect_urls сохраняются; текущая форма не выполняет автоматические переходы
Проверенного поведения redirects. Возврат на success URL всё равно не должен подтверждать деньги
PDF, стр.32: merchant response содержит notify_code и notify_time
Webhook доставляется сервером; публичный Payin DTO не содержит эти диагностические поля
Публичной диагностики доставки уведомления. Безопасный просмотр попыток или повтор доставки требует отдельного контракта и защиты от дублей
PDF, стр.32: тестовый заказ с эмуляцией оплаты и отправкой merchant callback
Есть локальный неплатёжный sandbox, проверки подписи, синтетические примеры и backend tests
Эквивалентного подготовленного внешнего тестового магазина с проверенным end-to-end уведомлением. Текущий sandbox Payin не доказывает реальную доставку callback и денежное зачисление
Xpay: методы TRANSGRAN_SBP, TRANSGRAN_BANK_CARD
cross_border — проект отдельного метода с собственным method_id; согласован method_id: 5, серверная поддержка ожидается
Реализованного коридора, двух валют/сумм, quote, гарантии суммы, условий терминала и проверенного провайдера. Чужие IDs не переносим; сервер должен реализовать согласованный ID 5 нашего метода, сохранив отдельные rail, тип реквизита и платёжную систему
Xpay: раздел Rates
Курс зафиксирован в конкретной операции; самостоятельного Merchant Rates API нет
Публичного API предварительных курсов/котировок. Один лишь раздел внешнего API не доказывает его гарантии; наш quote lifecycle ещё нужно согласовать
В навигации Xpay также видны Transactions, P2P, C2C, Deposit, Withdraw, Widgets, Data и Attachments, а в документации — Authentication, Data Types, Webhooks и Testing. Название раздела само по себе не определяет его полный денежный смысл. Поэтому мы не называем Widgets эквивалентом нашей hosted form, Data — capability discovery, а Deposit/Withdraw — физическим переводом активов без чтения конкретного контракта.
В Postman прочитан вводный контракт, таблица ошибок и примеры callback; полный набор операций в этой сверке не извлечён. Видны статусы created, pending, dispute, in_check, finished, canceled, expired, failed и ошибки invalid orderId, no requisites, method/currency, insufficient funds, processing, duplicate. Это подтверждает структуру описания жизненного цикла и ошибок, но не доказывает отсутствия аналогичной возможности у нас только из-за другого названия статуса.
Различия, которые не являются пробелами
Отличие
Решение Absolut Pay
Bearer в Xpay/PDF, HMAC-SHA256 raw body в Postman, сортированные поля в PDF
Сохраняем действующую Shop HMAC-SHA512, подпись фактически отправляемых байтов и независимую nonce-защиту. Переход на чужую схему не нужен
Копейки в PDF
Exact decimal-строки и явные валюты; float-примеры не переносим
Payout update в PDF, стр.22
У нас исходная сумма и условия неизменны, прогресс и резерв отдельны. Добавление изменения суммы пересматривает инварианты, а не закрывает косметический пробел
Чужие коды банков и названия статусов
Наши канонические bank_id и действующие статусы остаются. Provider mapping не передаётся как merchant bank_id
Подтверждение webhook телом 1 в PDF
У нас HTTP 200 после устойчивого сохранения, общий ключ однократного бизнес-действия для webhook и polling
Обычное сравнение подписи в Postman-примерах
Наши клиенты проверяют подпись безопасным сравнением. Чужой пример не является основанием ослаблять проверку
Предлагаемый порядок работ
Сначала подтвердить рабочие окружения, реального провайдера и тестовый end-to-end цикл текущего API. Затем согласовать необходимые мерчанту статистику и диагностику webhook, redirects и способы приёма. Публичные споры/тикеты и трансграничные переводы оформить отдельными проектами с финансовыми правилами. Эта последовательность — предложение для приоритизации, не утверждённый план серверных изменений.
Детальные источники, контрольные суммы и выявленные расхождения зафиксированы в отдельной таблице сверки, переданной владельцу портала. Список ранее исключённых пользователем разделов PDF остаётся неподтверждённым: перечисление чужих возможностей здесь не означает их включения в объём реализации.
ПРИЁМ
Создать платёж
POST/api/v2/payins
Получите реквизиты для оплаты или ссылку на платёжную форму.
Ваш уникальный номер запроса внутри магазина. После принятия номер нельзя использовать заново, в том числе после отказа.Минимум 1 · Максимум 128
amountstring
Да
Сумма в указанной валюте. Передавайте строкой, без экспоненты, запятой и разделителей тысяч. Больше нуля; до 80 символов; точность и лимиты определяет настроенная пара.Максимум 80
currencystring
Да
Код валюты операции. Доступная пара метода и валюты определяется условиями магазина.Валюты: названия, суммы и подключение →Значения: RUB, AZN, KZT, KGS, UZS
method_idinteger
Да
Числовой ID метода приёма: 1 — СБП, 2 — карта, 3 — QR, 4 — мобильный платёж.Методы: значения и реквизиты →Значения: 1, 2, 3, 4
modestring
Да
h2h — вернуть реквизиты; payment_form — вернуть полный URL платёжной формы.Значения: h2h, payment_form
traffic_typestring
Да
Тип трафика: primary или secondary. Используйте согласованный тип, не меняйте его для обхода ограничений.Значения: primary, secondary
payerobject
Да
Сведения о плательщике. ID должен оставаться устойчивым для одного клиента.
payer.idstring
Да
Устойчивый ID плательщика в вашей системе. Не создавайте новый ID для каждой оплаты.Минимум 1 · Максимум 128
payer.ipstring
Да
IPv4 или IPv6 плательщика, без zone identifier. Это не IP вашего сервера в allowlist.
Идентификатор устройства или браузера плательщика.Минимум 1 · Максимум 256
metadataobject
Нет
Ваш дополнительный JSON-объект, до 16384 UTF-8 байт. Без секретов и лишних персональных данных.
webhook_urlstring
Нет
HTTPS URL вашего серверного обработчика. Если не передан, используется сохранённый адрес магазина. Для приёма отсутствие обоих адресов даёт webhook_required; номер запроса остаётся занят.Максимум 2048 · Формат: uri
redirect_urlsobject
Нет
Адреса возврата браузера. Сейчас сохраняются, но hosted form не выполняет автоматический переход.
redirect_urls.successstring
Нет
HTTPS URL возврата после успеха.Максимум 2048 · Формат: uri
redirect_urls.failurestring
Нет
HTTPS URL возврата после неуспеха.Максимум 2048 · Формат: uri
redirect_urls.returnstring
Нет
HTTPS URL возврата к мерчанту.Максимум 2048 · Формат: uri
Тело — JSON, Content-Type: application/json. Неизвестные поля и повторяющиеся JSON-ключи отклоняются.
Заголовки запроса
Заголовок
Обязательно
Значение
X-API-Token
Да
API-токен магазина. Берётся из серверного хранилища секретов.
X-Timestamp
Да
Текущее Unix-время в секундах. Допустимое отклонение ±300 секунд.
X-Nonce
Да
Новый UUID v4 на каждый HTTP-запрос, включая повторное чтение.
201 означает, что платёж создан. Это ещё не оплата. Дождитесь status_id = 2 через API или проверенное уведомление.
Все поля успешного ответа
Поле и тип
Наличие
Описание
idstring
Да
ID, выданный Absolut Pay. Передавайте без изменений.
merchant_order_idstring
Да
Ваш уникальный номер запроса внутри магазина. После принятия номер нельзя использовать заново, в том числе после отказа.Минимум 1 · Максимум 128
status_idinteger
Да
1 — создан; 2 — оплачен; 3 — истёк; 4 — отменён. Поздняя подтверждённая оплата может изменить 3/4 на 2.Значения: 1, 2, 3, 4
amountstring
Да
Сумма в указанной валюте. Передавайте строкой, без экспоненты, запятой и разделителей тысяч.Максимум 80
currencystring
Да
Код валюты операции. Доступная пара метода и валюты определяется условиями магазина.Валюты: названия, суммы и подключение →Значения: RUB, AZN, KZT, KGS, UZS
method_idinteger
Да
Числовой ID метода приёма: 1 — СБП, 2 — карта, 3 — QR, 4 — мобильный платёж.Методы: значения и реквизиты →Значения: 1, 2, 3, 4
modestring
Да
h2h — вернуть реквизиты; payment_form — вернуть полный URL платёжной формы.Значения: h2h, payment_form
traffic_typestring
Да
Тип трафика: primary или secondary. Используйте согласованный тип, не меняйте его для обхода ограничений.Значения: primary, secondary
ratestring
Да
Зафиксированный курс: единиц валюты платежа за 1 USDT.Максимум 80
feestring
Да
Зафиксированная комиссия в процентах. «2» — это 2%, не 2 USDT.Максимум 80
created_atstring
Да
Время создания/выдачи в ISO 8601 с часовым поясом.Формат: date-time
expires_atstring
Да
Фактический срок оплаты по серверу. Не вычисляйте новый срок при открытии формы.Формат: date-time
is_testboolean
Да
Тестовая заявка: текущий Payin-контур выдаёт только неплатёжные реквизиты.Всегда: true
requisiteobject
По условию
Выданные реквизиты в режиме h2h. В текущем контуре — mock, переводить деньги по ним нельзя.
requisite.typestring
Да
Тип реквизита.Всегда: mock
requisite.valuestring
Да
Значение реквизита; TEST-ONLY-NOT-PAYABLE не подходит для оплаты.Всегда: TEST-ONLY-NOT-PAYABLE
requisite.bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK.Максимум 24
requisite.bank_namestring
По условию
Сохранённое название канонического банка.Минимум 1 · Максимум 200
payment_urlstring
По условию
Полный URL платёжной формы с публичным токеном. Не собирайте самостоятельно и не отправляйте в общую аналитику.Формат: uri
success_paidstring
По условию
Фактически подтверждённая сумма в валюте платежа; может отличаться от исходного amount после подтверждённой корректировки.Максимум 80
paid_atstring
По условию
Время подтверждённой оплаты.Формат: date-time
close_reasonstring
По условию
Причина отмены. Поле присутствует при status_id = 4.Минимум 1 · Максимум 100
bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK.Максимум 24
bank_namestring
По условию
Сохранённое название канонического банка.Минимум 1 · Максимум 200
Магазин или его группа недоступны для создания. HTTP 403 — отказ доступа; HTTP 422 — приём отклонён после резервирования номера; HTTP 200 — причина failed в lookup.
Что делать и можно ли повторить
Уточнить активацию у менеджера. Сохранённые операции читать действующим ключом. При 422 номер уже занят.
Повтор: Не автоматически. После активации проверить прежний результат; занятый номер не переиспользовать.
completed означает, что заявка сформирована. Факт оплаты определяется status_id внутри payin. При processing продолжайте чтение; при review_required нужна сверка.
Все поля успешного ответа
Поле и тип
Наличие
Описание
merchant_order_idstring
Да
Ваш уникальный номер запроса внутри магазина. После принятия номер нельзя использовать заново, в том числе после отказа.Минимум 1 · Максимум 128
statestring
Да
Результат обработки запроса: processing, completed, failed или review_required; это не статус оплаты.Значения: processing, completed, failed, review_required
payinobject
По условию
Текущий платёж. Присутствует только при state = completed.
payin.idstring
Да
ID, выданный Absolut Pay. Передавайте без изменений.
payin.merchant_order_idstring
Да
Ваш уникальный номер запроса внутри магазина. После принятия номер нельзя использовать заново, в том числе после отказа.Минимум 1 · Максимум 128
payin.status_idinteger
Да
1 — создан; 2 — оплачен; 3 — истёк; 4 — отменён. Поздняя подтверждённая оплата может изменить 3/4 на 2.Значения: 1, 2, 3, 4
payin.amountstring
Да
Сумма в указанной валюте. Передавайте строкой, без экспоненты, запятой и разделителей тысяч.Максимум 80
payin.currencystring
Да
Код валюты операции. Доступная пара метода и валюты определяется условиями магазина.Валюты: названия, суммы и подключение →Значения: RUB, AZN, KZT, KGS, UZS
payin.method_idinteger
Да
Числовой ID метода приёма: 1 — СБП, 2 — карта, 3 — QR, 4 — мобильный платёж.Методы: значения и реквизиты →Значения: 1, 2, 3, 4
payin.modestring
Да
h2h — вернуть реквизиты; payment_form — вернуть полный URL платёжной формы.Значения: h2h, payment_form
payin.traffic_typestring
Да
Тип трафика: primary или secondary. Используйте согласованный тип, не меняйте его для обхода ограничений.Значения: primary, secondary
payin.ratestring
Да
Зафиксированный курс: единиц валюты платежа за 1 USDT.Максимум 80
payin.feestring
Да
Зафиксированная комиссия в процентах. «2» — это 2%, не 2 USDT.Максимум 80
payin.created_atstring
Да
Время создания/выдачи в ISO 8601 с часовым поясом.Формат: date-time
payin.expires_atstring
Да
Фактический срок оплаты по серверу. Не вычисляйте новый срок при открытии формы.Формат: date-time
payin.is_testboolean
Да
Тестовая заявка: текущий Payin-контур выдаёт только неплатёжные реквизиты.Всегда: true
payin.requisiteobject
По условию
Выданные реквизиты в режиме h2h. В текущем контуре — mock, переводить деньги по ним нельзя.
payin.requisite.typestring
Да
Тип реквизита.Всегда: mock
payin.requisite.valuestring
Да
Значение реквизита; TEST-ONLY-NOT-PAYABLE не подходит для оплаты.Всегда: TEST-ONLY-NOT-PAYABLE
payin.requisite.bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK.Максимум 24
payin.requisite.bank_namestring
По условию
Сохранённое название канонического банка.Минимум 1 · Максимум 200
payin.payment_urlstring
По условию
Полный URL платёжной формы с публичным токеном. Не собирайте самостоятельно и не отправляйте в общую аналитику.Формат: uri
payin.success_paidstring
По условию
Фактически подтверждённая сумма в валюте платежа; может отличаться от исходного amount после подтверждённой корректировки.Максимум 80
payin.paid_atstring
По условию
Время подтверждённой оплаты.Формат: date-time
payin.close_reasonstring
По условию
Причина отмены. Поле присутствует при status_id = 4.Минимум 1 · Максимум 100
payin.bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK.Максимум 24
payin.bank_namestring
По условию
Сохранённое название канонического банка.Минимум 1 · Максимум 200
error_codestring
По условию
Причина отклонения запроса. Расшифровка и действие — в справочнике ошибок.Минимум 1 · Максимум 100
Магазин или его группа недоступны для создания. HTTP 403 — отказ доступа; HTTP 422 — приём отклонён после резервирования номера; HTTP 200 — причина failed в lookup.
Что делать и можно ли повторить
Уточнить активацию у менеджера. Сохранённые операции читать действующим ключом. При 422 номер уже занят.
Повтор: Не автоматически. После активации проверить прежний результат; занятый номер не переиспользовать.
Приём или запрос с таким номером не найден в данном магазине; этот код также используется для неизвестного пути v2.
Что делать и можно ли повторить
Проверить путь, магазин и идентификатор. Пока Payin не сформирован, искать по merchant_order_id. После потерянного ответа повторить чтение и при неопределённости обратиться в поддержку.
Повтор: Повтор чтения допустим с новой подписью. Один 404 не разрешает повтор POST или создание нового номера.
Не перезаписывайте уже принятый успех запоздавшим статусом. API и webhook должны использовать один ключ однократной выдачи товара.
Все поля успешного ответа
Поле и тип
Наличие
Описание
idstring
Да
ID, выданный Absolut Pay. Передавайте без изменений.
merchant_order_idstring
Да
Ваш уникальный номер запроса внутри магазина. После принятия номер нельзя использовать заново, в том числе после отказа.Минимум 1 · Максимум 128
status_idinteger
Да
1 — создан; 2 — оплачен; 3 — истёк; 4 — отменён. Поздняя подтверждённая оплата может изменить 3/4 на 2.Значения: 1, 2, 3, 4
amountstring
Да
Сумма в указанной валюте. Передавайте строкой, без экспоненты, запятой и разделителей тысяч.Максимум 80
currencystring
Да
Код валюты операции. Доступная пара метода и валюты определяется условиями магазина.Валюты: названия, суммы и подключение →Значения: RUB, AZN, KZT, KGS, UZS
method_idinteger
Да
Числовой ID метода приёма: 1 — СБП, 2 — карта, 3 — QR, 4 — мобильный платёж.Методы: значения и реквизиты →Значения: 1, 2, 3, 4
modestring
Да
h2h — вернуть реквизиты; payment_form — вернуть полный URL платёжной формы.Значения: h2h, payment_form
traffic_typestring
Да
Тип трафика: primary или secondary. Используйте согласованный тип, не меняйте его для обхода ограничений.Значения: primary, secondary
ratestring
Да
Зафиксированный курс: единиц валюты платежа за 1 USDT.Максимум 80
feestring
Да
Зафиксированная комиссия в процентах. «2» — это 2%, не 2 USDT.Максимум 80
created_atstring
Да
Время создания/выдачи в ISO 8601 с часовым поясом.Формат: date-time
expires_atstring
Да
Фактический срок оплаты по серверу. Не вычисляйте новый срок при открытии формы.Формат: date-time
is_testboolean
Да
Тестовая заявка: текущий Payin-контур выдаёт только неплатёжные реквизиты.Всегда: true
requisiteobject
По условию
Выданные реквизиты в режиме h2h. В текущем контуре — mock, переводить деньги по ним нельзя.
requisite.typestring
Да
Тип реквизита.Всегда: mock
requisite.valuestring
Да
Значение реквизита; TEST-ONLY-NOT-PAYABLE не подходит для оплаты.Всегда: TEST-ONLY-NOT-PAYABLE
requisite.bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK.Максимум 24
requisite.bank_namestring
По условию
Сохранённое название канонического банка.Минимум 1 · Максимум 200
payment_urlstring
По условию
Полный URL платёжной формы с публичным токеном. Не собирайте самостоятельно и не отправляйте в общую аналитику.Формат: uri
success_paidstring
По условию
Фактически подтверждённая сумма в валюте платежа; может отличаться от исходного amount после подтверждённой корректировки.Максимум 80
paid_atstring
По условию
Время подтверждённой оплаты.Формат: date-time
close_reasonstring
По условию
Причина отмены. Поле присутствует при status_id = 4.Минимум 1 · Максимум 100
bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK.Максимум 24
bank_namestring
По условию
Сохранённое название канонического банка.Минимум 1 · Максимум 200
Приём или запрос с таким номером не найден в данном магазине; этот код также используется для неизвестного пути v2.
Что делать и можно ли повторить
Проверить путь, магазин и идентификатор. Пока Payin не сформирован, искать по merchant_order_id. После потерянного ответа повторить чтение и при неопределённости обратиться в поддержку.
Повтор: Повтор чтения допустим с новой подписью. Один 404 не разрешает повтор POST или создание нового номера.
Поиск по части названия original_name, до 200 UTF-8 байт.string · Максимальная длина: 200
country_codequery
Нет
Фильтр страны: ровно две заглавные латинские буквы, например RU. Если фильтр не нужен, опустите параметр; null не передаётся.string · Шаблон: ^[A-Z]{2}$
afterquery
Нет
Курсор next_after из предыдущего ответа. Сохраните прежние фильтры. На странице не более 100 банков.string · Максимальная длина: 24 · Шаблон: ^bank_[1-9][0-9]*$
Тело запроса пустое. Не отправляйте JSON {}: при подписи GET используются нулевые байты тела.
Заголовки запроса
Заголовок
Обязательно
Значение
X-API-Token
Да
API-токен магазина. Берётся из серверного хранилища секретов.
X-Timestamp
Да
Текущее Unix-время в секундах. Допустимое отклонение ±300 секунд.
X-Nonce
Да
Новый UUID v4 на каждый HTTP-запрос, включая повторное чтение.
Ваш уникальный номер запроса внутри магазина. После принятия номер нельзя использовать заново, в том числе после отказа.Минимум 1 · Максимум 128
amountstring
Да
Сумма в указанной валюте. Передавайте строкой, без экспоненты, запятой и разделителей тысяч. Больше нуля, до 18 цифр целой части и до 2 после точки.
currencystring
Да
Код валюты операции. Доступная пара метода и валюты определяется условиями магазина.Валюты: названия, суммы и подключение →Значения: RUB, AZN, KZT, KGS, UZS
methodstring
Да
Метод выплаты: sbp — по номеру телефона, card — на карту, account — на банковский счёт.Методы: значения и реквизиты →Значения: sbp, card, account
bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK. Обязательно для sbp; для card/account — необязательно.Максимум 24
recipientobject
Да
Получатель: имя и ровно один вид реквизитов для выбранного метода.
recipient.card_numberstring
По методу
Номер карты: от 12 до 19 цифр, без пробелов.
recipient.phone_numberstring
По методу
Телефон с + и международным кодом, от 8 до 15 цифр.
recipient.account_numberstring
По методу
Номер счёта: от 8 до 34 заглавных латинских букв/цифр.
recipient.customer_namestring
Да
Имя получателя.Минимум 1 · Максимум 200
metadataobject
Нет
Ваш дополнительный JSON-объект, до 16384 UTF-8 байт. Без секретов и лишних персональных данных.
webhook_urlstring
Нет
HTTPS URL вашего серверного обработчика. Если не передан, используется сохранённый адрес магазина. Выплату можно создать без webhook и проверять через API; только порт 443, без credentials и fragment.Максимум 2000 · Формат: uri
Тело — JSON, Content-Type: application/json. Неизвестные поля и повторяющиеся JSON-ключи отклоняются.
Заголовки запроса
Заголовок
Обязательно
Значение
X-API-Token
Да
API-токен магазина. Берётся из серверного хранилища секретов.
X-Timestamp
Да
Текущее Unix-время в секундах. Допустимое отклонение ±300 секунд.
X-Nonce
Да
Новый UUID v4 на каждый HTTP-запрос, включая повторное чтение.
201 подтверждает создание и резерв, а не перевод получателю. Проверяйте status, paid_amount и remainder. Не отправляйте второй POST после потери ответа.
Все поля успешного ответа
Поле и тип
Наличие
Описание
metadataobject
Да
Ваш дополнительный JSON-объект, до 16384 UTF-8 байт. Без секретов и лишних персональных данных.
idstring
Да
ID, выданный Absolut Pay. Передавайте без изменений.
merchant_order_idstring
Да
Ваш уникальный номер запроса внутри магазина. После принятия номер нельзя использовать заново, в том числе после отказа.Минимум 1 · Максимум 128
amountstring
Да
Сумма в указанной валюте. Передавайте строкой, без экспоненты, запятой и разделителей тысяч.Максимум 80
currencystring
Да
Код валюты операции. Доступная пара метода и валюты определяется условиями магазина.Валюты: названия, суммы и подключение →Значения: RUB, AZN, KZT, KGS, UZS
methodstring
Да
Метод выплаты: sbp — по номеру телефона, card — на карту, account — на банковский счёт.Методы: значения и реквизиты →Значения: sbp, card, account
bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK. Обязательно для sbp; для card/account — необязательно.Максимум 24
bank_namestring
По условию
Сохранённое название канонического банка.Минимум 1 · Максимум 200
recipientobject
Да
Получатель: имя и ровно один вид реквизитов для выбранного метода.
recipient.card_numberstring
По методу
Номер карты: от 12 до 19 цифр, без пробелов.
recipient.phone_numberstring
По методу
Телефон с + и международным кодом, от 8 до 15 цифр.
recipient.account_numberstring
По методу
Номер счёта: от 8 до 34 заглавных латинских букв/цифр.
recipient.customer_namestring
Да
Имя получателя.Минимум 1 · Максимум 200
statusstring
Да
Статус выплаты: queued, processing, unknown, success, failed, cancelled или partial.Значения: queued, processing, unknown, success, failed, cancelled, partial
principal_usdtstring
Да
Основная стоимость выплаты в USDT по сохранённому курсу. Decimal-строка с 8 знаками после точки.Максимум 80
fee_usdtstring
Да
Комиссия выплаты в USDT, добавляется сверху к основной стоимости. Decimal-строка с 8 знаками после точки.Максимум 80
total_usdtstring
Да
Общая зарезервированная стоимость: principal_usdt + fee_usdt. Decimal-строка с 8 знаками после точки.Максимум 80
rate_fiat_per_usdtstring
Да
Зафиксированный курс: единиц валюты выплаты за 1 USDT. Decimal-строка с 8 знаками после точки.Максимум 80
fee_percentstring
Да
Сохранённая ставка комиссии выплаты в процентах.
paid_amountstring
Да
Фактически выплаченная сумма в валюте получателя. Decimal-строка с 2 знаками после точки.Максимум 80
remainderstring
Да
Невыплаченный остаток в валюте получателя. Не является поручением на новую выплату. Decimal-строка с 2 знаками после точки.Максимум 80
revisioninteger
Да
Версия состояния выплаты. Применяйте только более новую версию.От 1
created_atstring
Да
Время создания/выдачи в ISO 8601 с часовым поясом.Формат: date-time
updated_atstring
Да
Время последнего изменения в ISO 8601.Формат: date-time
Магазин или его группа недоступны для создания. HTTP 403 — отказ доступа; HTTP 422 — приём отклонён после резервирования номера; HTTP 200 — причина failed в lookup.
Что делать и можно ли повторить
Уточнить активацию у менеджера. Сохранённые операции читать действующим ключом. При 422 номер уже занят.
Повтор: Не автоматически. После активации проверить прежний результат; занятый номер не переиспользовать.
Некорректные поля, сумма, реквизиты, bank_id, UUID или query. При выплате bank_id должен указывать на активный канонический банк.
Что делать и можно ли повторить
Проверить схему выплаты и тип реквизитов, получить bank_id из справочника. У баланса query запрещён. Ошибка может возникнуть и после занятия номера выплаты.
Повтор: После исправления сначала lookup по прежнему номеру; если номер занят, не переиспользовать.
creating — результат ещё не установлен; created — объект payout доступен; rejected — запрос отклонён, причина в error_code. Статус регистрации не равен статусу выплаты.
Все поля успешного ответа
Поле и тип
Наличие
Описание
statusstring
Да
creating — запрос ещё создаётся; created — выплата создана; rejected — отказ. Это результат регистрации, не статус перечисления.Значения: creating, created, rejected
payoutobject / null
Да
Созданная выплата; null, пока запрос creating или rejected.
payout.metadataobject
Да
Ваш дополнительный JSON-объект, до 16384 UTF-8 байт. Без секретов и лишних персональных данных.
payout.idstring
Да
ID, выданный Absolut Pay. Передавайте без изменений.
payout.merchant_order_idstring
Да
Ваш уникальный номер запроса внутри магазина. После принятия номер нельзя использовать заново, в том числе после отказа.Минимум 1 · Максимум 128
payout.amountstring
Да
Сумма в указанной валюте. Передавайте строкой, без экспоненты, запятой и разделителей тысяч.Максимум 80
payout.currencystring
Да
Код валюты операции. Доступная пара метода и валюты определяется условиями магазина.Валюты: названия, суммы и подключение →Значения: RUB, AZN, KZT, KGS, UZS
payout.methodstring
Да
Метод выплаты: sbp — по номеру телефона, card — на карту, account — на банковский счёт.Методы: значения и реквизиты →Значения: sbp, card, account
payout.bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK.Максимум 24
payout.bank_namestring
По условию
Сохранённое название канонического банка.Минимум 1 · Максимум 200
payout.recipientobject
Да
Получатель: имя и ровно один вид реквизитов для выбранного метода.
payout.recipient.card_numberstring
По методу
Номер карты: от 12 до 19 цифр, без пробелов.
payout.recipient.phone_numberstring
По методу
Телефон с + и международным кодом, от 8 до 15 цифр.
payout.recipient.account_numberstring
По методу
Номер счёта: от 8 до 34 заглавных латинских букв/цифр.
payout.recipient.customer_namestring
Да
Имя получателя.Минимум 1 · Максимум 200
payout.statusstring
Да
Статус выплаты: queued, processing, unknown, success, failed, cancelled или partial.Значения: queued, processing, unknown, success, failed, cancelled, partial
payout.principal_usdtstring
Да
Основная стоимость выплаты в USDT по сохранённому курсу. Decimal-строка с 8 знаками после точки.Максимум 80
payout.fee_usdtstring
Да
Комиссия выплаты в USDT, добавляется сверху к основной стоимости. Decimal-строка с 8 знаками после точки.Максимум 80
payout.total_usdtstring
Да
Общая зарезервированная стоимость: principal_usdt + fee_usdt. Decimal-строка с 8 знаками после точки.Максимум 80
payout.rate_fiat_per_usdtstring
Да
Зафиксированный курс: единиц валюты выплаты за 1 USDT. Decimal-строка с 8 знаками после точки.Максимум 80
payout.fee_percentstring
Да
Сохранённая ставка комиссии выплаты в процентах.
payout.paid_amountstring
Да
Фактически выплаченная сумма в валюте получателя. Decimal-строка с 2 знаками после точки.Максимум 80
payout.remainderstring
Да
Невыплаченный остаток в валюте получателя. Не является поручением на новую выплату. Decimal-строка с 2 знаками после точки.Максимум 80
payout.revisioninteger
Да
Версия состояния выплаты. Применяйте только более новую версию.От 1
payout.created_atstring
Да
Время создания/выдачи в ISO 8601 с часовым поясом.Формат: date-time
payout.updated_atstring
Да
Время последнего изменения в ISO 8601.Формат: date-time
error_codestring
По условию
Причина отклонения запроса. Расшифровка и действие — в справочнике ошибок.Минимум 1 · Максимум 100
Некорректные поля, сумма, реквизиты, bank_id, UUID или query. При выплате bank_id должен указывать на активный канонический банк.
Что делать и можно ли повторить
Проверить схему выплаты и тип реквизитов, получить bank_id из справочника. У баланса query запрещён. Ошибка может возникнуть и после занятия номера выплаты.
Повтор: После исправления сначала lookup по прежнему номеру; если номер занят, не переиспользовать.
unknown сохраняет резерв и требует сверки. partial не разрешает автоматически отправлять remainder ещё раз.
Все поля успешного ответа
Поле и тип
Наличие
Описание
metadataobject
Да
Ваш дополнительный JSON-объект, до 16384 UTF-8 байт. Без секретов и лишних персональных данных.
idstring
Да
ID, выданный Absolut Pay. Передавайте без изменений.
merchant_order_idstring
Да
Ваш уникальный номер запроса внутри магазина. После принятия номер нельзя использовать заново, в том числе после отказа.Минимум 1 · Максимум 128
amountstring
Да
Сумма в указанной валюте. Передавайте строкой, без экспоненты, запятой и разделителей тысяч.Максимум 80
currencystring
Да
Код валюты операции. Доступная пара метода и валюты определяется условиями магазина.Валюты: названия, суммы и подключение →Значения: RUB, AZN, KZT, KGS, UZS
methodstring
Да
Метод выплаты: sbp — по номеру телефона, card — на карту, account — на банковский счёт.Методы: значения и реквизиты →Значения: sbp, card, account
bank_idstring
По условию
Канонический ID Absolut Pay из GET /api/v2/banks. Не код шлюза и не номер NSPK. Обязательно для sbp; для card/account — необязательно.Максимум 24
bank_namestring
По условию
Сохранённое название канонического банка.Минимум 1 · Максимум 200
recipientobject
Да
Получатель: имя и ровно один вид реквизитов для выбранного метода.
recipient.card_numberstring
По методу
Номер карты: от 12 до 19 цифр, без пробелов.
recipient.phone_numberstring
По методу
Телефон с + и международным кодом, от 8 до 15 цифр.
recipient.account_numberstring
По методу
Номер счёта: от 8 до 34 заглавных латинских букв/цифр.
recipient.customer_namestring
Да
Имя получателя.Минимум 1 · Максимум 200
statusstring
Да
Статус выплаты: queued, processing, unknown, success, failed, cancelled или partial.Значения: queued, processing, unknown, success, failed, cancelled, partial
principal_usdtstring
Да
Основная стоимость выплаты в USDT по сохранённому курсу. Decimal-строка с 8 знаками после точки.Максимум 80
fee_usdtstring
Да
Комиссия выплаты в USDT, добавляется сверху к основной стоимости. Decimal-строка с 8 знаками после точки.Максимум 80
total_usdtstring
Да
Общая зарезервированная стоимость: principal_usdt + fee_usdt. Decimal-строка с 8 знаками после точки.Максимум 80
rate_fiat_per_usdtstring
Да
Зафиксированный курс: единиц валюты выплаты за 1 USDT. Decimal-строка с 8 знаками после точки.Максимум 80
fee_percentstring
Да
Сохранённая ставка комиссии выплаты в процентах.
paid_amountstring
Да
Фактически выплаченная сумма в валюте получателя. Decimal-строка с 2 знаками после точки.Максимум 80
remainderstring
Да
Невыплаченный остаток в валюте получателя. Не является поручением на новую выплату. Decimal-строка с 2 знаками после точки.Максимум 80
revisioninteger
Да
Версия состояния выплаты. Применяйте только более новую версию.От 1
created_atstring
Да
Время создания/выдачи в ISO 8601 с часовым поясом.Формат: date-time
updated_atstring
Да
Время последнего изменения в ISO 8601.Формат: date-time
Некорректные поля, сумма, реквизиты, bank_id, UUID или query. При выплате bank_id должен указывать на активный канонический банк.
Что делать и можно ли повторить
Проверить схему выплаты и тип реквизитов, получить bank_id из справочника. У баланса query запрещён. Ошибка может возникнуть и после занятия номера выплаты.
Повтор: После исправления сначала lookup по прежнему номеру; если номер занят, не переиспользовать.
Все значения — decimal-строки в USDT. total = available + reserved. Чтение баланса не гарантирует, что следующая выплата пройдёт: резерв проверяется атомарно при создании.
Некорректные поля, сумма, реквизиты, bank_id, UUID или query. При выплате bank_id должен указывать на активный канонический банк.
Что делать и можно ли повторить
Проверить схему выплаты и тип реквизитов, получить bank_id из справочника. У баланса query запрещён. Ошибка может возникнуть и после занятия номера выплаты.
Повтор: После исправления сначала lookup по прежнему номеру; если номер занят, не переиспользовать.