A single product can combine them: custodial for fiat flows and compliance, non-custodial for user-controlled onchain assets, agentic for autonomous payments.
The rest of this page covers the custodial model. For non-custodial and agentic wallets, see OMS Wallet.
In the custodial model, value lives in two places: crypto wallets and fiat wallets, both held by OMS for a customer. Everything else in the account model either brings money into those balances (virtual accounts, deposit addresses, cash-ins) or names where money goes outside OMS (external accounts).
Crypto wallets
A crypto wallet is the primary balance store. OMS manages the private keys, so there is no end-user signing and no wallet SDK to integrate. Every operation is a server-to-server API call.address is its onchain deposit address and appears once the custody provider issues it. routing reports whether a virtual account or deposit address delivers into the wallet.
A wallet’s status is pending, active, frozen, suspended, or closed. A new wallet reads pending until its address is ready, then active.
Creating a wallet: POST /wallets with type: "custodial", the customerId, and details: { network, asset }. The customer needs an active cryptoCustody endorsement. OMS answers 201 with the wallet when it is ready, or 202 with a Location header pointing at GET /wallets/operations/{operationId} while provisioning finishes.
Listing and reading: GET /wallets?customerId=... lists a customer’s wallets. GET /wallets/{walletId} returns one wallet with its balances[].
Funding: Send crypto to the wallet’s address, or route deposits into it from a virtual account, deposit address, or cash-in.
Multiple wallets: A customer can hold a wallet for each asset and network it needs, for example usdc on polygon and usdc on base. Which pairs your project can create depends on its configuration; GET /networks reports them.
Fiat wallets
A fiat wallet (walletFiat) holds a USD balance at a partner bank on an internal ledger. It has no network and no onchain address. Create one with POST /wallets and type: "fiat". Virtual accounts and deposit addresses can deliver into it, and a quote with a walletFiat source pays out of it. See Fiat wallets.
Virtual accounts
A bank account number assigned to a customer. Each deposit creates a transaction that delivers the funds to the virtual account’sdestination: a stablecoin into a crypto wallet or registered external wallet (fiatAccountToCrypto), or USD to a registered bank account or the customer’s fiat wallet (fiatAccountToFiatAccount).
depositInstructions once they appear. See Virtual accounts.
Deposit addresses
A reusable onchain address assigned to a customer, for “accept any amount from any sender” flows. Each deposit creates a transaction that delivers the funds to the deposit address’sdestination: fiat to a registered bank account or the customer’s fiat wallet (cryptoToFiatAccount), or crypto to an OMS wallet or registered external wallet (cryptoToCrypto).
External accounts
Bank accounts, debit cards, and external wallets outside OMS. They are references, not balances: OMS never holds funds in an external account. Every external account ID uses theext_ prefix; type identifies the instrument:
Banks and external wallets are destinations. A debit card can be a quote source or destination. A quote can also deliver to a raw onchain address by passing
blockchainAddress on a walletExternal destination instead of an ext_ ID. See External accounts to register them and Debit cards for cards.