ECB reference rates, explained
The European Central Bank publishes one official FX reference rate per business day. Here is what that means, how it differs from live spot data, and how to read it from the API.
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 moves only on weekdays when the ECB publishes.
source: ecb_daily, distinct from live (aggregated spot) and fred_daily (Federal Reserve daily series).is_forward_filled: true.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.
/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:
The third class, fred_daily, comes from the US Federal Reserve's daily series and is most relevant for USD pairs where the Federal Reserve publishes its own reference figures. It follows a similar cadence to ecb_daily: once per business day, with gaps on US public holidays.
Reading an ECB-sourced response
Request the latest rates for any base currency and check source to know what you are looking at:
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.
Weekends, holidays, and forward-fill
The ECB does not publish on weekends or on public holidays. That means if you request a historical date that falls on a Saturday, Sunday, or a recognised public holiday, no actual fix exists for that date. The API handles this with the is_forward_filled field:
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 source continues through Saturday and Sunday because spot FX does not fully stop. If you need a rate on a weekend and staleness matters, request a conversion endpoint and check whether the response carries source: live instead of a forward-filled reference rate.Checking source in Python
A common pattern is to read the rate and branch on source to decide how to present it:
History back to 1999
The ECB started its EXR series when the euro was introduced. The API exposes this full history through the dated endpoint /v1/{date}/{base} and the range endpoint /v1/range. Both return is_forward_filled where applicable. You can pull a time series for a specific currency pair across any window:
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.