Hit Fixer's 100-call limit? Here is the rest of the field
Fixer's free plan gives 100 calls a month, locks the base currency to EUR, and leaves out the conversion endpoint until you pay. None of that is hidden in fine print, but it surprises people who only read the headline "free tier" line. Here is what else is out there.
Two things catch developers on Fixer's free plan: the call budget runs out fast at 100 calls a month, and every rate comes back based off EUR because "any base currency" only unlocks at the BASIC paid tier and up. There is also no /convert endpoint until then, so converting USD to IDR means fetching EUR-based rates and doing the arithmetic yourself. Below is an honest look at what replaces Fixer, and what each replacement costs you instead.
The two walls on Fixer's free plan
A hundred calls a month works out to about three a day — fine for testing once, not for a live app checking even one pair daily. That call cap is the wall most people hit first.
The second wall: the free plan quotes everything from EUR. USD-to-IDR means fetching EUR rates for both currencies and dividing, since a non-EUR base and /convert both require the BASIC tier.
What replaces a 100-call, EUR-only plan
The right replacement depends on which wall mattered more. Few providers solve both for free.
Frankfurter: no cap, no key, once a day
If the call limit is what pushed you off Fixer and a once-daily rate is acceptable, Frankfurter removes the cap entirely. Open-source, no API key, ships its own MCP server at mcp.frankfurter.dev. It wraps ECB reference rates published around 16:00 CET on business days, with no weekend publication — Saturday returns Friday's close. For a report or nightly job that only needs one official rate a day, that closes both of Fixer's gaps at once.
ExchangeRate-API: also keyless, comes with attribution terms
ExchangeRate-API's open-access endpoint at open.er-api.com needs no signup, updating once a day like Frankfurter. The terms differ: show "Rates By Exchange Rate API" with a link back, and do not redistribute the raw response. Exceed the limit and get a 429 that clears in 20 minutes. A keyed tier exists too, at 1,500 requests a month.
Open Exchange Rates: ten times the calls, still one base
Open Exchange Rates raises the ceiling to 1,000 free requests a month, a real step up from Fixer's 100. But the free plan is fixed to USD rather than EUR, and time-series and conversion requests are excluded too. Paid plans start at $12 a month and remove the base restriction entirely.
exchangerate.host: same 100-call ceiling, now behind a key
Worth naming so nobody trades one wall for an identical one: exchangerate.host now runs behind an APILayer key, capped at 100 requests a month on the free plan — the exact number Fixer gives you. Moving from Fixer to exchangerate.host solves the EUR-base problem but not the call-count problem.
Where exchangerate.dev fits
exchangerate.dev's free tier gives 10,000 calls a month at 12 requests a minute, a hundred times Fixer's cap, with no card required to sign up. There is no base-currency restriction on any tier — any of the 465 pairs in the catalog can be queried from either side. Daily history back to 1999 is free on every plan, not gated behind an upgrade.
Major pairs update roughly every 60 seconds through the trading week, backed by ECB and FRED reference data for the rest. Each response includes source, market_session, and a notice field, so code can tell a live rate from a daily fix directly. A /v1/convert endpoint ships free, closing the gap Fixer leaves until BASIC.
No EUR intermediate step, no client-side multiplication. derived: false means the pair is quoted directly rather than triangulated through a third currency.
Notes on the actual migration
Swapping providers is rarely a one-line change. Response field names differ — some return rates, others nest the same numbers under quotes or conversion_rates — so a fixed key path can fail silently instead of erroring.
Retry logic matters more at a low call ceiling than a high one. Burning a monthly budget of 100 or 1,000 requests on an unthrottled retry loop after one timeout is a common way to run out of quota by the 10th of the month. Cache responses and treat any reset window as a hard constraint.
Matching the fix to the wall
If the call count was the problem, Frankfurter or ExchangeRate-API's open endpoint remove the cap for nothing. If the EUR base was the problem, Open Exchange Rates solves that gap at 1,000 calls. If both walls matter, that combination is what the keyed alternatives, including exchangerate.dev, are built around.