15 vs 30 year mortgage calculator
A shorter mortgage can reduce lifetime interest substantially, but it also commits more of your monthly budget to the loan.
Run — free
This calculator places a 15-year mortgage beside a 30-year mortgage for the same principal while allowing a different quoted rate for each term. It reports monthly principal-and-interest payments, total payments, lifetime interest, and the key differences. Use the result to understand the financing tradeoff before considering taxes, insurance, fees, or an individual lender's underwriting rules.
Compare the same amount with realistic quoted rates
Begin with the amount you actually expect to borrow, not the property's purchase price. Subtract the down payment from the price and account separately for any financed costs before entering the loan amount. Then enter the annual percentage rate offered for each term. A 15-year and a 30-year mortgage commonly carry different rates, so using one rate for both can distort the comparison. This calculator deliberately accepts two rates and applies each one to its corresponding fixed term. The monthly figures cover principal and interest only. They do not include property tax, homeowners insurance, mortgage insurance, association dues, closing costs, discount points, or lender fees. Those costs matter to affordability, but several do not change merely because the amortization term changes. Keeping them outside the core calculation makes the loan tradeoff easier to see. For a useful decision, compare offers made on the same day with similar assumptions about points and fees, and confirm whether the quoted figures are interest rates or APRs before entering them.
Read monthly payment and lifetime interest together
The monthly payment answers a cash-flow question: how much principal and interest must leave your budget each month if you follow the scheduled payment plan? The lifetime-interest figure answers a different question: how much interest would you pay if you kept the mortgage for its entire term and made every scheduled payment without extra principal. A 15-year loan spreads repayment across 180 payments, while a 30-year loan uses 360. The shorter schedule usually produces a higher required payment because principal must be returned twice as quickly, even when its interest rate is lower. In exchange, the balance falls faster and has less time to accrue interest. The comparison section shows the extra monthly commitment for the 15-year term and the interest it saves relative to the 30-year term. A negative saving is possible if the supplied rates are unusual; the calculator reports the arithmetic rather than assuming the shorter option must win. Treat rounded currency outputs as planning estimates because lenders can use their own payment-rounding and final-payment conventions.
Use the result as a decision boundary, not a recommendation
Choosing a term involves more than minimizing interest. Test whether the 15-year payment remains comfortable after retirement contributions, emergency savings, maintenance, insurance, taxes, and other debts. A payment that works only in an ideal month may create more risk than the interest saving justifies. The 30-year mortgage can provide greater required-payment flexibility, while voluntary extra principal payments may still shorten payoff time; however, that strategy requires discipline and does not reproduce every feature of a true 15-year loan. Also consider how long you expect to keep the property or mortgage. Selling, refinancing, or prepaying early means you will not incur the displayed full-term interest, so lifetime totals become a consistent comparison benchmark rather than a forecast. Review prepayment terms and compare lender fees or points separately. The calculator does not predict investment returns or decide whether investing the monthly difference is better. It gives you clean loan mathematics that you can combine with your budget, risk tolerance, tax circumstances, and professional advice when appropriate.
What you can do with it
Evaluate two lender quotes
Enter the same principal with the quoted rate for each term to compare scheduled payment and full-term interest on a consistent basis.
Set a home-buying budget
See whether the higher required payment of a shorter mortgage fits alongside taxes, insurance, savings, and routine living costs.
Quantify the term tradeoff
Measure how much additional monthly cash a 15-year schedule requires and how much lifetime interest it can avoid.
FAQ
What does the calculator cost?
The API price is $0.002 per calculation. The page can also provide the browser-based calculator experience.
Does the monthly payment include taxes and insurance?
No. It includes scheduled principal and interest only, so add property tax, insurance, association dues, and any mortgage insurance when assessing affordability.
Why can I enter a different rate for each term?
Lenders often quote different interest rates for 15-year and 30-year mortgages. Separate inputs make the comparison reflect actual offers.
Does lifetime interest predict what I will actually pay?
It assumes every scheduled payment is made for the entire term with no refinancing, sale, late payment, or extra principal. It is a comparison estimate, not a personalized forecast.
Can a 30-year loan be paid like a 15-year loan?
Extra principal may shorten a 30-year payoff if the loan permits it, but the rate, required payment, fees, and borrower behavior can differ from a 15-year mortgage.
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/mortgage-15-vs-30 \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"loan_amount":400000,"annual_rate_15":5.75,"annual_rate_30":6.5}'const res = await fetch("https://api.kit.forhosting.com/finance/mortgage-15-vs-30", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"loan_amount": 400000,
"annual_rate_15": 5.75,
"annual_rate_30": 6.5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/mortgage-15-vs-30",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"loan_amount": 400000,
"annual_rate_15": 5.75,
"annual_rate_30": 6.5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/mortgage-15-vs-30", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"loan_amount":400000,"annual_rate_15":5.75,"annual_rate_30":6.5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"loan_amount":400000,"annual_rate_15":5.75,"annual_rate_30":6.5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/mortgage-15-vs-30", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"loan_amount": 400000,
"annual_rate_15": 5.75,
"annual_rate_30": 6.5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.mortgage_15_vs_30",
"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. |