Finance.Foundation
finance.foundation / Research / The Shape of "Live" Data
Research · Data · 2026-09

The Shape of "Live" Data

Finance Foundation's /api/v1/live endpoint serves 29 series — cryptocurrency prices, FX crosses, sovereign bond yields, central-bank policy rates, and macro indicators like GDP growth and unemployment — under a single 'live' label, polled on a fixed three-hour cycle. But each series also carries its own value date, its own retrieved_at timestamp, its own source and provider, and its own from_fallback flag, and reading across all 29 at once shows that a fixed polling cadence has almost nothing to do with how current the underlying number actually is.

The freshest tier is priced continuously: all nine crypto series (bitcoin, ether, BNB, XRP, Cardano's ADA, Solana, and the stablecoins DAI, USDC and USDT) carry a value dated the same calendar day they were retrieved. Nine FX crosses sourced from the ECB's daily reference rates, plus the US 10-year Treasury yield from the Treasury's daily par curve, sit one tier back — dated the prior business day, because both publishers fix a rate once per day rather than continuously. Already, at this first split, 'live' quietly covers two different things: a continuously-traded price versus a once-daily official fixing.

Below that sits the statistical-release tier, where the lag runs to weeks and months by construction, not by any fault of the feed: at one reading behind this note, Taiwan's M2 growth was dated eight days before retrieval, euro-area M3 growth and US CPI and unemployment a little over a month behind, euro-area unemployment nearly two months behind. The dataset dates each series to its actual reference period rather than backfilling a fresher-looking date. GDP growth for the US and the euro area, and the US current account, are quarterly — dated to Q1 or Q2 2026 at that same reading, a full quarter or two old by the time anyone reads them, because a quarterly figure cannot exist before its quarter closes.

Policy rates are the extreme case, and the dataset documents why directly in the series' own note: 'the date is when the rate last changed, not when we read it — a policy rate is a level that holds until the bank moves it.' The ECB's main refinancing rate is dated to its last decision; Taiwan's discount rate was dated 2024-03-22 at that reading, over two years earlier, because the Central Bank of the Republic of China had not moved it since and — sitting outside the World Bank, IMF and OECD statistical systems — publishes it only as a figure on its own web page rather than through a data API. Polling that series every three hours for two years returns the identical number every time; the three-hour cadence describes how often the site checks, not how often the value changes.

Provenance is layered the same way freshness is. At the reading behind this note, all nine crypto series were served through their listed fallback provider (Coinbase spot, plus Bybit for BNB) rather than the CoinGecko source named on the record, while every FX, yield and macro series came through its primary source undisturbed — a reminder that 'live' also hides which upstream actually answered. Collapsing a same-day market price, a month-old statistical release and a rate unchanged since 2024 into one undifferentiated 'live' timestamp would misrepresent all three. Carrying date, retrieved_at, source and from_fallback per series, instead of one badge for the whole feed, is what keeps 'live' honest at 29 different speeds.

← All research

Approximate reference values from public sources · seed-0.7 · marketcap-1 · 2026-08-30 · not real-time. See data & methodology.

# this page as data GET https://finance.foundation/api/v1/research/the-shape-of-live-data

JSONCSV No key, CORS enabled — paste any of these straight into a notebook.

Code to fetch it
curl
curl -s https://finance.foundation/api/v1/research/the-shape-of-live-data
Python
import requests r = requests.get("https://finance.foundation/api/v1/research/the-shape-of-live-data", timeout=30) r.raise_for_status() data = r.json()
JavaScript
const r = await fetch("https://finance.foundation/api/v1/research/the-shape-of-live-data"); if (!r.ok) throw new Error(r.status); const data = await r.json();
pandas
import pandas as pd df = pd.read_csv("https://finance.foundation/api/v1/research/the-shape-of-live-data.csv")