Exchange Rates Scraper: ECB Official Rates
Pricing
from $0.50 / 1,000 rates
Exchange Rates Scraper: ECB Official Rates
Official European Central Bank reference rates for 30 currencies: latest, any historical date, or a full time series. The figure European accounting and tax rules cite. Weekends and holidays are flagged rather than silently filled. No key, no quota.
Pricing
from $0.50 / 1,000 rates
Rating
0.0
(0)
Developer
Daniel Meshulam
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Official European Central Bank reference rates. Latest, any historical date, or a full time series.
{ "mode": "latest", "baseCurrency": "USD", "targetCurrencies": ["EUR", "ILS", "GBP"] }
No key. No quota. No attribution string buried in the response.
Why ECB rates and not a "free FX API"
There are a dozen free FX services and they mostly aggregate from unnamed sources. ECB reference rates are published by a central bank, once per working day around 16:00 CET, and they are the figure European accounting and tax rules actually cite. If a number has to survive an audit, provenance is the feature.
Every row says so: source: "ECB reference rate".
The weekend problem, handled properly
The ECB publishes on working days only. Ask most FX APIs for a Sunday and they hand back Friday's number stamped with Sunday's date. That is a quiet fabrication, and it compounds when you build a time series out of it.
Here, date is always the date the ECB actually published. When that differs
from what you asked for, the row says so:
{"date": "2026-01-16","requestedDate": "2026-01-18","currency": "ILS","rate": 3.61,"note": "no rate published on the requested date (weekend or holiday); this is the previous working day"}
You can still use it. You just are not misled about what it is.
Three modes
{ "mode": "latest", "baseCurrency": "EUR" }
{ "mode": "range", "startDate": "2026-01-01", "endDate": "2026-06-30","baseCurrency": "USD", "targetCurrencies": ["ILS"] }
{ "mode": "dates", "specificDates": ["2026-01-15", "2026-04-01"],"baseCurrency": "USD" }
Leave targetCurrencies empty for all 30 currencies the ECB publishes.
Use cases
- Invoicing and accounting: the rate on the invoice date, from a citable source
- Multi-currency reporting: one row per date and currency, ready to join
- Backtesting: a full daily series in one run
- E-commerce pricing: scheduled daily refresh of your conversion table
- Expense and travel tools: historical rate on the transaction date
Pricing
Charged per rate returned. A date the ECB never published for, or a currency it
does not track, produces an error row and costs $0.00.
Three modes, and which one you want
Backed by the ECB's official daily reference rates, served through Frankfurter. No key, no quota, no sign-up.
mode | Returns | Use it for |
|---|---|---|
latest | today's rate for each target currency | a dashboard, an invoice, a price list |
range | every working day between startDate and endDate | charting a currency pair, backtesting |
dates | only the specific dates in specificDates | converting a list of historical transactions |
dates is the one people build badly by hand. Accounting exports carry a
transaction date each, and looking up one rate per date sequentially is a
request per row; this batches them.
All 30 currencies: EUR, USD, GBP, JPY, CHF, AUD, CAD, NZD, SEK, NOK, DKK, PLN, CZK, HUF, RON, TRY, ILS, INR, IDR, KRW, CNY, HKD, SGD, MYR, PHP, THB, ZAR, BRL, MXN, ISK.
BGN is not in that list any more: Bulgaria adopted the euro, so the ECB stopped publishing a lev reference rate.
History runs back to 1999, when the ECB series begins.
Set baseCurrency to anything in the list. The ECB quotes against EUR and any
other base is computed by exact division rather than a lossy round trip, so a
USD base is as accurate as a EUR one.
Notes
- Daily reference rates, not tick data. The ECB publishes once per working day around 16:00 CET. Do not price a live trade off this; that is not what these rates are.
- The ECB quotes against EUR. Any other base is computed by exact division server-side, so a USD base is not a lossy round trip.
- Coverage is the ~30 currencies in the ECB reference set, with history back to 1999.
FAQ
Do I need an API key or have I got a request quota?
No key, no quota. The ECB publishes its reference rates openly.
Which exchange rate should I use on an invoice?
For anything inside the EU, the ECB reference rate for the invoice date is the
figure European accounting and tax rules cite. That provenance is the reason to
use this rather than a free FX aggregator that does not name its source. Every row
carries source: "ECB reference rate".
What happens if I ask for a weekend or a holiday?
You get the previous working day's rate, and the row tells you so: date is when
the ECB actually published, requestedDate is what you asked for, and note
explains the difference. Most FX APIs hand back Friday's number stamped with
Sunday's date, which is a quiet fabrication that compounds across a time series.
Can I get a full historical series in one run?
Yes. mode: "range" with startDate and endDate returns one row per date and
currency. History goes back to 1999.
Can I use a base currency other than EUR?
Yes. The ECB quotes against EUR, and any other base is computed by exact division server-side, so a USD base is not a lossy round trip through two roundings.
Which currencies are covered?
The roughly 30 currencies in the ECB reference set. Leave targetCurrencies
empty to get all of them.
Can I use this for live trading?
No. These are daily reference rates published once per working day around 16:00 CET, not tick data. Do not price a live trade off them. That is not what they are.
How do I keep an e-commerce conversion table current?
Schedule mode: "latest" daily, shortly after 16:00 CET. That is when the day's
rates land.