Tobler Hiking Speed Calculator for Uphill and Downhill Slopes
The Tobler hiking speed calculator estimates a hiker's walking speed from the steepness and direction of a slope.
Run — free
Enter a signed gradient percentage: positive values describe uphill travel, negative values describe downhill travel, and zero represents level ground. The result includes speed in kilometres per hour and metres per second, plus minutes per kilometre for planning. It applies Tobler's deterministic hiking function, including its prediction that a gentle descent is faster than a perfectly level route.
Enter a signed terrain gradient
Gradient describes vertical change relative to horizontal distance. A value of 10 percent means the route gains 10 metres over 100 horizontal metres, so it should be entered as positive 10 when you are walking uphill. The same segment entered as negative 10 represents travel in the downhill direction. This sign matters because Tobler's function is asymmetric: climbing and descending the same physical path do not produce the same estimated speed. Enter zero for level ground. If your mapping tool reports a decimal slope rather than a percentage, multiply it by 100 before entering it; a slope of 0.08 is an 8 percent gradient. Use the average grade only for a reasonably uniform segment. For a route with alternating climbs and descents, split it into sections and calculate each section separately, because averaging opposite grades can hide the effort of both. The accepted range is from negative 100 to positive 100 percent, which covers very steep hiking terrain while preventing implausible values and accidental unit mistakes.
Understand Tobler's hiking function
The calculator uses the equation v = 6 × exp(−3.5 × |s + 0.05|), where v is walking speed in kilometres per hour and s is the signed slope expressed as rise divided by horizontal run. The shift by 0.05 gives the curve its distinctive optimum: predicted speed is highest on a gentle 5 percent descent, not on level ground. Speed falls as the terrain becomes steeper uphill or farther downhill beyond that optimum. This captures the practical observation that a slight descent can assist walking, while a severe descent demands shorter steps, braking, and greater care. The function is empirical and deterministic, so the same input always produces the same output. Alongside kilometres per hour, the result converts speed to metres per second and calculates pace in minutes per kilometre. Values are rounded to six decimal places for stable results, while calculations use the unrounded value internally. The returned formula and normalized decimal slope make the estimate transparent and easy to audit or reproduce.
Use the estimate in route planning
Treat the result as a terrain-based baseline rather than a guaranteed personal pace. Tobler's function describes a general relationship between slope and walking speed; it does not know the hiker's fitness, pack weight, altitude, surface, weather, fatigue, rest stops, navigation delays, or technical obstacles. To estimate time for a uniform section, divide its distance in kilometres by the returned speed in kilometres per hour. For a varied route, calculate each section using its signed grade, compute each section's time, and add the times. That method preserves the uphill and downhill differences that a single route-average grade would erase. Use shorter sections where gradients change sharply, but avoid false precision when elevation data is noisy. The pace result is convenient for comparing segments, while metres per second can be useful in geographic or simulation workflows. Add a sensible contingency for breaks and local conditions, especially on loose, icy, exposed, or pathless ground. This calculator supports planning and comparison; it is not a safety assessment or a substitute for current trail information and judgement.
What you can do with it
Compare uphill and downhill directions
Estimate how walking speed changes when the same signed slope is travelled in the opposite direction.
Plan time by route segment
Calculate a speed for each relatively uniform section, then combine segment travel times for a better route estimate.
Check a mapping or simulation model
Generate transparent deterministic speed values for slope-aware accessibility, recreation, or geographic analysis.
FAQ
What does a positive gradient mean?
A positive gradient means uphill travel. A negative gradient means downhill travel, and zero means level ground.
Why is the fastest result near a 5 percent descent?
Tobler's empirical curve places its maximum at a decimal slope of negative 0.05, representing a gentle downhill grade.
Can I use an average grade for an entire hike?
Only as a rough shortcut. Splitting a varied route into signed-grade sections avoids cancelling climbs and descents in the average.
Does the estimate include stops or difficult surfaces?
No. It models slope only and does not account for breaks, fitness, load, weather, altitude, surface quality, or technical terrain.
How much does the API calculation cost?
Each API request costs $0.002. The same deterministic calculation can also run in the browser.
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/hobby/sport-hike-tobler \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"gradient_percent":10}'const res = await fetch("https://api.kit.forhosting.com/hobby/sport-hike-tobler", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"gradient_percent": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/sport-hike-tobler",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"gradient_percent": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/sport-hike-tobler", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"gradient_percent":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"gradient_percent":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/sport-hike-tobler", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"gradient_percent": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.sport_hike_tobler",
"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. |