Lumo B2B выпускает виртуальные VISA-карты для ваших клиентов через единый REST API. Никакой возни с эквайером — просто HTTP-запрос и активная карта.
- Выпуск: одной командой
POST /cards/request. Карта выдаётся из нашего стока мгновенно, либо ставится в очередь и приезжает через webhook. - 3DS OTP: коды подтверждения покупок мы получаем из почты эквайера и отдаём через API и вебхук — не нужно держать SIM-карту.
- Пополнение:
POST /cards/recharge— списываем USDT с баланса компании, пополняем карту. - Баланс: по одной карте —
GET /cards/:id/balance, по выбранным —POST /cards/balances/query, по всем сразу —GET /cards/balances. - Транзакции: история по каждой карте через
GET /cards/:id/transactionsили по всем сразу черезGET /cards/transactions, с фильтром по периоду и выгрузкой в CSV. Видно и сумму у мерчанта до конвертации. - Реквизиты карты: полный номер и CVC отдаются по отдельному запросу и только участникам с правом
cards.sensitive. - Закрытие:
POST /cards/:id/retire— карта закрывается, остаток за вычетом комиссии за закрытие возвращается на баланс компании, приходит webhookcard.closed. См. Закрытие карты.
Эндпоинты карт работают, только если программа карт подключена компании, — иначе 403 CARDS_NOT_ENABLED. Права для каждого эндпоинта — в разделе Команда и права.
Параметры задаются администратором Lumo индивидуально под компанию:
| Параметр | Описание |
|---|---|
cardOpeningFeeUsdt | Фиксированная комиссия за выпуск карты (USDT) |
cardMinInitialDepositUsdt | Сумма, которую нужно держать на балансе сверх комиссии при подаче заявки (USDT) |
cardCommissionBps | Наша комиссия за пополнение (bps: 100 = 1%). Ставку, по которой считается конкретное пополнение, возвращает quote в ourFeeBps — ориентируйтесь на неё |
cardMinRechargeUsdt | Минимальная сумма одного пополнения для компании; если не задана — действует общий минимум 10 |
cardClosureFeeUsdt | Комиссия за закрытие карты (USDT), удерживается из возвращаемого остатка |
cardsEnabled | Включена ли программа карт для компании |
Условия своей компании видно в GET /auth/company/profile, в блоке cards (кроме комиссии за закрытие — её фактическое значение приходит в feeUsdt вебхука card.closed):
{
"cards": {
"enabled": true,
"openingFeeUsdt": 5,
"commissionBps": 80,
"minInitialDepositUsdt": 10,
"minRechargeUsdt": null,
"testMode": false
}
}При POST /cards/request на балансе резервируется openingFee + minInitialDeposit. Когда карта выдана, резерв снимается целиком: openingFee списывается с баланса, а minInitialDeposit возвращается в доступный баланс — отдельно под первое пополнение он не закрепляется.
Пока карта не выдана, существует только заявка на неё:
| Статус заявки | Значение |
|---|---|
pending | Заявка в очереди, резерв заморожен |
fulfilled | Карта выдана, в заявке заполнен cardId |
cancelled | Заявка отменена, резерв возвращён |
Карта появляется в API в момент выдачи — сразу в статусе assigned:
assigned ─(POST /retire)─► closing ──► closed| Статус карты | Значение |
|---|---|
assigned | Активна, можно пополнять и использовать |
closing | Запрошено закрытие, идёт обработка; пополнения уже запрещены |
closed | Закрыта; остаток за вычетом комиссии возвращён на баланс компании |
retired | Устаревший статус закрытых карт (эквивалентен closed) |
Если карта надолго остаётся в closing, напишите в поддержку.
Значения requested и failed для карты и failed для заявки есть в перечислениях, но текущая версия API их не выставляет.
Помимо нашего статуса у карты есть состояние на стороне эквайера — upayState / upayStateName в GET /cards и GET /cards/{id}: Normal, Frozen, Locked, Deactivated и другие (полный список — в Webhooks по картам). Карта может оставаться assigned, будучи замороженной у эквайера, — пополнения по ней тогда отклоняются. Если состояние получить не удалось, поля приходят null.
Если у компании выставлен cardsTestMode = true, все операции работают без реальной выдачи:
POST /cards/requestсразу возвращает карту с маской4466********TESTи сроком12/29; вебхукcard.assignedне отправляется.POST /cards/rechargeсразу завершается со статусомsucceeded.GET /cards/:id/sensitiveвозвращает4111 1111 1111 1111 / 123.GET /cards/:id/otp/latestвозвращает фиксированный код843903.GET /cards/:id/balance,GET /cards/balancesиPOST /cards/balances/queryвозвращают123.45 USD.POST /cards/:id/retireзакрывает карту сразу, как будто на ней было123.45.- Истории операций нет:
GET /cards/transactionsиGET /cards/:id/transactionsвозвращают пустой список.
Деньги с баланса при этом списываются и возвращаются по-настоящему: комиссия за выпуск, пополнения и возврат при закрытии проходят через баланс компании.
Это позволяет писать интеграцию без расхода реального стока.