Credit card minimum payment calculator
Paying only a 2% minimum on a 5,000 balance at 19.99% APR takes 523 months, about 43.58 years, and costs 20,150.97 in interest. Enter your balance, APR and minimum terms to see your own payoff time. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Balance
- 5,000
- Annual rate percent
- 19.99
- Min payment percent
- 2
- Min payment floor
- 25
- Monthly rate percent
- 1.665833
- Max months
- 600
- Months
- 523
- Years
- 43.58
Paying only the minimum on a credit card is one of the most expensive habits in personal finance, yet most statements show only this month’s due amount—not how many years the balance will linger or how much interest will pile up. This credit card minimum payment calculator projects payoff time and cumulative interest when you pay only the minimum every month: enter your current balance, the annual percentage rate (APR), the issuer’s minimum payment percent, and an optional fixed dollar floor. Use it to shock-test a statement, compare APRs before a balance transfer, or show students why a two-percent minimum can still mean decades of payments when the APR is high.
How minimum payments, APR, and the floor interact each month
Credit card issuers usually define the monthly minimum as the greater of a fixed dollar floor (often twenty-five dollars or more) and a percentage of the outstanding balance (commonly one to three percent). Separately, interest accrues on the revolving balance at a monthly rate equal to the APR divided by twelve. This calculator models that loop with half-up rounding to cents so successive months stay stable across runtimes and match how many ledgers display money.
Each month the engine computes interest on the current balance, sets the payment to the larger of the percent-of-balance amount and the floor, caps that payment at balance plus interest so you never pay more than you owe, then subtracts the payment to form the next balance. When the payment is large enough relative to interest, principal declines and the schedule eventually reaches zero.
What you can do with it
Statement shock test
Enter the balance, APR, and minimum percent from a real statement to see months to payoff and total interest if you pay only the minimum forever.
FAQ
How does the credit card minimum payment calculator work?
Each month it applies interest at APR/12, sets the payment to max(floor, percent of balance) capped at balance plus interest, then updates the balance.
Does this use live bank data or store card numbers?
No. You supply balance and rate numbers only. Computation is local, deterministic, and never contacts an issuer or stores payment credentials.
How is the monthly minimum payment worked out?
Each month it is the larger of a fixed floor, 25 unless you change it, and the minimum percentage of the balance, capped at what you owe plus that month's interest. Interest builds at the APR divided by 12.
What if paying the minimum never clears the balance?
When the payment is no larger than that month's interest, the balance cannot fall. The calculation then stops and says the card never pays off, instead of running on for the maximum of 600 months.
Why does the payment get smaller over time?
Because it is a percentage of a shrinking balance, so less principal is repaid each month. In the 5,000 example the first payment is 100 and the last is only 11.13, which is what keeps payoff so slow.
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/finance/credit-card-minimum-payment \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"balance":5000,"annual_rate_percent":19.99,"min_payment_percent":2}'const res = await fetch("https://api.kit.forhosting.com/finance/credit-card-minimum-payment", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"balance": 5000,
"annual_rate_percent": 19.99,
"min_payment_percent": 2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/credit-card-minimum-payment",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"balance": 5000,
"annual_rate_percent": 19.99,
"min_payment_percent": 2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/credit-card-minimum-payment", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"balance":5000,"annual_rate_percent":19.99,"min_payment_percent":2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"balance":5000,"annual_rate_percent":19.99,"min_payment_percent":2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/credit-card-minimum-payment", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"balance": 5000,
"annual_rate_percent": 19.99,
"min_payment_percent": 2
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.credit_card_minimum_payment",
"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
The pure month-by-month amortization loop is free in the browser, identical on the API path, and fully deterministic—no random seeds, no live rate feeds, no server state. Invalid inputs fail with invalid_input and are not billed.
How minimum payments, APR, and the floor interact each month
When the payment is less than or equal to that month’s interest and the balance is not fully cleared, principal cannot fall—the run stops early with never_pays_off true and payoff_status set to never_pays_off. That edge case is educational as well as practical: a high APR paired with a low percentage minimum and a low floor can leave a balance that grows forever, which is exactly what a minimum-payment habit feels like when interest outruns the required payment.
Input contract, response fields, and safety limits
Monetary totals use half-up cents; years use two decimal places. POST a JSON body with three required finite numbers: balance greater than zero, annual_rate_percent greater than or equal to zero (for example 19.99 for a 19.99 percent APR), and min_payment_percent greater than zero (for example 2 for a two-percent minimum). Optional min_payment_floor defaults to twenty-five and must be non-negative when provided. Optional max_months defaults to six hundred (about fifty years) and must be an integer from one to twelve hundred; it is a safety cap so pathological low-payment scenarios cannot loop forever. Missing fields, non-finite values, and out-of-range integers fail with invalid_input naming the field, and failed jobs are not billed. On success the body echoes the inputs (including resolved defaults), monthly_rate_percent as APR divided by twelve, months and years to stop, first_payment and last_payment, total_paid, total_interest, total_principal_paid, remaining_balance, interest_to_principal_ratio, never_pays_off, and payoff_status of paid_off, never_pays_off, or max_months_reached.
When a minimum-payment projector earns its keep
Households use a credit card minimum payment calculator after a large purchase or a hard month to see whether minimum-only payments mean two years of interest or twenty. Financial coaches and nonprofit counselors put the same numbers on a screen during a session so clients feel the gap between minimums and a fixed higher payment without building a spreadsheet from scratch. Content teams can embed example inputs—five thousand dollars at 19.99 percent APR with a two-percent minimum and a twenty-five-dollar floor—and show months, total interest, and the interest-to-principal ratio next to the form. Developers wire the endpoint into debt dashboards, onboarding quizzes, or email drips that warn when a simulated schedule never pays off. Pair it with your own advice copy if you need coaching language—the API returns the schedule metrics, not legal or tax guidance.
Integration use cases
Coaching and classroom demos
Show clients or students how a low minimum percent plus a high APR can produce never_pays_off or multi-decade schedules without building a spreadsheet.
Debt dashboards and automation
Call the same JSON contract from scripts and LMS tools at $0.002 per success to flag balances that never clear under minimum-only payments.
Technical questions
What is min_payment_floor?
The fixed dollar minimum many issuers require (default 25). Each month’s payment is the larger of that floor and min_payment_percent of the current balance, never more than balance plus interest.
When is never_pays_off true?
When a simulated month’s payment is less than or equal to that month’s interest and the full balance-plus-interest is not cleared. Principal cannot fall to zero under those rules.
What does the calculator cost?
The browser widget is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid_input failures are not billed.