openapi: 3.1.0 info: title: Mortgage & Loan Amortization Calculator description: Give this API a loan amount, an interest rate, and a repayment term, and it hands back the precise monthly payment plus a complete schedule showing — for every single month — how much goes to interest, how much reduces the balance, and what you still owe. You can also ask 'what if I pay an extra $300 a month?' or 'what if I make a $10,000 lump payment in month 24?' and it will tell you exactly how many months you save and how much interest you avoid. Every number is computed with banker's rounding and a pinned arithmetic rule so that two correct systems running the same inputs produce identical results, down to the cent. No rate lookups, no market data — you supply the rate, the API does the math. version: 1.0.0 contact: name: _done url: https://forms.gle/5KzuSFH7p8hHtDmz7 email: info@underscoredone.com x-openapi-url: https://mortgage-amortization.underscoredone.com/openapi.json x-logo: url: https://underscoredone.com/logo.png altText: _done x-guidance: 'POST to /calculate with principal (positive number), annual_rate_percent (0 or above), term_months (1 or above), and start_date (YYYY-MM-DD for the first payment). Optional: extra_monthly_payment (recurring extra principal each month), one_time_payments (list of objects with ''month'' and ''amount'' keys for lump-sum payments), summary_only (true to skip the row-by-row schedule array), and rounding (decimal places, default 2). The top-level scheduled_payment field is always the base principal-and-interest payment without extras. Use with_extra_payments block when extras are supplied. The schedule array reflects actual cash paid each month including extras. All dates are YYYY-MM-DD. Raises 400 for invalid inputs such as negative principal or zero term.' x-ai-instructions: 'POST to /calculate with principal (positive number), annual_rate_percent (0 or above), term_months (1 or above), and start_date (YYYY-MM-DD for the first payment). Optional: extra_monthly_payment (recurring extra principal each month), one_time_payments (list of objects with ''month'' and ''amount'' keys for lump-sum payments), summary_only (true to skip the row-by-row schedule array), and rounding (decimal places, default 2). The top-level scheduled_payment field is always the base principal-and-interest payment without extras. Use with_extra_payments block when extras are supplied. The schedule array reflects actual cash paid each month including extras. All dates are YYYY-MM-DD. Raises 400 for invalid inputs such as negative principal or zero term.' x-provider: _done — single-purpose utility APIs for developers and AI agents. Pay per call with USDC on Base Mainnet or Solana Mainnet. x-pricing: model: pay-per-call currency: USDC network: Base Mainnet or Solana Mainnet price: $0.01 x-keywords: - math - mortgage - amortization - loan - monthly payment - repayment schedule - interest calculation - extra payment - lump sum - real estate - personal finance - lending - utility - api - ai-agent - pay-per-call - usdc - x402 x-category: mortgage calculator x-provider-url: https://underscoredone.com x-agentcash-auth: mode: paid x-402: price: $0.01 network: eip155:8453 asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' pay_to: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08' facilitator: https://api.cdp.coinbase.com/platform/v2/x402 scheme: exact description: Give this API a loan amount, an interest rate, and a repayment term, and it hands back the precise monthly payment plus a complete schedule showing — for every single month — how much goes to interest, how much reduces the balance, and what you still owe. You can also ask 'what if I pay an extra $300 a month?' or 'what if I make a $10,000 lump payment in month 24?' and it will tell you exactly how many months you save and how much interest you avoid. Every number is computed with banker's rounding and a pinned arithmetic rule so that two correct systems running the same inputs produce identical results, down to the cent. No rate lookups, no market data — you supply the rate, the API does the math. mime_type: application/json networks: - network: eip155:8453 asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' pay_to: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08' - network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v pay_to: 8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b paths: /calculate: post: tags: - mortgage calculator - loan amortization - amortization schedule - mortgage - monthly payment calculator - mortgage payment - loan payment schedule - mortgage amortization - loan calculator - extra payment calculator - interest schedule - payoff calculator - principal and interest - mortgage schedule summary: Exact monthly payment and full amortization schedule for any fixed-rate loan description: Compute the exact monthly payment and full amortization schedule for any fixed-rate loan, with optional extra and lump-sum payments. operationId: handler_calculate_post requestBody: content: application/json: schema: $ref: '#/components/schemas/Request' required: true responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/Response' examples: success: summary: Successful response value: api_version: 1.0.0 inputs_echo: principal: 400000 annual_rate_percent: 6.5 term_months: 360 start_date: '2026-07-01' rounding: mode: half_even decimals: 2 final_payment_adjusted: true scheduled_payment: 2528.27 summary: total_paid: 910179.81 total_interest: 510179.81 final_payment: 2530.88 payoff_date: '2056-06-01' scheduled_term_months: 360 with_extra_payments: total_paid: 734237.48 total_interest: 334237.48 final_payment: 200.36 payoff_date: '2047-11-01' actual_term_months: 257 interest_saved: 175942.33 months_saved: 103 schedule: - payment_number: 1 date: '2026-07-01' payment: 2828.27 scheduled_payment: 2528.27 extra_applied: 300.0 interest: 2166.67 principal: 661.6 balance: 399338.4 - payment_number: 2 date: '2026-08-01' payment: 2828.27 scheduled_payment: 2528.27 extra_applied: 300.0 interest: 2163.08 principal: 665.19 balance: 398673.21 '422': description: Unprocessable — a required field is missing or the wrong type. Check the detail field for specifics. content: application/json: schema: type: object properties: detail: type: array '402': description: Payment required. Send a signed USDC payment on Base Mainnet or Solana Mainnet using the x402 protocol. headers: X-Payment-Response: description: x402 payment challenge — base64-encoded JSON with payment details. schema: type: string '400': description: Bad request — your input failed validation or could not be processed. Check the detail field for specifics. content: application/json: schema: type: object properties: detail: type: string x-ai-instructions: 'POST to /calculate with principal (positive number), annual_rate_percent (0 or above), term_months (1 or above), and start_date (YYYY-MM-DD for the first payment). Optional: extra_monthly_payment (recurring extra principal each month), one_time_payments (list of objects with ''month'' and ''amount'' keys for lump-sum payments), summary_only (true to skip the row-by-row schedule array), and rounding (decimal places, default 2). The top-level scheduled_payment field is always the base principal-and-interest payment without extras. Use with_extra_payments block when extras are supplied. The schedule array reflects actual cash paid each month including extras. All dates are YYYY-MM-DD. Raises 400 for invalid inputs such as negative principal or zero term.' x-guidance: 'POST to /calculate with principal (positive number), annual_rate_percent (0 or above), term_months (1 or above), and start_date (YYYY-MM-DD for the first payment). Optional: extra_monthly_payment (recurring extra principal each month), one_time_payments (list of objects with ''month'' and ''amount'' keys for lump-sum payments), summary_only (true to skip the row-by-row schedule array), and rounding (decimal places, default 2). The top-level scheduled_payment field is always the base principal-and-interest payment without extras. Use with_extra_payments block when extras are supplied. The schedule array reflects actual cash paid each month including extras. All dates are YYYY-MM-DD. Raises 400 for invalid inputs such as negative principal or zero term.' x-payment-info: price: fixed: mode: fixed currency: USD amount: '0.01' protocols: - x402: {} components: schemas: HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError InputsEcho: properties: principal: type: number title: Principal annual_rate_percent: type: number title: Annual Rate Percent term_months: type: integer title: Term Months start_date: type: string title: Start Date type: object required: - principal - annual_rate_percent - term_months - start_date title: InputsEcho OneTimePayment: properties: month: type: integer title: Month description: Which payment number to apply this lump sum on, starting at 1. amount: type: number title: Amount description: The dollar amount of the one-time lump-sum principal payment. Must be greater than zero. type: object required: - month - amount title: OneTimePayment example: amount: 10000 month: 24 Request: properties: principal: type: number title: Principal description: The total amount borrowed, in dollars. Must be greater than zero. annual_rate_percent: type: number title: Annual Rate Percent description: The yearly interest rate as a plain percentage — enter 6.5 for 6.5%. Enter 0 for an interest-free loan. Must be zero or above. term_months: type: integer title: Term Months description: How many monthly payments the loan spans. A 30-year mortgage is 360; a 5-year car loan is 60. Must be at least 1. start_date: type: string title: Start Date description: The date of the very first payment, written as YYYY-MM-DD (for example, 2026-07-01). extra_monthly_payment: type: number title: Extra Monthly Payment description: An optional extra amount you put toward principal every single month, on top of the required payment. Defaults to 0. default: 0.0 one_time_payments: items: $ref: '#/components/schemas/OneTimePayment' type: array title: One Time Payments description: An optional list of one-time lump-sum principal payments. Each item needs a 'month' and an 'amount'. summary_only: type: boolean title: Summary Only description: Set to true if you only want the totals and scheduled payment — no row-by-row schedule. default: false rounding: type: integer maximum: 6.0 minimum: 2.0 title: Rounding description: How many decimal places to round every money value to. Default is 2 (cents). Valid range is 2 to 6. default: 2 type: object required: - principal - annual_rate_percent - term_months - start_date title: Request example: annual_rate_percent: 6.5 extra_monthly_payment: 300 one_time_payments: - amount: 10000 month: 24 principal: 400000 rounding: 2 start_date: '2026-07-01' summary_only: false term_months: 360 Response: properties: api_version: type: string title: Api Version description: API version default: 1.0.0 inputs_echo: $ref: '#/components/schemas/InputsEcho' description: The key inputs you sent, echoed back for confirmation. rounding: $ref: '#/components/schemas/RoundingInfo' description: Details about how numbers were rounded. scheduled_payment: type: number title: Scheduled Payment description: The fixed monthly payment required to pay off the loan on schedule, not counting any extra payments. summary: $ref: '#/components/schemas/Summary' description: Overall totals for the loan without any extra payments. with_extra_payments: anyOf: - $ref: '#/components/schemas/WithExtraPayments' - type: 'null' description: How the loan changes if you make the extra payments you described. Only appears when extras were supplied. schedule: anyOf: - items: $ref: '#/components/schemas/ScheduleRow' type: array - type: 'null' title: Schedule description: The full month-by-month payment table. Omitted when summary_only is true. type: object required: - inputs_echo - rounding - scheduled_payment - summary title: Response example: api_version: 1.0.0 inputs_echo: annual_rate_percent: 6.5 principal: 400000 start_date: '2026-07-01' term_months: 360 rounding: decimals: 2 final_payment_adjusted: true mode: half_even schedule: [] scheduled_payment: 2528.27 summary: final_payment: 2530.88 payoff_date: '2056-06-01' scheduled_term_months: 360 total_interest: 510179.81 total_paid: 910179.81 RoundingInfo: properties: mode: type: string title: Mode decimals: type: integer title: Decimals final_payment_adjusted: type: boolean title: Final Payment Adjusted type: object required: - mode - decimals - final_payment_adjusted title: RoundingInfo ScheduleRow: properties: payment_number: type: integer title: Payment Number date: type: string title: Date payment: type: number title: Payment scheduled_payment: type: number title: Scheduled Payment extra_applied: type: number title: Extra Applied interest: type: number title: Interest principal: type: number title: Principal balance: type: number title: Balance type: object required: - payment_number - date - payment - scheduled_payment - extra_applied - interest - principal - balance title: ScheduleRow Summary: properties: total_paid: type: number title: Total Paid total_interest: type: number title: Total Interest final_payment: type: number title: Final Payment payoff_date: type: string title: Payoff Date scheduled_term_months: type: integer title: Scheduled Term Months type: object required: - total_paid - total_interest - final_payment - payoff_date - scheduled_term_months title: Summary ValidationError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type input: title: Input ctx: type: object title: Context type: object required: - loc - msg - type title: ValidationError WithExtraPayments: properties: total_paid: type: number title: Total Paid total_interest: type: number title: Total Interest final_payment: type: number title: Final Payment payoff_date: type: string title: Payoff Date actual_term_months: type: integer title: Actual Term Months interest_saved: type: number title: Interest Saved months_saved: type: integer title: Months Saved type: object required: - total_paid - total_interest - final_payment - payoff_date - actual_term_months - interest_saved - months_saved title: WithExtraPayments securitySchemes: siwx: type: apiKey in: header name: SIGN-IN-WITH-X description: CAIP-122 wallet signature for repeat access after payment servers: - url: https://mortgage-amortization.underscoredone.com description: Production tags: - name: mortgage calculator - name: loan amortization - name: amortization schedule - name: mortgage - name: monthly payment calculator - name: mortgage payment - name: loan payment schedule - name: mortgage amortization - name: loan calculator - name: extra payment calculator - name: interest schedule - name: payoff calculator - name: principal and interest - name: mortgage schedule x402Version: 2 x-payment-accepts: - scheme: exact network: eip155:8453 payTo: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08' asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' - scheme: exact network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp payTo: 8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v