Rigid body Roche limit calculator
The rigid-body Roche limit calculator estimates the centre-to-centre distance at which tidal forces from a primary body can overcome the self-gravity holding a rigid satellite together.
Run — free
Enter the primary radius, the primary mean density, and the satellite mean density in consistent units. The calculation applies the conventional rigid-satellite coefficient of about 1.26, returns the distance in the same unit as the radius, and rejects zero or negative densities instead of producing a physically meaningless result.
Enter radius and densities in consistent units
Start with the mean radius of the primary body and choose any convenient length unit, such as kilometres, metres, or miles. The returned Roche limit will use that same unit, so no fixed length conversion is hidden in the calculation. Next, enter the primary and satellite mean densities using the same density unit for both values. Kilograms per cubic metre and grams per cubic centimetre are both acceptable choices, but they must not be mixed because the formula uses their ratio. Each density must be strictly greater than zero. A zero or negative density has no physical meaning here and is rejected as invalid input. The primary radius must also be positive and finite. Use representative mean densities rather than a surface value or a density measured for one small region. If an object is strongly layered, porous, or irregular, remember that this compact estimate describes an idealized body. Keeping a note of your chosen units and source values makes the result easier to reproduce and compare with published orbital distances. This input discipline is especially important when copying figures from tables that use different unit systems.
Understand the rigid-satellite formula
The calculator evaluates d = 1.26 × R × (primary density / satellite density)^(1/3). Here, R is the primary radius and d is the centre-to-centre Roche-limit distance. The density quotient is dimensionless because both densities use the same unit. Taking its cube root makes the result respond moderately rather than linearly to density changes: multiplying the density ratio by eight doubles its cube-root contribution. The coefficient 1.26 is the standard approximate factor for the idealized rigid-body case. The response also reports the density ratio and the distance measured in primary radii, which is useful for checking the arithmetic or comparing systems of very different sizes. A denser primary raises the limit, while a denser satellite lowers it because the satellite resists tidal disruption more strongly. The calculation is deterministic and does not use object-name presets, external catalogues, random values, or live astronomical data. Values are rounded to stable significant precision in the JSON response so repeated calls with the same input produce the same practical representation across the API and browser calculator.
Interpret the estimate and its boundaries
Treat the computed distance as a classical approximation, not as a prediction of the exact moment when every real moon, ring particle, spacecraft, or rubble pile will break apart. The rigid model assumes the satellite retains structural integrity and uses a simplified balance between tidal effects and self-gravity. It does not model tensile strength explicitly, rotation, orbital eccentricity, resonances, thermal stress, internal layering, an atmosphere, or deformation over time. A fluid satellite uses a different and substantially larger conventional coefficient, so do not substitute this result when the object behaves like a strengthless fluid. The Roche limit is reported from the centre of the primary, not as altitude above its surface. To obtain an approximate surface altitude for comparison, subtract the primary radius yourself while preserving the same length unit. If the reported distance lies inside the primary body, the simplified disruption boundary has no directly accessible external orbit in that scenario. For research, mission safety, or unusual material structures, use this value as a screening calculation and follow it with a model that represents the relevant mechanics and uncertainties. For education and quick comparisons, it provides a clear, reproducible rigid-body baseline.
What you can do with it
Compare hypothetical moon materials
Hold the primary body fixed and compare how different positive satellite densities move the rigid-body disruption boundary.
Check an orbital-distance exercise
Calculate the classical rigid Roche limit and compare it with an orbit expressed in kilometres or primary radii.
Screen an idealized system
Produce a fast baseline before selecting a more detailed tidal, structural, or numerical model.
FAQ
What formula does this calculator use?
It uses d = 1.26 × R × (primary density / satellite density)^(1/3), the conventional approximate expression for a rigid satellite.
Which units should I use?
Use any length unit for primary_radius and one consistent density unit for both densities. The result has the same length unit as primary_radius.
Why are zero and negative densities rejected?
Mean density must be positive for this physical model, and the satellite density is a divisor in the density ratio.
Is the result measured from the surface?
No. The Roche limit is a centre-to-centre distance. Subtract the primary radius to derive an approximate altitude above the surface.
Can I use this for a fluid satellite?
No. A fluid satellite uses a different model and coefficient. This capability is specifically for the classical rigid-body approximation.
What does an API calculation cost?
Each API request costs $0.002. The browser version uses the same deterministic calculation.
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/roche-limit-rigid \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"primary_radius":6371,"primary_density":5514,"satellite_density":3340}'const res = await fetch("https://api.kit.forhosting.com/astro/roche-limit-rigid", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"primary_radius": 6371,
"primary_density": 5514,
"satellite_density": 3340
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/astro/roche-limit-rigid",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"primary_radius": 6371,
"primary_density": 5514,
"satellite_density": 3340
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/astro/roche-limit-rigid", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"primary_radius":6371,"primary_density":5514,"satellite_density":3340}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"primary_radius":6371,"primary_density":5514,"satellite_density":3340}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/astro/roche-limit-rigid", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"primary_radius": 6371,
"primary_density": 5514,
"satellite_density": 3340
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "astro.roche_limit_rigid",
"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. |