Frankfurter
Frankfurter
Free, open-source exchange-rate API: daily mid-market rates for 228 currencies (including legacy codes) from 106 central banks and official sources. No API key, no signup, no daily or monthly caps.
Frankfurter is a free, open-source (MIT) exchange-rate API at https://api.frankfurter.dev. It collects daily reference rates from 106 central banks and official sources and returns mid-market rates for 228 currencies, including legacy codes. No API key or signup, and no daily or monthly caps; Frankfurter rate-limits only to prevent abuse.
By default you get a blend across providers, which is Frankfurter's own calculation, not an official rate. It can shift slightly as new data arrives. Add providers=ECB (or another provider) to get one central bank's published series. The default blend starts on Jan 1, 1999. Bundesbank history goes back to 1948 for the US dollar, through 1998, via provider routes.
Terms: Frankfurter says its blended rates are free to use, including commercially, and that storing daily observations locally is encouraged. Provider-route data follows that provider's terms. The ECB allows free reuse, commercial or not, if you cite "Source: ECB statistics" and don't modify the statistics. The ECB says its reference rates are "for information purposes only". The old api.frankfurter.app host redirects to api.frankfurter.dev.
Coverage
Daily FX rates blended across 106 central banks and official sources (101 daily, plus a few weekly, monthly and quarterly sources that stay out of the blend), or pinned to one provider such as the European Central Bank (reference rates from Jan 4, 1999). The default blended feed starts Jan 1, 1999; Deutsche Bundesbank history on provider routes goes back to June 1948 for the dollar and 1949 for most dollar crosses (to 1998). Weekly and monthly downsampling, CSV and NDJSON output. Rates update once a day; the ECB publishes around 16:00 CET on working days.
Good for
- Converting multi-currency P&L, prices or fundamentals into one currency at daily rates for backtests and dashboards
- Building reproducible daily FX history for research by pinning one provider (e.g. providers=ECB), since the default blend can be revised
- Long-horizon FX research on Bretton Woods-era dollar rates from the Bundesbank archive (1948โ1998) via provider routes
Verdict
Free, keyless daily FX for converting, normalizing or backtesting at daily frequency, and Frankfurter says storing the data locally is encouraged. Not for intraday trading: Frankfurter says it "isn't built for live trading". The default blend is Frankfurter's own calculation and can shift slightly as new data comes in, so pin providers=ECB (or another single provider) for a series you need to reproduce. That also puts you under one provider's terms: the ECB allows free commercial and non-commercial reuse if you cite "Source: ECB statistics" and don't modify the data. No numeric rate limit is published.
Endpoints
| Endpoint | Returns |
|---|---|
/v2/rates | Latest, historical (date) or time-series (from/to) rates; base, quotes, providers, group=week|month; .csv or NDJSON |
/v2/rate/{base}/{quote} | Single currency pair, optional date or providers |
/v2/providers/{provider}/rates | Rates straight from one provider (e.g. ecb, boc, bbk) |
/v2/currencies | Available currencies with coverage dates (scope=all adds legacy codes) |
/v2/coverage | First and last dates the selected rates query can return |
Get the free weekly email
Free weekly email of newly verified free data. Unsubscribe by emailing us.
By entering your email and clicking Subscribe, you agree to receive the Signal Lab weekly email from Quantum Data Technologies Ltd., 3200-650 West Georgia Street, Vancouver, BC V6B 4P7, Canada (signal-lab@qdt.ai). You can unsubscribe at any time: reply "unsubscribe" to any email or write to signal-lab@qdt.ai. See our Privacy Policy.
Use in your agent
Load Frankfurter exchange rates into pandas and Parquet. Checked against the provider's documentation on Oct 29, 2026.
Access
- No API key or account.
Request
curl 'https://api.frankfurter.dev/v2/providers/ecb/rates?from=2026-10-20"es=usd,gbp'Format
JSON array of rows {date, base, quote, rate}, one row per date and currency (rate is a number). CSV with a .csv suffix and NDJSON with Accept: application/x-ndjson are also offered.
Load into pandas and Parquet
Needs Python 3 with requests, pandas and pyarrow.
"""Frankfurter (ECB reference rates via the ECB provider route) -> pandas -> Parquet. No key."""
import requests
import pandas as pd
r = requests.get("https://api.frankfurter.dev/v2/providers/ecb/rates",
params={"from": "2020-01-01", "quotes": "usd,gbp,jpy"}, timeout=60)
r.raise_for_status()
rows = r.json() # [{"date": "2026-10-20", "base": "EUR", "quote": "USD", "rate": 1.1215}, ...]
df = pd.DataFrame(rows)
df["date"] = pd.to_datetime(df["date"])
wide = df.pivot(index="date", columns="quote", values="rate").reset_index() # one column per currency
wide.to_parquet("frankfurter_ecb_eur.parquet", index=False)
print(len(df), "rows", len(wide), "dates", wide["date"].min().date(), "to", wide["date"].max().date())Run by us on 2026-10-29 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 5,253 rows (1,751 dates for USD, GBP and JPY against EUR), 2019-12-31 to 2026-10-29.
Limits
- No daily or monthly caps; requests are rate-limited to prevent abuse (no number published).
- For large date ranges, narrow the currencies with quotes, or request NDJSON to stream.
Quirks
- /v2/rates blends rates across providers by default; the snippet uses /v2/providers/ecb/rates for the ECB reference rates only.
- Observed 2026-10-29: the ECB route has business days only, while the blended /v2/rates answered for a Sunday (2026-10-25).
- Observed 2026-10-29: from=2020-01-01 started at 2019-12-31, the last ECB rate on or before that date.
- v1 is deprecated in favor of v2 but stays available.
Terms and attribution
- Frankfurter says the API is free for commercial use and that storing daily rates locally is encouraged.
- Frankfurter does not own the rates: direct provider routes (such as /v2/providers/ecb) stay subject to that provider's terms.
- Rates come as is, with no warranty, and can be late, missing or revised.
Sources
- https://frankfurter.dev/: โYou don't need an API key.โ
- https://frankfurter.dev/: โThere are no quotas. Requests are rate-limited to prevent abuse, but there are no monthly or daily caps.โ
- https://frankfurter.dev/: โDirect queries to individual provider endpoints remain subject to each provider's termsโ
- https://frankfurter.dev/: โStoring daily observations locally for caching or historical analytics is encouraged to keep API traffic light.โ
- https://frankfurter.dev/: โBy default, rates are blended across all providers.โ
- https://frankfurter.dev/license/: โFrankfurter doesn't own the rates, so it can't give you rights the provider doesn't.โ
- https://frankfurter.dev/license/: โRates can be late, missing, or revised.โ
Information and education only. Not financial, investment, legal or tax advice. Listings can be inaccurate, incomplete or out of date and are provided "as is". Free tiers, limits and licenses belong to each provider and can change, so check the provider's own terms before you rely on them. Terms & Disclaimer