Appreciation calculator
The appreciation API answers one question cleanly: if an asset is worth X today and grows at a fixed annual rate, what will it be worth after a given number of years?
Run — free
You send the initial value, the annual appreciation rate as a decimal, and the number of years; you get back the final value, the total appreciation gained, and the growth multiple. It is the classic compound-growth formula applied to houses, land, art, equipment, or any asset whose value compounds year over year — deterministic, instant, and identical whether you run it here for free or call it from your code.
What appreciation means and when to model it
Appreciation is the increase in an asset's value over time, and it is the mirror image of depreciation: instead of losing worth, the asset gains it. Real estate is the textbook case — a house bought at one price tends to sell higher years later — but the same model fits farmland, collectibles, precious metals, classic cars, or a stake in a private business. The asset appreciation calculator treats growth as compound: each year the rate applies not to the original price but to the value reached at the end of the previous year. That compounding is exactly why a modest rate becomes a large gain over a long horizon, and why guessing with simple multiplication misleads you. A negative initial value is rejected outright, because an asset you do not own and that costs nothing cannot appreciate — if you are modeling debt or a short position, you need a different tool. When you are unsure which rate to use, look at the long-run average for the asset class in your region rather than last year's number, because a single hot year extrapolated over a decade almost always overstates the result.
How the computation works
The formula is the standard compound-growth equation: final value equals the initial value multiplied by (1 + rate) raised to the number of years. You pass the rate as a decimal — 0.03 means three percent per year, not three — and the years may be fractional, so 2.5 years is a valid input. The endpoint returns the final value rounded to two decimals, the total appreciation (final minus initial), and the growth multiple rounded to six decimals so the output stays byte-stable across machines. Rates below -1 are rejected because a loss greater than one hundred percent per year would compound into negative values, which has no financial meaning. Everything is computed in memory: no network, no randomness, no clock, so the same input always produces exactly the same output.
Where it fits in real workflows
Analysts use it to sanity-check property projections before building a full discounted-cash-flow model: one call answers whether a listing's claimed appreciation rate implies a plausible resale price. Product teams embed it in savings and real-estate widgets so users can slide the rate and the horizon and watch the final value move, which is far more persuasive than a static table. Accountants use it to estimate the current value of assets bought years ago when only the original price and an average annual rate are known. Because the same module runs free in the browser and behind the paid API, you can prototype the interaction on this page and then automate it without a behavior change — the free web result and the billed $0.002 result are bit-for-bit identical.
What you can do with it
Project a property's resale value
Given the purchase price and an expected annual rate, estimate what a house or plot of land will be worth at sale time.
Estimate today's value of an old asset
Work back from the original price and an average appreciation rate to value art, land, or equipment bought years ago.
Power a growth widget
Let users adjust the rate and horizon and see the final value update instantly, with the API result matching the free web result.
FAQ
What does it cost?
$0.002 per request via the API. It is also free to run in your browser on this page.
How do I express the rate?
As a decimal per year: 0.03 for 3% annually, 0.1 for 10%. Negative rates down to -1 are allowed and model depreciation instead.
Why was my input rejected?
The initial value must be zero or positive, the rate must be at least -1, and the years must be zero or positive. Non-numeric values are rejected too.
Can I use fractional years?
Yes. The years field accepts any non-negative finite number, so 2.5 years compounds the rate for two and a half years.
Is the growth simple or compound?
Compound: each year the rate applies to the value accumulated so far, following final = initial * (1 + rate)^years.
Is my data stored?
No. The numbers are processed in memory and discarded; only the computed result is returned.
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/appreciation \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"initial_value":250000,"appreciation_rate":0.03,"years":10}'const res = await fetch("https://api.kit.forhosting.com/fin/appreciation", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"initial_value": 250000,
"appreciation_rate": 0.03,
"years": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/appreciation",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"initial_value": 250000,
"appreciation_rate": 0.03,
"years": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/appreciation", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"initial_value":250000,"appreciation_rate":0.03,"years":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"initial_value":250000,"appreciation_rate":0.03,"years":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/appreciation", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"initial_value": 250000,
"appreciation_rate": 0.03,
"years": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.appreciation",
"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. |