Finance OS / API

Wallets

Казначейские крипто-кошельки мерчанта: реестр поддерживаемых монет, депозит-адреса для приёма средств, балансы и вывод на внешний адрес. Кошельки принадлежат самому мерчанту (это его казначейство), а не конкретному customer'у — поэтому endpoints живут под /api/v1/wallets, без привязки к {uuid}.

Мультичейн-монеты
Один и тот же ассет (например USDT) доступен в нескольких сетях (TRON, ETHEREUM, BSC, POLYGON, BASE). Параметр пути {coin} — это символ ассета (USDT, BTC, …). Для мультичейн-ассетов дополнительно указывайте network, иначе вернётся 422 invalid_request (неоднозначность). Сети — это блокчейны, которые нужны вашему клиенту, а не поставщики.
Окружение по префиксу ключа
Sandbox или live определяется префиксом ключа, а не заголовком: sk_test_ → sandbox, sk_live_ → live. В sandbox все балансы нулевые, депозит-адрес — детерминированный не-реальный адрес (не пополняйте его), а вывод только симулируется. См. Sandbox.

Реестр монет

GET /api/v1/wallets/coins
Bearer Token

Список доступных монет и наценок

Возвращает монеты, доступные вашему ключу (администратор Finance OS может ограничить набор per-merchant allowlist'ом). Для каждой монеты — сеть, тип, контракт токена, точность, минимумы и текущая наценка мерчанта.

Responses

{
  "data": [
    {
      "asset": "USDT",
      "symbol": "USDT",
      "name": "Tether USD",
      "network": "TRON",
      "kind": "token",
      "contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "decimals": 6,
      "min_deposit": "0.000000000000000000",
      "min_withdraw": "0.000000000000000000",
      "markup": { "deposit_pct": 0.5, "withdraw_pct": 1.0 }
    },
    {
      "asset": "USDT",
      "symbol": "USDT",
      "name": "Tether USD",
      "network": "ETHEREUM",
      "kind": "token",
      "contract": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
      "decimals": 6,
      "min_deposit": "0.000000000000000000",
      "min_withdraw": "0.000000000000000000",
      "markup": { "deposit_pct": 0.5, "withdraw_pct": 1.0 }
    },
    {
      "asset": "BTC",
      "symbol": "BTC",
      "name": "Bitcoin",
      "network": "BITCOIN",
      "kind": "native",
      "contract": null,
      "decimals": 8,
      "min_deposit": "0.000000000000000000",
      "min_withdraw": "0.000000000000000000",
      "markup": { "deposit_pct": 0.5, "withdraw_pct": 1.0 }
    }
  ]
}

Поля монеты

Name Type Required Description
asset string optional Символ ассета (используется как {coin} в пути).
symbol string optional Тикер для отображения.
name string optional Человекочитаемое имя.
network string optional Блокчейн-сеть: TRON, ETHEREUM, BITCOIN, LITECOIN, BSC, POLYGON, BASE.
kind enum optional native или token.
contract string? optional Адрес контракта для token; null для native.
decimals integer optional Точность ассета в сети.
min_deposit string optional Минимальная сумма депозита (десятичная строка; настраивается администратором, может быть 0).
min_withdraw string optional Минимальная сумма вывода (десятичная строка).
markup object optional deposit_pct / withdraw_pct — ваша наценка в процентах (0, если не настроена).

Балансы

GET /api/v1/wallets
Bearer Token

Балансы казначейства по всем монетам

Баланс каждой доступной монеты + оценка в USD. В sandbox все значения нулевые.

Responses

{
  "data": [
    { "asset": "USDT", "symbol": "USDT", "network": "TRON",     "balance": "1500.250000", "usd": 1500.25 },
    { "asset": "USDT", "symbol": "USDT", "network": "ETHEREUM", "balance": "0",           "usd": 0 },
    { "asset": "BTC",  "symbol": "BTC",  "network": "BITCOIN",  "balance": "0.05000000",  "usd": 3250.00 }
  ]
}

Баланс одной монеты

GET /api/v1/wallets/{coin}/balance
Bearer Token

Баланс по конкретной монете

Для мультичейн-ассета уточните сеть query-параметром ?network=TRON.

Query

Name Type Required Description
network string optional Сеть для мультичейн-ассета (макс. 20 символов). Без неё неоднозначный ассет вернёт 422.

Responses

{
  "data": {
    "asset": "USDT",
    "network": "TRON",
    "balance": "1500.250000",
    "usd": 1500.25
  }
}

Депозит-адрес

POST /api/v1/wallets/{coin}/address
Bearer Token

Получить адрес для приёма средств

Возвращает адрес казначейства в выбранной сети. Отправляйте на него только указанный ассет в указанной сети — балансы обновятся после подтверждения транзакции в блокчейне. В sandbox возвращается детерминированный не-реальный адрес (флаг sandbox: true); реальных средств туда не отправляйте.

Body

Name Type Required Description
network string optional Сеть для мультичейн-ассета (макс. 20 символов).

Responses

{
  "data": {
    "asset": "USDT",
    "network": "TRON",
    "address": "TXYZ1234567890abcdef..."
  }
}
{
  "data": {
    "asset": "USDT",
    "network": "TRON",
    "address": "SBXTRON8F2A1C...",
    "sandbox": true
  }
}

Вывод

POST /api/v1/wallets/{coin}/withdraw
Bearer Token

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

Инициирует on-chain-вывод из казначейства на внешний адрес. Ответ 202 Accepted означает, что запрос принят в обработку; итоговый статус подтверждается по факту транзакции в сети.
Вывод по умолчанию выключен
Реальный вывод — дормантная операция за kill-switch'ем и включается администратором Finance OS индивидуально. Пока он выключен, live-запрос вернёт 503 service_unavailable — обрабатывайте это как «временно недоступно» и повторяйте позже. В sandbox вывод всегда симулируется (без движения средств, флаг sandbox: true).

Body

Name Type Required Description
to string required Внешний адрес-получатель (макс. 120 символов).
amount string required Сумма в единицах ассета, десятичная строка до 18 знаков после точки (^\d+(\.\d{1,18})?$).
network string optional Сеть для мультичейн-ассета (макс. 20 символов).

Responses

{
  "data": {
    "status": "accepted",
    "asset": "USDT",
    "network": "TRON",
    "amount": "25.5",
    "to": "TExternalRecipientAddr...",
    "tx_hash": "9f2b0c...",
    "pricing": { "markup_pct": 1.0 }
  }
}
{
  "data": {
    "status": "accepted",
    "asset": "USDT",
    "network": "TRON",
    "amount": "25.5",
    "to": "TExternalRecipientAddr...",
    "pricing": { "markup_pct": 1.0 },
    "sandbox": true
  }
}
{
  "error": {
    "code": "service_unavailable",
    "message": "Сервис временно недоступен. Попробуйте позже.",
    "request_id": "req_8f3ca1b209d74e55a1c0f2e7"
  }
}

Коды ошибок

Ошибки отдаются в едином конверте { "error": { "code", "message", "request_id" } }. При ошибке валидации добавляется поле fields с детализацией по параметрам.

Introduction.'], ['name' => 'not_found', 'type' => '404', 'desc' => 'Монета недоступна для этого ключа.'], ['name' => 'insufficient_funds', 'type' => '402', 'desc' => 'Недостаточно средств в казначействе для вывода.'], ['name' => 'service_unavailable', 'type' => '503', 'desc' => 'Вывод временно недоступен (дормант) либо инфраструктура недоступна. Повторите позже.'], ]" />