One endpoint with one job: price an FX pair. That price becomes the LP_EXECUTION leg of whatever consumes it.
A quote isn't a transaction type. What you do with it decides that:
POST /v1/customers/{customerId}/conversions, where both sides are the customer's own balances, makes it aCONVERSION.POST /v1/customers/{customerId}/payouts/fiat, where value leaves, makes it aPAY_OUTwith the FX running as a leg inside it.- A pay-in never consumes a quote. The deposit intent's
indicativeRateis its price.
Setting the amount. Set fromAmount to fix what's debited, or toAmount to fix what lands. Sending both is a conflict, not a constraint.
Conditional fields. chain is required when either side is a stablecoin and must be omitted otherwise. rail is required when either side is fiat and must be omitted otherwise. Supplying a field the pair shape forbids is an error rather than an ignored value.
Why the rail is part of the price. (rail, currency) names the route being priced. (ACH, BOB) and (ACH, CLP) price separately, and (CHATS, USD) means USD delivered in Hong Kong. A quote that didn't know the rail could only return an average.
Par pairs, USD against USDC or USDT, are quotable at a rate of 1 with the fee table itemized, but a quote is never required for them.
A pair whose route isn't LIVE in GET /v1/countries/{country} fails with route_unsupported before anything is locked. Execute inside expiresAt, and re-quote rather than retry an expired one.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||

