Prepayment penalty calculator
A 2% penalty on a remaining balance of 150,000 comes to 3,000. If your contract counts the penalty in months of interest instead, enter the months and the annual rate and the calculator switches method. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Remaining principal
- 150,000
- Penalty percent
- 2
- Decimal places
- 2
- Calculation mode
- percent_of_balance
- Penalty
- 3,000
Compute loan prepayment penalty as percent of balance or N months of interest. Search intent: prepayment penalty calculator. No network calls, random seeds, or server state are required. Failed
Two ways to charge for paying early
A prepayment penalty is a fee some loans charge when the balance is paid off ahead of schedule. Loan contracts can express it in two ways, and the calculator handles both. The first is a percentage of the remaining balance: with 150,000 still owed and a 2% clause, the penalty is 3,000. The second is a number of months of interest: the remaining balance times the annual rate, divided by twelve and multiplied by the months your contract names. Either way, the result states which method was applied along with the amount.
Entering the figures correctly
Use the principal still owed, not the original loan amount. Enter percentages as percentages: 2 for a 2% penalty, and the annual rate the same way when the penalty is counted in months of interest. Check your contract to see which method applies before you calculate. Rounding is applied once, to the final penalty, using the number of decimals you choose. Knowing the figure in advance lets you weigh it against what you expect to save by paying off or refinancing the loan.
FAQ
Other languages?
EN-only delivery; Nitro hydrates the other seven locales.
What kinds of penalty can it calculate?
Two: a percentage of the remaining balance, or a number of months of interest. Choose the one your contract names; the result states which method was applied together with the penalty amount.
How is a months-of-interest penalty calculated?
The remaining balance is multiplied by the annual rate, divided by twelve and multiplied by the number of months your contract sets. It is the interest that balance would generate over those months.
Which balance should I enter?
The principal still owed at the moment you pay off the loan, not the original loan amount. The percentage is applied to that balance, or the months of interest are worked out on it.
How do I write the percentages?
As percentages, without turning them into decimal fractions, so type 2 for a 2% penalty. The annual interest rate used in the months-of-interest method is written the same way.
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/prepayment-penalty \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"remaining_balance":150000,"penalty_percent":2}'const res = await fetch("https://api.kit.forhosting.com/finance/prepayment-penalty", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"remaining_balance": 150000,
"penalty_percent": 2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/prepayment-penalty",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"remaining_balance": 150000,
"penalty_percent": 2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/prepayment-penalty", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"remaining_balance":150000,"penalty_percent":2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"remaining_balance":150000,"penalty_percent":2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/prepayment-penalty", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"remaining_balance": 150000,
"penalty_percent": 2
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.prepayment_penalty",
"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
Compute loan prepayment penalty as percent of balance or N months of interest. penalty = balance×% or balance×rate×months/12. 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. 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
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. Compute loan prepayment penalty as percent of balance or N months of interest. 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. 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
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.