sourceToDestination. There is no settable transaction “type”.
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.
Direction (sourceToDestination)
The sourceToDestination field is a composite of the source and destination instrument categories, inferred from each side:
Two-step flow
POST /transactions with a body of { "quoteId": "qt_..." }. If the quote expires before you create the transaction, create a new quote.
Quote object
pricing.fixedAmountSide to "source" when the user specifies how much to send, or "destination" when the user specifies how much to receive.
The source and destination are typed instruments discriminated by type: an OMS wallet (walletCrypto), an externally-custodied wallet (walletExternal), a bank account (bankUs, bankIban, bankCanada), a debit card (card), or cash pickup (cash). Each instrument carries the reference fields (id, asset, network) directly, alongside type, category, and displayName. The one exception is an unregistered external party, where id is null and a small details object carries either blockchainAddress (crypto) or accountNumberLast4 and bankName (fiat).
Party, precursor, and payout origin
Transaction and quote responses carry three flat reference objects that identify who is on each side, what created the transaction, and which of your resources funded the payout:
Dereference the referenced resource by
id to retrieve richer detail. Bank account numbers, routing numbers, and BICs are not returned on payoutOrigin; read them from the funding virtual account or external account directly. Cash payouts render the pickupCode at the destination top level (a sibling of payoutOrigin), not inside the instrument.
Instrument display name
Every source and destination instrument carries adisplayName: an opaque, ready-to-render label for the value being moved. The field is always present and is the value you should show in receipts, tables, and confirmation UIs; do not compose your own from other instrument fields.
The value is derived server-side from the stored data on each instrument. Format is deliberately unversioned: OMS may refine the rendering without changing the schema, so treat it as an opaque string.
Customer summary on a transaction
Transactions carry acustomer summary that resolves the transaction’s customer in one hop:
GET /transactions/{transactionId}, in POST /transactions responses, and on every entry of GET /transactions. Names on a list response resolve from the same request context, so listing a page of transactions from the same customer does not multiply the underlying customer read. The same customer shape appears on virtual accounts and deposit addresses; external accounts carry the same field plus a bare ownerDisplayName for the owning customer or counterparty.
Transaction statuses
OMS fires
transaction.statusChanged on every status change, so your handler branches on the transaction’s status field rather than parsing an event-name string. Subscribe with the Webhooks endpoints (POST /webhooks with a body of { url, subscriptions }; pass ["*"] for all partner-visible events) or in the OMS Dashboard. See the transaction lifecycle for the delivery model.
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 thefeesDeducted.developer field on both the source and destination sides of the pricing object.
Key operations
GET /transactions returns results newest-first and filters by status, sourceToDestination, customerId, the originating instrument (walletId, virtualAccountId, depositAddressId, cashInId), and inclusive createdAfter/createdBefore date bounds. Pagination uses limit, startingAfter, and endingBefore.
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.Related
- Fiat to crypto guide: cash-in and virtual-account funding
- Send from a wallet guide: crypto sends and bank payouts
- Bank transfers guide: ACH and wire transfer details