Open Exchange Rates alternatives, once the free plan hits USD-only
The free Open Exchange Rates plan gives you 1,000 requests a month, but every one of them is priced in USD. No conversion endpoint, no time series, no other base currency, until you pay $12 a month or more. Here is what that actually costs you, and four other places to look.
You can still build EUR/GBP or any other cross from a USD-base free plan. Fetch the USD rates, divide one by the other, and you have your cross. It works. It also means an extra request field to track, an extra division in your code, and a small compounding rounding error on the third decimal that most invoicing use cases will never notice and some reconciliation jobs will.
Where the free plan stops
Open Exchange Rates gives free-tier accounts 1,000 requests a month with hourly rate updates and daily historical data. The catch: every response comes back priced against USD, with no way to change that on the free plan. Ask for base=EUR and the API ignores it or errors, depending on the endpoint.
The free tier also excludes /convert and the time-series call entirely. Both are gated to paid plans, which start at $12 a month and unlock the base parameter outright, plus conversion and time series, for any number of base currencies at no extra charge.
The USD-base workaround, honestly
If you are stuck on the free plan and need a EUR/GBP rate, you do not need to pay yet. Every currency in the response is quoted against USD, so EUR/GBP is just rates.GBP / rates.EUR — you do the division the API would otherwise do for you.
Two things to budget for. Code: every non-USD pair now needs a division step and a guard against a missing or zero value. Rounding: dividing two already-rounded USD quotes introduces a small compounding error versus a rate fetched directly against that base — invisible for a dashboard, not for a reconciliation job checking figures to the fourth decimal.
/convert have no clean do-it-yourself substitute the way base currency does. Time series means looping a historical endpoint call per day, burning through the 1,000-request budget fast — a harder wall than the base-currency one.Four places to look instead
Frankfurter — free, open-source, no key, ECB only
Frankfurter wraps European Central Bank reference rates in a JSON API. No API key, no enforced quota, and it is open source. The trade-off is the data: ECB rates publish once per business day, around 16:00 CET, with no weekend data at all. If a once-daily fix on business days covers your use case, Frankfurter costs nothing and needs no signup.
ExchangeRate-API open access — free, no key, daily update
ExchangeRate-API runs a genuinely keyless endpoint at open.er-api.com. No signup, no API key. It updates once a day, the same freshness bucket as Frankfurter. Two conditions attach: visible attribution ("Rates By Exchange Rate API" linking to exchangerate-api.com) and no redistributing the raw data, though caching it is fine. Exceeding the limit returns an HTTP 429 that clears after 20 minutes; a keyed free tier above open access gives 1,500 requests a month.
Fixer — free, keyed, EUR-only, 100 calls
Fixer requires a key even on its free plan, and that plan is EUR-based only — every other base currency, plus conversion, is gated to the Basic tier and above. The quota is 100 calls a month, tighter than Open Exchange Rates by an order of magnitude. The free plan does include hourly updates, SSL, and full historical data.
exchangerate.dev — free, keyed, any base, intraday
The free tier here runs 465 pairs at 10,000 calls a month, 12 requests a minute, no credit card. There is no base-currency restriction on any tier — EUR base and USD base cost the same nothing — and full daily history back to 1999 is included free. Major pairs update roughly every 60 seconds on trading days; the rest are backed by ECB or FRED daily reference rates. Anonymous, keyless calls work too for quick evaluation, capped per IP.
Matching the plan to the job
A batch job that only needs a Monday-through-Friday closing rate has three free, no-signup options: Frankfurter, ExchangeRate-API open access, or the USD workaround above. A project that needs a Saturday rate, or the base parameter to just work, has to look past the ECB-only sources. Quoting live prices through the trading day needs a source that updates intraday.
The USD-base workaround is not a bug you have to route around forever — it is a division you can ship today and revisit once the rounding actually matters.