Station keeping
/stationkeepPurpose
Estimates the propulsive cost of holding a constellation in place over a multi-year horizon, reporting both per-satellite detail and fleet totals.
This is a budgeting tool for design trades, not a maneuver planner.
Request
| Parameter | Type | Unit | Default | Required | Description |
|---|---|---|---|---|---|
constellation_id | string | n/a | — | Yes | Identifier of an existing constellation. |
years | number | years | 5 | No | Budget horizon. |
strategy | object | n/a | — | No | Internally tagged by `kind`. See below; this is where most requests fail. |
The strategy object is internally tagged
strategy is an internally tagged enum, and its variant names are not the
short forms the CLI uses. The CLI writes --strategy leo; the API needs
kind: "leo_drag_makeup".
A plain string fails:
strategy: invalid type: string "leo", expected internally tagged enum StationKeepingStrategyThe right shape with the CLI’s short name also fails:
strategy.kind: unknown variant `leo`, expected `leo_drag_makeup` or `geo`And the right variant with the CLI’s field name fails again:
strategy: missing field `cd_area_over_mass_m2_per_kg`Three consecutive failures for one object is worth stating plainly: the CLI
flag --cdam is cd_area_over_mass_m2_per_kg here. The API field spells the
quantity out, including its units.
| Parameter | Type | Unit | Default | Required | Description |
|---|---|---|---|---|---|
kind | string | n/a | — | Yes | Literal `leo_drag_makeup`. |
deadband_km | number | km | — | Yes | Mean semi-major-axis deadband half-width. |
cd_area_over_mass_m2_per_kg | number | m^2/kg | — | Yes | Ballistic coefficient. The CLI calls this `--cdam`. This is the parameter that dominates the answer. |
The geo variant takes slot longitude, east-west and north-south deadbands, and
the luni-solar inclination drift rate.
Example
curl -s -X POST http://127.0.0.1:8080/stationkeep \
-H 'content-type: application/json' \
-d '{
"constellation_id": "probe1",
"years": 5.0,
"strategy": {
"kind": "leo_drag_makeup",
"deadband_km": 1.0,
"cd_area_over_mass_m2_per_kg": 0.02
}
}'{
"status": "ok",
"satellite_count": 4,
"years": 5.0,
"fleet_delta_v_mps_per_year": 38.750767324497055,
"fleet_propellant_kg_per_year": 4.617596787471648,
"satellites": [
{
"satellite_id": "probe1-s0-p00-sat00",
"report": {
"years": 5.0,
"mean_semi_major_axis_km": 6922.079930128192,
"components": [
{
"name": "drag-makeup",
"delta_v_mps_per_year": 10.427483649509684,
"dv_per_cycle_mps": 1.0962610225925555,
"cycles_per_year": 9.511862079023526,
"cadence_days": 38.39942137149827
}
]
}
}
]
}Response elided; satellites holds one entry per spacecraft.
Reading the result
| Field | Value | Meaning |
|---|---|---|
fleet_delta_v_mps_per_year | 38.75 | Fleet total, useful for logistics rather than spacecraft sizing |
delta_v_mps_per_year | 10.43 | Per-satellite annual cost. This is what sizes a tank |
dv_per_cycle_mps | 1.096 | Size of one correction burn |
cycles_per_year | 9.51 | How often it fires |
cadence_days | 38.4 | The same figure as an interval |
cadence_days is the operationally useful number. It says a satellite fires
roughly every five and a half weeks, which sets how often the ground segment
must plan and execute maintenance across the whole fleet.
The fleet delta-v figure sizes nothing; a tank is sized by the per-satellite annual cost times the horizon, plus margin.
The per-satellite breakdown appears under components, which is a list rather
than a scalar because the GEO strategy contributes separate east-west and
north-south terms.
The parameter that dominates
Delta-v scales roughly linearly with cd_area_over_mass_m2_per_kg. Doubling it
doubles the propellant. Compute it from the actual drag area, drag coefficient,
and mass, and state the value alongside any result you quote.
Atmospheric density is itself uncertain by tens of percent and varies with solar activity, so treat the output as a range. A common practice is to run the budget at expected and at elevated density, and size propellant for the latter.
See also
orbitforge stationkeep, whose flags use the short names this endpoint does not accept.
main (pre-release)