Frankfurter vs ExchangeRate-API: the two free, no-key options compared
Both let you make a request right now with no signup and no key. Past that, they diverge: one is open-source ECB data with no quota, the other is a commercial API giving away a limited, attributed slice of its feed. Neither is wrong. They fit different jobs.
Frankfurter has no quota at all but publishes once a day, only on business days, from the European Central Bank. ExchangeRate-API's open access also needs no key, updates once a day too, but comes with an attribution requirement and a ban on redistributing the raw data. Pick by what your project does with the data, not by which name is more familiar.
What both get you, for nothing
Type a curl command against either service right now and you get JSON back. No signup form, no key generation step, no credit card — rarer than it should be in this space, and why both show up on every "free FX API" list.
Past that first request, they stop resembling each other. Frankfurter is a standalone open-source project publishing European Central Bank reference rates. ExchangeRate-API is a commercial product with paid tiers, and open.er-api.com is the free, unauthenticated slice of that product — a funnel, roomier than usual because the company sells the keyed tiers above it.
Frankfurter: no key, no quota, ECB only
Frankfurter wraps ECB reference rates in a clean JSON API. There is no API key at any tier, and no enforced request quota — the project does not meter you. It is open source, so the code is inspectable before pointing production traffic at it.
The constraint is the underlying data, not the API wrapper. ECB reference rates publish once per business day, at roughly 16:00 CET, with nothing published at all on Saturday or Sunday — request a weekend date and you get the prior Friday's fix, because the ECB itself did not publish one.
ExchangeRate-API: no key, one attribution string, one restriction
The open-access endpoint at open.er-api.com needs no API key either — call it the same way you'd call Frankfurter, cold, no setup. It updates once a day, same cadence as Frankfurter, though not ECB-sourced.
Two conditions come with it: attribution, displaying "Rates By Exchange Rate API" with a link back to exchangerate-api.com, and no redistribution — you cannot republish the raw feed, though caching for your own app is allowed. Exceed the rate limit and you get an HTTP 429; the block lifts after 20 minutes. A keyed plan without the attribution requirement gives 1,500 requests a month.
Side by side
Which one for which job
An internal dashboard has no attribution surface to satisfy anyway, so ExchangeRate-API's condition is moot and either source works. Pick based on whether you want to inspect the code (Frankfurter) or want a keyed upgrade path ready if traffic grows (ExchangeRate-API).
If the surface is public — a currency converter, a price widget on a product page — the attribution line starts to matter. Frankfurter carries no such obligation. Where a visible attribution link is a non-issue for your product, ExchangeRate-API's open access is just as usable.
Read the fine print before pointing a high-volume cron job at either one. Frankfurter states no enforced quota, which sounds unlimited but is not a documented SLA. ExchangeRate-API is explicit about its ceiling — hit the limit, get a 429, wait 20 minutes.
Weekends expose the ECB-only sourcing most plainly. Picture a Saturday travel-booking flow that needs a rate rendered, not a five-day-old placeholder — no ECB fix means no fresh number, any day the market is closed in Frankfurt.
If neither fits
Both are once-a-day snapshots by design, and for a large share of FX use cases — invoicing, accounting exports, a weekly report — that is the right amount of freshness. If your project needs a rate that reflects what changed an hour ago, that is a different category of source, and exchangerate.dev is one option: a keyed API with a live-updating source on major pairs. It is not a substitute for either on their own terms — it is the option once intraday freshness becomes the actual requirement.