Calculate a loan amortization schedule row
Calculate the exact row you need from a standard fixed-rate loan amortization schedule without generating every preceding row.
Run — free
Enter the original principal, nominal annual interest rate, full term in months, and the one-based payment number to inspect. The result separates that scheduled payment into interest and principal, then reports the balance remaining immediately after the payment. Zero-interest loans are supported, and an out-of-range payment number produces a clear input error.
Enter loan terms on a consistent monthly basis
Start with the original principal, meaning the amount financed before scheduled interest is added. Enter the annual interest rate as a percentage, so 6.5 means 6.5 percent rather than the decimal 0.065. Supply the complete term as a positive number of months and identify the payment using a one-based payment number: the first payment is 1, the twelfth is 12, and the final payment equals the term. The calculator assumes one payment per month, a fixed nominal annual rate, and equal scheduled payments over a fully amortizing term. It does not automatically include taxes, insurance, service charges, optional products, or additional principal payments. If a fee is financed as part of the opening balance, include it in principal; otherwise keep it separate. Use the contractual loan balance rather than a purchase price or asset value. The payment number must fall within the stated term. Asking for month 361 on a 360-month loan is invalid because no scheduled row exists after the loan’s contractual final payment.
Understand how the selected row is calculated
For a loan with interest, the annual percentage rate is divided by twelve and by one hundred to obtain the monthly decimal rate. The standard fixed-payment amortization formula determines the scheduled monthly payment. The calculator then derives the outstanding balance immediately before the requested payment without rounding through every earlier row. Interest for the selected row equals that opening balance multiplied by the monthly rate. Principal equals the scheduled payment minus that interest, and the remaining balance equals the opening balance minus the principal portion. This explains why early payments usually contain more interest while later payments direct more money toward principal, even though the scheduled payment stays constant. For an annual rate of exactly zero, the principal is divided evenly across the term, interest is zero, and the balance declines in equal steps. Monetary outputs are rounded to two decimal places for display. The underlying calculation retains full floating-point precision until the selected row is complete, avoiding cumulative cent-rounding drift from simulating a displayed schedule line by line.
Interpret the result and compare it with lender records
The response identifies the requested payment number and reports the scheduled payment, its interest component, its principal component, and the remaining balance immediately afterward. This makes a single-row result useful for checking a statement, estimating equity at a future installment, or feeding one period into a financial workflow without transferring a full schedule. Treat the figures as a standard mathematical estimate. A lender may round each prior row to cents, use daily interest, apply a different day-count convention, schedule payments on actual dates, or handle the final installment as a small adjustment. Extra payments, skipped payments, rate changes, fees, escrow charges, and late charges also change a real account but are outside this fixed-rate model. For those reasons, a lender’s statement can differ slightly even when the headline principal, annual rate, and term match. Keep all comparison inputs consistent and use the contractual statement for settlement decisions. The calculation is deterministic and needs no network access, so identical input always produces identical output. Browser use is available on this page, while an automated API request uses the published base price of $0.002.
What you can do with it
Check a payment breakdown
Compare the interest and principal portions of a selected scheduled payment with a lender statement or servicing export.
Estimate a future balance
Find the remaining principal immediately after a planned payment number without building or storing an entire amortization table.
Power a focused finance workflow
Retrieve one deterministic schedule row for a report, audit check, customer tool, or downstream calculation.
FAQ
What kind of loan does this calculator model?
It models a fully amortizing loan with equal monthly payments and a fixed nominal annual interest rate.
Is the payment number zero-based or one-based?
It is one-based: payment 1 is the first scheduled payment, and the final valid payment number equals the term in months.
What happens if the payment number exceeds the term?
The request returns an invalid-input error because no scheduled payment row exists beyond the stated loan term.
How is a zero-interest loan handled?
The principal is divided evenly across all monthly payments, the interest portion is zero, and the balance falls by an equal amount each month.
Why might the result differ from my lender's schedule?
The lender may round each row, accrue interest daily, use payment dates, include fees, or apply transactions that this standard monthly model does not include.
How much does an API calculation cost?
The published base price is $0.002 per request. The same deterministic calculation can also run in your browser.
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/calc2/loan-amortization-row \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"principal":250000,"annual_interest_rate":6.5,"term_months":360,"payment_number":12}'const res = await fetch("https://api.kit.forhosting.com/calc2/loan-amortization-row", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"principal": 250000,
"annual_interest_rate": 6.5,
"term_months": 360,
"payment_number": 12
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/calc2/loan-amortization-row",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"principal": 250000,
"annual_interest_rate": 6.5,
"term_months": 360,
"payment_number": 12
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/calc2/loan-amortization-row", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"principal":250000,"annual_interest_rate":6.5,"term_months":360,"payment_number":12}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"principal":250000,"annual_interest_rate":6.5,"term_months":360,"payment_number":12}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/calc2/loan-amortization-row", 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_interest_rate": 6.5,
"term_months": 360,
"payment_number": 12
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "calc2.loan_amortization_row",
"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. |