FX

Create a firm FX quote

Always firm — consumes one vendor quote and persists a Quote row. Pass an Idempotency-Key header to make retries safe (returns the original response on replay).

post/v1/fx/quotes

Headers

X-API-Keystring

API key

Idempotency-Keystring

Client-supplied key to deduplicate retries (e.g. on network timeout). Replays return the original quote rather than burning another vendor quote.

Request body

onBehalfOfstring required

Customer this quote is for (the customer who will deposit).

maxSlippageBpsnumber

Per-trade max slippage tolerance on the re-quote step, in basis points (1 bp = 0.01%). Minimum 5, maximum 1000. Optional for stable sources — if omitted, the organization-level default for the pair applies. REQUIRED for volatile sources (e.g. BTC): a quote whose source can move materially across the deposit-confirmation window is rejected when this is omitted, so the tolerance the customer accepts is always explicit.

Example request

{
  "onBehalfOf": "cus_abc123",
  "pair": {
    "sourceCurrency": "USDT",
    "sourceNetwork": "BASE",
    "sourceRail": "SEPA",
    "destinationCurrency": "USDC",
    "destinationNetwork": "BASE",
    "destinationRail": "SEPA"
  },
  "amount": {
    "value": "10000000",
    "side": "SOURCE"
  },
  "maxSlippageBps": 25
}

Response

Firm quote created.

idstring required
grossSourcestring required

Source amount, fees included, in source-currency minor units.

displayedDestinationstring required

Destination amount the customer will receive, in destination-currency minor units.

ratestring required

All-in customer rate (displayedDestination / grossSource).

expiresAtstring required

When the firm quote expires (ISO 8601).

quoteBinding'PERSISTED' | 'AT_ACCEPT'

How this quote binds to a later trade. PERSISTED: the firm price is held and a trade created from this quote replays it, so accepting later (within expiresAt) is safe. AT_ACCEPT: pricing is finalized when the trade is created, so the price may move between quote and accept.

Example response

{
  "id": "quote_abc123",
  "pair": {
    "sourceCurrency": "USDT",
    "sourceNetwork": "BASE",
    "sourceRail": "SEPA",
    "destinationCurrency": "USDC",
    "destinationNetwork": "BASE",
    "destinationRail": "SEPA"
  },
  "amount": {
    "value": "10000000",
    "side": "SOURCE"
  },
  "grossSource": "10000000",
  "displayedDestination": "9998500",
  "rate": "0.9998500",
  "expiresAt": "2026-05-26T19:42:00.000Z",
  "quoteBinding": "PERSISTED",
  "expectedDepositDetails": {
    "kind": "CRYPTO_ADDRESS",
    "address": "0xCustomerInfiniteTxWallet...",
    "network": "BASE",
    "note": "Deposit instructions become active only when the trade created by accepting this quote includes them — immediately on accept, or after the fx_trade.deposit_instructions_ready event if the trade starts in PENDING_WALLET_APPROVAL. Funds sent before then cannot be matched to a trade."
  }
}

Changes

No recorded changes to this endpoint across all 1 revision of this API.