POST /transactions starts from a quote. A quote locks the amounts and fees for a short window, so the customer sees a guaranteed price before you commit.
You create a quote when the money starts in an OMS wallet (walletCrypto or walletFiat) or on a debit card (card). Transactions that virtual accounts, deposit addresses, and cash-ins create for you skip this step; see When quotes are not required.
Quote lifecycle
The window is short: 30 seconds by default, set per project, and never longer than the underlying provider will hold the price.
expiresAt on the quote is the deadline. Creating a transaction from an expired quote returns 422 QuoteExpired, and reusing an accepted quote returns 422 QuoteConsumed. Create the quote when the customer is ready to confirm, not when they open the screen.
Checks at quote time
OMS validates the whole route when you create the quote, so most problems surface before any money moves:- Unsupported pairs. A source and destination combination OMS cannot route is rejected with
422before a quote exists. The error’sdetails.supportedDestinationslists what the source can reach. - Customer readiness. A customer whose
cryptoCustodyendorsement is notactiveis refused with403 KYCRequiredon routes that need custody, even when the project does not require KYC. - Limits and corridor rules. Amount limits, rail availability, and cash pickup rules return their own
422errors.
What a quote contains
sourceanddestination: the two sides, echoed from the request with resolved instrument detail.pricing: the amounts on each side, every fee, the exchange rate, and gas sponsorship.sourceToDestination: the corridor, for examplecryptoToCrypto,cryptoToFiatAccount,cryptoToCash, orfiatAccountToFiatAccount.customerIdandcustomer: the customer the quote belongs to, with a display name.expiresAt: when the locked pricing expires.
Fee structure
Economics live in onepricing object. pricing.source.amount is the gross the customer pays, pricing.destination.amount is what arrives, and every fee is an entry in pricing.fees:
pricing.fees is always present and is [] when no fees apply. Only non-zero fees are listed. Known fee types are developer, oms, and gas; treat type as open and display unknown types rather than rejecting them.
Every amount is a decimal string at its asset’s precision: two decimals for usd and cad, and six for usdc and usdt. The same amount renders the same string in every response and webhook.
Developer fees are your margin on top of OMS fees. They appear as developer entries in pricing.fees. Contact your OMS account team to configure them.
Gas sponsorship
SetsponsorGas: true on the quote request to cover network gas for the customer’s onchain delivery. When OMS absorbs the gas, pricing.sponsorGas is true on the response; the field is left out otherwise. Sponsored gas does not appear in pricing.fees. sponsorGas is ignored when the destination has no onchain leg.
Fixed-amount quoting
Setamount on exactly one side of the quote request; OMS calculates the other. pricing.fixedAmountSide reports which side you fixed:
source: the customer sends an exact amount and the destination is calculated. “I want to send $100.”destination: the recipient receives an exact amount and the source is calculated. “My recipient gets exactly $100.”
When quotes are not required
Transactions that deposit addresses, virtual accounts, and cash-ins create for you skip the quote step. OMS prices them when the funds arrive, using the samepricing shape, but the price is not locked in advance.