Skip to main content
A user funds their wallet by paying in cash at any of 50,000+ retail locations, which OMS converts to USDC. They hold the USDC on Polygon. When they want to move money out, they can send it onchain to another wallet or external blockchain address, or withdraw it back to a bank account. Funding by bank transfer uses a dedicated virtual account number. This is the core loop for any consumer crypto product: move money in, hold it onchain, move it out. OMS handles the fiat rails, conversion, and compliance on both sides. Who this is for:
  • Consumer apps that want to offer crypto-backed savings or spending accounts
  • Crypto exchanges and brokers handling retail on/off-ramp volume
  • DeFi frontends that need fiat on-ramps for users without existing crypto holdings
  • Apps onboarding cash-preferring or unbanked users who fund without a bank account or card
Cash-in funding, crypto-to-crypto sends, bank funding, and bank payouts all run on the OMS API today. Create a virtual account for inbound bank transfers with POST /virtual-accounts, and register the customer’s bank account for payouts with POST /external-accounts. In sandbox, simulate a bank deposit with POST /virtual-accounts/{virtualAccountId}/simulate/inbound-transfer and a cash deposit with the cash-in simulate/present-code and simulate/deposit-cash endpoints. The OMS API is in early access: request access for an API key.

How it works

On-ramp flow
1App→OMSPOST /cash-ins (cash) or POST /virtual-accounts (bank)
2OMS→AppCash-in code with estimated pricing, or bank account deposit instructions
3Customer→OMSDeposits cash with the code at a retail location, or sends a bank transfer to the account number
4OMSCreates a transaction automatically, converts the deposit to USDC, credits the wallet
5OMS→AppWebhook: transaction.statusChanged
Off-ramp flow
1App→OMSPOST /quotes (wallet source, bank destination)
2OMS→AppCash-in code with estimated pricing, or bank account deposit instructions
3Customer→OMSDeposits cash with the code at a retail location, or sends a bank transfer to the account number
4OMSPulls USDC from wallet, initiates ACH or wire transfer to the external account
5OMS→AppWebhook: transaction.statusChanged
Funding needs no quote. A cash-in or virtual account deposit creates its transaction automatically when the money arrives, and the cash-in shows estimated pricing up front. Moving money out uses the quote-then-execute flow: the source is the customer’s OMS wallet, and the quote locks the rate and fee breakdown for a short window before any money moves, so the customer sees exactly what they’ll receive. To move money out as a crypto-to-crypto send, run the same POST /quotes then POST /transactions flow: the source is the customer’s wallet and the destination is another wallet or an external blockchain address. Bank payouts follow the flow above, with the destination referencing an external account, registered with POST /external-accounts, by its ext_ identifier.

OMS resources


Implementation

Customer onboarding

Create customer records, collect KYC, and provision wallets.

Fiat to crypto

Fund wallets with cash-ins and bank deposits to virtual accounts.

Crypto to fiat

Quote and execute ACH or wire off-ramps.

Bank transfers

Full walkthrough of both funding and withdrawal flows.