POST /v2/quotes and you get back one or more priced options — no resource ids, no recipient, and no margin of your own. It answers “what would this cost” so you can show a customer a price before they commit.
A quote carries no margin of your own — Conduit’s rate and fees only. Apply your own margin when you create the order, not on the quote: see Redeem the option for which margin field a redemption accepts.
Test this flow in sandbox. Drive a conversion end-to-end with simulated
money first — start with the sandbox quickstart, then
conversion simulation — then apply the same request
shape to a quote.
Prerequisites
- Your API key.
- A source and destination asset pair enabled for your organization. An unpriceable pair returns
422 UNSUPPORTED_PAIR.
Step 1 — Price it
Sendsource, destination, lockSide, and amount. Two more things decide what you get back: whether source and destination name the same asset, and whether you include destinationCountry — the payout recipient’s domicile. There’s no separate mode field — these two signals discriminate three modes.
Conversion only
Different assets, nodestinationCountry. One option, with rail: null — there’s no payout leg to route.
Conversion and payout
Different assets plus adestinationCountry. One option per rail actually available: the domestic US rails (fedwire, rtp, fednow) are evaluated for a USA recipient regardless of what country you send, so they appear whenever the corridor otherwise supports them; swift is the one rail actually routed to the destinationCountry you send.
201 with options: [], not an error.
Withdrawal only
The same asset on both sides, plus adestinationCountry. One option per available rail, and rate: null on each — there’s no FX leg to price, only a rail fee:
destinationCountry returns 400 VALIDATION_ERROR — there’s nothing to price.
Step 2 — Read an option
Each entry inoptions[] prices one path. A conversion-only or payout-mode option is redeemable in Step 3; a withdrawal-mode option (rate: null) is preview-only — it prices a rail’s fee for a standalone payout, and redeeming it as an order returns 422 INVALID_ORDER_COMBO.
Step 3 — Redeem the option
Create the order withquoteOptionId instead of amount / lockSide — the order inherits both from the option, so sending either alongside quoteOptionId returns 400 VALIDATION_ERROR. A redemption also always names an explicit source (wallet or virtual account); sourceAsset (deposit funding) is refused alongside quoteOptionId, since there’s no funding window to check against the option’s locked rate. markupBps isn’t available on a redemption — it’s refused alongside quoteOptionId, since redemption never recomputes the option’s locked rate to fold a percentage into. For a percentage margin, create the order directly with amount / lockSide instead. markupAmount is available, but behaves differently here than on a fresh order: the option’s sourceAmount and destinationAmount are already locked and never recomputed, so markupAmount always adds to totalDebit — on both lock sides — rather than reducing the principal the way it would on a source-locked order created directly.
A payout-mode option needs autoPayout naming the recipient (quotes carry no recipient), and it’s subject to the same documentation and whitelist policy as a standalone payout — most purposes need at least one documents id:
- The option is single-use and short-lived.
expiresAtis about a minute out. - A payout-mode option’s
autoPayoutmust match what the option priced. Itsrailmust equal the option’s own, and — for a fiat payout — itsrecipient.postalAddress.countrymust equal thedestinationCountryyou quoted. - A withdrawal-mode option (
rate: null) can’t be redeemed as an order — it only informs a standalone payout. - Recipient-type pricing is rare, but possible. If a pricing rule scoped to this payout’s recipient type would have priced the option differently, redemption is refused rather than collecting the wrong amount. Create the order directly with
amount/lockSideinstead — pricing will resolve against the real recipient.
End-to-end
POST /v2/quotes— get backoptions[].- Show the customer a price from the option you want (its
endUserRate,recipientAmount,totalDebit). POST /v2/orderswith that option’squoteOptionId(plusautoPayoutfor a payout-mode option).- The order is created already priced at the quote’s locked rate — proceed exactly as you would for any other order:
POST /v2/orders/{orderId}/execute, orautoExecute: trueon create. See Convert crypto and Send a payout for what happens next.
See also
- Convert crypto — creating a conversion order directly, without a quote.
- Send a payout — the standalone payout endpoint a withdrawal-mode option informs, and the documentation/whitelist policy an
autoPayoutredemption shares. - Errors — the full
QUOTE_*error reference.