Skip to main content
POST
/
v1
/
plan
curl -X POST https://rotastellar-cae.subhadip-mitra.workers.dev/v1/plan \
  -H "Content-Type: application/json" \
  -H "Origin: https://rotastellar.com" \
  -d '{
    "satellite_id": "25544",
    "preset_id": "onboard-ml-inference"
  }'
{
  "id": "a92f33e8-a349-494c-8b4e-f87d859b9ec5",
  "created_at": "2026-03-05T06:55:37.811Z",
  "version": "1.0.0",
  "satellite": {
    "id": "25544",
    "name": "ISS (ZARYA)",
    "norad_id": 25544,
    "altitude_km": 417,
    "inclination_deg": 51.6,
    "period_min": 93,
    "tle_epoch": "26063.86671769"
  },
  "preset": {
    "id": "onboard-ml-inference",
    "name": "On-Board ML Inference",
    "category": "ml-inference",
    "steps": 4
  },
  "orbital_environment": {
    "prediction_start": "2026-03-05T06:55:37.811Z",
    "prediction_hours": 12,
    "eclipse_fraction": 0.348,
    "bus": { "..." : "..." },
    "windows": [ "..." ],
    "ground_passes": [ "..." ],
    "summary": {
      "total_windows": 14,
      "comms_windows": 6,
      "sunlit_windows": 9,
      "eclipse_windows": 5,
      "total_pass_time_s": 2847,
      "ground_stations_visible": 8
    }
  },
  "placement_decisions": [
    { "step_id": "capture", "location": "onboard", "reason": "preset_defined" },
    { "step_id": "preprocess", "location": "onboard", "reason": "preset_defined" },
    { "step_id": "inference", "location": "onboard", "reason": "preset_defined" },
    { "step_id": "encrypt_results", "location": "onboard", "reason": "preset_defined" }
  ],
  "transfer_schedule": {
    "transfers": [ "..." ],
    "total_transfers": 1,
    "total_downlink_mb": 11.03,
    "total_uplink_mb": 0,
    "passes_used": 1,
    "total_transfer_time_s": 12
  },
  "error_budget": {
    "worst_case_ber": 0.00001,
    "total_fec_overhead_mb": 0.53,
    "total_retransmission_reserve_mb": 0.11,
    "delivery_confidence": 0.997
  },
  "security_summary": {
    "encryption": "aes256",
    "total_encryption_overhead_mb": 0.53,
    "total_key_exchanges": 1,
    "data_classification": "restricted"
  },
  "plan": {
    "segments": [ "..." ],
    "total_duration_s": 1382,
    "total_compute_s": 170,
    "total_transfer_s": 12,
    "total_ground_s": 0,
    "windows_used": 2,
    "policy": {
      "objective": "min_latency",
      "deadline_orbits": 3
    }
  },
  "events": [ "..." ]
}
Base URL: https://rotastellar-cae.subhadip-mitra.workers.dev — No API key required.

Request

satellite_id
string
required
NORAD catalog ID (e.g., "25544" for ISS).
preset_id
string
Preset workload ID. One of: onboard-ml-inference, split-learning, earth-observation-qa, federated-learning, resilient-store-forward. Mutually exclusive with custom_job.
custom_job
object
Custom workload definition with arbitrary step DAG. Mutually exclusive with preset_id. See Custom Workloads for the full schema.
  • name (string) — Workload name
  • steps (array, required) — Step definitions with dependencies
  • security (object) — Security policy overrides
  • policy (object) — Execution policy overrides
security
object
Override security settings from the preset or custom job:
  • encryptionnone, aes128, or aes256
  • data_classificationopen, restricted, or confidential
  • require_authenticated_uplink — boolean
  • key_rotation_orbits — number
options
object
Planning options:
  • prediction_hours (number, 1–48, default: 12) — Orbital prediction window
  • min_elevation_deg (number, 0–90, default: 5) — Minimum ground station elevation
Either preset_id or custom_job is required, but not both.
curl -X POST https://rotastellar-cae.subhadip-mitra.workers.dev/v1/plan \
  -H "Content-Type: application/json" \
  -H "Origin: https://rotastellar.com" \
  -d '{
    "satellite_id": "25544",
    "preset_id": "onboard-ml-inference"
  }'
{
  "id": "a92f33e8-a349-494c-8b4e-f87d859b9ec5",
  "created_at": "2026-03-05T06:55:37.811Z",
  "version": "1.0.0",
  "satellite": {
    "id": "25544",
    "name": "ISS (ZARYA)",
    "norad_id": 25544,
    "altitude_km": 417,
    "inclination_deg": 51.6,
    "period_min": 93,
    "tle_epoch": "26063.86671769"
  },
  "preset": {
    "id": "onboard-ml-inference",
    "name": "On-Board ML Inference",
    "category": "ml-inference",
    "steps": 4
  },
  "orbital_environment": {
    "prediction_start": "2026-03-05T06:55:37.811Z",
    "prediction_hours": 12,
    "eclipse_fraction": 0.348,
    "bus": { "..." : "..." },
    "windows": [ "..." ],
    "ground_passes": [ "..." ],
    "summary": {
      "total_windows": 14,
      "comms_windows": 6,
      "sunlit_windows": 9,
      "eclipse_windows": 5,
      "total_pass_time_s": 2847,
      "ground_stations_visible": 8
    }
  },
  "placement_decisions": [
    { "step_id": "capture", "location": "onboard", "reason": "preset_defined" },
    { "step_id": "preprocess", "location": "onboard", "reason": "preset_defined" },
    { "step_id": "inference", "location": "onboard", "reason": "preset_defined" },
    { "step_id": "encrypt_results", "location": "onboard", "reason": "preset_defined" }
  ],
  "transfer_schedule": {
    "transfers": [ "..." ],
    "total_transfers": 1,
    "total_downlink_mb": 11.03,
    "total_uplink_mb": 0,
    "passes_used": 1,
    "total_transfer_time_s": 12
  },
  "error_budget": {
    "worst_case_ber": 0.00001,
    "total_fec_overhead_mb": 0.53,
    "total_retransmission_reserve_mb": 0.11,
    "delivery_confidence": 0.997
  },
  "security_summary": {
    "encryption": "aes256",
    "total_encryption_overhead_mb": 0.53,
    "total_key_exchanges": 1,
    "data_classification": "restricted"
  },
  "plan": {
    "segments": [ "..." ],
    "total_duration_s": 1382,
    "total_compute_s": 170,
    "total_transfer_s": 12,
    "total_ground_s": 0,
    "windows_used": 2,
    "policy": {
      "objective": "min_latency",
      "deadline_orbits": 3
    }
  },
  "events": [ "..." ]
}

Errors

StatusCodeDescription
400validation_errorInvalid request body or parameters
400invalid_bodyRequest body is not valid JSON
403origin_not_allowedRequest from disallowed origin
422planning_failedPlanner cannot find a feasible schedule
500internal_errorUnexpected server error