A mortgage calculator API from your Excel loan model.

A mortgage calculator API returns the interest rate, the monthly payment and the repayment plan of a loan as JSON. Your Excel workbook already calculates all three from your terms. SpreadAPI publishes it as a loan calculator API and a web calculator, so your website, your advisers and AI assistants calculate with the same terms.

Mortgage calculatorsample · invented bank and terms
Example values of the demo workbook
Monthly payment$1,570.25
Interest rate per year
3.71%
Loan amount
$330,000.00
Balance at end of fixed period
$250,238.93
Years until fully repaid
28.3
Repayment plan
YearInterestRepaymentBalance
1$12,129.61$6,713.39$323,286.61
2$11,876.26$6,966.74$316,319.87
3$11,613.36$7,229.64$309,090.23
4$11,340.52$7,502.48$301,587.75
5$11,057.41$7,785.59$293,802.16
See the call

An example, not a live call: the request for the default values and the outputs of the answer.

GETRequest
https://spreadapi.io/api/v1/services/410c7f87-78c7-42db-83dd-edbe83cb2d03_mwf715o4ynj7v/execute?purchase_price=420000&down_payment=90000&fixed_period=10&initial_repayment=0.02&extra_repayment=0
Answer
{
  "outputs": [
    {
      "name": "loan_amount",
      "title": "Loan amount",
      "value": 330000,
      "formatString": "$#,##0.00"
    },
    {
      "name": "loan_to_value",
      "title": "Loan-to-value",
      "value": 0.7857,
      "formatString": "0.0%"
    },
    {
      "name": "interest_rate",
      "title": "Interest rate per year",
      "value": 0.0371,
      "formatString": "0.00%"
    },
    {
      "name": "monthly_payment",
      "title": "Monthly payment",
      "value": 1570.25,
      "formatString": "$#,##0.00"
    },
    {
      "name": "balance",
      "title": "Balance at end of fixed period",
      "value": 250238.93,
      "formatString": "$#,##0.00"
    },
    {
      "name": "interest",
      "title": "Interest in the fixed period",
      "value": 108668.93,
      "formatString": "$#,##0.00"
    },
    {
      "name": "years_to_repay",
      "title": "Years until fully repaid",
      "value": 28.3,
      "formatString": "0.0"
    },
    {
      "name": "repayment_plan",
      "title": "Repayment plan",
      "value": [
        ["Year", "Payments", "Interest", "Repayment", "Extra repayment", "Balance"],
        [1, 18843, 12129.609999999986, 6713.390000000014, 0, 323286.61],
        [2, 18843, 11876.26000000001, 6966.739999999991, 0, 316319.87],
        [3, 18843, 11613.359999999986, 7229.640000000014, 0, 309090.23],
        [4, 18843, 11340.520000000019, 7502.479999999981, 0, 301587.75],
        [5, 18843, 11057.409999999974, 7785.590000000026, 0, 293802.16],
        [6, 18843, 10763.590000000026, 8079.409999999974, 0, 285722.75],
        [7, 18843, 10458.700000000012, 8384.299999999988, 0, 277338.45],
        [8, 18843, 10142.299999999988, 8700.700000000012, 0, 268637.75],
        [9, 18843, 9813.950000000012, 9029.049999999988, 0, 259608.7],
        [10, 18843, 9473.229999999981, 9369.770000000019, 0, 250238.93]
      ]
    }
  ]
}

New terms should reach every calculator the same day.

Today the terms change in the Excel file, then someone rebuilds the change in the website calculator, the adviser tool and the app. Each copy can drift.

Product and pricing

Own the terms

Edit a rate in the terms sheet and republish. The workbook is the calculator; nobody re-keys it.

IT and developers

Call one endpoint

Website, app and adviser tool send the loan data and get the rate, the monthly payment and the repayment plan as JSON.

Sales and advisers

Calculate from a link

The ready-made web calculator runs on the same terms, by link or embedded in a page.

The payment and the plan behind it.

Mark the repayment plan as a result and every answer carries it year by year: payments, interest, repayment and the remaining balance.

The plan shows one row per year of the fixed period: change it from 10 to 15 years and five more rows appear. The API answer always carries the whole marked range; for a shorter period its last rows are empty.

An AI assistant that uses the service answers with these numbers. It does not estimate a payment.

The engine calculates with more than 500 Excel functions, including dynamic arrays, LET and LAMBDA. The table comes from formulas that spill, like in Excel. Measured on our demo calculator: a calculation takes about 20 ms on the server, and a call returns in about 100 ms from Europe.

"outputs": [
  { "name": "interest_rate", "value": 0.0371 },
  { "name": "monthly_payment", "value": 1570.25 },
  { "name": "repayment_plan", "value": [
    ["Year", "Payments", "Interest", "Repayment", "Extra repayment", "Balance"],
    [1, 18843, 12129.609999999986, 6713.390000000014, 0, 323286.61],
    [2, 18843, 11876.26000000001, 6966.739999999991, 0, 316319.87],
    … 8 more rows
  ] }
]

From the answer of the example above, default values

Where it fits

  • Mortgage and loan calculators on a website or in an app
  • Indicative monthly payments in an adviser conversation
  • Comparing scenarios, for example the same loan with several fixed periods in one batch call
  • A loan model an AI assistant has to apply exactly

What it is not

  • Not a core banking system and not a credit decision system
  • No credit scoring
  • Results are calculations, not offers and not advice
  • No version history with rollback and no audit trail of changed terms
  • Macros in the workbook do not run

Where the data runs

In our cloud, or with the on-premises runtime on your own infrastructure. Callers never see the formulas, only the results you mark.

Try it with your own loan workbook.

Import the Excel file, mark the inputs and the results, publish.