exchangerate.host alternatives, now that it requires a key
exchangerate.host used to answer requests with no signup at all. It is now operated by APILayer, and the free plan caps out at 100 requests a month behind a key. Here is what changed and where developers are moving.
If a script that ran fine for years suddenly returns 401s or a "quota exceeded" message, the cause is almost certainly this: exchangerate.host moved under APILayer, and what was a keyless, effectively unlimited endpoint now requires signup and gives you 100 requests a month on the free plan. Paid tiers start at $14.99/month for 10,000 requests. Below are the realistic options, including the case where you should stop looking and use the free one.
What actually changed
exchangerate.host built a reputation as the free, keyless option: no signup, just a GET request. That version is gone. It is now operated by APILayer, and every request needs an apikey header tied to an account.
The free plan allows 100 requests a month. For a project that used to make a few hundred calls a day, that ceiling arrives before the first week is out. Paid access starts at $14.99/mo for 10,000 requests.
If a once-daily ECB fix is all you need
Before comparing the paid options, weigh whether you need one at all. Frankfurter is open-source and requires no API key. It wraps European Central Bank reference rates, published once per business day around 16:00 CET, with no weekend data — Saturday shows Friday's close, and it now ships its own MCP server at mcp.frankfurter.dev.
For a dashboard, a report, or a batch job that only ever needs "today's official rate," that once-daily cadence may be enough on its own. A full migration guide with an endpoint mapping is linked below if you decide it is not.
The realistic alternatives, side by side
The field splits by what each free tier restricts: base currency, call count, or both.
ExchangeRate-API: keyless, but read the attribution terms
ExchangeRate-API runs an open-access endpoint at open.er-api.com needing no key, updating once a day like Frankfurter. But display "Rates By Exchange Rate API" with a link back, and do not redistribute the raw data. A hit rate limit returns a 429 that clears in 20 minutes. A keyed tier exists too, at 1,500 requests a month.
Open Exchange Rates: 1,000 requests, but pinned to USD
Open Exchange Rates gives 1,000 free requests a month with hourly updates and daily history included. The catch: the free plan is fixed to USD. IDR or GBP as the base means converting client-side, or paying $12/mo for any base plus time-series and conversion calls.
Fixer: 100 calls, EUR only, no conversion endpoint
Fixer's free plan allows 100 API calls a month with hourly updates and history included. The base currency is locked to EUR, with no conversion endpoint until BASIC — /convert?from=USD&to=IDR will not work, you fetch and multiply yourself.
Where exchangerate.dev sits in this
exchangerate.dev's free tier gives 10,000 calls a month at 12 requests a minute, with no card required to sign up. Anonymous keyless calls work too, for quick evaluation, capped per IP. There is no base-currency restriction on any tier — any of the 465 pairs in the catalog can be the base. Daily history back to 1999 is included free on every tier, not gated behind a paid plan.
Major pairs update roughly every 60 seconds through the trading week; most other pairs do too, with ECB and FRED reference rates filling in the rest. Every response carries source, market_session, timestamp, data_updated_at, and a notice field, so your code can tell a live spot rate from a daily fix without guessing off the clock. A keyed MCP server ships on every plan including Free, at the same quota as the REST API.
What actually breaks in the migration
Moving off a keyless endpoint touches more than the URL. Add an Authorization header or apikey parameter, since every option above except Frankfurter and the open-access ExchangeRate-API endpoint requires one. Field names are not standardized either, so a script reading rates.EUR off one API can silently break if the new provider nests the data differently.
Rate limits deserve retry logic, not a shrug. A free tier measured in the low hundreds per month means a single retry loop with no backoff can burn a day's budget in minutes. Cache aggressively and treat the monthly count as a hard ceiling.
Picking one
Match the restriction that affects your code. A once-daily ECB rate with zero setup: Frankfurter. Willing to add attribution text: ExchangeRate-API's open endpoint. Need a base other than USD or EUR, or intraday movement: that is the gap the keyed options, including exchangerate.dev, fill.