Depreciation calculator
A 10,000 machine with a 1,000 salvage value and a 5-year life loses 1,800 a year on a straight line and ends at a book value of 1,000. Switch to double-declining balance or sum-of-years digits to front-load the expense. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Cost
- 10,000
- Salvage
- 1,000
- Useful life
- 5
- Depreciable base
- 9,000
- Periodic depreciation
- 1,800
- Total depreciation
- 9,000
- Book value end
- 1,000
Depreciation turns the cost of a long-lived asset into a sequence of expenses so the books show wear over useful life instead of a one-time hit at purchase. Spreadsheets bury the formula, and hand calculators often disagree on residual rounding in the last period when you switch methods. This depreciation calculator accepts original cost, estimated salvage value, useful life in whole periods, and a chosen method—straight-line, double-declining-balance, or sum-of-years-digits—then returns the depreciable base, the first-period depreciation amount, total depreciation over the life, ending book value, and a full schedule of depreciation, accumulated depreciation, and book value for each period. Useful life must be a positive integer: zero or negative life is rejected as invalid input rather than dividing by zero.
How the three methods allocate cost across useful life
Every method starts from the same depreciable base: original cost minus salvage. That base is the total amount that will be expensed over useful life; after the last period, book value equals salvage and accumulated depreciation equals the base. Example: cost ten thousand, salvage one thousand, useful life five.
Straight-line charges one thousand eight hundred each year. Double-declining-balance charges four thousand in year one, then two thousand four hundred, then one thousand four hundred forty, then eight hundred sixty-four, then two hundred ninety-six. Sum-of-years-digits charges three thousand, two thousand four hundred, one thousand eight hundred, one thousand two hundred, and six hundred.
Currency is unitless: you supply amounts in whatever currency you already use and interpret the outputs in the same units. Negative cost, salvage above cost, or a method outside the three enumerated names is rejected as invalid input rather than inventing a negative expense or an inflated residual.
What you can do with it
Pick a method and get the first-period charge
Enter cost, salvage, useful life, and method to get the periodic depreciation amount for period one, plus total depreciation over the life.
Period-by-period book value schedule
Use the returned schedule to list depreciation, accumulated depreciation, and book value for each period under SL, DDB, or SYD.
FAQ
What happens if useful life is zero or negative?
A non-positive useful life would divide by zero or reverse time, so it is rejected and not billed.
How does double-declining-balance treat salvage?
The last period takes any leftover residual so ending book value equals salvage.
How do I calculate straight-line depreciation?
Subtract the salvage value from the cost to get the depreciable base, then divide it by the useful life. Every full period carries the same charge, and the last one absorbs any rounding so the schedule ends exactly at salvage.
What is the difference between double-declining balance and sum-of-years digits?
Both put more expense in the early years. Double-declining balance applies a fixed rate of two divided by the useful life to each period's opening book value, while sum-of-years digits spreads the base by remaining life over the sum of the years' digits.
Does it handle MACRS, section 179 or bonus depreciation?
No. It covers the three classic periodic methods with a full schedule. Partial-year conventions, MACRS tables, section 179, bonus depreciation and units-of-production depreciation are outside what it calculates.
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/depreciation \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"cost":10000,"salvage":1000,"useful_life":5,"method":"straight_line"}'const res = await fetch("https://api.kit.forhosting.com/fin/depreciation", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"cost": 10000,
"salvage": 1000,
"useful_life": 5,
"method": "straight_line"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/depreciation",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"cost": 10000,
"salvage": 1000,
"useful_life": 5,
"method": "straight_line"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/depreciation", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"cost":10000,"salvage":1000,"useful_life":5,"method":"straight_line"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"cost":10000,"salvage":1000,"useful_life":5,"method":"straight_line"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/depreciation", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"cost": 10000,
"salvage": 1000,
"useful_life": 5,
"method": "straight_line"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.depreciation",
"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
How the three methods allocate cost across useful life
Straight-line (straight_line) spreads the base evenly, so each full period carries the same charge until the last period absorbs residual rounding. Double-declining-balance (double_declining_balance) applies a constant rate of two divided by useful life to the opening book value of each period, which front-loads expense; the engine never books more than remaining book minus salvage, and the final period takes whatever residual is left so the schedule still ends at salvage. Sum-of-years-digits (sum_of_years_digits) weights early periods more heavily without using a declining book-value rate: the digits one through n sum to n times n plus one over two, and period t expenses remaining life over that sum times the depreciable base, again with a last-period residual so totals match the base. Partial-year conventions, MACRS tables, section 179, bonus depreciation, and units-of-production are out of scope—this endpoint answers the three closed-form periodic methods with an explicit schedule.
Input contract, rounding, and error behaviour
Optionally send decimals as an integer from zero through eight controlling half-up rounding of money-style outputs (default two). Zero or negative useful life is the contracted hard error: dividing a depreciable base by a non-positive life is undefined, so the task fails instead of returning Infinity or a fabricated schedule. Half-up rounding is applied to each money field from the raw floating computation so goldens stay stable across runtimes. The final period of the schedule absorbs any residual so that accumulated depreciation equals the depreciable base and ending book value equals salvage even when division does not land on a clean decimal. POST a JSON object with four required fields: cost as a finite number greater than zero, salvage as a finite number greater than or equal to zero and less than or equal to cost, useful_life as an integer from one through one hundred (whole periods, typically years), and method as one of straight_line, double_declining_balance, or sum_of_years_digits. Numeric strings that parse to finite values are accepted the same way as JSON numbers. Missing fields, non-finite values, non-positive cost, negative salvage, salvage greater than cost, an unknown method, and a useful_life that is zero, negative, non-integer, or above one hundred fail with invalid_input and are not billed. On success the body echoes rounded cost and salvage, useful_life, method, depreciable_base, periodic_depreciation (the first-period charge; under straight-line this is the constant annual amount), total_depreciation, book_value_end, a schedule array with one object per period containing period, depreciation, accumulated_depreciation, and book_value, and a short formula string you can show next to the numbers. Pair this API with your own tax module if you need MACRS percentages or jurisdiction-specific first-year conventions; the calculator does not estimate tax savings or deferred tax assets.
Where a multi-method depreciation calculator earns its keep
Accounting education pages and personal-finance blogs rank for depreciation calculator when they offer a live tool that lets the reader pick a method instead of locking the page to a single convention. Bookkeeping coaches let students enter cost, salvage, and life, switch among straight-line, double-declining-balance, and sum-of-years-digits, and check both the first-period expense and the full book-value ladder against textbook tables. SaaS onboarding flows can show first-asset depreciation without standing up a full general-ledger module. Internal ops scripts need a deterministic parse endpoint instead of a fragile spreadsheet paste step when building fixed-asset registers for demos or sandboxes. Sweep useful_life or method in a loop from your own code to build what-if tables; pin periodic_depreciation and schedule book values in tests; keep requests small. The free browser path uses the same pure module as the API, so demo landings and production automation never drift. This tool does not fetch asset catalogs, apply tax bonus percentages, prorate mid-year acquisitions, or read MACRS tables—only closed-form periodic depreciation and book value for a single asset given cost, salvage, whole-period life, and one of the three textbook methods. If you need the straight-line-only landing that already ranks for that narrower query, keep that page; this endpoint is the method picker with a schedule.
Integration use cases
Classroom and content widgets
Embed the free browser calculator on education pages so learners switch methods and verify textbook tables against a deterministic API.
Technical questions
How do I calculate depreciation with this tool?
Send cost (greater than zero), salvage (zero or more, not above cost), useful_life as a positive integer, and method as straight_line, double_declining_balance, or sum_of_years_digits. The response includes periodic_depreciation and a full schedule.
What is periodic_depreciation in the response?
It is the first-period depreciation amount. Under straight-line it is the constant charge; under accelerated methods it is the larger opening-period expense, with later periods in the schedule.
What does the depreciation calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.