Free Exchange Rate API: How to Choose One in 2026
If you search "free exchange rate API" you'll see a familiar lineup: Fixer, ExchangeRate-API, Open Exchange Rates, Frankfurter, and a few others. They look identical on the surface — JSON responses, similar tagline, "free plan available". They're not.
This is a practical breakdown of what actually differs in 2026, written by people who run XRates and so have spent more time than is healthy reading currency-API pricing pages.
What "free" actually means
The honest version of the question is: how much can you do on the free tier before you hit a wall? The answer varies by an order of magnitude.
| Provider | Free requests | Free HTTPS | Free base currency | Free historical |
|---|---|---|---|---|
| Fixer | 100/mo | ❌ HTTP only | ❌ EUR locked | ❌ |
| ExchangeRate-API | 1,500/mo | ✅ | ✅ | ❌ |
| Open Exchange Rates | 1,000/mo | ✅ | ❌ USD locked | ❌ |
| Frankfurter | unlimited | ✅ | ✅ | ✅ |
| XRates | 100/mo | ✅ | ✅ | ✅ |
Two things to notice. First, the request quota is the noisiest signal — Frankfurter is unlimited, ExchangeRate-API is 1,500, Fixer/XRates are 100. Second, the actually painful constraints are usually elsewhere: Fixer locking the free plan to HTTP-only and EUR-base means the free tier is unusable for anything client-side or for non-EUR users. Open Exchange Rates' USD lock is the same trap — you can't display GBP→EUR without paying.
Refresh rate: the spec nobody reads
The free quota number is on every pricing page. The refresh rate often isn't, and it matters more than people realise.
- ExchangeRate-API free: every 24 hours. Fine for a side project, useless for trading.
- Open Exchange Rates free: hourly.
- Fixer free: hourly.
- Frankfurter: every business day (it follows the ECB).
- XRates: every 4 hours, all plans, free included.
If you're displaying live FX in a dashboard and the data is a day old, your customers notice. If you're only showing rates for an invoice that was already issued, daily is plenty. Match the refresh rate to your actual use case before optimising request quota.
The hidden tax: authentication
Most free APIs use a key-in-URL pattern: https://api.example.com/latest?app_id=YOUR_KEY. It works, but it has costs:
- Keys leak into your server logs, Cloudflare logs, browser history, and
Refererheaders when you click out of the page. - Anyone watching network requests in DevTools sees the key.
- Rotating a key means updating every URL in your codebase.
XRates uses Bearer tokens via the Authorization header — same pattern as Stripe, GitHub, and basically everything modern. Marginally more code on the client side; significantly less risk of leaking the key. ExchangeRate-API and Open Exchange Rates put the key in the URL path or query string. Fixer too.
If you're building an app where the key sits on a server you control, this matters less. If your code ever runs in someone's browser — even briefly during dev — pick an API with header-based auth and avoid a class of bugs entirely.
Source transparency
Most APIs publish a list of "data sources" that's marketing copy ("we use trusted providers"). The interesting question is: when one source goes down, what happens?
- Fixer: ECB only. ECB doesn't publish on weekends. Your weekend data is whatever was published Friday.
- ExchangeRate-API / Open Exchange Rates: aggregated commercial feed (i.e., they don't say where it comes from). When the feed is wrong, you find out from a customer.
- Frankfurter: ECB, same caveats as Fixer.
- XRates: ECB, CBR, FloatRates, fawazahmed0 dataset, IMF — five sources with priority fallback, plus a public /status page showing per-source uptime. We covered this in Aggregating Exchange Rates from Six Sources.
For most apps, single-source is fine. For apps where rate freshness or accuracy is part of your value prop — invoicing, fintech dashboards, multi-currency e-commerce — multi-source is one of those investments that looks paranoid until the day a single upstream returns yesterday's numbers all day.
A reasonable decision tree
Pick the API that actually matches your situation, not the one with the biggest free quota.
- Quick prototype, will replace later → ExchangeRate-API. 1,500/mo free is plenty, no signup pain.
- Frontend code, key visible in browser → don't use a free tier of any of them. Move the calls server-side first.
- EU-only, business-day data is fine → Frankfurter. Free, unlimited, ECB-direct. No signup at all.
- Need historical or timeseries on free → XRates or Frankfurter. Both ship historical on the free plan; everyone else gates it.
- Production app with real money flowing through it → multi-source matters. XRates aggregates 5 sources; the alternative is layering Fixer + ExchangeRate-API yourself and writing the consensus logic.
- Already on Stripe / familiar with Bearer auth → XRates. Same auth pattern, same response shape.
A small benchmark
We ran 100 sequential latest requests against each provider from a Hetzner Falkenstein server in May 2026. Numbers in milliseconds, p50/p95.
| Provider | p50 | p95 |
|---|---|---|
| ExchangeRate-API | 142 | 312 |
| Open Exchange Rates | 168 | 390 |
| Fixer | 211 | 540 |
| Frankfurter | 89 | 204 |
| XRates | 76 | 188 |
Take this with the salt of a single benchmark from one location — your latency depends on where your servers are. Frankfurter and XRates do well partly because they cache aggressively and aren't routing through commercial CDN tiers tuned for paid plans first.
Where to next
If XRates is the right fit, the Free Exchange Rate API page covers the free tier in detail and the API documentation walks through every endpoint. The /compare/vs-fixer-io, vs-exchangerate-api and vs-openexchangerates pages have side-by-side feature tables if you want a more granular look.
If XRates isn't the right fit — that's fine, this is a tools-for-the-job situation. Use the decision tree above.