Most "free currency API" searches end the same way. You pick the first provider with a free plan, ship the integration, and a month later the app breaks because you hit a 100-request cap, or the rates turn out to be yesterday's ECB fixing, or the "free" plan needed a card and it just charged you.
I maintain one of these APIs (AllRatesToday), so treat the ranking with that in mind. But the comparison table below is the thing I wish I had found first, and the numbers in it are the ones on each provider's pricing page at the time of writing.
The four questions that matter
Before the table, the questions a free tier has to answer:
- How many requests, and per what? Per month, per day, or lifetime. Lifetime caps are fine for a prototype and a trap for anything scheduled.
- How fresh is the data? Many free tiers serve one daily fixing, usually the ECB's 16:00 CET table of about 30 currencies. That is fine for an invoice and useless for a price display.
- Is there a credit-card wall? Some providers put a card on the free plan so the upgrade is one click. Read the fine print about what happens at the cap.
- Where do the rates come from? Mid-market rates, a central bank's reference table, or a retail rate with a spread baked in. These differ by up to a few percent and you need to know which one you are showing.
Comparison table
| API | Free tier | Currencies | Update frequency on free | Card required |
|---|---|---|---|---|
| AllRatesToday | Free key, no card. Keyless open endpoint for official central-bank tables | 160+ | Real-time (60 s) with key | No |
| CurrencyFreaks | 1,000 req/month | 1,000+ incl. crypto | Daily | No |
| ExchangeRate-API | 1,500 req/month | 161 | Daily | For upgrades |
| Open Exchange Rates | 1,000 req/month | 200+ | Hourly | Yes |
| CurrencyLayer | 100 req/month | 168 | Daily | Yes |
| Fixer | 100 req/month | 170+ | Daily | Yes |
| CurrencyAPI | 300 req/month | 170+ | Daily | Yes |
| XE | Trial only | 170+ | Up to 60 s | Yes |
| Alpha Vantage | 25 req/day | Multi-asset | Daily | No |
| ExchangeRate.host | Free plan | 168+ | Daily | No |
| Frankfurter | Unlimited, keyless | ~30 (ECB) | Daily (ECB) | No |
| fawazahmed0/currency-api | Unlimited, static JSON on a CDN | 340 | Daily | No |
Two of those rows are not companies at all. Frankfurter is an open-source wrapper around the ECB table, and fawazahmed0's currency-api is a GitHub repo that republishes daily JSON files through jsDelivr. If daily ECB-style data is enough for you, start with one of those and skip the signup entirely. I benchmarked both every hour for a week alongside the commercial open endpoints; the static CDN file was the fastest thing in the test.
When a daily fixing is enough, and when it is not
Daily is enough for accounting, invoicing, customs and tax work. In fact for those you usually want a specific daily table, the one your tax authority or central bank publishes, not a market rate. That is a different product category, and it is why I keep the official tables on a separate keyless endpoint:
# ECB reference rate, no key, attribution required
curl "https://allratestoday.com/api/open/central-bank/ecb?source=EUR&target=USD"
{
"bank": "ecb",
"rate_date": "2026-09-25",
"source": "EUR",
"target": "USD",
"rate": 1.1403,
"rate_type": "reference",
"cadence": "daily",
"attribution": {
"source": "Official rates published by ECB, served by AllRatesToday",
"terms": "Free to use with visible attribution linking to allratestoday.com"
}
}
The same endpoint pattern works for the other central banks in the set: swap ecb for cbuae, boe, rbi, sbv and so on. GET /api/open/central-banks lists them.
Daily is not enough for a checkout, a pricing page in the visitor's currency, a trading dashboard or anything where the user compares your number with Google's. For that you want mid-market rates refreshed at least every minute, and every provider in the table charges for that except the ones that grant it on the free key.
Real-time on the free tier
With AllRatesToday the free key gets the same 60-second mid-market feed as the paid plans. Be aware that the free allowance is a fixed block of requests, not a monthly reset: it is there to build and test against real data, and a production price display that polls on a schedule belongs on a paid plan. Either way, one fetch per minute per base currency, cached server-side, is all a price display needs.
curl "https://allratestoday.com/api/v1/rates?source=USD&target=EUR" \
-H "Authorization: Bearer YOUR_API_KEY"
// Node 18+ / browser
const r = await fetch(
'https://allratestoday.com/api/v1/rates?source=USD&target=EUR',
{ headers: { Authorization: `Bearer ${process.env.ALLRATES_KEY}` } }
).then(res => res.json());
console.log(r.rate); // 0.8778
Historical dates, time series and CSV/XLSX output are on the same endpoints with date= and format= parameters. There are official SDKs for JavaScript, Python, PHP, Go and Rust if you prefer typed clients.
How to pick
- Prototype or side project: a keyless source. Frankfurter, the currency-api CDN files, or the open central-bank endpoint above. No account, nothing to expire.
- Price display, checkout, SaaS billing: a real-time mid-market feed with a free key and no card. Cache for 60 seconds.
- Accounting, tax, customs: the official table from the institution your rule names, not a market rate. Use the central-bank endpoints.
- Crypto plus fiat: CurrencyFreaks or CurrencyAPI cover the most symbols.
- Stocks and forex together: Alpha Vantage, with a very low free cap.
One thing every free tier has in common
None of them are meant to be called on every page view. Whatever you pick, put the rate behind a cache with a short TTL and fall back to the last good value when a fetch fails. That single habit turns a 100-request free plan into something you can actually ship on, and it is the difference between a demo and a product.
The full ranking with per-provider notes and an FAQ lives here: The best free currency exchange API in 2026.
Top comments (0)