Execute a transaction (send)
Executes a transfer by accepting an open quote. Reference the quote by its ID; OMS pulls funds from the quote’s source and delivers them to its destination. Pass an Idempotency-Key header to safely retry without sending twice.
Authorizations
Token from POST /auth/token
Headers
Required on POST and PUT requests. Use a unique value per logical mutation attempt, for example a UUID.
Body
Request body for executing a transaction. References the quote to accept; the remaining fields are optional routing hints and metadata.
The quote to accept (qt_ prefix). Must be open with non-expired pricing.
Device fingerprint of the end user, used for risk screening.
The registered debit card funding a buy or receiving a sell (ext_ prefix), as returned by POST /external-accounts/cards. Required when the quote is priced on the card rail: omitting it is rejected with 422 externalAccountRequired. Sending it on a quote priced on any other rail is rejected with 422 externalAccountRailMismatch.
Deprecated for cards — pass externalAccountId instead. A raw provider payment-method identifier, still forwarded as supplied on non-card flows and not validated against the quote; a card-rail quote requires externalAccountId regardless.
Your own transaction reference, for reconciliation.
External custody credit details, required for EXTERNAL settlement.
Expected sending address for crypto-funded transactions.
Free-form labels attached to the transaction.
Risk-session identifier generated client-side by the Sardine SDK (initialized with the customer's riskId). Required when the precursor quote's source or destination funding instrument is a card; ignored otherwise. Missing when required is rejected with 422 riskSessionRequired.
Free-form key-value pairs stored on the resource and echoed back on reads.
Response
The request has succeeded and a new resource has been created as a result.
A single movement of money from a source to a destination. Created by accepting a quote, or generated automatically by a deposit address, virtual account, or cash-in. Track its progress with status.
Transaction ID (txn_ prefix).
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Resource type discriminator. Always "transaction".
transaction Current lifecycle status. See subStatus for finer granularity.
processing, awaitingAction, completed, failed Status-scoped sub-state (e.g. processing.fundsPulled). Always present: each status carries a default member (e.g. processing.initiated) when no more specific value applies.
processing.fundsPulled, processing.cashPickupReady, processing.underReview, completed.cashPickupCollected, completed.cashPickupExpired, awaitingAction.awaitingSenderAttribution, awaitingAction.depositAddressFrozen, awaitingAction.depositAddressInactive, failed.attributionTimeout, failed.depositAddressFrozenTimeout, failed.depositAddressInactiveTimeout, failed.depositAddressClosed, processing.awaitingCryptoOut, processing.cryptoOut, processing.awaitingFiatOut, processing.fiatOut, processing.inboundPending, processing.inboundProcessing, failed.inboundFailed, failed.returnPending, failed.returnStarted, failed.returnComplete, failed.returnFailed, processing.initiated, awaitingAction.held, completed.settled, failed.unspecified, failed.expired, failed.providerDeclined, failed.outboundFailed The OMS customer that owns this record — the sender on a transaction (cst_ prefix).
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$What created this transaction, as a uniform {type, id} reference — dereference the resource by id for its full record. null for a genuine out-of-band arrival with no originating OMS resource at all (e.g. funds pushed directly to a wallet from outside OMS); the manual arm (id: null) is reserved for a future operator-initiated transaction, distinct from an out-of-band arrival.
The funding side: a typed instrument carrying identity and detail.
- OMS wallet
- External wallet
- Fiat wallet
- US bank account
- IBAN bank account
- Canadian bank account
- Card
- Cash
The receiving side: a typed instrument plus payoutOrigin.
- OMS wallet
- External wallet
- Fiat wallet
- US bank account
- IBAN bank account
- Canadian bank account
- Card
- Cash
Consolidated economics.
Every rail identifier assigned to this transaction — blockchain tx hashes and Fedwire/SWIFT references (uetr, imad, endToEndId, instructionId) today; ACH/cash rail references planned. Ordered oldest-first by leg; within one leg the entries follow a fixed scheme order, not the moment each identifier was assigned. A re-driven wire payout replaces its previous wire's identifiers in place rather than appending them. [] until the first identifier is assigned.
Corridor composite derived from the two sides.
cryptoToCrypto, cryptoToCash, cryptoToFiatAccount, cashToCrypto, fiatAccountToCrypto, fiatAccountToFiatAccount Display-safe summary of the owning customer (customer.id equals customerId) — lets a list row render without a second request.
Estimated completion time. Present when the destination rail has a predictable settlement time (e.g. bank payouts and some crypto legs); null otherwise.
Failure detail. Set when the transaction fails; includes refund or recovery state where applicable.
Present while status is awaitingAction; explains the hold + deadline. Populated when the hold model is wired.
- Sender attribution
- Deposit address frozen
- Deposit address inactive
Free-form key-value pairs supplied at creation or update.
When the transaction was created.
When the transaction was last updated.
Expiry of the transaction's actionable window: present on auto-created transactions and on cash payouts (the pickup-code expiry), and retained after completion for audit. Null for other quote-initiated transactions.
The owning project. Populated only on the cross-project admin endpoints (e.g. GET /admin/transactions/redrivable) so operators can tell which project a stranded transaction belongs to. Omitted on partner endpoints, where the project is implicit from the auth token.
^prj_.+$