Все значимые изменения API документируются на этой странице.
- Клиенты партнёра покупают USDT по QR СБП, купленное зачисляется на карту или баланс компании. Подключается отдельно. Эндпоинты:
GET /sbp/rate,POST /sbp/customers,GET /sbp/customers/{customerId},POST /sbp/customers/{customerId}/kyc,POST /sbp/quotes,POST /sbp/orders,GET /sbp/orders,GET /sbp/orders/{id},POST /sbp/orders/{id}/cancel. - Права
sbp.readиsbp.create. - Вебхуки
sbp.customer.kyc_updatedиsbp.order.status_changed, тип доставкиsbpв журнале. См. Покупка USDT за рубли. - Наценка партнёра:
partnerFeeBpsвPOST /sbp/quotes. Удерживается из купленного и остаётся на балансе компании, в котировке, заказе и вебхуке — полеpartnerFeeUsdt. См. Ваша наценка. - Выпуск карты за рубли: цена карты в рублях в настройках компании (
sbpCardPriceRubвPATCH /auth/company/profile,sbp.cardPriceRubв профиле), котировкаPOST /sbp/quotesсpurpose: card_issue. После оплаты USDT зачисляются на баланс компании и карта выпускается сама. Новые поля котировки и заказа:purpose,cardIssueUsdt; заказа и вебхука —cardIssueStatus,issuedCardId,cardRequestId. ОшибкиSBP_CARD_PRICE_NOT_SETиSBP_CARD_PRICE_TOO_LOW. См. Выпуск карты за рубли.
- Срок на оплату ST00012 и ГИБДД: 4 минуты после accept вместо 60 секунд, столько же исполнитель получает на такой платёж. Раньше ордер успевал стать
failedсOrder expired, а через несколько секунд переходил вsuccess. От 50 000 ₽ срок любого ордера на 10 секунд больше. merchantNameу оплат ST00012: вместо общей подписиЖКХтеперь приходит получатель из поляNameплатёжки.paymentTypeостаётсяst00012.- Отказ
passport_patronymic_missingвkycReason: отчество не распознано, паспорт в банк не отправлен. Отказ не окончательный, повторPOST /sbp/customers/{customerId}/kycвыдаёт новую ссылку на проверку. - Отказ
passport_unreadableвkycReason: данные с разворота паспорта не совпали с машиночитаемой строкой внизу страницы, паспорт в банк не отправлен. Отказ не окончательный, повтор выдаёт новую ссылку. Причинаpassport_missing_fieldsбольше не возникает.
- Повтор
POST /sbp/customers/{customerId}/kycпосле исправимого отказа банка (aura_…,kycTerminal: false) отвечал422 SBP_PROVIDER_REJECTED. Теперь он просит банк перепроверить клиента.
- Балансы выбранных карт:
POST /cards/balances/query. В теле —cardIdsи/илиexternalIds, до 100 ID суммарно. Элементы ответа — в форматеGET /cards/balances, в порядке запроса; ID, которых нет среди карт компании, — вnotFound. См. Баланс карты.
processorParentIdв операциях по картам (GET /cards/:id/transactions,GET /cards/transactions) — общий ID авторизации и её проведения или отмены, в вебхуках этоupayParentId. По нему финальная строка связывается с авторизацией, сохранённой из вебхукаcard.transaction.created, даже еслиcard.transaction.settledне дошёл. См. История транзакций.
Только документация — поведение API не менялось. Документация сверена с текущим кодом API; ниже — что в ней было описано неверно или не описано.
- IP-вайтлиста нет. Доступ к API не ограничивается по IP-адресам, регистрировать адреса серверов нигде не нужно. Упоминания whitelist и ошибки
403 IP not whitelistedубраны. - Ключи выдаются участникам команды, а не компании целиком, и действуют с правами участника.
regenerate-keyперевыпускает ключ того участника, от чьего имени сделан запрос.POST /auth/company/loginвозвращает сессионный токен, а не ключ. - Ошибки авторизации: отключённая компания —
401 COMPANY_INACTIVE, а не403. Реальные403—PERMISSION_DENIED(нет права) иCARDS_NOT_ENABLED. - Формат ошибок на странице Обработка ошибок приведён к фактическому:
errorCode,details,path,timestamp,requestId;requestIdприходит и в заголовкеX-Request-Id. Добавлен полный список кодов. - Ограничения частоты запросов нет,
429API не отдаёт — описание rate limit убрано.
- Срок на оплату — 60 секунд после accept, а не 5 минут. Не завершённый к
paymentUntilордер становитсяfailedсfailureReason: Order expired, а неexpired_by_system. - Сразу после accept ордер в статусе
created, а неin_progress; в ответе естьpaymentType. - Статусы
expired_no_takerиexpired_by_systemордерам не присваиваются: ордер, который никто не взял, становитсяfailed, а просроченный исполнителем —disputedс автоматически открытым спором. Вебхука нет наcreated,in_progressи на спор, открытый вами. - Повторный accept без
Idempotency-Keyотвечает404 QUOTE_NOT_FOUND, а не400 Quote already accepted. - Повторное открытие спора отвечает
400 DISPUTE_NOT_ALLOWED, а не возвращает уже открытый спор. - Тексты ошибок котировок исправлены, в таблицы добавлены
QR_AMOUNT_MISSING,ST00012_SUM_*,GIBDD_UIN_INVALID,RATE_UNAVAILABLE,WALLET_BACKEND_ERROR. - Штраф ГИБДД по УИН может прийти как обычный платёж СБП (
paymentType: nspk) — описаны оба варианта. - Частичный возврат по ордеру от платёжной стороны (
order_partial_refund) не меняет статус и не сопровождается вебхуком — описан отдельно, а не как исход спора.
- Комиссии за пополнение баланса компании нет — зачисляется вся сумма.
GET /wallets/balanceотдаётfrozenBalanceиavailableBalance;trxBalanceвсегда0.- Жизненный цикл депозита компании приведён к фактическому: не прошедшая AML-проверка уходит в
pending_retry, а после повторов — вfailedс вебхукомdeposit.failed;deposit.aml_failedпо депозитам компании не приходит. - Кошельки пользователей: депозиты не зачисляются на баланс компании, а пересылаются на
depositForwardAddress; с баланса компании списывается комиссия за обработку. По ним приходят толькоdeposit.completed,deposit.aml_failedиdeposit.failed. Описаны вывод с заблокированного кошелька и статусы депозитов пользователей. - История баланса: добавлены типы операций выплат, споров и служебные, для каждого типа указано, что лежит в
referenceId. - Список диспутов отдаёт суммы строками (
"52.63000000"), а не числами.
- Типы и статусы операций — значения эквайера как есть:
typeNameConsumption/Refund/Deactivate,statusNameUnposted/Posted/Cancelled/Failed,directionNamePay/Collect. Значенийpurchase,succeeded,debitне бывает. - Вебхуки по картам приходят плоским JSON, без вложенного
data. Поправлены поля событий; дедуплицировать нужно поX-Lumo-Delivery-Id. card.assignedприходит и на мгновенную выдачу карты, сrequestId: null.- Quote пополнения —
ourFeeBps,commissionUsdt,totalDebitUsdt; списание —targetAmount + commissionUsdt, комиссии эквайера сверху нет. Сумма — от 10 до 1 000 000 USD. Ошибки пополнения приходят сCARD_RECHARGE_INVALID, а причина — в началеmessage. - Статусы пополнения: ответ на
POST /cards/rechargeобычно уже итоговый —succeededилиin_progress_manual;refundedозначает отмену после ручного разбора, а не возврат успешного пополнения. Сбой эквайера не возвращает деньги сразу: пополнение остаётсяpendingи досверяется автоматически. Деньги сразу возвращаются только при явном отказе эквайера (422). - 3DS-код действует 5 минут, а не 2; приходит сразу, а не опросом раз в 15 секунд. Если кода нет, ответ — пустое тело, а не
null.maskedCard— последние цифры номера карты. - Баланс карты отдаётся из последнего известного значения и может быть старше 60 секунд — свежесть показывает
fetchedAt. - Тестовый режим: тестовые суммы пополнения
0.01/0.02недостижимы (минимум — 10), история операций пустая. GET /cards/:id/transactionsне принимаетfrom/to— фильтр по периоду есть только у общей лентыGET /cards/transactions.- Ошибок
BRIDGE_UNAVAILABLEиINSUFFICIENT_FUNDSкакerrorCodeнет — описаны фактические коды.
- Подпись считается от сырого тела запроса — примеры проверки исправлены. Описано, как получить и сменить секрет подписи.
- Повторы: попытка ждёт ответа 10 секунд, повторы идут на любой не-
2xxответ, включая4xx. payout.rechargedприходит вместоpayout.status_changed, а не в дополнение к нему.- Выплаты: часы приёма общие для всех компаний; описаны все
failReasonи исход спораtrader_won.
- 2026-03-08 — ордер, который исполнитель не подтвердил вовремя, переходит в
disputedсо спором, открытым платёжной стороной; ордер без исполнителя — вfailed. - 2026-03-09 — вывод с заблокированного кошелька пользователя:
POST /user-wallets/{walletId}/withdrawиGET /user-wallets/withdrawals/status/{requestId}. - 2026-04-20 — вход в кабинет больше не перевыпускает API-ключ.
- 2026-04-23 — просмотр своего ключа
POST /auth/company/api-key/reveal, секрет вебхуков:POST /auth/company/webhook-secret/revealи/rotate, полеwebhookSecretв профиле. - 2026-04-27 — команды и права: у каждого участника свой ключ и набор прав, роли
owner/admin/member, приглашения (/members,/members/invites,/auth/invites/{token}), ошибка403 PERMISSION_DENIED. См. Команда и права. - 2026-04-28 — тестовая отправка
POST /webhooks/testи журнал доставокGET /webhooks/deliveries. - 2026-05-08 — из quote пополнения убраны поля комиссии эквайера, а из истории операций — строки пополнений.
- 2026-05-25 — комиссия за пополнение баланса компании отменена.
- 2026-05-27 — единый формат ошибок с
errorCodeиrequestId. - 2026-06-01 —
targetAmountпополнения проверяется на входе: от 10 до 1 000 000, не больше двух знаков после запятой; отказ эквайера —422, а не502. - 2026-06-10 — частичный возврат по исполненному ордеру (
order_partial_refund). - 2026-07-21 — сбой эквайера при пополнении больше не приводит к немедленному возврату: пополнение остаётся
pendingи досверяется. - 2026-07-22 — состояние карты у эквайера (
upayState,upayStateName) вGET /cardsиGET /cards/{id}; история пополнений одной картыGET /cards/{id}/recharges. - 2026-08-14 — штраф ГИБДД по УИН выставляется как обычный платёж СБП (
paymentType: nspk), оплата по реквизитам осталась запасным вариантом.
Балансы всех карт одним запросом:
GET /cards/balances. До 100 карт на страницу, включая закрытые, отсортированы поcardId; следующая страница —after=meta.nextCursor. Ответ —{ "data": [...], "meta": { "limit", "nextCursor" } }, у каждой картыcardId,externalId,balance,currency,fetchedAt.balance— строка без округления. Если баланс неизвестен,balance,currencyиfetchedAtравныnull:nullозначает «неизвестно», а не ноль.fetchedAt— когда баланс получен от эквайера. См. Баланс карт.
- Повторное закрытие спора по ордеру, который уже завершился как
failed, больше не меняет баланс и заморозку компании.
GET /cards/{id}/otp/latestотдавал вcardIdвнутренний идентификатор карты у эквайера, и код выглядел как код чужой карты. Теперь там id карты в нашем API — как в пути запроса и в вебхукеcard.otp_received.
- Пополнение карты списывает с баланса ровно
targetAmount + commissionUsdt. Раньше сумма округлялась до центов, и списание могло на доли цента расходиться с возвратом при неуспешном пополнении.
MCC мерчанта в операциях: у транзакций появилось поле
merchantMcc— код категории торговой точки (5734,5816,4121, …), как его прислал эквайер. Приходит и вGET /cards/{id}/transactions, и в общемGET /cards/transactions.Поле есть примерно у трети операций — у покупок, где эквайер передал MCC. У пополнений, закрытий карты и части покупок будет
null, поэтому рассчитывать на его наличие в каждой строке не стоит.
В колонке
mccвыгрузкиGET /cards/transactions.csvтеперь действительно MCC. Раньше туда попадалditchCode, а это канал эквайринга — у всех операций там одно и то же значение (straitsx), к категории мерчанта отношения не имеющее.Описание
ditchCodeв документации исправлено: это не MCC. Поле осталось на месте ради обратной совместимости, но за категорией мерчанта теперь нужно идти вmerchantMcc.
Отмена заявки на карту:
POST /cards/requests/{id}/cancel. Пока карта по заявке не выпущена, заявку можно отменить — резерв (cardOpeningFeeUsdt + cardMinInitialDepositUsdt) возвращается в доступный баланс, аexternalIdзаявки снова освобождается.Только для статуса
pending: выпущенную карту не отменяют, её закрывают черезPOST /cards/{id}/retire— иначе придётCARD_REQUEST_NOT_CANCELABLE. Повторный вызов возвращает ту же заявку и ничего не меняет, поэтому запрос безопасно повторять, если ответ не дошёл.Новый webhook
card.request_cancelled— заявку отменила наша сторона, резерв вернулся на баланс. На вашу собственную отмену события нет: результат приходит в ответе на сам запрос.Коды ошибок:
CARD_REQUEST_NOT_CANCELABLE.
Обратная сторона приёма по QR: вы создаёте заявку с реквизитом получателя, мы списываем USDT с баланса и передаём заявку исполнителю, который отправляет рубли на карту или по номеру телефона через СБП.
GET /payouts/config— лимиты, курс, часы приёма, подключены ли выплаты.GET /payouts/banks— справочник банков СБП;idоттуда идёт вbankId.POST /payouts/quote— сколько USDT спишется, без создания заявки.POST /payouts— создать заявку. ПередавайтеIdempotency-Key: ретрай с тем же ключом вернёт ту же заявку, а не выплатит второй раз.GET /payouts,GET /payouts/{id}— список и статус;?search=ищет по вашемуexternalIdили по нашемуid.POST /payouts/{id}/cancel— отмена, пока заявку не взял исполнитель.POST /payouts/{id}/dispute— спор с вложениями (multipart, до 3 файлов).
Списание происходит при создании заявки, а не при исполнении: иначе заявка могла бы жить у исполнителя без списания. Провал возвращает средства автоматически и ровно один раз — признаком служит поле refundedAt.
Комиссия зашита в курс, отдельной строкой её нет. Курс фиксируется при создании заявки, движение рынка после этого на выплату не влияет.
Ограничения, о которых стоит знать заранее: приём заявок только в рабочие часы (по умолчанию 08:00–22:00 МСК, см. withinWorkingHours), одна выплата на пару «номер телефона + банк» раз в 72 часа и лимит одновременно активных заявок. Подробности — в разделе Выплаты в рублях.
Выплаты подключаются отдельно и по умолчанию выключены.
payout.status_changed— на каждую смену статуса выплаты.payout.recharged— заявка вернулась вsuccessпосле возврата средств, и сумма списана повторно. Отдельное событие потому, что изstatusэтого не видно.
Добавлены PAYOUTS_NOT_ENABLED, PAYOUT_NOT_FOUND, PAYOUT_REQUISITE_INVALID, PAYOUT_BANK_REQUIRED, PAYOUT_BANK_UNKNOWN, PAYOUT_ACTIVE_LIMIT, PAYOUT_REQUISITE_COOLDOWN, PAYOUT_OUTSIDE_WORKING_HOURS, PAYOUT_NOT_CANCELABLE, PAYOUT_DISPUTE_NOT_ALLOWED, PAYOUT_SERVICE_REJECTED, PAYOUT_SERVICE_UNAVAILABLE.
Две последних различайте внимательно: PAYOUT_SERVICE_REJECTED — заявки нет и деньги вернулись, PAYOUT_SERVICE_UNAVAILABLE — заявка принята и средства не возвращены, повторять запрос можно только с тем же Idempotency-Key.
- Поиск ордера по идентификатору:
GET /orders?search=.... Находит по вашемуexternalOrderId— достаточно части, поэтому387057найдётtransaction_387057— либо по нашемуidордера, целиком или по первым символам. Полный UUID ищется точным совпадением.
GET /disputesпринимаетsearch(по ордеру диспута — те же правила, что в/orders),resolution,limitиoffset. Безlimitповедение прежнее: вся история одним массивом. При постраничной выдаче общее число приходит в заголовкеX-Total-Count.
Только документация — поведение API не менялось.
refundAmountу диспутов описывался неверно. Было сказано, что поле заполняется только приpartial_refund, а при полномrefundравноnull. На самом деле приrefundв нём лежит полная сумма ордера;nullбывает только приconfirm. Если вы полагались на прежнее описание при сверке — перепроверьте логику.refundAmount— это не «зачислено на баланс». Поле показывает, какая часть ордера отменена. Если средства ещё не были списаны, решение по диспуту снимает заморозку, и баланс не растёт. Реальное движение — в истории баланса поreferenceId = orderId.- Исход диспута лежит в
resolution, а не вstatus. Выигранный и проигранный диспут одинаково получаютstatus: resolved;confirmозначает отказ по диспуту. Добавлена таблица соответствия резолюции и итогового статуса ордера. - Статус ордера после диспута. Было написано, что ордер остаётся
disputed— на самом деле он переходит вfailedпри возврате и вsuccessпри отказе. - Статусы
in_reviewиrejectedописывались как этапы рассмотрения. Они существуют в перечислении, но не выставляются — помечены как зарезервированные.
- Страница История баланса и эндпоинты
GET /wallets/balance-historyиGET /wallets/balance-history.csvв OpenAPI — раньше не были описаны нигде. - В схему
Disputeдобавлен вложенный объектorder: он всегда приходил в ответе, но в документации его не было, из-за чего за суммой ордера делали лишний запрос.
- Сумма в валюте мерчанта: у операций появились
originalAmountиoriginalCurrency. Покупка на 910 ₺ теперь видна как таковая, а не только как списание 19.6248 USD. Поля есть и в выдаче, и в вебхуках операций;nullтам, где конвертации не было (пополнение, закрытие карты). - Операции по всем картам сразу:
GET /cards/transactions— одна лента по всем картам компании с фильтрамиfrom/to, вместо запроса на каждую карту. - Выгрузка в CSV:
GET /cards/transactions.csvиGET /cards/:id/transactions.csv— операции и пополнения одним файлом (колонкаtypeих различает), с фильтром по периоду.
card.status_changed— карта заморожена / заблокирована / деактивирована на стороне эквайера. Это не нашstatusкарты: она остаётсяassigned, будучи замороженной у эквайера.card.transaction.settled— ранее пришедшая авторизация провелась. Приходит отдельной строкой в среднем через 29 часов, с тем жеupayParentId. Связывайте по нему, иначе один платёж посчитается дважды.
GET /cards/:id/transactionsотдавал в полеcardIdвнутренний идентификатор карты у эквайера — тот, который на вашей стороне получить неоткуда. Теперь тамcardIdкарты в нашем API, как и в вебхуках.- Некорректная дата в query-параметрах возвращает
400, а не500.
- Закрытие карты:
POST /cards/:id/retireтеперь полноценно закрывает карту. Появились статусыclosing→closed; остаток на карте за вычетом комиссииcardClosureFeeUsdtвозвращается на баланс компании; отправляется новый webhookcard.closed. См. Закрытие карты. - Новый параметр компании
cardClosureFeeUsdt— комиссия за закрытие карты, удерживается из возвращаемого остатка.
POST /orders/prepareтеперь принимает QR-ссылки от шести банков и автоматически нормализует их в форматqr.nspk.ruперед обработкой: Райффайзен, T-Bank/Тинькофф, Газпромбанк, ПСБ, UniCredit, Экспобанк. Прямые ссылкиqr.nspk.ru,multiqr.ruиplatiqr.ruработают как раньше. Дополнительно есть общий fallback на последний сегмент пути, совпадающий с паттерном qrcId (XX[A-Z0-9]{18,}).
GET /rates/current— актуальный курс USDT/RUB. В ответе помимоrate/baseRateтеперь приходятeffectiveRate,offsetBps,minAmountRub,maxAmountRub.rateуже содержит per-company комиссию (см. ниже) — именно по нему создаётся следующий ордер.
GET /cards/{id}/balance— live-баланс карты, проксируется в мост (~60-секундный кэш на стороне bridge). ВcardsTestModeвозвращает синтетический ответ.
Полная программа виртуальных VISA-карт с выпуском через API.
POST /cards/request— выпуск (синхронный при наличии стока, иначе асинхронный с webhookcard.assigned). ОбязателенIdempotency-Key.GET /cardsиGET /cards/{id}— список и детали карт компании.POST /cards/{id}/retire— закрытие карты.GET /cards/{id}/sensitive— одноразовое раскрытие полного номера и CVC (без кэша, логируется).GET /cards/{id}/otp/latest— последний 3DS OTP из почты эквайера.GET /cards/{id}/transactions— история операций по карте, cursor-пагинация черезbefore.
POST /cards/recharge/quote— расчётtotalDebitUsdt = userCharge + commission.POST /cards/recharge— выполнение пополнения (обязателенIdempotency-Key). Автоматический возврат средств при ошибке моста или при переходе вfailed/refunded.GET /cards/recharges— история пополнений компании.
card.assigned,card.otp_received,card.transaction.created,card.recharge.{succeeded,failed,refunded,in_progress_manual}.
- Раздел Карты в документации: обзор программы, выпуск, пополнение, PAN+CVC, 3DS OTP, история транзакций, webhooks.
POST /orders/prepare— создание котировки из QR-кода СБПPOST /orders/accept/{id}— подтверждение и создание ордераGET /orders— список ордеров с фильтрациейGET /orders/{id}— детали ордера- Поддержка
Idempotency-Keyдля accept
POST /orders/{id}/disputes— открытие диспутаGET /disputes— список диспутов компании
GET /wallets— получение адреса кошелька компанииGET /wallets/balance— баланс USDT и TRXGET /wallets/deposits— история депозитов
POST /user-wallets— создание кошелька для пользователяGET /user-wallets— список кошельковGET /user-wallets/blocked— заблокированные кошелькиPOST /user-wallets/{id}/block— блокировкаPOST /user-wallets/{id}/replace— замена кошелькаGET /user-wallets/deposits— депозиты пользователей
- События ордеров:
order.status_changed - События депозитов:
deposit.created,deposit.completed,deposit.failed,deposit.aml_* - HMAC-SHA256 подпись (
X-Lumo-Signature) - Автоматические ретраи (до 4 попыток)
POST /auth/company/login— логин и получение API-ключаGET /auth/company/profile— профиль компанииPATCH /auth/company/profile— обновление профиляPOST /auth/company/regenerate-key— ротация ключа
- Аутентификация через
X-API-Key - AML-проверки входящих депозитов
- SDK для JavaScript/TypeScript
- Расширенная аналитика в личном кабинете
- Поддержка дополнительных сетей (Solana, TON)
- GraphQL API
- Batch-операции