Top of descent calculator
From 35,000 ft down to 3,000 ft on a 3° path at 280 knots, start descending about 100 nautical miles out and you level off in 21 min 32 s. Enter cruise and target altitude, angle and ground speed to brief the arrival. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Cruise altitude
- 35,000
- Target altitude
- 3,000
- Descent angle
- 3
- Ground speed
- 280
- Altitude to lose ft
- 32,000
- Distance nm
- 100.4912390915
- Distance km
- 186.1097747974
- Distance mi
- 115.6432526529
A top of descent calculator answers the planning question every jet, turboprop, and advanced GA pilot asks before the arrival: how many nautical miles before the airport or crossing restriction should you leave cruise altitude so a constant flight-path angle meets the target height on schedule? Enter cruise altitude and target altitude in feet, a descent angle in degrees (three degrees is the classic continuous-descent and ILS-style path), and the expected average ground speed in knots. The tool converts altitude to lose into along-track distance with the trigonometric identity distance equals height over tan of the path angle, converts feet to nautical miles with the international definition, then divides distance by ground speed for descent time and multiplies for an equivalent vertical rate in feet per minute. Use it for briefing TOD gates, classroom flight-planning problems, or lightweight dispatch scripts that need a transparent formula instead of a black-box flight-management estimate.
What top of descent means and how the geometry works
Top of descent, often abbreviated TOD or T/D on flight-management displays, is the along-track point where a continuous descent from cruise should begin if you want to arrive at a chosen target altitude while flying a chosen constant flight-path angle. In still air and with a fixed path angle γ measured below the horizontal, the triangle is elementary: the vertical leg is altitude to lose in feet, the angle at the TOD is γ, and the horizontal leg is the ground distance to the level-off point.
The same triangle yields the gradient in feet per nautical mile as feet-per-NM times tan(γ). A three-degree path is the industry reference many crews memorise as roughly three nautical miles per thousand feet, which is why a thirty-five-thousand-foot cruise to near sea level often places TOD near one hundred five to one hundred ten NM depending on exact target height and true angle. This calculator uses the exact tan formula rather than the rounded rule of three, so non-standard angles such as two-and-a-half or four degrees stay honest.
It does not model idle thrust limits, speed brakes, step-down restrictions, or wind; those belong in full performance tools. It does give a clean, auditable baseline you can compare with the FMS TOD or a paper 3:1 estimate before you brief the arrival.
Practical planning tips, limits, and when to use another tool
Keep units consistent with aviation convention: altitudes in feet, path angle in degrees, ground speed in knots, primary distance in nautical miles. Prefer a slightly shallower planned angle or an earlier TOD when ATC is likely to keep you high, and treat a steeper path as a contingency that may require speed brakes rather than a baseline for idle descent.
Strong headwinds reduce ground speed and therefore reduce descent rate for a fixed angle while increasing time; tailwinds do the opposite—recompute with the ground speed you expect, not true airspeed alone. Absolute limits reject multi-hundred-thousand-foot fantasy altitudes and ground speeds above two thousand knots so intermediate tan products stay finite. This landing targets people searching for a top of descent calculator, TOD distance from cruise altitude, or descent planning by angle and ground speed.
It is not a full flight-management performance profile, not a required-navigation-performance procedure designer, and not a fuel-burn estimator. Prefer a dedicated fuel or time-enroute tool when you need burn or block time for the whole flight; use this capability when the search intent is specifically where and when to start down.
What you can do with it
Crew briefing and arrival planning
Pilots enter cruise level, expected ground speed, field or restriction altitude, and a 3° path to brief a TOD gate in NM and minutes before top of descent.
Flight-school and exam problems
Instructors generate deterministic TOD distance and rate answers for constant-angle descent homework and show invalid cases when cruise is not above target.
FAQ
How is top of descent distance calculated?
Distance in feet is that height divided by tan of the descent angle; convert to nautical miles with the international NM definition.
What descent angle should I use?
Three degrees is the common continuous-descent and ILS-style reference. Use a published path angle when available, or a slightly shallower angle if you expect to stay high longer.
What if cruise altitude is not above the target?
A descent requires strictly positive altitude to lose; equal or inverted altitudes are rejected and not billed.
Does this include wind or aircraft performance?
No. Enter the ground speed you expect so wind is implicit in GS. Thrust limits, speed brakes, and step-downs are outside this closed-form geometry model.
Is the top of descent calculator free?
The browser tool is free and runs locally.
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/travel/top-of-descent \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"cruise_altitude":35000,"target_altitude":3000,"descent_angle":3,"ground_speed":280}'const res = await fetch("https://api.kit.forhosting.com/travel/top-of-descent", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"cruise_altitude": 35000,
"target_altitude": 3000,
"descent_angle": 3,
"ground_speed": 280
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/travel/top-of-descent",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"cruise_altitude": 35000,
"target_altitude": 3000,
"descent_angle": 3,
"ground_speed": 280
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/travel/top-of-descent", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"cruise_altitude":35000,"target_altitude":3000,"descent_angle":3,"ground_speed":280}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"cruise_altitude":35000,"target_altitude":3000,"descent_angle":3,"ground_speed":280}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/travel/top-of-descent", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"cruise_altitude": 35000,
"target_altitude": 3000,
"descent_angle": 3,
"ground_speed": 280
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "travel.top_of_descent",
"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
What top of descent means and how the geometry works
That distance in feet is altitude_to_lose divided by tan(γ); divide by feet per nautical mile (the international nautical mile of 1852 metres expressed in feet) to get distance in NM. When you also know average ground speed in knots, time in hours is distance_nm divided by ground_speed, and the equivalent constant descent rate in feet per minute is ground_speed over sixty times tan(γ) times feet per nautical mile.
Input contract, response fields, and validation errors
Absolute altitude bounds allow common elevated fields and very high cruise levels while rejecting absurd outliers. POST a JSON body with four required finite numbers. cruise_altitude (aliases cruise, cruise_alt, from_altitude, altitude_from, fl_cruise) is the starting altitude in feet MSL and must be strictly greater than target_altitude. target_altitude (aliases target, target_alt, to_altitude, altitude_to, airport_elevation, field_elevation) is the level-off height in feet—field elevation, pattern altitude, or a published crossing restriction. descent_angle (aliases angle, path_angle, fpa, gamma, descent_path_angle) is the constant path angle in degrees in the open-closed interval from zero point one through forty-five; three degrees is the usual example. ground_speed (aliases gs, speed, groundspeed, ground_speed_kts, knots) is average ground speed during the descent in knots and must be strictly positive. On success the body echoes the four inputs, altitude_to_lose_ft, distance_nm, distance_km, distance_mi, distance_ft, gradient_ft_per_nm, descent_rate_fpm, time_hours, time_minutes, a compact time_formatted label, a formula string, a short English message, and ordered substitution steps for teaching or logging. Failed validation—missing fields, non-finite values, zero or negative ground speed, non-positive angle, angle above forty-five degrees, or cruise not strictly above target—returns invalid_input and is never charged. Pricing is a flat $0.002 per successful request on the unit item schedule.
Practical planning tips, limits, and when to use another tool
If your chart or dispatch package quotes statute miles or kilometres, read distance_mi or distance_km from the same response rather than mixing unit systems in a second mental conversion. When the target is not the runway threshold but a fix altitude (for example cross twenty miles out at ten thousand feet), set target_altitude to that restriction and measure distance before that fix, not before the airport. Failed tasks that return invalid_input do not consume prepaid balance, which keeps exploratory scripts cheap when you deliberately send equal altitudes to verify error handling.
Integration use cases
Dispatch and lightweight tools
Ops scripts compute a transparent TOD distance without calling an FMS performance API, logging formula steps beside the published arrival.