Snowballr provides financial education, not investment advice. Verify any advisor on FINRA BrokerCheck.
API DOCS

Snowballr Calculator API

Free, no-auth JSON endpoints for compound interest, loan amortization, and debt payoff. CORS-enabled. Schema.org compatible. Use them in your app, agent, spreadsheet, or AI tool.

License & attribution

All API responses are licensed under CC-BY 4.0. Commercial use OK. Attribute as: Calculations by Snowballr (snowballr.io) with a backlink.

Endpoints

Compound interest

GET /api/calculate/compound

Future value of an initial amount plus fixed contributions at the end of each month. The nominal annual rate and selected compounding frequency determine the equivalent monthly growth rate. Returns a year-by-year schedule.

The monthly growth factor is (1 + rate / 100 / n)^(n / 12), where n is 365 for daily, 252 for business days, 12 for monthly, 4 for quarterly, 2 for semiannual, or 1 for annual compounding. Each month, the balance grows by that factor and then receives the monthly contribution. Deposits remain monthly at every compounding frequency. This is a projection convention; individual accounts may credit interest differently.

result.effectiveAnnualRate is 100 × ((1 + rate / 100 / n)^n − 1), rounded to six decimals. The legacy result.cagr field retains the nominal input rate for compatibility. Neither field measures a cash-flow return or IRR. The example assumes a constant rate and excludes fees, taxes, inflation, and withdrawals.

Query parameters
ParamTypeDefaultDescription
initialnumber0Starting balance
monthlynumber0Fixed contribution added after growth at each month-end
ratenumber7Nominal annual % return, before compounding (e.g., 7 for 7%)
yearsnumber30Time horizon (1–100)
compoundingstringmonthlydaily | business-days (252) | monthly | quarterly | semiannually | annually
currencystringUSDISO 4217 currency code
Example request
https://snowballr.io/api/calculate/compound?initial=10000&monthly=500&rate=7&years=30&compounding=monthly&currency=USD
Example response

Schedule abbreviated to the first year here; the API returns all years. Amounts are rounded to two decimals only in the response.

{
  "@context": "https://schema.org",
  "@type": "Dataset",
  "name": "Compound interest calculation: USD 10000 + USD 500/mo at 7% for 30 years",
  "inputs": {
    "initial": 10000,
    "monthly": 500,
    "rate": 7,
    "years": 30,
    "compounding": "monthly",
    "currency": "USD"
  },
  "assumptions": {
    "contributionTiming": "end-of-month",
    "monthlyGrowthFactor": "(1 + rate / 100 / n)^(n / 12), where n is the compounding frequency per year",
    "rateDefinition": "Nominal annual percentage; fixed contributions grow at the equivalent monthly rate.",
    "cagrDefinition": "Legacy alias of inputs.rate (nominal annual percentage), not a cash-flow return or IRR. Use result.effectiveAnnualRate for the effective annual percentage."
  },
  "result": {
    "finalBalance": 691150.47,
    "totalContributions": 190000,
    "totalGrowth": 501150.47,
    "cagr": 7,
    "effectiveAnnualRate": 7.229008,
    "multiple": 3.64
  },
  "schedule": [
    {
      "year": 1,
      "balance": 16919.19,
      "contributions": 16000,
      "growth": 919.19
    }
  ],
  "source": "https://snowballr.io",
  "citation": "Snowballr Compound Interest API — https://snowballr.io/api-docs",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "generatedFor": "https://snowballr.io/api/calculate/compound?initial=10000&monthly=500&rate=7&years=30&compounding=monthly&currency=USD"
}

Loan amortization

GET /api/calculate/loan

Monthly payment + total interest for any fixed-rate loan. Optional extra monthly payment shows months and interest saved.

Query parameters
ParamTypeDefaultDescription
principalnumber300000Loan amount
ratenumber6.5Annual APR
yearsnumber30Loan term
extranumber0Extra monthly payment
currencystringUSDISO 4217 currency code
Example request
https://snowballr.io/api/calculate/loan?principal=300000&rate=6.5&years=30&extra=200
Example response

Response excerpt; schedule abbreviated to the first year. monthlyPayment is the base payment, excluding the additional 200 per month in this example. Assumes a fixed rate, monthly payments, and no fees.

{
  "@context": "https://schema.org",
  "@type": "Dataset",
  "inputs": { "principal": 300000, "rate": 6.5, "years": 30, "extraMonthly": 200, "currency": "USD" },
  "result": {
    "monthlyPayment": 1896.20,
    "totalPayment": 579184.67,
    "totalInterest": 279184.67,
    "monthsToPayoff": 277,
    "yearsToPayoff": 23.08,
    "interestSavedFromExtra": 103448.79,
    "monthsSavedFromExtra": 83
  },
  "schedule": [
    { "year": 1, "balance": 294174.02, "interestYTD": 19328.47, "principalYTD": 5825.98 }
  ]
}

Debt snowball / avalanche

GET /api/calculate/debt-snowball

Pay-off plan for up to 20 debts using snowball or avalanche method. Returns comparison between both. Accepts GET (query string JSON) or POST (JSON body).

Query parameters
ParamTypeDefaultDescription
debtsJSON array—Array of { name, balance, rate, minPayment }
extranumber0GET: extra monthly payment above initial minimums. In a POST JSON body, use extraPayment.
strategystringsnowballsnowball | avalanche
Example request
https://snowballr.io/api/calculate/debt-snowball?extra=300&strategy=snowball&debts=%5B%7B%22name%22%3A%22Card%20A%22%2C%22balance%22%3A4000%2C%22rate%22%3A22%2C%22minPayment%22%3A80%7D%2C%7B%22name%22%3A%22Card%20B%22%2C%22balance%22%3A8000%2C%22rate%22%3A18%2C%22minPayment%22%3A160%7D%5D
Example response

Response excerpt. The monthly budget is the initial minimum payments plus extra; freed payments roll into the next debt in the same month. Both strategies choose Card A first in this example. monthsToFree is null when a balance remains at the 600-month simulation limit; inspect paidOff and remainingBalance.

{
  "@context": "https://schema.org",
  "@type": "Dataset",
  "inputs": {
    "debts": [
      {
        "name": "Card A",
        "balance": 4000,
        "rate": 22,
        "minPayment": 80
      },
      {
        "name": "Card B",
        "balance": 8000,
        "rate": 18,
        "minPayment": 160
      }
    ],
    "extraPayment": 300,
    "strategy": "snowball"
  },
  "result": {
    "monthsToFree": 28,
    "paidOff": true,
    "monthsSimulated": 28,
    "remainingBalance": 0,
    "totalInterest": 2831.64,
    "payoffOrder": [
      {
        "month": 12,
        "debtPaidOff": "Card A"
      },
      {
        "month": 28,
        "debtPaidOff": "Card B"
      }
    ]
  },
  "comparison": {
    "snowball": {
      "monthsToFree": 28,
      "totalInterest": 2831.64
    },
    "avalanche": {
      "monthsToFree": 28,
      "totalInterest": 2831.64
    },
    "avalancheSavesInterest": 0
  }
}

Code samples

JavaScript (fetch)
const url = "https://snowballr.io/api/calculate/compound?initial=10000&monthly=500&rate=7&years=30&compounding=monthly&currency=USD";
const data = await fetch(url).then(r => r.json());
console.log(data.result.finalBalance);
// 691150.47
Python (requests)
import requests
r = requests.get("https://snowballr.io/api/calculate/compound", params={
    "initial": 10000, "monthly": 500, "rate": 7, "years": 30,
})
print(r.json()["result"]["finalBalance"])
# 691150.47
curl
curl "https://snowballr.io/api/calculate/loan?principal=300000&rate=6.5&years=30&extra=200"

FAQs

Is there a rate limit?

Responses are cached at the edge for 24 hours. Please be reasonable. For high-volume use, consider self-hosting using our open formula reference at /compound-interest-formula.

What about authentication?

None. No keys, no tokens, no sign-up.

Will the response format change?

Additive only. We will not rename or remove existing fields without 6 months notice. New fields may appear in the result or schedule objects.

Want more endpoints?

We're working on retirement (4% rule), mortgage refinance, Roth vs Traditional, and FIRE projections. Suggest one →

Last reviewed 2026-09-28. Response caching and availability depend on the hosting environment.