Mortgage PMI cost calculator
On a 280,000 loan at 6.5% with a 0.55% PMI rate, insurance costs 128.33 a month for 156 months, 20,020 in total, until the balance reaches 218,400. Enter your loan, rates, term and target to see your own figures. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Loan amount
- 280,000
- Annual interest rate
- 6.5
- Term months
- 360
- Annual pmi rate
- 0.55
- Target balance
- 218,400
- Monthly pi
- 1,769.79
- Monthly pmi
- 128.33
- Months with pmi
- 156
- Years with pmi
- 13
Private mortgage insurance (PMI) is the monthly premium many conventional lenders charge when you put down less than twenty percent. Borrowers, loan officers, and affordability tools need a clear estimate of how much PMI costs each month and how long those premiums continue until the loan balance reaches a cancel threshold—commonly seventy-eight or eighty percent of original home value. This mortgage PMI cost calculator takes your starting loan amount, mortgage interest rate, remaining term in months, annual PMI rate, and a target balance, then returns flat monthly PMI, months and years of coverage, total PMI paid, the balance when simulation stops, and whether the target was actually reached. Failed validation is not billed.
What PMI is and when it stops
Private mortgage insurance is the monthly premium many conventional lenders charge when you put down less than twenty percent. It does not last for the whole loan: it stops once the balance falls to a cancellation threshold, commonly 78% or 80% of the original home value. The calculator works out the flat monthly premium from your starting loan and annual PMI rate, then follows a standard fixed-rate repayment schedule month by month, charging the premium while the balance is still above your target. On 280,000 at 6.5% over 360 months with a 0.55% PMI rate and a 218,400 target, that is 128.33 a month for 156 months, or 13 years.
Using the result to compare down payments
Place the monthly premium next to the principal-and-interest payment, 1,769.79 in the example, to see what really leaves your account each month. Try the same home price with ten, fifteen and twenty percent down to see how much insurance each option adds and for how long. Enter both rates as percentages, 6.5 and 0.55 rather than decimals, and the term in months, 360 for 30 years. The target must be below the starting loan amount; if it is never reached within the term, the result says so and shows where the balance ended.
What you can do with it
Purchase affordability and down-payment trade-offs
Show buyers monthly PMI and total premiums until cancel when comparing ten, fifteen, and twenty percent down on the same price.
FAQ
How is the monthly PMI calculated?
Multiply the starting loan amount by the annual PMI rate, divide by 100 and then by 12. On 280,000 at a 0.55% rate, that gives 128.33 a month, the same amount every month while the insurance applies.
Why does the PMI amount not fall as I pay down the loan?
Because it is treated as a flat premium tied to the starting loan, which is how most quotes express an annual PMI rate. What changes as you repay is how long it lasts, not the monthly amount.
What target balance should I enter?
Enter the outstanding balance at which your PMI stops, commonly 78% or 80% of the original home value converted into an amount. It must be lower than the starting loan amount.
What happens if the balance never reaches the target?
The schedule stops at the end of the term and the result says the target was not reached. It still shows how many months you paid insurance, the total premium and the balance where it ended.
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/mortgage-pmi-estimate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"loan_amount":280000,"annual_interest_rate":6.5,"term_months":360,"annual_pmi_rate":0.55,"target_balance":218400}'const res = await fetch("https://api.kit.forhosting.com/finance/mortgage-pmi-estimate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"loan_amount": 280000,
"annual_interest_rate": 6.5,
"term_months": 360,
"annual_pmi_rate": 0.55,
"target_balance": 218400
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/mortgage-pmi-estimate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"loan_amount": 280000,
"annual_interest_rate": 6.5,
"term_months": 360,
"annual_pmi_rate": 0.55,
"target_balance": 218400
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/mortgage-pmi-estimate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"loan_amount":280000,"annual_interest_rate":6.5,"term_months":360,"annual_pmi_rate":0.55,"target_balance":218400}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"loan_amount":280000,"annual_interest_rate":6.5,"term_months":360,"annual_pmi_rate":0.55,"target_balance":218400}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/mortgage-pmi-estimate", 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": 280000,
"annual_interest_rate": 6.5,
"term_months": 360,
"annual_pmi_rate": 0.55,
"target_balance": 218400
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.mortgage_pmi_estimate",
"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
How monthly PMI and the cancel horizon are computed
On a two-hundred-eighty-thousand-dollar loan at six and a half percent for three hundred sixty months with a zero-point-fifty-five percent annual PMI rate and a two-hundred-eighteen-thousand-four-hundred-dollar target, you get a concrete monthly PMI, a multi-year cancel horizon, and a total premium figure you can place next to principal-and-interest on an affordability sheet. The engine models conventional private mortgage insurance as a flat monthly premium tied to the starting principal, which is how most consumer quotes and Loan Estimate worksheets express annual PMI rates. monthly_pmi equals loan_amount times annual_pmi_rate divided by one hundred, then divided by twelve. Separately, the loan is amortized with a standard fixed principal-and-interest payment derived from loan_amount, annual_interest_rate, and term_months: payment equals P times i times (1+i)^n over ((1+i)^n minus one), where i is the monthly rate and n is term_months; when the interest rate is zero the payment collapses to principal divided by months so the schedule never divides by zero. Each simulated month charges one monthly_pmi while the opening balance is still strictly greater than target_balance, applies interest and principal reduction, and advances the clock. Simulation stops when the balance falls to or below the target or when term_months is exhausted. months_with_pmi is that count, years_with_pmi is months divided by twelve, total_pmi is months times monthly_pmi, and balance_at_cancel is the outstanding principal when the loop ends. reached_target is true only if the cancel threshold was actually hit inside the term.
Input contract, validation, and response fields
Optional decimals controls half-up rounding for money and rate outputs and defaults to two, with an allowed range of zero through eight. Every successful response echoes the inputs (rounded where appropriate) and adds monthly_pi, monthly_pmi, months_with_pmi, years_with_pmi, total_pmi, balance_at_cancel, and the boolean reached_target. Missing fields, non-finite numbers, and out-of-range values fail with invalid_input naming the problem; those failures do not consume prepaid balance. Numeric strings are accepted where a finite number is expected so form posts and spreadsheet exports do not need a separate cast step before the API call.
Where a PMI cost estimate earns its keep
Purchase counselors and first-time-buyer programs use a mortgage PMI cost calculator to show how a smaller down payment trades lower cash at closing for years of monthly insurance. The tool does not price FHA MIP, USDA annual fees, or lender-paid single-premium products; those products use different rate schedules and cancel rules and belong in their own capabilities. Affordability engines and CMS calculators call the same JSON contract from automation so marketing pages and authenticated tools never drift apart on cancel months. Portfolio analysts batch loan_amount, rate, term, PMI rate, and target balance across pipelines to flag loans still above the cancel threshold and sum projected premiums.
Integration use cases
Loan officer quote checks
Convert a lender PMI rate sheet into months_with_pmi and total_pmi next to principal-and-interest during rate-lock conversations.
Portfolio and automation pipelines
Batch estimate remaining PMI cost across many loans via the API using the same JSON fields as the free browser widget.
Technical questions
How is monthly PMI calculated?
monthly_pmi = loan_amount × (annual_pmi_rate / 100) / 12. The premium is flat on the starting principal for every month until the balance reaches target_balance or the term ends.
What should I put in target_balance?
Use the outstanding balance at which PMI cancels—often 78% or 80% of original home value converted to dollars. It must be strictly less than loan_amount.
Does the interest rate affect PMI itself?
The annual PMI rate sets the premium dollars; the mortgage interest rate and term set how fast the balance falls, which determines months_with_pmi and total_pmi.
What if the loan never reaches the target within the term?
months_with_pmi equals term_months, total_pmi covers the full term, balance_at_cancel is the remaining principal, and reached_target is false.
What does the mortgage PMI cost calculator cost?
The browser tool is free. API requests use prepaid balance at $0.002 per successful call; invalid input is not billed.