Economics
/econ/estimatePurpose
Estimates the lifetime cost of a constellation and, when revenue and a discount rate are supplied, its net present value.
The model is deliberately transparent rather than sophisticated: every input is a number you supply, so the output is only as good as your estimates, and the breakdown shows exactly where the money went.
Request
The request is flat, not nested. Every field sits at the top level.
| Parameter | Type | Unit | Default | Required | Description |
|---|---|---|---|---|---|
satellite_recurring_usd | number | USD | — | Yes | Recurring cost to build one satellite. |
satellite_mass_kg | number | kg | — | Yes | Mass of one satellite. Drives launch packing. |
non_recurring_usd | number | USD | — | Yes | Development cost, incurred once. |
launch_price_usd | number | USD | — | Yes | Price of one launch. |
launch_capacity_kg | number | kg | — | Yes | Payload capacity per launch. With satellite mass, this sets how many fly together. |
spares_per_plane | integer | count | — | Yes | On-orbit spares carried in each plane. |
annual_operations_usd | number | USD/year | — | Yes | Recurring operations cost. |
mission_years | number | years | — | Yes | Mission duration. |
total_satellites | integer | count | — | No | Operational satellites, excluding spares. |
planes | integer | count | — | No | Number of planes. With `spares_per_plane`, determines total spares. |
annual_revenue_usd | number | USD/year | — | No | Revenue. Required for a net present value. |
discount_rate | number | n/a | — | No | Discount rate as a fraction, for example 0.08 for 8 percent. |
The API request is flat, while the underlying cost model nests satellite, launch vehicle, and sparing into sub-objects. Sending the nested shape fails:
Failed to deserialize the JSON body into the target type: missing field `satellite_recurring_usd`Follow the flat field names above, not the internal model structure.
Example
A 60-satellite constellation in 6 planes, one spare per plane:
curl -s -X POST http://127.0.0.1:8080/econ/estimate \
-H 'content-type: application/json' \
-d '{
"satellite_recurring_usd": 1500000.0,
"satellite_mass_kg": 260.0,
"total_satellites": 60,
"planes": 6,
"non_recurring_usd": 50000000.0,
"launch_price_usd": 60000000.0,
"launch_capacity_kg": 5500.0,
"spares_per_plane": 1,
"annual_operations_usd": 5000000.0,
"mission_years": 5.0,
"annual_revenue_usd": 80000000.0,
"discount_rate": 0.08
}'{
"breakdown": {
"development_usd": 50000000.0,
"satellites_usd": 99000000.0,
"launch_usd": 240000000.0,
"operations_usd": 25000000.0,
"station_keeping_usd": 0.0,
"fuel_limited_years": null,
"total_usd": 414000000.0,
"satellites_built": 66,
"launches": 4,
"per_satellite_usd": 6900000.0
},
"npv_usd": -89546747.21914366
}Reading the breakdown
Launch dominates
Launch is 240 million of a 414 million total: 58 percent, and 2.4 times the cost of the satellites themselves.
That ratio is the single most useful output of the model. It says the design is launch-limited, so the highest-leverage changes are the ones that reduce launch count: lighter satellites, fewer satellites, or a cheaper ride. Halving the recurring satellite cost would save 49.5 million; halving the launch price would save 120 million.
Packing is integer, and it bites
66 satellites at 260 kg is 17,160 kg. At 5500 kg per launch that is 3.12 launches, which rounds up to 4. The fourth launch carries 12 satellites in a vehicle that could take 21, and you pay full price for it.
Launch count is an integer, so cost is a step function of satellite count and mass, not a smooth one. Adding one satellite can cost 60 million or nothing at all depending on where you sit relative to a packing boundary.
Sweep satellite mass and count around your operating point before committing. The cheapest design is often just below a boundary rather than at the nominal requirement.
Spares are 10 percent of the build
satellites_built is 66, not 60: one spare per plane across 6 planes. That is 9
million of satellite cost, and it also contributed to crossing into a fourth
launch.
per_satellite_usd of 6.9 million is total cost divided by satellites built. It
is a useful comparison figure and not a marginal cost; building one more
satellite does not cost 6.9 million, because development is already sunk and
launch is a step.
Net present value is negative
npv_usd is -89.5 million at 80 million annual revenue over 5 years and an
8 percent discount rate. Undiscounted revenue is 400 million against 414 million
of cost, and discounting future revenue to present value widens the gap.
This is the model doing its job. The design does not pay back on these assumptions, and the honest responses are to extend mission life, raise revenue, or reduce launch cost, rather than to adjust the discount rate until the sign changes.
station_keeping_usd is zero because no station-keeping inputs were supplied;
fuel_limited_years is null for the same reason.
See also
/trade/sweepto explore geometry and cost together, once documented./stationkeepfor the propellant figures that feed the station-keeping cost term.
main (pre-release)