Coming from Frankfurter? Here is the mapping.
Frankfurter is a solid open-source project backed by ECB data. If you want an API key, weekend coverage, and freshness metadata, this guide shows exactly what changes.
The path structure differs, parameters are renamed, and some response fields are new. This is a re-point with small code edits, not a zero-change swap. Once you have the mapping, an afternoon is enough to update your integration.
/latest?from=USD, exchangerate.dev uses /v1/latest/USD./{start}..{end} becomes /v1/range?start_date=&end_date=.source and market_session on every response tell you exactly what kind of rate you have.is_forward_filled on history endpoints flags weekends and holidays where no fix was published.What changes and what you gain
Frankfurter is open-source and wraps European Central Bank reference data. It works well for weekday reference rates when you do not need a key. exchangerate.dev covers the same ECB series but adds live weekend rates (ECB does not publish on weekends), freshness metadata on every response, and a keyed tier for production quotas.
The core difference is that you move from a public no-auth API to a keyed one. You get a source field that distinguishes live spot from ECB or FRED daily fixes, a market_session field that says whether the FX day is open or in a weekend session, and is_forward_filled on historical calls that tells you when a prior value was carried because no fix was published.
Endpoint mapping
The table below covers the three Frankfurter endpoints most developers use. The operation is the same; the path, parameter names, and response shape change.
amount, base, and rates. exchangerate.dev returns result, base, rates, plus source, market_session, timestamp, and data_updated_at. If you read the response by key, update those references.Before and after code
Here is a typical Frankfurter call converted to exchangerate.dev. The structure is familiar; the differences are the base URL, the path layout, and the Authorization header.
The key differences: from becomes the last path segment, to becomes symbols, and Authorization: Bearer exr_live_... is added. You also receive source and market_session in the response without any extra work.
Migrating time-series calls
Frankfurter uses a double-dot range in the path: /{start}..{end}?from=USD. exchangerate.dev uses /v1/range with explicit start_date and end_date query parameters. The double-dot syntax is not supported.
New freshness fields
Every response from exchangerate.dev includes source and market_session. These do not exist in Frankfurter, so they are additive; you do not need to remove anything, but they are worth reading.
On a weekend date request, Frankfurter returns the Friday close. exchangerate.dev does the same for ecb_daily but sets is_forward_filled: true to say so explicitly. For live rates, market_session: weekend means the rate is being updated even though the ECB is not publishing.
notice field.