Mortgage recast calculator
With 200,000 left at 4% over 240 months, a 20,000 lump sum lowers the payment from 1,211.96 to 1,090.76 and saves 9,087.06 in interest, while the rate and the term stay unchanged. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Current mortgage balance
- 200,000
- Annual interest rate (%)
- 4
- Months remaining
- 240
- Lump-sum principal payment
- 20,000
- Principal after lump-sum payment
- 180,000
- Monthly payment before recast
- 1,211.96
- Monthly payment after recast
- 1,090.76
- Monthly payment change
- 121.2
free
What a recast does to your payment
A recast lets you pay a lump sum toward your mortgage and have the payment recalculated on the smaller balance, while the interest rate and the months remaining stay as they are. The calculator subtracts the lump sum from the balance and works out the new level payment with the standard annuity formula, over the same number of months at the same rate. It then shows the payment before and after, the drop in money and in percent, and the interest saved. With 200,000 at 4% and 240 months left, a 20,000 lump sum lowers the payment from 1,211.96 to 1,090.76.
How to read the savings correctly
Because the term does not change, the monthly relief is proportional to the share of principal you pay down: 20,000 out of 200,000 cuts the payment by 10%. The interest saved compares the lifetime interest of both scenarios, each worked out as the payment times the months remaining minus the starting principal. In the example that is 90,870.56 against 81,783.50, a saving of 9,087.06. Enter the annual rate as a percentage, 4 for 4%. All money figures are rounded once at the end, to two decimals unless you choose otherwise.
What you can do with it
Servicing quotes
Show a borrower the exact new payment after a principal-curtailment lump sum, term unchanged.
FAQ
What is a recast?
Re-amortizing a smaller balance after a lump sum while keeping the same rate and remaining term—no refinance required.
Why does the payment fall by exactly 10% in the example?
Because the term does not change, the monthly relief is proportional to the share of principal you pay down. Paying 20,000 off a 200,000 balance removes 10% of the principal, so the payment falls by the same 10%.
How is a recast different from a refinance?
A recast keeps your interest rate and your remaining term: it simply spreads a smaller principal over the same months after a one-time payment. The loan terms stay as they are and only the payment changes.
How is the interest saved worked out?
It compares the lifetime interest of both scenarios, each found as the payment times the months remaining minus the starting principal. In the example that is 90,870.56 against 81,783.50, a saving of 9,087.06.
Does it work with a zero interest rate?
Yes. When the rate is zero, the payment is simply the principal divided by the months remaining, so the calculation still returns sensible figures instead of failing.
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-recast \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"balance":200000,"annual_rate":4,"months_remaining":240}'const res = await fetch("https://api.kit.forhosting.com/finance/mortgage-recast", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"balance": 200000,
"annual_rate": 4,
"months_remaining": 240
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/mortgage-recast",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"balance": 200000,
"annual_rate": 4,
"months_remaining": 240
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/mortgage-recast", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"balance":200000,"annual_rate":4,"months_remaining":240}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"balance":200000,"annual_rate":4,"months_remaining":240}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/mortgage-recast", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"balance": 200000,
"annual_rate": 4,
"months_remaining": 240
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.mortgage_recast",
"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
Recasts a mortgage by subtracting lump_sum from the balance and re-amortizing over the same months_remaining at the unchanged annual_rate, returning payment_before, payment_after, payment_delta, payment_delta_percent and total interest_saved.
Recast versus refinance
Because the term is held constant, the monthly relief is proportional to the fraction of principal paid down. A recast, unlike a refinance, keeps your interest rate and remaining term intact and simply re-amortizes a smaller principal after a one-time lump_sum. new_principal equals balance minus lump_sum, and both the old and new payments use the annuity formula payment = P·i·(1+i)^n / ((1+i)^n − 1) with i = annual_rate/1200 and n = months_remaining. On a $200,000 balance at 4% with 240 months left, a $20,000 lump sum drops the payment from $1,211.96 to $1,090.76—a payment_delta of $121.20, or payment_delta_percent of 10.00. When annual_rate rounds to zero the formula degrades to principal divided by months, so an interest-free loan still returns sane figures instead of dividing by zero.
Interest saved and the output fields
Beyond the lower installment, the tool totals lifetime interest for both scenarios. interest_before equals payment_before times months_remaining minus the original balance, and interest_after applies the same identity to new_principal, so interest_saved is their difference—$90,870.56 minus $81,783.50 gives $9,087.06 on the sample loan. All thirteen output fields, from new_principal through interest_saved, are rounded once with a half-up rule at the decimals parameter, which defaults to 2. payment_delta is payment_before minus payment_after, and payment_delta_percent expresses that as a share of the original payment; both are derived from unrounded intermediates so the percentage and the dollar figures stay internally consistent rather than drifting a cent apart when displayed.
Validation and safe integration
balance must be a finite number above zero, annual_rate zero or more, and months_remaining a positive integer; each failure returns a typed invalid_input error naming the field. The critical guard is lump_sum: it defaults to 0 and must be at least zero and strictly less than balance—you cannot recast by paying the loan off entirely—otherwise you get invalid_input rather than a nonsensical zero payment. That makes the endpoint safe to expose behind a servicing portal where borrowers type arbitrary amounts. Failed tasks are never billed, and prepaid balance is spent only on successful API calls at the published base price, which keeps bulk what-if analysis cheap to run.
Integration use cases
Lump-sum planning
Compare interest_saved across several lump_sum amounts before committing the cash.
Portfolio analysis
Batch payment_delta and interest_saved across many loans through the JSON API.
Technical questions
What does it return?
new_principal, payment_before and payment_after, payment_delta, payment_delta_percent, interest_before, interest_after and interest_saved.
Can lump_sum equal the balance?
No. lump_sum must be at least 0 and strictly less than balance, or the call returns an invalid_input error.
Does the term change?
No. months_remaining is held constant; only the principal and the payment shrink.
Is it free?
Free in the tier A browser widget; the deterministic API starts at $0.002 and bills only successful calls.