Hohmann Total Delta-V Calculator for Circular Orbits
This Hohmann transfer calculator finds the two burns and total delta-v required to move between circular, coplanar orbits around the same primary body.
Run — free
Enter the initial orbital radius, final orbital radius, and standard gravitational parameter in a consistent unit system. The result works for raising or lowering an orbit, reports each burn as a positive magnitude, and includes the transfer ellipse semi-major axis for an immediate, useful geometry check during early mission planning.
Set up the two circular orbits correctly
A Hohmann transfer begins in one circular orbit and ends in another circular orbit around the same central body. Enter radius_initial and radius_final as distances from the center of that body, not altitude above its surface. For example, an Earth parking orbit radius must include Earth’s radius as well as the spacecraft’s altitude. Both radii must be strictly positive. Enter mu, the standard gravitational parameter of the primary body, using units that match the radii. If radii are in meters, mu should be in cubic meters per second squared, and the returned velocity changes will be in meters per second. If radii are in kilometers, use cubic kilometers per second squared, and the velocity results will be in kilometers per second. Mixing meters and kilometers produces a numerically valid but physically meaningless answer, because the calculator cannot infer or convert an unstated unit system. The two orbits are assumed to be circular and coplanar, with instantaneous burns and no atmospheric drag, perturbations, plane change, finite-thrust loss, or third-body effects. Those assumptions define the ideal two-impulse Hohmann result rather than a complete mission budget.
Understand the two burns and the total
The calculation first sets the transfer ellipse semi-major axis to half the sum of the two orbital radii. It then evaluates circular speed at each endpoint and transfer-ellipse speed at the same locations using the vis-viva equation. The magnitude of the difference at the initial radius is delta_v_first, and the magnitude at the destination radius is delta_v_second. Adding those magnitudes gives delta_v_total. For an outward transfer, the first burn accelerates the spacecraft into an ellipse whose apoapsis touches the higher orbit, while the second burn accelerates again to circularize there. For an inward transfer, both physical burn directions reverse relative to the motion: the first lowers the opposite apsis and the second circularizes at the smaller radius. The output deliberately reports magnitudes, so both contributions and their total remain nonnegative in either direction. When both radii are equal, the transfer ellipse is that same circle and both burns are zero. The result therefore expresses ideal propulsion demand without assigning a prograde or retrograde sign convention that might differ between flight-dynamics systems.
Use the result in mission planning
Treat delta_v_total as a clean baseline for comparing circular coplanar transfers, not as the amount a real spacecraft should load into its final budget. A practical plan normally adds launch-injection uncertainty, navigation correction, finite burn losses, attitude-control use, reserve policy, and any plane change or rendezvous requirement. The calculator is especially useful for quick trade studies because every evaluation is deterministic: the same three inputs always return the same values, with no ephemeris lookup or hidden body database. You can compare target radii, feed the total into a rocket-equation calculation, or verify an independent orbital-mechanics implementation. Keep the individual burns as well as the total, since propulsion constraints often depend on the size and location of each maneuver rather than only their sum. Also inspect transfer_semi_major_axis: it must lie halfway between the supplied radii and offers a simple way to catch an incorrectly entered altitude. For high-fidelity operations, replace this idealized estimate with trajectory optimization based on epochs, state vectors, maneuver duration, perturbations, and operational constraints. Via the API, each deterministic calculation costs $0.002.
What you can do with it
Compare destination orbits
Evaluate candidate circular orbit radii and compare their ideal two-burn propulsion requirements.
Check a mission budget
Establish the ideal Hohmann baseline before adding reserves, losses, corrections, and other maneuvers.
Validate orbital software
Use deterministic burn components and transfer geometry as reference values for another implementation.
FAQ
What units should I use?
Use any consistent unit system. Radius in meters with mu in m^3/s^2 returns delta-v in m/s; kilometers with km^3/s^2 returns km/s.
Should I enter orbital altitude or orbital radius?
Enter radius measured from the primary body's center. Add the body's radius if you begin with altitude above its surface.
Does the calculator support lowering an orbit?
Yes. It reports positive magnitudes for both burns and the total whether the final radius is higher or lower.
Why are both burns zero when the radii match?
Identical radii describe the same circular orbit, so the transfer ellipse is unchanged and no ideal velocity change is required.
Does the result include plane changes or propulsion losses?
No. It assumes circular coplanar orbits, instantaneous impulses, and an ideal two-body model.
What does an API calculation cost?
Each request costs $0.002. The browser calculation uses the same pure algorithm.
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/astro/hohmann-deltav-total \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"radius_initial":7000000,"radius_final":42164000,"mu":398600441800000}'const res = await fetch("https://api.kit.forhosting.com/astro/hohmann-deltav-total", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"radius_initial": 7000000,
"radius_final": 42164000,
"mu": 398600441800000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/astro/hohmann-deltav-total",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"radius_initial": 7000000,
"radius_final": 42164000,
"mu": 398600441800000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/astro/hohmann-deltav-total", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"radius_initial":7000000,"radius_final":42164000,"mu":398600441800000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"radius_initial":7000000,"radius_final":42164000,"mu":398600441800000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/astro/hohmann-deltav-total", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"radius_initial": 7000000,
"radius_final": 42164000,
"mu": 398600441800000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "astro.hohmann_deltav_total",
"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. |