A transaction moves money through OMS. The type is inferred from the asset pair, you specify a source and destination, and OMS determines whether the operation is fiatToCrypto, cryptoToFiat, or cryptoToCrypto.
Standard sends and payouts follow a two-step flow: create a quote to lock pricing, then create a transaction to execute it. Cash-in and auto-created transactions (virtual accounts, deposit addresses) skip the quote step.
Transaction types
| Type | Source | Destination |
|---|
fiatToCrypto | Cash (Cash-In) today; ACH to a virtual account (early access) | Wallet (USDC/USDT) |
cryptoToFiat | Wallet (USDC/USDT) | Bank account or cash pickup (early access) |
cryptoToCrypto | Wallet (USDC/USDT) | Wallet or external on-chain address |
Two-step flow
POST /quotes → quote in "open" status (rate locked)
│
POST /transactions → transaction in "processing"
│
completed | failed
The quote locks the exchange rate and fee breakdown for a short validity window. If the quote expires before you create the transaction, create a new quote.
Quote object
{
"id": "qt_...",
"object": "quote",
"type": "cryptoToCrypto",
"status": "open",
"source": {
"walletId": "wlt_...",
"asset": "usdc",
"network": "polygon",
"amountGross": "100.00",
"amountNet": "99.42",
"feesDeducted": { "total": "0.58", "developer": "0.20", "oms": "0.35", "gas": "0.03" }
},
"destination": {
"wallet": { "blockchainAddress": "0x..." },
"asset": "usdc",
"network": "polygon",
"amountGross": "99.42",
"amountNet": "99.42"
},
"rates": {
"exchangeRate": "1.0",
"effectiveRate": "0.9942"
},
"fixedAmountSide": "source",
"expiresAt": "2025-01-15T10:35:00Z"
}
Set fixedAmountSide to "source" when the user specifies how much to send, or "destination" when the user specifies how much to receive.
A quote’s source is always an OMS wallet, referenced by walletId. The destination.wallet can target another OMS wallet (id), an external on-chain address (blockchainAddress), or a saved external account such as a bank (externalAccount, early access).
Transaction statuses
| Status | Meaning |
|---|
processing | Executing. Funds are being pulled or converted. |
completed | Funds delivered to the destination. |
failed | Async failure. The error object describes the cause. |
OMS fires a webhook on every status change. Event names follow the pattern transaction.{type}.{event}: for example, transaction.fiatToCrypto.completed.
Developer fees
Developer fees are configurable per integration and are never shown to the end user. Set them on your OMS account or pass them in the quote request. They appear in the feesDeducted.developer field on both the source and destination sides of the quote.
Key operations
| Operation | Endpoint |
|---|
| Create a quote | POST /quotes |
| Get a quote | GET /quotes/{quoteId} |
| Create a transaction | POST /transactions |
| Get a transaction | GET /transactions/{transactionId} |
| List transactions | GET /transactions |
All POST endpoints accept an Idempotency-Key header. Use a stable key tied to your internal order ID to safely retry on network failure without risk of double-execution.