This page only applies to companies configured for buyer-paid currency spread. If your company
absorbs the spread, nothing changes: keep creating transactions exactly as you do today.
The flow
1
Create the quote
Call Amounts are integers in the currency’s smallest unit.
POST /v2/fx/quotes with the commercial amount, the currency you present to the buyer, and the
payment method you will charge.Idempotency-Key is optional; repeating a call
with the same key returns the same quote instead of freezing a second rate.2
Show the buyer what they will pay
Before the buyer authorizes, your page must display:
- the final amount (
buyer_charged_amount), in the charged currency, as the prominent figure — it must equal what gets authorized; - the commercial amount (
presented_amount) and its currency, when different; - the applied rate (
base_rate) and the destination currency; - a neutral, consistent label.
- call it a tax, IOF, MDR, card fee, or network fee — it is none of those;
- present it as a choice the buyer makes;
- change the amount between confirmation and authorization;
- reveal the spread only after the buyer picks a payment method.
3
Create the transaction with the quote
Pass
fx_quote_id on POST /v2/transactions. The charge uses the rate frozen in the quote, not the
current one, so the buyer is authorized for exactly the amount they confirmed.amount stays the commercial amount — the same one you quoted. The buyer-facing total is derived
from the quote; sending it here would be quoting one figure and charging another.With the Payment Element
The Element tokenizes the card and handles 3DS; it never renders an amount. So the quote lives in your own flow, aroundsubmit:
fx_quote_id to POST /v2/transactions.
Errors
Notes
- Quotes are single-use and expire with the rate that produced them; expect to create one per checkout attempt.
- A quote belongs to one company. Quotes from another company return
404. - Same presented and wallet currency means there is no currency conversion, and
POST /v2/fx/quotesreturns422.

