Why does the same Treasury bill have two different rates?
Ask for the 13-week bill on 27 July 2026 and the API returns two numbers for it: 3.82 and 3.91. Neither is wrong. They are answers to two different questions, computed on two different conventions, and a third endpoint offers a third answer of 3.96 for what most people would also call "the 3-month rate".
The endpoint
GET /ust/bill-rates takes the same parameters as the yield-curve endpoint: from, to, filter[year], page[limit], page[offset], fmt. Each row is one bill tenor on one day, and carries more than the curve endpoint does:
{"date": "2026-07-27", "tenor": "13WK", "discount": 3.82, "coupon": 3.91,
"avg_discount": 3.82, "avg_coupon": 3.91,
"maturity_date": "2026-10-29", "cusip": "912797SK4"}
Seven tenors appear: 4WK, 6WK, 8WK, 13WK, 17WK, 26WK, 52WK. The 6-week bill is a relatively recent addition to the Treasury's schedule and is missing from some published field lists — another reason to enumerate what you receive.
The maturity_date and cusip fields tell you something important that the yield-curve endpoint cannot: each of these rows is a specific security, not a fitted point. In 2026 the endpoint returns meta.total of 994 rows to 27 July, which is 142 days × 7 tenors.
Discount rate versus coupon-equivalent yield
Bills pay no coupon. They are sold below face value and redeem at 100, so the return is the discount. Two conventions exist for quoting it.
The bank discount rate expresses the discount as a fraction of the face value, on a 360-day year:
price = 100 × (1 − discount × days ÷ 360)
The coupon-equivalent yield expresses the same gain as a fraction of the price you actually paid, on a 365-day year, so it is comparable with a coupon-bearing note. That description is the whole calculation for bills of 182 days or fewer. Past half a year Treasury solves a semi-annually compounded equation instead, because the note being compared against pays a coupon along the way — which is why this formula reproduces the 13-week coupon to the basis point and lands about four basis points high on the 52-week (4.17 against a published 4.13 on 4 September 2026).
Run it on the real row. Take the 13-week bill, nominal 91 days, discount = 3.82%:
- Price = 100 × (1 − 0.0382 × 91 ÷ 360) = 100 × (1 − 0.009656) = 99.0344
- Gain = 100 − 99.0344 = 0.9656
- Return on money invested = 0.9656 ÷ 99.0344 = 0.009750
- Annualised on 365 days = 0.009750 × 365 ÷ 91 = 0.03911 → 3.911%
Published coupon: 3.91. The 9-basis-point gap between the two columns is entirely the two convention choices — a smaller denominator and a longer year — and nothing about the bill changed.
The gap widens with maturity because both effects compound. On the same day the 52-week bill shows discount 3.95 against coupon 4.12: 17 basis points apart.
And then there is the third number
/ust/yield-rates reports a 3M constant-maturity rate of 3.96 for 27 July 2026. So on one day you have three defensible "three-month rates":
- 3.82 — bank discount rate on the 13-week bill
- 3.91 — coupon-equivalent yield on the same bill
- 3.96 — 3-month CMT par yield from the fitted curve
A 14-basis-point spread across three numbers that a headline would call the same thing. If your model consumes a short rate, the convention is a decision you make deliberately, and you record it.
The averages column
avg_discount and avg_coupon hold period averages, and on many rows they equal the daily values. Where they differ, the daily and the average are pointing at different windows. On 24 July 2026 the 26-week bill shows discount 3.91 with avg_discount 3.88 — three basis points apart. Pick one column for a series and stay with it.
Try it now
- Here is the 13-week row of
/ust/bill-rateson the newest date. Reproduce itscouponfrom itsdiscountwith the two formulas above, using the nominal 91 days as the worked example did. Getting within a basis point means you have understood both conventions.
- Here is
/ust/yield-rateson its newest date; the3Misdata[-11], at the top. Check the date matches the bill's, then compare the bill'scouponwith it. Write down which one your code will treat as "the 3-month rate" and why.
- Here is the 13-week row on five of the first seven business days of 2026 (7 and 8 January are left out). Track its
cusipdown the dates, find the days on which it changed, and check each newmaturity_dateagainst the old one. Rows are securities, and securities roll.