Contents Lesson 10 of 16

5 min read · practitioner

What is the difference between a rate that is set and a rate that is printed?

The Fed's target range on 27 July 2026 was 3.50% to 3.75%. SOFR that day printed 3.64%. Neither number caused the other, and the second one is a statistic computed from about $2.95 trillion of actual overnight borrowing.

The endpoint

GET /rates/reference-rates takes filter[code], filter[currency] (enumerated USD, GBP, EUR), filter[from], filter[to], page[offset], page[limit] (default 20, maximum 100) and fmt.

Rows carry date, code, currency, rate_type, rate, source and source_series_id. Some rows carry two more fields, and that inconsistency turns out to be the most useful thing here.

What is actually in there

Querying a single date, 27 July 2026, returned ten codes on the day this was written and eleven when re-checked three weeks later. The eleventh is SONIA, and the reason is the publication lag at the end of this lesson: it had not been published yet, and it was backfilled afterwards. A row that is absent today may not be absent tomorrow.

Code Currency rate_type Rate Source
SOFR USD overnight 3.64 NY_FED
EFFR USD overnight 3.63 NY_FED
OBFR USD overnight 3.63 NY_FED
BGCR USD overnight 3.62 NY_FED
TGCR USD overnight 3.62 NY_FED
ESTR EUR overnight 2.185 ECB
SOFR30D USD average 3.61807 FRED
SOFR90D USD average 3.62518 FRED
SOFR180D USD average 3.66367 FRED
SOFRINDEX USD index 1.25249067 FRED

Read rate_type before you read rate. Three of these are not daily rates at all: the average rows are backward-looking compounded averages over 30, 90 and 180 days, and SOFRINDEX at 1.25249067 is not a percentage — it is a cumulative accrual index. Plotting it on an axis labelled "%" produces a line at 1.25 that looks like a collapse in interest rates and is nothing of the kind. Four consecutive business days of it, which is the whole argument:

Live API response: sofr index accrual

Set versus printed, in three currencies

Line each benchmark up against its policy rate on the same day:

  • SOFR 3.64 against a Fed target midpoint of 3.625 — 1.5 basis points above the midpoint, and comfortably inside the 3.50–3.75 range.
  • ESTR 2.185 against the ECB deposit rate of 2.25 — 6.5 basis points below the policy rate.
  • SONIA 3.7307 on 24 July 2026 against a Bank Rate of 3.75 — 1.93 basis points below.

Two of the three print below the rate the central bank set. That is not a failure of policy transmission; it is what happens when a rate is the outcome of trades between counterparties with differing credit and collateral, rather than an announcement. A market rate has no obligation to equal a policy rate, and the small persistent gaps are informative in their own right.

Volume is the field that explains the market

Some rows carry volume_billion_usd and a percentiles object. On 27 July 2026:

  • SOFR — rate 3.64, volume $2,953 billion, percentiles p1 3.59, p25 3.62, p75 3.68, p99 3.72
  • EFFR — rate 3.63, volume $104 billion
Live API response: sofr overnight observation

SOFR is computed from roughly 28 times the volume of EFFR. That depth is the practical argument for why SOFR rather than a survey rate became the dollar benchmark after the LIBOR era: it is the median of an enormous, genuinely transacted market. Depth was not the only criterion and secured was not the universal answer — ESTR in the table above is unsecured, and so is SONIA, and each is the benchmark in its own currency. And the percentiles are published, so you can see the dispersion directly — the p1-to-p99 range that day was 13 basis points wide around a 3.64% median.

The gotcha: rows do not all have the same keys

The ESTR row (source ECB) and the SONIA row (source BOE) carry no percentiles and no volume_billion_usd at all. Different publishers release different supporting statistics, and the endpoint does not pad the difference with nulls — the keys are simply absent. Code that does row["volume_billion_usd"] will raise on the European rows.

Publication timing differs too. On 28 July 2026 the newest SOFR observation was 27 July; the newest SONIA observation was 24 July. Joining benchmarks across currencies on the same date will silently drop rows unless you handle the lag.

This is the endpoint behind the the-rate-that-rules-them-all lesson — except that, as the table above shows, there were ten of them on the day this was written, and eleven once SONIA landed.

Try it now

  1. Here is /rates/reference-rates?filter[from]=2026-07-27&filter[to]=2026-07-27&page[limit]=100. Group its rows by rate_type and confirm you can name what each of overnight, average and index means before using any of them.
Live API response: mda2 reference rates 2026 07 27
  1. Here are SOFR and EFFR on the two newest dates, in one call. Compare the gap between the two rates with the ratio between the two volumes.
Live API response: mda2 sofr effr latest
  1. Here is the same endpoint with filter[currency]=GBP, the whole newest row. List the keys the SOFR rows above carry that this row does not. Then write the null-safe accessor you now know you need.
Live API response: mda2 sonia latest row