Interest rate calculator
If 1,000 grows to 1,210 over 2 periods, the implied interest rate is 10% per period. Enter a starting amount, a future amount and the number of periods to back out the rate behind a savings goal or a deposit. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Principal amount
- 1,000
- Future value
- 1,210
- Periods
- 2
- Interest rate
- 10
- Rate decimal
- 0.1
Rearranged, r equals the nth root of future value over principal, minus one. Students, lenders, savers, and product teams use an interest rate calculator to recover that periodic rate from three numbers — principal, future value, and the period count — without iterating a spreadsheet RATE function or guessing a yield.
How the interest rate turns principal, future value, and periods into r
The implied interest rate of a lump that grows or shrinks from a starting principal to a future amount is the periodic rate r that satisfies principal times one plus r to the power of n equals future value. Solving for that rate is not an iteration and not a cash-flow internal rate of return: it is the closed form r equals future value divided by principal, raised to one over n, minus one.
When the future amount is larger than the principal the rate is positive; when it is smaller the rate is negative, which this calculator still reports as long as both amounts are non-negative and principal is not zero. Principal must be a finite number strictly greater than zero, because dividing the future amount by a zero starting balance does not define a rate. Future value must not be negative.
Periods must be a finite number strictly greater than zero, including fractional horizons when the holding period is not a whole number of steps. The identity is the same rearrangement textbooks write for compound interest solved for r, and it is the same rearrangement used to quote a holding-period yield on a deposit, a savings goal, or a zero-coupon instrument that has no coupons to reinvest.
This calculator does not take a stream of cash flows, does not convert a nominal annual quote into an effective annual rate, and does not apply a day-count convention: you supply one principal, one future lump, and a period count, and it returns the unique real rate per period that compounds one into the other.
What you can do with it
Savings goal implied rate
Back out the periodic interest rate a deposit must earn to grow a starting principal into a target future amount over a known number of compounding periods.
Textbook TVM checks
Recover the periodic interest rate from a principal, a future lump, and n so homework and exam keys match the closed form r = (FV/P)^(1/n) - 1.
FAQ
How is the interest rate calculated from principal and future value?
Both are rounded half-up for stable comparison across runtimes.
Is the result annual, monthly, or something else?
It is the rate per period you counted. If periods is years, the rate is per year; if periods is months, the rate is per month. The calculator does not convert an annual rate to a monthly rate or apply a day-count convention.
Is this the same as effective interest rate, discount rate, EAR, or compound interest?
No. An effective-interest-rate landing is the EIR label for a related identity. A discount-rate landing is searched when people are discounting a lump. An EAR landing converts a nominal annual percent and a compounding frequency. Compound interest takes the rate as an input and returns a future balance. This tool solves the reverse TVM identity for r from principal, future value, and n.
Can the implied interest rate be negative?
Yes. When the future amount is smaller than the starting amount, the rate comes out negative. The starting amount must be above zero and the future amount cannot be negative.
Can I use it for regular deposits or several payments?
No. It works with one starting lump and one future lump only. A series of deposits or payments needs a cash-flow calculation, which is a different question from this single compound growth rate.
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/interest-rate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"principal":1000,"future_value":1210,"periods":2}'const res = await fetch("https://api.kit.forhosting.com/fin/interest-rate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"principal": 1000,
"future_value": 1210,
"periods": 2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/interest-rate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"principal": 1000,
"future_value": 1210,
"periods": 2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/interest-rate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"principal":1000,"future_value":1210,"periods":2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"principal":1000,"future_value":1210,"periods":2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/interest-rate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"principal": 1000,
"future_value": 1210,
"periods": 2
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.interest_rate",
"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 implied interest rate per period is the unique r that compounds a starting principal into a known future value over a counted number of periods: principal times one plus r to the power of n equals future value. This endpoint accepts principal, future_value, and periods, returns the rate per period as a percent together with the decimal form, and fails with invalid_input when the number of periods is zero because the exponent one over n is then undefined.
How the interest rate turns principal, future value, and periods into r
When principal is one thousand, future_value is one thousand two hundred ten, and periods is two, the ratio is 1.21, the square root is 1.1, and the rate is ten percent per period. A period count of zero makes the exponent one over n undefined, so the request is rejected rather than returning infinity or a guessed yield.
Input contract, response shape, and error behaviour
Example: one thousand principal, one thousand two hundred ten future, and two periods yield a rate of ten. POST a JSON body with three required finite numbers. principal is the starting lump in one currency unit; aliases p, present_value, pv, and present map to the same field so a worksheet can keep its column names. It must be strictly greater than zero: a missing, empty, non-finite, or zero principal fails with invalid_input naming the field, and those failures are not billed. future_value is the lump at the end of n periods in that same currency; aliases fv, future, and amount are accepted; a negative future value is rejected because this identity is defined on non-negative amounts. A future value of zero is allowed and yields a rate of minus one hundred percent per period, the complete loss of the principal. periods is the number of compounding periods n; aliases n, nper, and number_of_periods are accepted; fractional periods are allowed when the horizon is not a whole number of steps. If periods is negative or otherwise not strictly greater than zero, the request fails because the exponent one over n is undefined. Each numeric field may arrive as a JSON number or a numeric string. On success the body echoes principal, future_value, and periods, then reports rate as a percentage rounded half-up to eight decimal places, rate_decimal as the same rate as a fraction rounded half-up to ten decimal places, and a formula string restating r equals (FV/P) to the power of one over n, minus one. Pair the JSON with your own rule for what a period means — a year, a month, a quarter — because this endpoint returns the rate per period you counted; it does not convert an annual rate to a monthly rate or the reverse.
Where an interest rate calculator earns its keep
Exam prep and classroom drills use an interest rate calculator to recover r from a textbook principal, future value, and n so the printed yield matches the closed form instead of a rounded spreadsheet guess. Savers and planners back out the periodic rate a deposit must earn to turn a starting balance into a target future amount over a known number of compounding steps, then pin rate in a plan so every conversation starts from one number. An interest-rate landing answers the reverse TVM question: given principal, future value, and n, what is r per period. Failed validation does not consume balance. Product teams and FP&A templates recompute the implied rate when a future payout or a holding period changes mid-model; a tiny parse API avoids reinventing the power identity in every workbook. This is a different search and a different job from an effective-interest-rate landing, which people open when they want the EIR label rather than a generic interest rate; from a discount-rate landing, which people search when they are discounting a lump in a DCF setting; from an EAR calculator, which converts a nominal annual percent and a compounding frequency into an effective annual rate without ever seeing a principal or future lump; from a compound-interest calculator, which takes the rate as an input and returns a future balance; from a simple-interest calculator, which uses I equals P r t rather than compounding; and from a CAGR calculator, which people search when they want annualized growth language rather than a TVM interest rate. Keep principal positive, keep future_value non-negative, keep periods strictly positive and never zero, pin the rounded percentage in tests, and you get a reproducible implied rate for homework, LMS plugins, and edge workers without standing up a full time-value-of-money engine of your own.
Integration use cases
Workbook and API parity
Recompute the implied rate when a future payout or a holding period changes, using the same pure module in the browser widget and the prepaid API.
Technical questions
What happens if the number of periods is zero?
The task fails with invalid_input. periods (aliases n, nper, number_of_periods) must be a finite number that is not zero and is strictly greater than zero, because r = (FV/P)^(1/n) - 1 is undefined when n is zero. Those failures are not billed.
What does the interest rate calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.