Mortgage points break-even
One point on a 300,000 loan costs 3,000; if it lowers the payment from 1,800 to 1,750, the 50 saved each month repays it in 60 months, or 5 years. Enter your loan, the points and both payments. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Loan principal
- 300,000
- Discount points
- 1
- PI without points
- 1,800
- PI with points
- 1,750
- Decimal places
- 2
- Points cost
- 3,000
- Monthly savings
- 50
- Breakeven months
- 60
- Breakeven years
- 5
Months to recover discount-point cost from lower monthly payment. Search intent: mortgage points breakeven. No network calls, random seeds, or server state are required. Failed jobs are not billed.
What buying points means
Discount points are an upfront payment to the lender in exchange for a lower monthly payment. One point costs one percent of the loan, so on a 300,000 mortgage a single point costs 3,000. The question is how long the lower payment takes to give that money back. The calculator multiplies the loan by the points and divides by 100 to get the cost, subtracts the payment with points from the payment without them to get the monthly saving, and divides the cost by that saving. With payments of 1,800 and 1,750, you save 50 a month and break even after 60 months, or 5 years.
Using the break-even to decide
Compare the break-even with how long you expect to keep this loan. If you sell or refinance before that point, the lower payment never pays back the points; if you keep it longer, each month after break-even is a real saving. Enter both payments as principal and interest only, for the same loan, so the difference reflects the points and nothing else. The result shows the cost of the points, the monthly saving and the break-even in months and in years, rounded once to the decimals you choose.
FAQ
Other languages?
EN-only delivery; Nitro hydrates the other seven locales.
How much does one discount point cost?
One point equals one percent of the loan amount. On a 300,000 mortgage, a single point costs 3,000 upfront: the calculator multiplies the loan by the points and divides by 100.
How is the monthly saving worked out?
It is the principal-and-interest payment without points minus the payment with points. With 1,800 and 1,750 the saving is 50 a month, and that saving is what slowly repays the cost of the points.
What if I sell the home before the break-even point?
Then the lower payment never fully repays what you spent on points. In the example you would need to keep the loan at least 60 months; selling or refinancing sooner leaves part of the cost unrecovered.
Why is the break-even also shown in years?
Because a period like 60 months is easier to judge as 5 years when you compare it with how long you plan to stay. The years are simply the months divided by twelve.
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/points-breakeven \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"loan_amount":300000,"points":1,"monthly_payment_without":1800,"monthly_payment_with":1750}'const res = await fetch("https://api.kit.forhosting.com/finance/points-breakeven", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"loan_amount": 300000,
"points": 1,
"monthly_payment_without": 1800,
"monthly_payment_with": 1750
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/points-breakeven",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"loan_amount": 300000,
"points": 1,
"monthly_payment_without": 1800,
"monthly_payment_with": 1750
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/points-breakeven", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"loan_amount":300000,"points":1,"monthly_payment_without":1800,"monthly_payment_with":1750}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"loan_amount":300000,"points":1,"monthly_payment_without":1800,"monthly_payment_with":1750}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/points-breakeven", 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": 300000,
"points": 1,
"monthly_payment_without": 1800,
"monthly_payment_with": 1750
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.points_breakeven",
"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
The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos.
How it works
No network calls, random seeds, or server state are required. Failed jobs are not billed. Search intent is matched with precise English keywords. Optional fields document defaults. No network calls, Months to recover discount-point cost from lower monthly payment. breakeven_months = (loan×points/100) / monthly_savings. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested.
Inputs, limits and rounding
Optional decimals use half-up once. Outputs echo key inputs for logging and automation. No network calls, random seeds, or server state are required. Failed jobs are not billed. Search intent is matched with precise English keywords. Optional fields document defaults. Half-up rounding is Provide required JSON fields as documented in params. Invalid types or ranges raise invalid_input. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input.
When to use it
Use when the search intent matches this calculator. Months to recover discount-point cost from lower monthly payment. No network calls, random seeds, or server state are required. Failed jobs are not billed. Search intent is matched with precise English keywords. Optional fields document defaults. Half-up The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input.
Integration use cases
Quick check
Verify a formula in the free browser widget.
Automation
Call the API with the same JSON fields from scripts.
Teaching
Show pinned golden examples without proprietary tools.
Technical questions
Is the browser widget free?
Yes. Tier A runs client-side with the same core as the API.
Does it call the network?
No. Computation is local and deterministic.
What happens on bad input?
The handler throws invalid_input; failed jobs are not billed.
Can I use the API?
Yes. Send the same JSON documented in params.