Reading source and market_session in your pipeline
Every exchangerate.dev response carries two freshness fields: source and market_session. Together they tell you exactly what you are looking at, and whether to accept that rate or wait for a fresher one.
Every call to /v1/latest, /v1/convert, or /v1/range returns a source field and a market_session field alongside the rate data. Read both before you act on a number. source tells you the quality class of the data; market_session tells you the state of the FX trading day when that data was captured.
source has three values: live (aggregated spot, updates intraday through the trading week), ecb_daily (European Central Bank reference fix, once per business day), or fred_daily (Federal Reserve daily series).market_session reports the state of the FX trading day: open, weekend, or interbank_closed.sources value is live.data_updated_at alongside source to see exactly when the underlying rate was last written.What each field contains
source classifies where the rate came from. ecb_daily means the European Central Bank reference fix, published once per business day around 16:00 CET. fred_daily means the Federal Reserve daily series. live means aggregated spot data that updates approximately every 60 seconds through the trading week.
market_session describes the state of the interbank trading week. It is open during the trading week, weekend from the Friday 17:00 New York close until Sunday 17:00 New York, or interbank_closed for a known non-weekend closure. It does not name Sydney, Tokyo, London, or New York sessions.
Reading both fields together
Neither field alone gives you the full picture. A rate with source: live and market_session: weekend means the interbank market is closed and the live field is carrying its last intraday consensus from the trading week, not a fresh weekend quote. A rate with source: ecb_daily and market_session: weekend means you have a reference fix that has not moved since Friday.
The example below reads both fields and logs a freshness decision. It calls /v1/latest/USD and checks whether the rate is from the live source before using it in a downstream calculation:
data_updated_at is when the underlying rate was last written. timestamp is when the response was built. For freshness decisions, read data_updated_at: it tells you the age of the rate itself, not the age of the HTTP response.Enforcing live-only data in your client
The API does not accept a source=live query filter. If your pipeline requires live spot, request only the symbols you need and reject any response whose per-currency sources value is not live. This keeps the freshness policy in your application and makes a daily-reference fallback explicit.
For a multi-symbol request, use the sources map rather than the top-level source: the top-level value reports the least-fresh class anywhere in the response. A single daily-reference currency can therefore make a mixed basket report ecb_daily even when the other symbols are live.
Weekend behavior by source
On weekends, the source field separates two situations. source: ecb_daily or source: fred_daily with market_session: weekend means the reference institution has not published since Friday, and the rate reflects Friday's fix. For source: live with market_session: weekend, the interbank market is closed — the last intraday consensus from the trading week is carried.
A weekend live response and a weekend ECB fix are both labeled weekend. On Monday, the live source resumes intraday updates; the ECB fix publishes at ~16:00 CET.
The notice field
Every response also carries a notice field. For live data it reads: "Indicative rates, not for settlement." For reference-rate data it adds attribution to the ECB. The notice is machine-readable so you can surface it to your own users if you display rates in a UI.
notice field on every response states this explicitly.