Skip to main content
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

TypeSourceDestination
fiatToCryptoCash (Cash-In) today; ACH to a virtual account (early access)Wallet (USDC/USDT)
cryptoToFiatWallet (USDC/USDT)Bank account or cash pickup (early access)
cryptoToCryptoWallet (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

StatusMeaning
processingExecuting. Funds are being pulled or converted.
completedFunds delivered to the destination.
failedAsync 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

OperationEndpoint
Create a quotePOST /quotes
Get a quoteGET /quotes/{quoteId}
Create a transactionPOST /transactions
Get a transactionGET /transactions/{transactionId}
List transactionsGET /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.