Every rail
Swapping between two tokens you already hold is not a rail — no money enters or leaves. That is
POST /v1/users/{userId}/exchange/convert.
A rail becoming available is gated on the matching onboarding, not just on KYC being complete. Each currency needs its own activation — see the integration flow and the per-region KYC pages.
The signature pattern
Most outbound rails do not move money on the call that creates them. They return something to sign, and the transfer only proceeds once the signature comes back:- Create the payout / order. The response carries a
signatureRequest(or aworkflowIdplus a hash), usually alongside a quote. - Sign it on-device with the wallet owner key via
bmoni_embedded_sdk— the key registered asuserOwnerAddressat wallet creation. - Submit it:
Bank payouts
A single rail that pays out to bank accounts across many countries, funded fromUSDB. Use it when the destination country has no dedicated rail of its own.
1. Find the country and bank
banks takes an ISO alpha-3 country code and returns bank IDs to use downstream. Branches only exist for some banks — treat an empty list as “no branch needed”, not an error.
2. Validate the destination
routingNumber is also accepted, for rails that require one. Validate before creating the payout so the user can fix a wrong account number while it is still cheap.
3. Create the payout
The response is a signature request plus a quote. Finish it with the signature pattern above.
Crypto in and out
The wallet’s tokens can also arrive from, or leave to, an external on-chain address. No fiat is involved, so there is no quote and no local identifier.In — get a deposit address
supported-assets lists the enabled chains and tokens; it is not user-scoped, so you can call it before onboarding to build a picker. deposit/wallet returns the address to show:
USDC, USDT, USDB, DAI, EURC, PYUSD, and USDP — call supported-assets for the live list rather than hardcoding it.
Out — send to an external address
supported/{currency} first — the chain and token pair has to be one the rail actually supports. This returns a signature request; finish it with the signature pattern.
Related
- Supported regions — which rail each region gets, and the KYC it requires
- Integration flow — every wallet-home endpoint in one table

