Skip to main content
Some companies present prices in one currency and settle in another. When the company is configured to pass the currency spread on to the buyer, the buyer is charged more than the commercial price — and that final amount must be shown to them and confirmed before authorization. The hosted Checkout does this on its own. Everywhere else — the Payment Element, a direct API integration, your own payment page — the screen belongs to you, so the guarantee is contractual: you create a quote, display it, and pass its id when creating the transaction.
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 POST /v2/fx/quotes with the commercial amount, the currency you present to the buyer, and the payment method you will charge.
Amounts are integers in the currency’s smallest unit. 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.
Never:
  • 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.
The last two are not stylistic. An amount that changes after confirmation, or a markup that appears only once a method is chosen, changes what the charge legally is.
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, around submit:
Your backend forwards 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/quotes returns 422.