Amortization schedule
POST /api/amortizationBuild the full per-period amortization schedule for a fully-amortizing loan. Send POST /api/amortization with the required fields principal, annualRate and termYears and pay $0.001 per call over x402 or MPP, or call it free by solving a proof-of-work challenge. It returns a JSON object with payment, totalPaid, totalInterest, periods, rowsReturned and 1 more.
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.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
principal | number | yes | Loan principal (positive) Also accepted as amount, p, balance, loan. |
annualRate | number | yes | Annual interest rate as decimal (0.06 = 6%) |
termYears | number | yes | Loan term in years |
paymentsPerYear | number | no | Payments per year (default 12 = monthly) |
maxRows | number | no | 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 request
curl -i -X POST https://agent402.tools/api/amortization \
-H "Content-Type: application/json" \
-d '{"principal":200000,"annualRate":0.06,"termYears":30,"maxRows":3}'
Without payment this returns HTTP 402 Payment Required with the exact price for amortization; any x402 v2 or MPP client pays it and retries.
Example response
{
"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
}
]
}
| Field | Type | Always present | In the example |
|---|---|---|---|
payment | number | yes | 1199.1 |
totalPaid | number | yes | 431676.38 |
totalInterest | number | yes | 231676.38 |
periods | number | yes | 360 |
rowsReturned | number | yes | 3 |
schedule | array of objects | yes | 3 items in the example |
From an MCP client
catalog.call {
"slug": "amortization",
"params": {
"principal": 200000,
"annualRate": 0.06,
"termYears": 30,
"maxRows": 3
}
}
On the hosted connector at https://agent402.tools/mcp, catalog.call runs amortization free (rate-limited, no wallet). Local install: npx -y agent402-mcp.
Errors and behavior
principal,annualRateandtermYearsare required. An input the tool rejects returns an HTTP 4xx whose body carrieserror,tool,expected,requiredandexample, so the caller can correct it.- A paid call that ends in any status of 400 or above is not charged over x402, MPP or a prepaid credits key: settlement is cancelled when the tool fails. The exception is a Tempo push credential, a transfer the buyer sent before the call: it settles before the tool runs, so if the tool then fails the payment is recorded as a refund owed to the paying wallet.
- Free tier: no outbound network call leaves the server for this tool, so proof-of-work (16 leading zero bits of sha256) pays for it.
- A
GETorHEADto /api/amortization returns the same 402 quote, so the price can be read without a body. - An
Idempotency-Keyheader makes a retried paid call replay the first 200 instead of charging again (an answer larger than 1 MB is not replayed).
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";
const client = new x402Client();
client.setSpendControls?.(false); // keep your own spending ceiling in code
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
Fetch a challenge, solve the sha256 puzzle (16 leading zero bits, a fraction of a second of CPU), 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
Amortization schedule is one step in this skill pack, each sold as a single call:
- 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
Loan payment
POST /api/loan-paymentCompute the monthly (or per-period) payment on a fully-amortizing loan: mortgage, auto, student loan, business loan. Ret…
Annuity present/future value
POST /api/annuityPresent and future value of a level annuity (equal periodic payments). Supports an ordinary annuity (payments at period …
Black-Scholes option price
POST /api/black-scholesPrice a European option (call or put) with the Black-Scholes-Merton model, plus the greeks (delta, gamma, vega, theta, r…
Bond price
POST /api/bond-pricePrice a fixed-coupon bond from its yield to maturity: present-value the coupons plus face. Returns clean price, coupon p…
Bond yield to maturity
POST /api/bond-ytmSolve a bond's yield to maturity from its market price - the annual rate that present-values the coupons plus face to th…
Break-even analysis
POST /api/break-evenBreak-even point for a product: the units and revenue at which total revenue covers fixed plus variable costs. Also retu…