Official Exchange Rate Methodology
How AllRatesToday compares official central-bank exchange rates across 45+ sources, and the open, reproducible formula behind the upcoming composite official rate. No proprietary blends — every number can be recomputed from the published tables.
How the cross-bank comparison works
Every source in the Central Bank Rates API is stored
as the institution published it: one table per publication date, in the bank's own quoting
convention, with its own rate_date. The comparison endpoint answers one
question in one call: what does each central bank currently say this pair is worth?
curl "https://allratestoday.com/api/v1/central-banks/rates?source=USD&target=EUR" \
-H "Authorization: Bearer art_live_your_key" {
"source": "USD",
"target": "EUR",
"as_of": "2026-08-10",
"count": 41,
"banks": [
{ "code": "ecb", "name": "European Central Bank", "rate": 0.9214,
"rate_date": "2026-08-10", "rate_type": "reference",
"derived": true, "method": "inverse", "stale": false },
{ "code": "boc", "name": "Bank of Canada", "rate": 0.9209,
"rate_date": "2026-08-08", "rate_type": "daily",
"derived": true, "method": "cross", "stale": false }
],
"stats": { "min": 0.9187, "max": 0.9241, "median": 0.9214,
"spread_bps": 58.6, "banks_in_stats": 38 }
} Per-bank latest tables
For each active source we take its most recent published table — not a shared "as of"
timestamp. Central banks publish on different schedules (ECB at ~16:00 CET on TARGET
business days, others daily, weekly, or quarterly), so each entry carries the bank's own
rate_date. Sources that amend tables row by row (the US Treasury amends its
quarterly table mid-quarter for currencies that moved sharply) are resolved to the set of
rows currently in force, per currency.
Bank-internal crosses — banks are never mixed
If a bank doesn't print the requested pair directly, the rate is derived strictly within that bank's own table, in this preference order:
- Published — the pair exactly as printed (
derived: false). - Inverse — the reciprocal of the printed opposite pair.
- Cross via the bank's home currency — e.g. USD→EUR from the Bank of Canada is (CAD per USD) ÷ (CAD per EUR), both from the same Bank of Canada table on the same date.
Two different banks' tables are never combined to produce a single rate, and anything not
printed directly is flagged derived with its method — compliance
users need to know exactly what the institution actually published.
Spread statistics and freshness
The response includes min, max, median, and
spread_bps — the min-to-max range divided by the median, in basis points.
These are computed only over fresh sources (newest publication within 30 days);
weekly-to-quarterly sources are still returned with their true rate_date and a
stale: true flag, since their rates remain legally in force, but they are kept
out of the statistics so a quarter-old table can't distort a comparison of today's rates.
The composite official rate rolling out
On top of the comparison we are rolling out a single composite official rate per pair — a consensus of what the world's central banks say, computed with a formula that is fully open. Many aggregated "reference rates" on the market are proprietary blends whose inputs and weights you cannot inspect. Ours is the opposite by design: the inputs are public central-bank tables you can download yourself, and the formula below is the whole formula.
The formula
- Eligible inputs — official reference-type rates from daily-cadence central banks only. Weekly, monthly, and quarterly sources, and transactional rate types (buying/selling counters), are excluded.
- Freshness window — a bank's table qualifies only if its
rate_datefalls within the last 3 calendar days, so weekends and single holidays don't empty the panel but genuinely lapsed sources drop out. - USD normalization — each bank's quote for the pair is normalized to a per-USD basis using that bank's own USD quote from the same table. No external market rate enters the calculation.
- Trimmed median — sort the normalized rates, drop the top 10% and bottom 10%, and take the median of what remains. Outliers (a bank with a managed peg, a stale fixing, a fat-finger) fall out of the trim instead of being hand-filtered.
- Minimum panel — a composite is published only when at least 3 qualifying banks cover the pair after trimming eligibility; otherwise the pair has no composite that day, rather than a composite built on too-thin data.
Every published composite will carry its input list — which banks, which
rate_date each contributed, and which were trimmed — so any value can be
recomputed independently from the same public sources. The composite data feed ships
separately; this page will link to the endpoint when it is live.
What the composite is not
- It is not a market rate — for live interbank mid-market pricing use the real-time rates API.
- It is not a substitute for a specific bank's rate — if your tax authority mandates the ECB or HMRC rate, use that bank's endpoint directly.
- It is not adjusted — no smoothing, no interpolation, no manual overrides. The trimmed median of the qualifying inputs is the published number.
FAQ
Are rates from different central banks ever mixed to compute a pair?
No. Derivation happens strictly inside one bank's table (inverse or home-currency cross),
and anything not printed directly is flagged derived. The composite is the only
place multiple banks meet — and there they are combined by an open trimmed-median formula,
never blended into a pair silently.
Why a trimmed median rather than an average?
A mean lets a single pegged or misprinted rate drag the number; a trimmed median is robust to outliers without anyone deciding case-by-case which bank to exclude. The trim rule is fixed and public, so the result stays reproducible.
Why normalize through USD?
Banks quote in different conventions (units per home currency, home currency per unit, per-100 units). Normalizing each bank through its own USD quote puts every input on one basis without importing any rate the bank didn't itself publish.
Compare 45+ official sources in one call
The comparison endpoint is live on every plan, including free.
Get Free API Key Central Bank Rates API