Skip to content
Create account
or
Sign in
The Stripe Docs logo
/
Ask AI
Create account
Sign in
Get started
Payments
Finance automation
Platforms and marketplaces
Money management
Developer tools
Get started
Payments
Finance automation
Get started
Payments
Finance automation
Platforms and marketplaces
Money management
Overview
About Stripe payments
    Overview
    Currencies
      Localise prices
        The FX Quotes API
      Settle in additional currencies
      Conversions on disputes and refunds
    Declines
    Payouts
    Recurring payments
    3D Secure authentication
    Refund and cancel payments
    Balances and settlement time
    Receipts
    Handle webhook events
Upgrade your integration
Payments analytics
Online payments
OverviewFind your use caseManaged Payments
Use Payment Links
Build a checkout page
Build an advanced integration
Build an in-app integration
Payment Methods
Add payment methods
Manage payment methods
Faster checkout with Link
Payment interfaces
Payment Links
Checkout
Web Elements
In-app Elements
Payment scenarios
Custom payment flows
Flexible acquiring
Orchestration
In-person payments
Terminal
Other Stripe products
Financial Connections
Crypto
Climate
HomePaymentsAbout Stripe paymentsCurrenciesLocalize prices

The FX Quotes APIPublic preview

Access real-time and locked exchange rates using the FX Quotes API.

Copy page

Available in Preview

Austria
Belgium
Bulgaria
Canada
Croatia
Cyprus
Czech Republic
Denmark
Estonia
Finland
France
Germany
Gibraltar
Greece
Hungary
Ireland
Italy
Latvia
Lithuania
Luxembourg
Malta
Netherlands
Norway
Poland
Portugal
Romania
Slovakia
Slovenia
Spain
Sweden
Switzerland
United Kingdom
United States

Displaying prices in a customer’s local currency improves conversion rates and payment authorisation rates. To convert currencies in an accurate and cost-effective way, you must account for:

  • The appropriate foreign currency amounts to display on your site before checkout.
  • The current exchange rates and foreign exchange (FX) fees for transactions.
  • The amount of money credited to your Stripe balance in your currency.
  • The frequency of exchange rate changes and when to update localised prices.

The FX Quotes API provides the following currency conversion capabilities:

  • Current exchange rates: Stripe’s current exchange rate for any given currency pair.
  • Extended exchange rate quotes: A 5 minute, 1 hour or 24 hour rate quote can be created to reduce the uncertainty from FX fluctuations.
  • FX fee information: Details about Stripe’s FX fees for your transactions, helping you estimate settlement amounts before payment costs.

Terms of use

Merchant Category Codes (MCC) restriction

Stripe doesn’t support the FX Quotes API for certain MCCs. Use the form at the bottom of this page to request access.

By using the FX Quotes API, you agree to the following Terms of Service:

  • The FX Quotes API is currently offered as a preview service. This means Stripe offers the service “as is” and disclaims all expressed or implied warranties and guarantees around this service. You’re relying on a preview service at your own risk and Stripe isn’t liable for losses, damages, or costs arising that relate to the accuracy of the preview service.
  • The FX Quotes API might provide you with a quote for a specific currency pair that’s valid for a period of time in the future. This is called an Extended Rate Quote. This quote isn’t an offer to enter into foreign exchange, and we can withdraw it at any time.
  • Use of the FX Quotes API and Extended Rate Quotes must be used as part of a commercial transaction of goods and services you sell on Stripe.
  • Extended Rate Quotes can help you manage general uncertainty in foreign exchange (FX) rates. You’re not permitted to selectively use Extended Rate Quotes in certain situations but not others. For example, you cannot only use Extended Rate Quotes in instances where the market FX rate is less favourable than the Extended Rate Quote.
  • Stripe might add or remove supported currencies from the FX Quotes API at any time, without notice.

Set up to use the FX Quotes API

If you’re using the SDK, refer to SDK versioning to add configurations to access preview features. If you call the API endpoints directly instead of using the SDK, specify a beta header along with your API version in the API call.

Below is a sample for Ruby. You can run the equivalent command for all SDKs in other languages.

gem install stripe -v 14.0.0-beta.1
Sample Ruby SDK
require 'stripe' Stripe.api_key =
sk_test_BQokikJOvBiI2HlWgH4olfQ2
Stripe.api_version = '2025-04-30.basil' Stripe.add_beta_version("fx_quote_preview", "v1")

Set the optimal localised price

Using the rates from the FX Quotes API, you can set your localised prices for other countries based on the price you charge customers in your home country. When finalising your localised prices, consider any local market pricing nuances and whether you want to round prices to the nearest whole number.

To ensure that you receive the same amount regardless of the currency your customer pays in, you can choose to pass Stripe’s FX fee to the customer. For example, imagine you’re a US-based merchant who wants to sell your 100 USD product in France. To calculate the equivalent price in EUR, use the exchange_rate parameter to pass the FX fee to the customer. If you don’t want to pass on this fee, use the base_rate parameter. The following example response shows a quote created to convert prices presented in the local currency, EUR, to your settlement currency, USD:

fx_quote.json
{ "id": "fxq_1R6BWhL05bA97JHQELB5EROs", "object": "fx_quote", "created": 1742824731, "lock_duration": "five_minutes", "lock_expires_at": 1742825031, "lock_status": "active", "to_currency": "usd", "rates": { "eur": { "exchange_rate": 1.06053, "rate_details": { "base_rate": 1.08295, "duration_premium": 0.0007, "fx_fee_rate": 0.02, "reference_rate": 1.0827, "reference_rate_provider": "ecb" } } }, "usage": { "payment": { "destination": null, "on_behalf_of": null }, "transfer": null, "type": "payment" } }

Using the above example, to pass on the FX fee to the customer, divide the product price (100 USD) by the exchange rate (1.06053) to get the price for your customers in France inclusive of the FX fee: 94.29 EUR. If you don’t want to pass on the FX fee, divide the product price (100 USD) by the base rate (1.08295) for the price excluding the FX fee: 92.34 EUR. Note that cross-border transactions also carry an international payment method fee, depending on the geography and payment method. See Stripe’s pricing page for more details.

Quote durations and rate changes

If you’re interested in a longer quote lock_duration, contact us using the form at the bottom of this page.

When you localise your pricing using exchange rate information provided by the FX Quotes API, you might want certainty around how long a given rate is valid. The FX Quotes API offers three time periods for lock_duration: five_minutes, hour, and day. This duration indicates that your transaction will be converted at the quoted exchange rate as long as you use the provided rate before it expires, as indicated by lock_expires_at.

The FX Quotes API also provides exchange rate information for the current live Stripe exchange rate. For this, set lock_duration to none.

When lock_duration is set to 5 minutes, an hour, or a day, the duration_premium field includes the fee charged for the extended rate quote. To determine the right lock duration, consider how regularly local prices are refreshed and how long a checkout session lasts.

Currency markets might experience volatility, affecting our ability to honour a given quote. An extended rate quote created for payments has a 3.5% rate threshold, and an extended rate quote for transfers has a 1% rate threshold. If an exchange rate exceeds these thresholds, the extended rate quote is invalidated, with lock_status changing to expired.

When you use an expired quote for a PaymentIntent or Transfer, you receive an error.code of either payment_intent_fx_quote_invalid or transfers_fx_quote_invalid. You can use these error codes to handle expired quotes.

Use locked exchange rates to localise prices

As an example, if you’re a UK-based merchant that localises prices for US customers, and you want to receive 100 GBP regardless of changes in the USD-GBP exchange rate. In this scenario, we recommend fetching an extended rate quote with a lock_duration of hour:

Command Line
cURL
curl https://api.stripe.com/v1/fx_quotes \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-04-30.basil; fx_quote_preview=v1" \ -d to_currency=gbp \ -d "from_currencies[]"=usd \ -d lock_duration=day

European Central Bank reference rates

If you want to show the European Central Bank’s exchange rates as a reference, the FX Quotes object contains all of the rates that the European Central Bank supports.

If the latest exchange rate for USD is, for example, 0.8, divide your price (100 GBP) by the exchange rate (0.8) to calculate your localised price: 125 USD. Because this exchange rate is locked for the next hour, you can show 125 USD to your US customers, from your site to the checkout page.

You can pass your US price 125 USD into the Payment Intents API to make the payment using the fx_quote parameter:

Command Line
cURL
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-04-30.basil; fx_quote_preview=v1" \ -d amount=125 \ -d currency=usd \ -d fx_quote=fxq_1QBck4FTKRd55CNDdboZYz9g

Handle minor units

Disputes and Refunds

Stripe converts disputed or refunded payments back to the presentment currency at the current exchange rate, instead of at the previous rate.

All API requests expect amount values in the currency’s minor unit. After using the rates provided by the FX Quotes API, convert the resulting converted amount into Stripe’s minor units. See Minor units in API amounts and Zero-decimal currenciesfor more details.

Handle quote expiry

Stripe sends an fx_quote.expired webhook when a quote becomes invalid due to expiry or significant rate drifts. Attaching an already expired FX Quote object to the PaymentIntent API or Transfer API returns a 400 status code. We recommend subscribing to the fx_quote.expired webhook event and creating a new extended rate quote after receiving the event so that localised prices can be updated based on the new FX Quote object.

Mid-market rate fallback

Some non-card payment methods take longer to process payments than a 24-hour locking period covers. For these payments, the extended rate quote might expire or become unusable due to significant mid-market rate changes. In these cases, we use the mid-market rate to process the payment.

Pricing

We don’t charge for extended rate quotes with a lock duration of none. When lock_duration is set to five_minutes, hour, or day, Stripe charges a fee to cover the risk and cost incurred. This fee is shown in the duration_premium field and is added to the base_rate to calculate the exchange_rate.

The exact fee depends on the lock_duration, and the currency pair used for the currency conversion. Refer to the table below to calculate the fee for an extended rate quote. If you’re converting from a currency in Group 2 to a currency in Group 1 (or vice versa), the fee listed for Group 2 will be used. For example, a USD-KRW currency pair with a 1-hour duration will have a 0.15% fee because KRW is in Group 2. If both currencies are in the same group, the fee for that group is applied.

The FX Quote API only supports the currencies in the following two groups:

Group5 minutes1 hour24 hours
Group 1: aed, aud, awg, bbd, bgn, bhd, bmd, bsd, cad, chf, dkk, eur, gbp, hkd, idr, inr, jod, jpy, kwd, myr, nzd, omr, pab, ron, sar, sek, sgd, thb, usd, xcd, yer0.07%0.10%0.20%
Group 2: afn, all, amd, ang, aoa, azn, bam, bdt, bif, bnd, bob, brl, bwp, bzd, clp, cny, cop, crc, cve, czk, djf, dop, dzd, fkp, gel, gip, gmd, gnf, gtq, gyd, hnl, htg, huf, ils, isk, jmd, kes, kgs, khr, krw, kyd, kzt, lkr, lrd, mad, mdl, mga, mkd, mnt, mop, mur, mvr, mxn, mzn, nad, nok, npr, pen, php, pkr, pln, pyg, qar, rsd, rwf, shp, std, tjs, tnd, try, ttd, twd, tzs, uah, ugx, uyu, uzs, vnd, xaf, xof, xpf, zar, zmw0.12%0.15%0.30%
Was this page helpful?
YesNo
Need help? Contact Support.
Join our early access programme.
Check out our changelog.
Questions? Contact Sales.
LLM? Read llms.txt.
Powered by Markdoc