Skip to main content
Every OMS integration is built from a small set of resources. The API-managed resources are Customers, Wallets (custodial), Quotes, Transactions, Cash-ins, and Webhooks. Understanding the relationships between them is the fastest way to design a correct integration. Deposit Addresses, Virtual Accounts, and External Accounts appear as concepts that transactions reference, but they are not yet available in the OMS API. They are available through early access.

The entity model

Customer
├── Wallets          (custodial stablecoin balances, created and listed under the customer)
└── referenced by Transactions:
    ├── Virtual Accounts   (persistent bank account numbers, early access)
    ├── Deposit Addresses  (persistent onchain addresses, early access)
    └── External Accounts  (registered bank accounts / debit cards, early access)

Quote  →  Transaction
           ├── fiatToCrypto
           ├── cryptoToFiat
           └── cryptoToCrypto

Cash-in  (code-based cash deposit → auto-creates Transaction)

Webhooks  (API-managed subscriptions, full CRUD)
All financial operations belong to a Customer. A customer has zero or more wallets. Quotes and transactions are also scoped to a customer. Webhook subscriptions are managed through the API independently of any customer.
Deposit Addresses, Virtual Accounts, and External Accounts are not yet available in the OMS API. To be notified when they launch, register your interest.

Register interest

Share your use case and we’ll reach out when these resources are available.

Customers

A customer is an identity record. Before a customer can move money, OMS must grant endorsements that unlock specific capabilities.
EndorsementUnlocks
basicStandard operations
cryptoCustodyCrypto custody and advanced features
usdUSD stablecoin operations
Customers are created via POST /customers. Endorsements are granted after KYC/KYB verification, delivered via the customer.endorsement.granted webhook.

Wallets

The Payments API wallet resource is custodial: OMS manages the keys, and they never leave OMS infrastructure. Wallets hold stablecoin balances (USDC by default) and are the source or destination for all transactions. Wallets are created and listed under the customer: POST /customers/{id}/wallets (body specifies asset and chain) and GET /customers/{id}/wallets. Each wallet holds a single asset on one chain and has an onchain address. GET /wallets/{id}/balance returns that wallet’s current balance for its asset and chain. For user-controlled keys (onchain consumer apps, agentic flows), use OMS non-custodial wallets. The two models can be combined.

Virtual accounts

A dedicated bank account number assigned to a customer. When fiat arrives via ACH, OMS automatically creates a fiatToCrypto transaction and delivers USDC to the customer’s wallet. Virtual accounts are not yet available in the OMS API; they are available through early access.

Deposit addresses

A persistent onchain address. When crypto arrives, OMS automatically creates and executes a transaction. Deposit addresses are not yet available in the OMS API; they are available through early access.

External accounts

A customer’s registered bank account or debit card. External accounts are referenced as the source for on-ramps or the destination for off-ramps using an ID provisioned through early access. ID prefixes: pmCard_ (debit cards), cpUsBank_ (US banks), cpIntlBank_ (international banks), cpBcAddr_ (blockchain addresses).

Quotes and transactions

The two-step flow for most money movement:
  1. POST /quotes: lock pricing, return full fee breakdown
  2. POST /transactions: execute against the locked quote
Quotes expire if not used within the validity window. The fixedAmountSide field indicates which side of the trade was specified.

Cash-ins

A code-based deposit flow for in-person cash at retail locations. Creates a deposit code the customer presents at a partner location. OMS converts the deposited cash to USDC and auto-creates a transaction. No upfront amount is required.

Webhooks

API-managed event subscriptions with full CRUD. Register a subscription endpoint and OMS delivers events (such as transaction.fiatToCrypto.completed and customer.endorsement.granted) as state changes occur. Subscriptions are created, listed, updated, and deleted through the API rather than only in the dashboard.
Virtual accounts, deposit addresses, and cash-ins all bypass the quote step. They go directly to processing because OMS cannot lock pricing before the funds arrive.