Lease mileage calculator
Return a leased car with 42,000 miles on a 36,000-mile allowance at 0.15 a mile and you owe 900 for 6,000 extra miles. Unused miles are not refunded, so the charge never drops below zero. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Allowed miles
- 36,000
- Actual miles
- 42,000
- Per mile rate
- 0.15
- Excess miles
- 6,000
- Excess charge
- 900
A closed-end vehicle lease already prices a contracted mileage allowance into the monthly payment, then bills a stated per-mile penalty for every mile the odometer is over that allowance at turn-in. Shoppers comparing a thirty-six-month twelve-thousand-mile contract with a fifteen-thousand-mile sibling need the cash overage, not a spreadsheet that treats unused miles as a refund. This lease mileage calculator accepts the allowed miles, the actual miles driven, and the per-mile penalty rate, returns the excess miles and the excess charge, and treats an under-allowance return as a zero charge rather than a credit.
What lease mileage overage is and how the one-sided formula works
The monthly payment on a closed-end car or light-truck lease already prices in a contracted mileage allowance. Captive finance companies usually quote that allowance as an annual figure such as twelve thousand or fifteen thousand miles and then multiply by the term in years, so a thirty-six-month twelve-thousand-mile lease is thirty-six thousand allowed miles, not twelve thousand.
At turn-in the lessor reads the odometer, subtracts the contract allowance, and multiplies leftover miles by a stated excess-mileage rate printed in the lease, commonly between ten and thirty cents per mile on United States retail contracts. The response reports both the excess miles and the excess charge so a shopper can see the mile gap separately from the cash due. Acquisition fees, excess wear-and-tear, disposition fees, and sales tax on the overage are not invented; add those line items on the full turn-in worksheet.
The calculator is pretax overage math only, which is the figure people search for when they type lease mileage calculator.
What you can do with it
End-of-lease turn-in estimate
Enter the contract allowance, the current or projected odometer, and the per-mile penalty to see the pretax excess charge before you return the vehicle.
FAQ
How is lease mileage overage calculated?
Excess charge is excess miles times the per-mile rate, rounded to two decimals.
What if I drove fewer miles than the allowance?
Unused miles are not a credit or rebate on a closed-end lease; the calculator never returns a negative charge.
Are taxes, wear-and-tear, and disposition fees included?
Add excess wear, a disposition fee, and any tax on the overage on the full turn-in worksheet.
Do I enter my yearly mileage allowance or the total?
Enter the total for the whole contract: the yearly allowance multiplied by the years of the lease. A three-year lease with 36,000 included miles is entered as 36,000, not as the yearly figure.
How do I enter the per-mile penalty?
Type it in currency per mile, so fifteen cents is 0.15. The rate is printed in your lease; on US retail contracts it commonly falls between ten and thirty cents a mile.
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/lease-mileage \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"allowed_miles":36000,"actual_miles":42000,"per_mile_rate":0.15}'const res = await fetch("https://api.kit.forhosting.com/fin/lease-mileage", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"allowed_miles": 36000,
"actual_miles": 42000,
"per_mile_rate": 0.15
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/lease-mileage",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"allowed_miles": 36000,
"actual_miles": 42000,
"per_mile_rate": 0.15
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/lease-mileage", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"allowed_miles":36000,"actual_miles":42000,"per_mile_rate":0.15}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"allowed_miles":36000,"actual_miles":42000,"per_mile_rate":0.15}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/lease-mileage", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"allowed_miles": 36000,
"actual_miles": 42000,
"per_mile_rate": 0.15
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.lease_mileage",
"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
Actual miles that are negative fail with invalid_input instead of producing a nonsense rebate.
What lease mileage overage is and how the one-sided formula works
Miles left unused are not a refund: the lessee prepaid the right to drive up to the cap, and coming in under that cap does not generate a credit on the payoff statement. That one-sided identity is why a naive subtraction that can go negative is the wrong product for a lease mileage calculator. This endpoint implements the industry identity: excess miles equal the greater of zero and actual miles minus allowed miles, and the excess charge equals that quantity times the per-mile penalty rate.
Input contract, response shape, and error behaviour
Actual miles is the field the product contract singles out: a negative odometer is never truncated to zero and never treated as a rebate. POST a JSON body with three required fields: allowed_miles, the contracted mileage cap as a finite number at least zero (aliases allowed, allowance, and included_miles); actual_miles, the odometer miles driven as a finite number at least zero (aliases actual, miles_driven, and driven); and per_mile_rate, the contractual excess-mileage penalty in currency per mile as a finite number at least zero, for example 0.15 for fifteen cents (aliases rate, penalty, excess_rate, and overage_rate). Each numeric field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, booleans, non-finite values, a negative allowance, a negative rate, and actual miles that are negative fail with invalid_input naming the field and are not billed. On success the body echoes allowed_miles, actual_miles, and per_mile_rate, and adds excess_miles, excess_charge, and a formula string restating the max-zero identity. Example: allowed_miles thirty-six thousand, actual_miles forty-two thousand, per_mile_rate 0.15 yields six thousand excess miles and an excess charge of nine hundred after two-decimal money rounding. When actual miles sit at or under the allowance, excess_miles and excess_charge are both zero. Pair the figure with your own tax table if the jurisdiction taxes the overage; this endpoint computes pretax lease mileage math only.
Where a lease mileage calculator earns its keep
Content teams can illustrate under-allowance returns with a zero charge and no invented credit. Failed validation does not consume balance. Keep actual miles non-negative, pin the rounded money fields in tests, and you get reproducible lease mileage overage figures for widgets, LMS modules, and edge workers without a lending stack of your own. Quote tools and comparison pages can call the same pure module from the browser for free previews and from the API when storing a scenario, guaranteeing that the overage a visitor saw on a landing page matches the overage stored after they save a quote. Personal-finance apps and household budgets already know a planned commute; posting allowed_miles, actual_miles, and per_mile_rate fills a card with excess miles and excess charge so a driver can see whether buying extra miles up front is cheaper than paying the penalty later. Educators teaching lease versus loan math can seed classroom examples that fail loudly when actual_miles is negative, instead of silently refunding a negative odometer.
Integration use cases
Buy extra miles versus pay later
Compare the cash cost of prepaid extra miles against the same projected overage billed at the contractual per-mile rate at turn-in.
Quote and comparison tools
Store allowed_miles, actual_miles, and per_mile_rate in a quote pipeline whose API excess charge matches the free browser preview byte for byte.
Technical questions
What happens if actual miles are negative?
The task fails with invalid_input. actual_miles cannot be negative: a negative odometer is rejected and not billed rather than treated as a rebate.
What does the lease mileage calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.