LearnGuide

ECB reference rates, explained

A central bank reference rate is a published daily benchmark, not a tradable quote; this page explains the ECB's reference rates. Bank Indonesia publishes its own daily USD/IDR reference rate, JISDOR. The Bank of Japan publishes its own yen exchange rate statistics for the Tokyo market. exchangerate.dev does not serve either of those two; it serves ECB daily reference rates and live indicative rates.

9 Aug 2026 · 6 min read

When you call /v1/latest/USD and get back source: ecb_daily, you are reading the European Central Bank's euro foreign-exchange reference rate: published once per business day around 16:00 CET, intended for reference and information, not for transactions. This is the most authoritative daily FX figure for EUR pairs, but it is a single snapshot, the market keeps moving after 16:00 CET, and the fix does not update until the next business day.

  • The ECB publishes its euro reference rates once per business day, around 16:00 CET.
  • Sources: live, ecb_daily, market_daily (stored daily market-feed close for currencies without an ECB fix).
  • On weekends and public holidays, no new ECB fix is published. Historical responses for those dates carry is_forward_filled: true.
  • All rates are indicative, for reference and analytics only, not for settlement or dealing.
  • History goes back to 1999, the start of the ECB's EXR series.

What the ECB reference rate is

Every business day, the European Central Bank publishes a set of euro foreign-exchange reference rates. These are computed around 16:00 CET through a concertation process with central banks in and outside the European System of Central Banks. The rates represent a consensus mid-market figure at that moment and are intended for information and reference use only, as the ECB's own documentation makes clear.

They are widely used in financial contracts, accounting, and regulatory reporting across the EU because they come from a public institution and are published on a fixed, transparent schedule. When you see source: ecb_daily in an API response, that is exactly what you are reading.

Indicative, not for settlement

ECB reference rates are not dealing rates. They reflect a market consensus at a point in time. Every /v1/latest response that carries an ECB-sourced rate includes a notice field confirming this: "Indicative rates, not for settlement. Source: incl. ECB statistics."

Three source classes in the API

Every response from the API carries a source field that tells you which data class the rate comes from. There are three:

source valueecb_dailylive
ProviderEuropean Central BankIndicative spot rate
FrequencyOnce per business dayIntraday (~60s), trading week
Published~16:00 CET on weekdaysThrough the trading week
Between fixesPrior fix carried; market movement not capturedContinues updating through the trading week
Weekend / holidayNo new fix; prior value carriedInterbank closed; last spot rate carried
History availableBack to 1999Recent window
Suited forAccounting, reporting, audit trailReal-time display, pricing

Reading an ECB-sourced response

Request the latest rates for any base currency and check source to know what you are looking at:

bash · latest rates, EUR base
curl -s https://api.exchangerate.dev/v1/latest/EUR
json · response excerpt
{  "result": "success",  "base": "EUR",  "source": "ecb_daily",  "market_session": "open",  "timestamp": "2026-06-19T14:05:33Z",  "data_updated_at": "2026-06-19T14:00:00Z",  "rates": {    "USD": 1.14235,    "GBP": 0.86781,    "JPY": 184.320  },  "notice": "Indicative rates, not for settlement. Source: incl. ECB statistics."}

Two timestamp fields appear on every response. data_updated_at is when the underlying rate was last written to the data store. For ecb_daily this will be around 16:00 CET on the most recent business day. timestamp is when the API built the response. If you are caching responses, data_updated_at is the field to track for staleness.

That first request works without a key. When the call moves into a scheduled job or application, create a free key for account-attributed quota and keep it on the server.

Between fixes, weekends, and forward-fill

The ECB fix is a once-a-day snapshot. Between the ~16:00 CET publication and the following business day's fix, ecb_daily data does not update, any intraday or overnight market movement is not captured. The ECB also does not publish on weekends or public holidays, so a Saturday or Sunday request returns Friday's fix. The API handles non-publication dates with the is_forward_filled field:

bash · Basic or higher · historical weekend date
curl -s https://api.exchangerate.dev/v1/2026-06-13/USD \  -H "Authorization: Bearer exr_live_..."
json · forward-filled response
{  "result": "success",  "base": "USD",  "source": "ecb_daily",  "market_session": "weekend",  "is_forward_filled": true,  "rates": {    "EUR": 0.87531,    "GBP": 0.75945,    "JPY": 161.412  }}

When is_forward_filled is true, the rate in the response is the last published value carried forward from the prior business day. It is not a new observation. For many use cases (displaying a rate on a weekend, populating a chart) this is fine. For accounting or audit trails where you need to record whether a fix actually existed on a given date, you should check this flag.

Live rates update intraday, between fixes

The live source updates approximately every 60 seconds through the trading week, including between the ECB's daily fixes and overnight. If you need a rate that reflects where the market is right now rather than where it was at 16:00 CET yesterday, check whether the response carries source: live.

Checking source in Python

A common pattern is to read the rate and branch on source to decide how to present it:

python · source-aware rate fetch
import requestsAPI = "https://api.exchangerate.dev/v1"KEY = "exr_live_..."resp = requests.get(    f"{API}/latest/USD",    headers={"Authorization": f"Bearer {KEY}"},    timeout=10,)resp.raise_for_status()data = resp.json()rate = data["rates"]["EUR"]        # 0.87531source = data["source"]            # ecb_dailysession = data["market_session"]   # openif source == "ecb_daily":    print(f"ECB reference rate as of last business day: {rate}")elif source == "live":    print(f"Indicative spot rate ({session}): {rate}")else:    print(f"Rate ({source}): {rate}")

History back to 1999

The ECB started its EXR series when the euro was introduced. Plus and Pro expose this full history through the dated endpoint /v1/{date}/{base} and the range endpoint /v1/range. Both return is_forward_filled where applicable. Use a Basic or higher key for this recent example:

bash · weekly EUR/USD series
curl -s "https://api.exchangerate.dev/v1/range?base=EUR&symbols=USD&start_date=2026-06-10&end_date=2026-06-16" \  -H "Authorization: Bearer exr_live_..."

Note the parameter names: start_date and end_date (snake_case), and symbols as a comma-separated string. The range returns one row per published business day, each with its own source and is_forward_filled; weekend dates are not included as rows.

The ECB fix is one observation per business day. Live spot, forward-fill, and triangulated crosses are all context around that anchor.
See both fields on a live response

One request, no key: try /v1/latest/USD and read source and market_session on the real payload. When you need history and your own quota, the free key is 5,000 calls a month; no card.

Questions

What are ECB euro foreign-exchange reference rates?

They are official mid-market FX rates published by the European Central Bank once per business day, around 16:00 CET. They represent a consensus figure computed through a concertation process and are intended for reference and information only, not for transaction settlement.

Why does an API response sometimes show is_forward_filled: true?

The ECB does not publish rates on weekends or public holidays. When you request a historical date that falls on one of those days, the API carries forward the most recent published rate and sets is_forward_filled to true. The rate is not a new observation; it is the prior business day's value repeated.

What is the difference between ecb_daily and live in the source field?

ecb_daily is the European Central Bank's official reference fix, published once per business day around 16:00 CET. Between that publication and the next, the market keeps moving but ecb_daily does not update. live is an indicative spot rate that updates approximately every 60 seconds through the trading week. They serve different purposes: ecb_daily for accounting and audit trails that require a fixed official benchmark; live for real-time display and up-to-date indicative pricing.

How far back does ECB rate history go?

The ECB EXR series starts in 1999, when the euro was introduced. Plus and Pro can request dates from 1999 onward using /v1/{date}/{base}. Dates with no ECB publication (weekends, holidays) will carry is_forward_filled: true.

Keep reading

Start with a free API key

5,000 requests a month on the free plan. No credit card.

Get a free key