Quote an exchange and lock its rate
/fx/quotesPrices selling sellAmount for buyCurrency and locks the rate until expiresAt (about 30 seconds).
Execute it with POST /fx/exchanges and quoteId — once: a quote is single-use. Nothing moves and nothing
is reserved; an unused quote simply lapses, so no Idempotency-Key is needed. Requires fx:write.
A crypto pair settles on an execution venue: its quote has rateLocked: false, the rate is indicative, and
the exchange fills at the venue's price.
Accounts: name sellAccountId / buyAccountId, or leave them out and your default account in that currency
(isDefault: true on GET /accounts) is used — or the only one, when you hold just one. None in the sell
currency is 400 no_account_for_currency, none in the buy currency 400 fx_target_account_not_found. A named
account in another currency is 400 fx_account_currency_mismatch; one that is not yours is 404 not_found.
Parameters
X-Request-IdstringheaderOptional client correlation id; echoed back unchanged.max length 128
Request body application/jsonrequired
sellAmountobjectrequiredWhat you sell. No more decimals than its currency has (and never more than 8).valuestringrequiredExample:
149.90pattern ^-?\d{1,18}(\.\d{1,18})?$
currencystringrequiredISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).Example:
EURpattern ^[A-Z0-9]{3,10}$
buyCurrencystringrequiredISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).Example:
EURpattern ^[A-Z0-9]{3,10}$
sellAccountIdstringOptional. Left out, your default account in the sell currency (isDefault) — or the only one.Example:
acc_AAAAAAAAAAcpattern ^acc_[A-Za-z0-9_-]{11}$
buyAccountIdstringOptional. Left out, your default account in the buy currency (isDefault) — or the only one.Example:
acc_AAAAAAAAAAcpattern ^acc_[A-Za-z0-9_-]{11}$
Responses
The quote.
Headers
X-Request-IdstringThe client'sX-Request-Idif supplied, otherwise a server-generated id. EqualstraceIdin problems.RateLimit-LimitintegerRateLimit-RemainingintegerRateLimit-ResetintegerSeconds until the window resets.
Schema application/json
objectstringrequiredAllowed values:
fx_quoteidstringrequiredSend asquoteIdtoPOST /fx/exchanges. Single use.sellMoneyrequiredDecimal amount as a string — never a float, never minor units. An amount you send may carry no more decimal places than its currency has (and never more than 8); trailing zeros do not count, so10.100 EURis fine and10.123 EURis400 validation_failedonamount.value.valuestringrequiredExample:
149.90pattern ^-?\d{1,18}(\.\d{1,18})?$
currencystringrequiredISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).Example:
EURpattern ^[A-Z0-9]{3,10}$
buyMoneyrequiredDecimal amount as a string — never a float, never minor units. An amount you send may carry no more decimal places than its currency has (and never more than 8); trailing zeros do not count, so10.100 EURis fine and10.123 EURis400 validation_failedonamount.value.valuestringrequiredExample:
149.90pattern ^-?\d{1,18}(\.\d{1,18})?$
currencystringrequiredISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).Example:
EURpattern ^[A-Z0-9]{3,10}$
ratestringrequiredUnits of the buy currency per unit of the sell currency, your spread applied:buy = sell × rate. A string, never a float.Example:
0.8612feeobjectrequiredCharged on top ofsell, in the sell currency.valuestringrequiredExample:
149.90pattern ^-?\d{1,18}(\.\d{1,18})?$
currencystringrequiredISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).Example:
EURpattern ^[A-Z0-9]{3,10}$
totalDebitedobjectrequiredWhat leaves the sell account:sell + fee.valuestringrequiredExample:
149.90pattern ^-?\d{1,18}(\.\d{1,18})?$
currencystringrequiredISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).Example:
EURpattern ^[A-Z0-9]{3,10}$
sellAccountIdstringrequiredOpaque account identifier. Treat as a string; never parse or construct it.Example:
acc_AAAAAAAAAAcpattern ^acc_[A-Za-z0-9_-]{11}$
buyAccountIdstringrequiredOpaque account identifier. Treat as a string; never parse or construct it.Example:
acc_AAAAAAAAAAcpattern ^acc_[A-Za-z0-9_-]{11}$
rateLockedbooleanrequiredTrue when the rate is held untilexpiresAt. False when it is not: crypto pairs fill at the venue's price, andrateis a guide.expiresAtstring (date-time)requiredRFC 3339, UTC, with millisecond precision.Example:
2026-09-18T10:15:30.123Z