Skip to main content
POST
Execute a transaction (send)

Authorizations

Authorization
string
header
required

Token from POST /auth/token

Headers

Idempotency-Key
string
required

Required on POST and PUT requests. Use a unique value per logical mutation attempt, for example a UUID.

Body

application/json

Request body for executing a transaction. References the quote to accept; the card and source wallet are taken from that quote. An external buy delivers to the quote's destination address when the destination is walletExternal, and otherwise to the customer's custody wallet on the destination chain; with no such address it is rejected with 422 ExternalDeliveryWalletRequired.

quoteId
string
required

The quote to accept (qt_ prefix). Must be open with non-expired pricing.

deviceFingerprint
string

Device fingerprint of the end user, used for risk screening.

webSessionId
string

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.

metadata
object

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.

id
string
required

Transaction ID (txn_ prefix).

Pattern: ^[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})$
object
enum<string>
required

Resource type discriminator. Always "transaction".

Available options:
transaction
status
enum<string>
required

Current lifecycle status. See subStatus for finer granularity.

Available options:
processing,
awaitingAction,
completed,
failed
subStatus
enum<string>
required

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.

Available options:
processing.fundsPulled,
processing.cashPickupReady,
processing.underReview,
completed.cashPickupCollected,
completed.cashPickupExpired,
awaitingAction.informationRequested,
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,
completed.settled,
failed.unspecified,
failed.expired,
failed.providerDeclined,
failed.outboundFailed
customerId
string
required

The OMS customer that owns this record — the sender on a transaction (cst_ prefix).

Pattern: ^[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})$
precursor
object | null
required

What created this transaction, as a uniform {type, id} reference — dereference the resource by id for its full record. A custodial-wallet deposit renders {type: walletDeposit, id: null}. null remains only for a genuine out-of-band arrival with no recognised origin at all; the manual arm (id: null) is reserved for a future operator-initiated transaction, distinct from either.

source
OMS wallet · object
required

The funding side: a typed instrument carrying identity and detail.

destination
OMS wallet · object
required

The receiving side: a typed instrument plus payoutOrigin.

pricing
object
required

Consolidated economics.

tracking
object[]
required

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.

sourceToDestination
enum<string>

Corridor composite derived from the two sides.

Available options:
cryptoToCrypto,
cryptoToCash,
cryptoToFiatAccount,
cashToCrypto,
fiatAccountToCrypto,
fiatAccountToFiatAccount
customer
object

Display-safe summary of the owning customer (customer.id equals customerId) — lets a list row render without a second request.

estimatedArrival
string<date-time>

Estimated completion time. Present when the destination rail has a predictable settlement time (e.g. bank payouts and some crypto legs); null otherwise.

error
object

Failure detail. Set when the transaction fails; includes refund or recovery state where applicable.

hold
Information requested · object

The hold blocking this transaction while status is awaitingAction. Retained after it clears, with resolvedAt set and required false, so the reason stays visible. Absent if the transaction has never been held.

metadata
object

Free-form key-value pairs supplied at creation or update.

createdAt
string<date-time>

When the transaction was created.

updatedAt
string<date-time>

When the transaction was last updated.

expiresAt
string<date-time>

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.

projectId
string

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.

Pattern: ^prj_.+$