Zero-coupon bond price calculator
Find what a zero-coupon bond is worth today: a face value of 1,000 at 5% a year with 10 years left is priced at 613.91, a discount of 386.09. Enter face, yield and years and read the price at once. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Face value
- 1,000
- Yield percent
- 5
- Years to maturity
- 10
- Yield decimal
- 0.05
- Price
- 613.91
- Discount
- 386.09
- Discount percent
- 38.61
Zero-coupon bonds pay no periodic coupons: the only cash flow is a single face (par) amount at maturity, so the instrument always trades at a discount or premium that is pure time value of money. Investors, students, and product teams need a fast, deterministic present price from face value, yield to maturity, and remaining years without opening a spreadsheet or a full fixed-income library. This zero-coupon bond price calculator applies the classic annual-compounding formula price equals face divided by one plus yield raised to years, returns the rounded present price, the dollar discount versus face, and the discount as a percent of face, and fails clearly when inputs are missing, non-finite, non-positive where required, or when yield is at or below negative one hundred percent.
What a zero-coupon bond price means
A zero-coupon bond, sometimes called a pure discount bond or a strip, promises a single lump-sum payment of face value on the maturity date and nothing in between. Because there are no coupons to reinvest, the entire return comes from the difference between the price you pay today and the face you receive later. That difference is the market’s way of embedding the required yield for the remaining life of the bond.
If the annual yield is five percent and ten years remain until a one-thousand face is paid, the fair present price under annual compounding is one thousand divided by one point zero five to the tenth, which is roughly six hundred fourteen dollars—you pay that amount today and receive one thousand at maturity. If yield rises, the present price falls; if yield falls, the present price rises toward face. When yield is exactly zero, no discounting occurs and price equals face.
Fractional years are allowed so a six-month remaining life can be entered as zero point five. The calculator does not model day-count conventions, continuous compounding, credit spreads as a separate input, or tax treatment of original-issue discount; it answers the core present-value question that textbooks, interview screens, and simple portfolio tools share: given face, yield, and time, what is the zero’s price today.
Who needs a quick zero-coupon price
Wealth and treasury tooling often prices strips, T-bills under a simplified annual model, or synthetic zeros stripped from coupon bonds when only face, yield, and maturity remain as inputs. Interview and homework generators require a deterministic oracle that marks wrong yields and rejects impossible bases instead of returning NaN. Product landing pages that rank for zero coupon bond price calculator benefit from a free browser path that matches the paid automation path on the same pure module.
Use it when the question is the simple zero price, and layer richer analytics in your own service when you need them.
What you can do with it
Classroom and exam checks
Verify textbook zero-coupon prices for given face, yield, and years, including the zero-yield case where price equals face.
Product and portfolio widgets
Show investors the present price and discount of a pure discount bond next to quoted face and yield in onboarding or calculator pages.
FAQ
Does this handle coupon bonds or continuous compounding?
No. This capability prices only zero-coupon cash flows under annual compounding. Coupon schedules, continuous compounding, and day-count conventions are out of scope.
How is the price of a zero-coupon bond calculated?
Divide the face value by one plus the annual yield, raised to the number of years left. With a face of 1,000, a 5% yield and 10 years, the price comes out at 613.91.
What happens to the price if the yield is zero?
Nothing is discounted, so the price equals the face value. As the yield rises the price today falls, and as it falls the price climbs back toward face.
Can I price a bond with less than a year to maturity?
Yes. Years accept decimals, so six months is entered as 0.5. The same annual compounding rule is applied to the fraction of a year.
How big is the discount compared with face value?
You get it two ways: in money, as face minus price, and as a percent of face. For 10 years at 5%, the discount is 386.09, or 38.61% of face.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/finance/zero-coupon-bond-price \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"face_value":1000,"yield_percent":5,"years_to_maturity":10}'const res = await fetch("https://api.kit.forhosting.com/finance/zero-coupon-bond-price", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"face_value": 1000,
"yield_percent": 5,
"years_to_maturity": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/zero-coupon-bond-price",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"face_value": 1000,
"yield_percent": 5,
"years_to_maturity": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/zero-coupon-bond-price", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"face_value":1000,"yield_percent":5,"years_to_maturity":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"face_value":1000,"yield_percent":5,"years_to_maturity":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/zero-coupon-bond-price", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"face_value": 1000,
"yield_percent": 5,
"years_to_maturity": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.zero_coupon_bond_price",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Input contract, formula, and response fields
Optionally set decimals to an integer from zero to eight for currency-style rounding of money and percent outputs; the default is two. Money-like fields use half-up rounding once from the raw floating-point results so goldens stay byte-stable across runtimes. POST a JSON body with three required finite numbers: face_value greater than zero (the par amount paid at maturity), yield_percent as a nominal annual percent greater than negative one hundred (five means five percent per year, not a decimal fraction; yields at or below negative one hundred percent would make one plus y non-positive and are rejected), and years_to_maturity greater than zero (fractional years allowed). The engine forms the decimal yield y as yield_percent over one hundred, then computes price as face_value divided by one plus y raised to years_to_maturity when y is not zero, or price equal to face_value when y is zero. discount is face_value minus price; discount_percent is discount over face_value times one hundred. The response also echoes face_value (rounded), yield_percent, years_to_maturity, yield_decimal (y rounded for stable display), price, discount, discount_percent, and a short formula string. Missing fields, empty strings, non-finite values, non-positive face or years, yield at or below negative one hundred, and out-of-range decimals fail with invalid_input and are not billed. Example: face_value one thousand, yield_percent five, years_to_maturity ten yields a price near six hundred thirteen point nine one at two decimals, a positive discount, and a discount percent in the high thirties—exactly the identity price times one point zero five to the ten recovers face within rounding.
Where a zero-coupon bond price API earns its keep
Sweep yield_percent or years_to_maturity in a loop from your own code to build price-yield curves for a fixed face; pin price and discount in tests; keep requests small. This tool does not produce Macaulay duration, modified duration, convexity, dirty versus clean price for coupon bonds, or multi-curve discounting—only the annual-compounding present value of a single face cash flow.
Integration use cases
Price-yield scenario sweeps
Loop yield_percent or years_to_maturity to build simple price curves for strips and education demos without a full bond library.
Technical questions
How is the zero-coupon bond price calculated?
With annual compounding: price = face_value / (1 + yield_percent/100)^years_to_maturity. When yield is zero, price equals face_value. The API also returns discount and discount_percent versus face.
What units should I use for yield and maturity?
yield_percent is a percent per year (5 means 5%, not 0.05). years_to_maturity is in years and may be fractional (0.5 for six months). face_value is in the same currency units you care about.
Can yield be negative?
Yes, slightly negative yields are allowed as long as yield_percent is greater than -100 so that (1+y) stays positive. Yields at or below -100% are rejected with invalid_input.
What does the zero-coupon bond price calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.