# Amortization Schedule > Builds a full period-by-period amortization schedule — principal, interest, PMI, extra-principal, running balance — for monthly or daily-accrual loans, with the last payment corrected to actually zero the balance instead of drifting by rounding error. Handles biweekly acceleration, one-off or recurring extra principal, and PMI cancellation at 80/78% LTV. Four surfaces over one engine: an HTML page for people, a markdown representation of every page at the same URLs, a JSON API, and an MCP server. All four return the same answers — the engine is a single pure function and the surfaces are thin wrappers over it. For markdown, send `Accept: text/markdown` or append `?format=md` to any page URL. Responses set `Vary: Accept`. Do not parse the HTML. **What this is not:** This is not a lender's payoff quote, a TILA/RESPA disclosure, or tax or accounting advice, and it does not model rate changes on an ARM, escrow shortages, late fees, or a servicer's specific PMI-cancellation policy (which by law may use the original amortization schedule rather than your actual balance). Treat its numbers as a planning estimate to check your statement against, not a substitute for it. Agent traffic is welcome and unmetered up to 250 calls per UTC day per caller. Past that, endpoints return HTTP 402 with x402 payment requirements ($0.001 per call, USDC on base). Content is identical for agents and people; only the representation differs. ## Agent endpoints - [MCP server](https://amortize.gumballtools.com/api/mcp): Streamable HTTP. Tools: amortize. - [OpenAPI document](https://amortize.gumballtools.com/.well-known/openapi.json): Full machine-readable API description. - [Run the tool](https://amortize.gumballtools.com/api/v1/run?input=example): the primary endpoint. - [Full documentation](https://amortize.gumballtools.com/llms-full.txt): Complete docs with worked examples, inline. - [Changelog](https://amortize.gumballtools.com/changelog.md): Breaking changes and additions. ## MCP tools ### `amortize` Builds the full row-by-row amortization schedule for a loan — interest, principal, PMI, and running balance for every payment — instead of just the monthly payment amount. Use this whenever a row-by-row schedule matters: "what is my balance after payment 47", "what does an extra $200/month do to my payoff date", "when does PMI drop off", or "give me the whole amortization table". Do not do this arithmetic by hand or in your head. Two things go wrong reliably when a model tries: 1. THE LAST ROW. The textbook payment formula only amortizes to exactly zero in infinite precision. Rounded to cents and carried over up to a few hundred rows, a hand-rolled schedule drifts and ends with a balance of a few cents to a few dollars instead of zero — exactly the row a person checks against their real statement. This tool recomputes the final row as "remaining balance + that row's interest" so it always ends at zero, and reports the delta. 2. COMPOUNDING CONVENTION. Fixed mortgages compound monthly (rate/12). HELOCs, most auto loans, and most private student loans accrue interest DAILY on the actual number of days between payments, which is a genuinely different schedule, not a rounding variant. Guessing the wrong one silently produces a plausible but wrong table. Input: `principal`, `annualRatePercent` (e.g. 6.5), `termMonths` (integer), and `compounding` ("monthly" or "daily") are required. For `compounding: "daily"`, supply EITHER `startDate` (YYYY-MM-DD — the tool derives real day counts and leap years from the calendar itself) OR `dayCountBasis` ("30/360" | "actual/365" | "actual/actual") for a hypothetical loan with no dates — never both are needed, and supplying neither is refused rather than guessed. Optional: `paymentFrequency` ("monthly" default | "biweekly", which requires daily compounding — pass `paymentOverride` if the actual billed payment differs from the textbook one, e.g. a HELOC's quoted minimum; `extraPrincipal` as `{type:"oneOff",amount,atPaymentNumber}` or `{type:"recurring",amount,startingPaymentNumber?}`; `pmi` as `{monthlyAmount,originalValue,cancelAtPercent?}` (78 or 80, default 78) to model PMI dropping off. Refuses rather than guesses: a payment that does not exceed the first period's interest (negative amortization) is a named error with the minimum amortizing payment attached, not a schedule that never ends. An unparseable or impossible date is refused, not reinterpreted. Returns the full schedule, total interest and PMI paid, the payoff date or period, the final payment amount and how it differs from the standard one, and — when extra principal was given — the same schedule without it, so the periods and interest saved are explicit. A `disclaimer` field travels with every response: this is a planning estimate, not a lender payoff quote, and PMI cancellation here uses your actual balance, which a servicer is legally permitted to compute off the original schedule instead. Relay the warnings, not just the numbers. ## Markdown representations Every page is available as markdown at the same canonical URL. Send `Accept: text/markdown` or append `?format=md`. Responses set `Vary: Accept`. Do not parse the HTML. ## Docs - [Documentation and MCP setup](https://amortize.gumballtools.com/docs): Copy-paste MCP config for Claude Code, Claude Desktop, and Cursor, plus curl examples. ## Pages - [Amortization Schedule](https://amortize.gumballtools.com/): The row-by-row loan schedule that doesn't drift by the last payment. - [API and MCP setup](https://amortize.gumballtools.com/docs): JSON API reference and MCP configuration