Simple mortgage calculator
A 250,000 mortgage at 6.5% over 30 years costs 1,580.17 a month in principal and interest. Enter the amount, rate and term to compare quotes on the figure that matches the loan note, without taxes or insurance mixed in. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Principal amount
- 250,000
- Annual rate
- 6.5
- Term years
- 30
- Term months
- 360
- Monthly rate
- 0.0054166667
- Monthly payment
- 1,580.17
A simple mortgage payment is the constant principal-and-interest installment a borrower sends each month so that a loan principal is fully repaid over a chosen term at a stated annual rate. Headline percentages hide the cash that actually leaves the account: dividing principal by the number of months ignores compound interest on a reducing balance and understates the true monthly commitment. This simple mortgage calculator accepts a loan principal, an annual nominal interest rate as a percent, and a term in years, applies the standard amortizing installment formula, and returns the monthly payment. Property tax, homeowner insurance, private mortgage insurance, and HOA dues stay out of the figure on purpose so the result matches the note, not an escrow estimate.
What a simple mortgage monthly payment means and how the amortizing formula works
A simple mortgage monthly payment is the constant installment a borrower sends so that a principal P at annual nominal rate i percent is fully amortised in n months on a reducing-balance schedule. The calculator is simple because it answers one question and refuses to invent the rest of a closing disclosure: given the loan amount, the annual rate, and the term in years, what cash leaves the account every month for principal and interest.
It does not add property tax, homeowner insurance, private mortgage insurance, or HOA dues; those belong in an escrow worksheet, not in the note installment. Money fields round to two decimal places so they match currency. Origination fees and discount points are not invented: add financed fees to principal if they go into the note, otherwise leave them out of the principal you send.
What you can do with it
Compare principal-and-interest quotes
Turn principal, annual rate, and term in years into the monthly simple-mortgage payment before locking a conventional note.
Buyer landing pages
Let visitors enter a requested amount, published rate, and term in years to see the monthly simple-mortgage payment next to each product card.
FAQ
How is the simple mortgage monthly payment calculated?
If the rate is zero, the payment is principal/n.
What happens if the term is not positive?
Zero, negatives, booleans, and non-numeric values are rejected and not billed.
Are taxes, insurance, PMI, and HOA dues included?
No. This is a simple mortgage payment: principal and interest only. Add any financed fees to principal if they go into the note; otherwise leave them out. Escrow items are not part of this installment.
What is the monthly payment on 250,000 at 6.5% for 30 years?
It is 1,580.17 a month for principal and interest, spread over 360 payments. Property tax, insurance and association dues would be paid on top of that amount.
Should I include origination fees or discount points?
Only if they are financed into the loan; in that case add them to the amount borrowed. Otherwise leave them out, because the calculator does not invent fees or points.
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/fin/simple-mortgage \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"principal":250000,"annual_rate":6.5,"term_years":30}'const res = await fetch("https://api.kit.forhosting.com/fin/simple-mortgage", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"principal": 250000,
"annual_rate": 6.5,
"term_years": 30
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/simple-mortgage",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"principal": 250000,
"annual_rate": 6.5,
"term_years": 30
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/simple-mortgage", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"principal":250000,"annual_rate":6.5,"term_years":30}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"principal":250000,"annual_rate":6.5,"term_years":30}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/simple-mortgage", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"principal": 250000,
"annual_rate": 6.5,
"term_years": 30
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.simple_mortgage",
"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.
Limits
max_term_years | 50 |
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
A term that is not positive fails with invalid_input instead of inventing a schedule.
What a simple mortgage monthly payment means and how the amortizing formula works
The monthly rate r is the annual percent divided by twelve hundred: r equals annual_rate divided by twelve divided by one hundred. The number of payments n is term_years times twelve, because mortgages are quoted in years and repaid monthly. When r is greater than zero the closed form is monthly_payment equals P times r times (1 plus r) to the n, divided by (1 plus r) to the n minus one. That identity is the standard amortizing installment lenders publish for conventional mortgages: each installment covers interest on the outstanding principal first, then reduces the balance, so the interest share falls and the principal share rises even though the cash payment never changes. When the annual rate is zero the denominator would be zero, so the calculator switches to the honest special case monthly_payment equals P divided by n, which is how genuine interest-free notes and some seller-financed contracts are billed.
Input contract, the positive-term rule, and the response shape
Fractional years are accepted when they are still positive, so a five-and-a-half-year remaining term can be priced without rounding it to an integer first. POST a JSON body with three required fields: principal, the financed amount as a finite number strictly greater than zero (aliases amount and loan_amount); annual_rate, the annual nominal interest as a percent such as 6.5 for six and a half percent per year, finite and at least zero (aliases rate and interest_rate); and term_years, the term as a positive finite number of years up to fifty (aliases term and years). Each numeric field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, non-finite values, a non-positive principal, and a negative annual_rate fail with invalid_input naming the field and are not billed. The distinctive product rule is the term: term_years must be positive. Zero, a negative number, a boolean, or a non-numeric string never produce a fake schedule, because a mortgage term that is not a positive span of years is not a valid simple mortgage. On success the body echoes principal, annual_rate, and term_years, and adds term_months (term_years times twelve), monthly_rate (annual_rate divided by twelve hundred), monthly_payment rounded to two decimals, and a formula string restating the amortizing identity and the zero-rate special case. Example: principal two hundred fifty thousand, annual_rate 6.5, term_years thirty yields a monthly rate of one twelfth of six and a half percent and a monthly payment rounded to two decimals. Pair the figure with your own tax and insurance table; this endpoint computes installment math only and does not emit an amortization schedule row by row.
Where a simple mortgage calculator earns its keep
Educators teaching amortizing versus interest-only mortgages can seed classroom examples that fail loudly when the term is not positive, instead of silently treating a zero-year note as a valid mortgage. Remaining-term what-ifs that use a fractional year, such as a refinance with five and a half years left, stay inside the same contract because the term rule is positivity, not an integer constraint. Failed validation, including a term that is not positive, does not consume balance. Quote tools and origination CRMs can call the same pure module from the browser for free previews and from the API when storing a scenario, guaranteeing that the monthly payment a visitor saw matches the monthly payment stored after they save a quote. Affordability worksheets already know the financed amount; posting principal, annual_rate, and term_years fills a card with the principal-and-interest installment so a counselor can see whether a thirty-year quote is cheaper in cash each month than a fifteen-year note at a higher monthly hit. Content teams can illustrate zero-percent seller financing with annual_rate zero, where monthly_payment collapses to principal over term_months without a divide-by-zero. Keep principal strictly positive and term_years a positive span of years, pin the rounded money fields in tests, and you get reproducible simple-mortgage payments for widgets, LMS modules, and edge workers without a loan-origination stack of your own.
Integration use cases
Quote and CRM pipelines
Store principal, annual_rate, and term_years in a quote tool whose API payment matches the free browser preview byte for byte.
Technical questions
Does a 0% seller-financed note work?
Yes. When annual_rate is zero the calculator returns monthly_payment = principal / (term_years×12) instead of dividing by a zero monthly rate.
What does the simple mortgage calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input, including a term that is not positive, is not billed.