Guide/API concepts
Guide

Reading source and market_session in your pipeline

Every exchangerate.dev response carries two freshness signals — source and market_session. Together they tell you exactly what you are looking at without guessing.

MMexchangerate.dev·Jun 13, 2026·5 min read

Point-in-time data returns the value that was actually published as of a given timestamp, with no later revisions folded in. It is the difference between a backtest you can trust and one quietly contaminated by information the market did not yet have.

Key points
source tells you the quality class: "live", "ecb_daily", or "fred_daily".
market_session tells you whether you're in an active session, the weekend, or interbank-closed.
Both fields together let you decide whether to accept a rate or wait for a fresher one.

What "point-in-time" means

Most data providers serve you the current best estimate of a historical value. When a figure is revised — a GDP print restated, a settlement corrected — the old number silently disappears. Query last March today and you get March as it is understood now, not as it was understood in March.

A point-in-time store keeps every vintage. Ask for the value as_of=2026-03-14 and you receive exactly what a subscriber would have seen on that date, revisions excluded.

Why look-ahead bias ruins backtests

If your historical series contains values that were only knowable later, your strategy is implicitly trading on the future. Returns look spectacular in simulation and collapse in production. The bias is subtle precisely because the numbers are real — just not real yet.

The tell
A backtest that beats live trading by a wide, consistent margin almost always has a look-ahead leak. Point-in-time data closes the most common one.

How Console stamps every value

Every observation we store carries the timestamp it became public. Add an as_of parameter and the API replays the series as it stood on that date — no special endpoint, same envelope.

replay · point-in-timecopy
$ curl https://api.console.dev/v1/fx/eurusd?as_of=2026-03-14
# → the rate as published on 2026-03-14, not today's restatement

Naive vs point-in-time

QueryNaive storePoint-in-time
source=liveAssume intradaySpot consensus, all sessions
source=ecb_dailyAssume staleOfficial fix, published once/day
session=weekendAssume market closedLive spot continues on weekends

“If you cannot reproduce the number you traded on, you do not have a backtest — you have a story.”

Putting it together

Point-in-time is the default on every Console series — fx, metals, and power alike. You do not opt in; you opt out by omitting as_of to get the latest. Either way, every value names the feed and timestamp it came from, so the number is auditable end to end.

MM
exchangerate.dev
API concepts and integration guides.

Keep reading

GuideHow to backfill FX rates without look-ahead biasRead BlogWhat the ECB-based APIs missed last weekendRead GuideReading derived crosses and triangulation flagsRead