Car lease monthly payment calculator
This car lease monthly payment calculator estimates the base payment for a conventional closed-end vehicle lease.
Run — free
Enter the negotiated vehicle price, the residual value written in the lease, the money factor, the number of months, and the down payment used as a capitalized-cost reduction. The result separates depreciation from the finance charge so you can see what drives the estimate. It excludes taxes and dealer or registration fees, making it a transparent comparison tool rather than a final contract quote.
Enter comparable lease figures
Start with the negotiated vehicle price, sometimes described as the gross capitalized cost when no other financed items have been added. Use the residual value as a currency amount, not a residual percentage. If a dealer gives you a percentage, multiply that percentage by the appropriate sticker price first and confirm which price the leasing company uses. Enter the money factor as the small decimal shown in the offer, such as 0.0021, rather than entering an annual percentage rate. The term must be a whole number of months. Finally, enter only the portion of cash paid at signing that actually reduces the capitalized cost as the down payment. Do not combine the first monthly payment, registration, acquisition fee, refundable security deposit, or taxes with that value. Keeping those categories separate is essential when comparing two offers because identical cash due at signing can hide very different reductions in financed cost. The calculator rejects combinations that would reduce the adjusted capitalized cost below the residual value.
Understand the monthly calculation
A lease payment has two main parts before tax. The depreciation charge pays for the expected loss in vehicle value during the lease. It is calculated by subtracting the residual value from the adjusted capitalized cost, then dividing that difference by the number of months. The finance charge compensates the leasing company for providing capital. It is calculated by adding the adjusted capitalized cost and residual value, then multiplying that sum by the money factor. The estimated monthly payment is the sum of those two unrounded amounts. Results are displayed to two decimal places, while the total of monthly payments is calculated from the unrounded monthly estimate to avoid compounding display rounding. A larger residual generally lowers depreciation, while a larger money factor raises the finance charge. A down payment lowers adjusted capitalized cost and therefore reduces both components, but it also places more money at risk if the vehicle is stolen or totaled early in the lease.
Use the estimate when evaluating an offer
Treat the result as a clean baseline for checking dealer worksheets and comparing scenarios, not as the exact amount that will appear on a contract. Real lease invoices may add sales or use tax, acquisition and documentation charges, registration, optional products, negative equity, or other financed amounts. Tax treatment also varies by jurisdiction: some places tax each monthly payment, while others tax a larger portion of the transaction upfront. Ask for an itemized lease worksheet and compare its adjusted capitalized cost, residual, money factor, and term with the values you entered. If the base payment differs, look for capitalized fees, rebates applied differently, or a marked-up money factor before assuming the arithmetic is wrong. Run alternatives with a smaller down payment, a different negotiated price, or a different term to see which lever changes the payment. For API use, each calculation costs $0.002; the same deterministic formula is used for every valid request.
What you can do with it
Check a dealer worksheet
Recreate the base payment from the contract figures and investigate differences before signing.
Compare lease offers
Normalize offers with different prices, residuals, money factors, terms, and down payments.
Test negotiation scenarios
See how a lower vehicle price or money factor changes depreciation, finance charge, and payment.
FAQ
Does the estimate include tax and fees?
No. It estimates the base depreciation and finance charges only. Add taxes, acquisition fees, registration, and other charges according to the actual offer and local rules.
Should I enter residual value as a percentage?
No. Enter the residual as a currency amount. Convert a quoted residual percentage to an amount using the price basis specified by the leasing company.
Is the money factor the same as APR?
No. Enter the lease money factor as a decimal. Multiplying a money factor by 2400 gives a commonly used approximate APR equivalent, but the calculator needs the original factor.
Why is cash due at signing not always the down payment?
Cash due at signing can include the first payment, taxes, fees, and deposits. Enter only the capitalized-cost reduction in the down_payment field.
Is a larger down payment always better?
It lowers the estimated monthly payment, but it increases upfront exposure and may not be recovered if the vehicle is stolen or totaled. Compare both payment and total cash commitment.
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/travel/car-lease-payment \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"vehicle_price":42000,"residual_value":25200,"money_factor":0.0021,"lease_term_months":36,"down_payment":3000}'const res = await fetch("https://api.kit.forhosting.com/travel/car-lease-payment", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"vehicle_price": 42000,
"residual_value": 25200,
"money_factor": 0.0021,
"lease_term_months": 36,
"down_payment": 3000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/travel/car-lease-payment",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"vehicle_price": 42000,
"residual_value": 25200,
"money_factor": 0.0021,
"lease_term_months": 36,
"down_payment": 3000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/travel/car-lease-payment", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"vehicle_price":42000,"residual_value":25200,"money_factor":0.0021,"lease_term_months":36,"down_payment":3000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"vehicle_price":42000,"residual_value":25200,"money_factor":0.0021,"lease_term_months":36,"down_payment":3000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/travel/car-lease-payment", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"vehicle_price": 42000,
"residual_value": 25200,
"money_factor": 0.0021,
"lease_term_months": 36,
"down_payment": 3000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "travel.car_lease_payment",
"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. |