Stair rise and run calculator
Turn a floor-to-floor height into equal steps: a total rise of 280 with a target riser of 18 gives 16 risers of exactly 17.5, 15 treads and, with treads 25 deep, a total run of 375 at 34.992°. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Total rise
- 280
- Target riser height
- 18
- Tread depth
- 25
- Decimal places
- 4
- Num risers
- 16
- Riser height
- 17.5
- Num treads
- 15
- Total run
- 375
Dimension stairs from total rise and target riser or fixed count. Search intent: stair rise and run calculator. No network calls or random seeds are required. Failed jobs are not billed.
From one height to a full staircase
Start with the total rise, the vertical distance from the lower floor to the upper one, and the riser height you would like each step to have. The calculator divides the first by the second and rounds to the nearest whole number of risers, then splits the total rise evenly, so every step is the same height. There is always one tread fewer than risers, because the upper floor works as the last step. If you also give the tread depth, you get the total run, the horizontal length the stairs take up, and their angle. A rise of 280 with a target of 18 and treads of 25 gives 16 risers of 17.5, 15 treads, a run of 375 and 34.992°.
Mistakes that make stairs come out wrong
The most common is mixing units: the total rise, the riser height and the tread depth must all be in the same unit, whatever it is. The second is building with the target height instead of the result. The target is only a wish; the real riser is the total rise divided by the whole number of steps, which is why 18 becomes 17.5 here. The third is multiplying the tread depth by the number of risers, which overstates the run by one tread. Results are rounded only once, to the number of decimals you choose.
What you can do with it
Teaching
Pinned goldens.
FAQ
How many risers do I need for my stairs?
Divide the total rise by your target riser height and round to the nearest whole number. A rise of 280 with a target of 18 gives 16 risers, and the height is then split evenly, so each one is exactly 17.5.
Why is there one tread fewer than risers?
The last riser takes you onto the upper floor, which acts as the final step, so it needs no tread of its own. That is why 16 risers come with 15 treads.
Can I fix the number of steps myself?
Yes. Enter the number of risers you want instead of a target height, and the total rise is divided by that count. Every riser comes out the same height, whatever number you choose.
How is the angle of the stairs worked out?
It is the arctangent of the riser height divided by the tread depth, given in degrees. Risers of 17.5 with treads 25 deep give an angle of 34.992°, which lets you compare two layouts at a glance.
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/math/stairs-rise-run \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"total_rise":280,"riser":18}'const res = await fetch("https://api.kit.forhosting.com/math/stairs-rise-run", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"total_rise": 280,
"riser": 18
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/stairs-rise-run",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"total_rise": 280,
"riser": 18
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/stairs-rise-run", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"total_rise":280,"riser":18}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"total_rise":280,"riser":18}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/stairs-rise-run", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"total_rise": 280,
"riser": 18
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.stairs_rise_run",
"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 calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos.
How it works
No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs are not billed. Dimension stairs from total rise and target riser or fixed count. n≈round(total/riser); riser=total/n; angle=atan(riser/run). The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos.
Inputs, limits and rounding
Optional decimals use half-up once. Outputs echo inputs. No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs are not billed. Provide required JSON fields. Invalid types raise invalid_input. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos.
When to use it
Use when search intent matches. Dimension stairs from total rise and target riser or fixed count. No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs are not billed. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos.
Integration use cases
Quick check
Free widget.
Automation
Same JSON via API.
Technical questions
Free?
Yes tier A.
Network?
No.
Bad input?
invalid_input.
API?
Yes.
Locales?
EN-only; Nitro hydrates.