Amortization schedule
POST /api/amortizationBuild the full per-period amortization schedule for a fully-amortizing loan. Each row reports the period number, payment, the principal vs. interest split for that payment, and the remaining balance after that payment. Use this when the user wants to see how interest tapers over the life of the loan, or to model an extra-payment scenario by reading the balance at any period.
Input
| Field | Type | Description |
|---|---|---|
principal * | number | Loan principal (positive) |
annualRate * | number | Annual interest rate as decimal (0.06 = 6%) |
termYears * | number | Loan term in years |
paymentsPerYear | number | Payments per year (default 12 = monthly) |
maxRows | number | Cap the number of schedule rows returned (default 360; absolute max 1200 = 100 years monthly). Use a small value to preview just the first few rows. |
Example output
{
"payment": 1199.1,
"totalPaid": 431676.38,
"totalInterest": 231676.38,
"periods": 360,
"rowsReturned": 3,
"schedule": [
{
"period": 1,
"payment": 1199.1,
"interest": 1000,
"principal": 199.1,
"balance": 199800.9
},
{
"period": 2,
"payment": 1199.1,
"interest": 999,
"principal": 200.1,
"balance": 199600.8
},
{
"period": 3,
"payment": 1199.1,
"interest": 998,
"principal": 201.1,
"balance": 199399.71
}
]
}
Try it - see the 402 challenge (free)
curl -i -X POST https://agent402.tools/api/amortization \
-H "Content-Type: application/json" \
-d '{"principal":200000,"annualRate":0.06,"termYears":30,"maxRows":3}'
The response is HTTP 402 Payment Required with exact payment requirements. Any x402 v2 client pays automatically and retries:
Paid call (JavaScript agent)
import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
import { metaTitle, metaDescription } from "./seo-meta.js";
const client = new x402Client();
client.setSpendControls?.(false); // @x402/core 2.23+ refuses anything over $1 or off the pegged-asset list by default; keep your own ceiling in code instead
registerExactEvmScheme(client, { signer: privateKeyToAccount(KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);
const res = await payFetch("https://agent402.tools/api/amortization", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"principal": 200000,
"annualRate": 0.06,
"termYears": 30,
"maxRows": 3
}),
});
No wallet? Pay with compute
This is a pure-CPU tool, so an agent without a wallet can pay with proof-of-work instead of USDC: fetch a challenge, solve the sha256 puzzle (16 leading zero bits - a fraction of a second of CPU, no money, no AI tokens), and resend with the X-Pow-Solution header.
import { createHash } from "node:crypto";
const lz = (b) => { let t = 0; for (const x of b) { if (!x) { t += 8; continue; } t += Math.clz32(x) - 24; break; } return t; };
const c = await (await fetch("https://agent402.tools/api/pow/challenge?slug=amortization")).json();
let n = 0;
while (lz(createHash("sha256").update(c.challenge + ":" + n).digest()) < c.difficulty) n++;
await fetch("https://agent402.tools/api/amortization", { method: "POST", headers: { "X-Pow-Solution": c.token + ":" + n, "Content-Type": "application/json" }, body: JSON.stringify({"principal":200000,"annualRate":0.06,"termYears":30,"maxRows":3}) });
Part of these workflows
This tool is one step in a curated multi-tool workflow - agents can fetch the whole sequence as an MCP prompt or call https://agent402.tools/api/skill-packs/{slug}/prompt.
- Loan comparison - Compare two or more loan offers - different rates, terms, fees, prepayment structures - on the metrics that actually matter (monthly payment, total interest, year-1 equity build, NPV at your discount rate, effective rate). Apples-to-apples math without opening a spreadsheet.
Related tools
US gov dataset search
GET /api/gov-dataSearch 300,000+ US government datasets on catalog.data.gov (Catalog API): titles, publishing org, formats, and direct re…
try in playground →US weather alerts
GET /api/weather-alertsActive National Weather Service alerts for a US state as clean JSON: event, severity, headline, affected areas, onset/ex…
try in playground →Recent earthquakes (USGS)
GET /api/earthquakesReal-time USGS earthquake feed: magnitude, place, time, depth, coordinates. Live government data, no key. ?minMag=4.5&pe…
try in playground →