Debt avalanche calculator
Attack the most expensive rate first and see when each debt is gone: with 250 a month, a 400 store card at 22.9%, a 3200 card at 18.5% and a 1500 loan at 11% are cleared in 24 months with 864.23 of interest. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Monthly payment
- 250
- Debt count
- 3
- Total balance
- 5,100
- Max months
- 600
- Months
- 24
The debt avalanche method is the personal-finance rule that attacks the most expensive interest first. After every account receives its contractual minimum payment, leftover cash goes to the highest annual percentage rate until that balance is gone, then rolls to the next highest rate, and so on until the list is clear. People search for a debt avalanche calculator when they already know their card and loan balances and want the mathematically cheapest payoff order plus a dollar figure for total interest—not a side-by-side ranking against the snowball method. This capability accepts a list of debts with balances and annual rates, a monthly payment budget, and optional per-debt minimums, then simulates month-by-month compounding until every balance is cleared.
What the debt avalanche method pays first, and how total interest is built
The debt avalanche method sorts obligations by annual percentage rate from highest to lowest. After minimum payments are covered on every remaining account, extra cash targets the first rank until that balance is gone, then rolls to the next highest rate. That sequence is the one that usually minimises total interest for a fixed monthly budget, which is why people search specifically for a debt avalanche calculator rather than a generic payoff tool.
Each debt records the month it hits zero and the interest it accrued along the way; the response totals those interest figures so a client can show both the attack order and the dollar cost of waiting. Zero-rate accounts still wait their turn after every positive APR is gone, but they do not inflate the interest total. The simulation never invents a refinance, a 0% promo window, or a late fee: it is a deterministic cash-flow engine for the avalanche rule, not a full credit-bureau model.
If the monthly budget cannot outrun interest before the safety cap, the task fails instead of returning a plan that would never finish.
When the avalanche method helps most
Spreadsheet add-ons and budgeting apps often already store card balances, APRs, and minimums; posting that list plus a budget once yields the next-to-pay queue and a dollar interest figure for a payoff dashboard. Content teams can seed a default example where a small high-rate store card is attacked before a large cheaper installment loan, so readers see why order changes the interest line before they paste their own numbers. Failed validation does not consume balance.
Keep the list under fifty debts, pin the ranked arrays and the interest total in tests, and you get a reproducible avalanche plan for widgets, LMS modules, and edge workers without standing up a full financial-planning stack of your own.
What you can do with it
Landing-page debt avalanche calculator
Let visitors paste card and loan balances with APRs and a monthly budget, then show the highest-rate payoff order and the projected total interest.
Coaching and counselling payoff plans
Turn a client’s account list into a stable avalanche sequence and interest total for session notes and written payoff plans.
Budgeting apps and spreadsheet add-ons
Post stored balances, rates, and minimums plus a budget once to fill a next-to-pay queue and an interest line without reimplementing monthly compounding.
FAQ
How does the debt avalanche method order debts?
Avalanche sorts by highest annual interest rate first. After minimums are paid, leftover cash attacks that target until it is gone, then rolls to the next highest rate. Ties break by smaller balance, then original list position.
What happens if an interest rate is negative?
Negative rates are rejected; each rate must be a finite number greater than or equal to zero (annual percent APR). Invalid input is not billed.
How is total interest calculated?
Each remaining balance accrues monthly interest at APR/12, rounded half-up to two decimals. The response sums that interest across every debt and every month until the last balance is cleared.
What if my monthly budget can't keep up with the interest?
The budget must at least cover every minimum payment. If it still cannot outrun the interest within the safety limit of 600 months, the calculator returns no plan rather than one that would never finish.
When will each of my debts be paid off?
Each debt shows the month it reaches zero and the interest it cost along the way. In the example, the store card is cleared in month 3, the credit card in month 21 and the personal loan in month 24.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/debt-avalanche \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"debts":[{"name":"Store card","balance":400,"rate":22.9,"min_payment":25},{"name":"Credit card","balance":3200,"rate":18.5,"min_payment":50},{"name":"Personal loan","balance":1500,"rate":11,"min_payment":40}],"monthly_payment":250}'const res = await fetch("https://api.kit.forhosting.com/fin/debt-avalanche", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"debts": [
{
"name": "Store card",
"balance": 400,
"rate": 22.9,
"min_payment": 25
},
{
"name": "Credit card",
"balance": 3200,
"rate": 18.5,
"min_payment": 50
},
{
"name": "Personal loan",
"balance": 1500,
"rate": 11,
"min_payment": 40
}
],
"monthly_payment": 250
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/debt-avalanche",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"debts": [
{
"name": "Store card",
"balance": 400,
"rate": 22.9,
"min_payment": 25
},
{
"name": "Credit card",
"balance": 3200,
"rate": 18.5,
"min_payment": 50
},
{
"name": "Personal loan",
"balance": 1500,
"rate": 11,
"min_payment": 40
}
],
"monthly_payment": 250
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/debt-avalanche", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"debts":[{"name":"Store card","balance":400,"rate":22.9,"min_payment":25},{"name":"Credit card","balance":3200,"rate":18.5,"min_payment":50},{"name":"Personal loan","balance":1500,"rate":11,"min_payment":40}],"monthly_payment":250}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"debts":[{"name":"Store card","balance":400,"rate":22.9,"min_payment":25},{"name":"Credit card","balance":3200,"rate":18.5,"min_payment":50},{"name":"Personal loan","balance":1500,"rate":11,"min_payment":40}],"monthly_payment":250}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/debt-avalanche", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"debts": [
{
"name": "Store card",
"balance": 400,
"rate": 22.9,
"min_payment": 25
},
{
"name": "Credit card",
"balance": 3200,
"rate": 18.5,
"min_payment": 50
},
{
"name": "Personal loan",
"balance": 1500,
"rate": 11,
"min_payment": 40
}
],
"monthly_payment": 250
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.debt_avalanche",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
A negative rate is rejected with invalid_input rather than clamped to zero.
What the debt avalanche method pays first, and how total interest is built
This endpoint does more than sort: it compounds each remaining balance monthly at APR divided by twelve, applies the contractual minimum to every open account, and pours leftover budget onto the current highest-rate target, including a waterfall in the same month if that target is cleared with cash to spare.
Input contract, response shape, and error behaviour
Each debt object must include balance (finite number greater than or equal to zero, currency units) and rate (finite number greater than or equal to zero, annual interest as a percent such as 19.9 for 19.9 percent APR). Negative rates are rejected by name rather than silently clamped, matching the product rule that a negative APR is not a legal input for this calculator. Ranks are one-based. Money fields use half-up rounding to two decimals and rates to four so goldens stay stable across runtimes. POST a JSON body with a required debts array and a required monthly_payment. An optional min_payment is the contractual monthly minimum for that row and defaults to zero, meaning the entire budget avalanches onto the highest remaining APR. Aliases list, items, and accounts are accepted for the array; payment, extra_payment, monthly, and budget alias monthly_payment. At most fifty debts are allowed per call. An empty array, a missing debts field, a non-array value, a missing monthly_payment, a budget smaller than the sum of minimums, or any negative rate fails with invalid_input and is not billed. On success the body includes debt_count; total_balance; the echoed monthly_payment and max_months; months and years until the last balance clears; total_interest and total_paid rounded to two decimals; payoff_order as ranked records each carrying rank, name, balance, rate, min_payment, original_index, months_to_payoff, and interest_paid; method set to avalanche; and a short summary. Optional max_months defaults to six hundred and may be set between one and twelve hundred.
Where a debt avalanche payoff API earns its keep
Coaching platforms and credit-counselling intake forms can call the same pure module from the browser for free previews and from the API for stored plans, guaranteeing that the sequence a client saw on the landing page matches the interest total stored after signup.
Technical questions
What if my debts list is empty or the payment is too small?
An empty list, a missing monthly_payment, a budget below the sum of minimums, or a payment that cannot outrun interest within max_months all fail with invalid_input.
What does the debt avalanche calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.