Finance OS / API

Payments

Buy (RUB → USDT через СБП), Sell (USDT → RUB через СБП), Crypto Deposit и Withdraw на managed customers. Все операции требуют kyc_status='verified'.

KYC gate
Любая операция без верифицированного customer'а вернёт 422 KYC_REQUIRED. Сначала пройдите KYC.

Котировки

Курсы обновляются у Finance OS раз в минуту и фиксируются на 60 секунд после первой котировки в сессии.

Buy quote

POST /api/v1/customers/{uuid}/payments/buy/calculate
Bearer Token

Сколько USDT за N рублей

Body

Name Type Required Description
amount_rub numeric required 100..100000 RUB.

Sell quote

POST /api/v1/customers/{uuid}/payments/sell/calculate
Bearer Token

Сколько RUB за N USDT

Body

Name Type Required Description
amount_usdt numeric required 1..1000 USDT.

Текущие курсы (без customer)

GET /api/v1/payments/rates
Bearer Token

Buy/sell rate без привязки к customer'у

Buy (RUB → USDT)

POST /api/v1/customers/{uuid}/payments/buy
Bearer Token

Создать СБП-платёж

Возвращает transaction с QR-кодом для СБП. End-user сканирует QR в своём банковском приложении, переводит RUB, USDT зачисляется на баланс customer'а.

Body

Name Type Required Description
amount_rub numeric required 100..100000.
bank_id string required Идентификатор банка-получателя.

Responses

{
  "data": {
    "uuid": "1a7ee75b-7f0e-48af-a075-a56721f1140e",
    "type": "payment",
    "status": "pending",
    "status_code": 0,
    "amount_from": "1000",
    "amount_to": "12.9602550000",
    "currency_from": "RUB",
    "currency_to": "USDT",
    "rate": "0.012960254775",
    "qr_url": "https://fin-os.io/api/v1/sandbox/qr/abc123.png",
    "expires_at": "2026-05-27T14:38:00+00:00",
    "env": "sandbox"
  }
}

Buy status

GET /api/v1/customers/{uuid}/payments/buy/{txUuid}/status
Bearer Token

Проверить статус buy-транзакции

В sandbox через ~5 секунд автоматически переходит в completed и USDT кредитится на баланс customer'а. В live статус обновляется через провайдерский webhook.

Sell (USDT → RUB)

POST /api/v1/customers/{uuid}/payments/sell
Bearer Token

Создать СБП-выплату на банковский счёт

Сумма USDT блокируется (locked) в момент создания. При success — consume'ится; при failure — возвращается в available.

Body

Name Type Required Description
amount_usdt numeric required 1..1000.
bank_id string required Банк-получатель.
phone string required Телефон счёта в СБП (E.164).

Sell status

GET /api/v1/customers/{uuid}/payments/sell/{txUuid}/status
Bearer Token

Проверить статус sell-транзакции

Crypto deposit

POST /api/v1/customers/{uuid}/payments/deposit/address
Bearer Token

Получить адрес для крипто-депозита

Возвращает адрес для пополнения customer'а в указанной сети. End-user отправляет криптовалюту по этому адресу — балансы customer'а обновятся при подтверждении транзакции в блокчейне.

Body

Name Type Required Description
currency enum optional USDT, BTC, ETH, LTC, KAS.
Default: USDT

Responses

{
  "data": {
    "currency": "USDT",
    "network": "TRC20",
    "address": "TXYZ1234567890abcdef...",
    "min_deposit": "1.000000",
    "env": "live",
    "warning": "Send only USDT in TRC20 network to this address."
  }
}

Crypto withdraw

POST /api/v1/customers/{uuid}/payments/withdraw
Bearer Token

Crypto-вывод на внешний адрес

Сумма блокируется (locked). После транзакции в сети — consume'ится.

Body

Name Type Required Description
currency enum required USDT/BTC/ETH/LTC/KAS.
amount numeric required Минимум 0.000001.
address string required Внешний адрес.

Коды ошибок

KYC.'], ['name' => 'INSUFFICIENT_BALANCE', 'type' => '422', 'desc' => 'Недостаточно средств для lock (sell/withdraw).'], ['name' => 'AMOUNT_OUT_OF_RANGE', 'type' => '422', 'desc' => 'Сумма вне разрешённого диапазона.'], ['name' => 'INVALID_BANK', 'type' => '422', 'desc' => 'bank_id не в списке поддерживаемых СБП-банков.'], ['name' => 'INVALID_ADDRESS', 'type' => '422', 'desc' => 'Некорректный crypto-адрес для указанной сети.'], ['name' => 'PROVIDER_DOWN', 'type' => '503', 'desc' => 'Платёжный шлюз временно недоступен. Retry через минуту.'], ]" />