Skip to main content

Conjunction Analysis

Analyze potential collisions between space objects and receive recommendations for avoidance maneuvers.
Status: Early Access — Request API key

Overview

Conjunction analysis evaluates:
  • Time of Closest Approach (TCA) — When objects will be nearest
  • Miss Distance — Predicted separation at TCA
  • Collision Probability — Statistical likelihood of collision
  • Avoidance Options — Maneuver recommendations if needed

Quick Start

from rotastellar import RotaStellar

client = RotaStellar(api_key="rs_...")

# Get conjunctions for a satellite
conjunctions = client.intelligence.conjunctions(
    satellite="STARLINK-1234",
    threshold_km=5.0,
    days_ahead=7
)

for conj in conjunctions:
    print(f"TCA: {conj.tca}")
    print(f"Secondary: {conj.secondary.name}")
    print(f"Miss distance: {conj.miss_km} km")
    print(f"Probability: {conj.probability:.2e}")
    print(f"Risk level: {conj.risk_level}")
    print()

Get Conjunctions

GET /v1/conjunctions
satellite
string
required
Primary satellite (NORAD ID or name)
threshold_km
number
default:"5.0"
Maximum miss distance to report (km)
days_ahead
integer
default:"7"
Prediction window (1-14 days)
min_probability
number
Minimum collision probability to report (e.g., 1e-6)

Response

{
  "conjunctions": [
    {
      "id": "conj_abc123",
      "tca": "2026-01-23T14:32:15Z",
      "primary": {
        "id": "12345",
        "name": "STARLINK-1234",
        "operator": "SpaceX"
      },
      "secondary": {
        "id": "45678",
        "name": "COSMOS 2251 DEB",
        "type": "DEBRIS"
      },
      "miss_km": 0.45,
      "probability": 2.3e-5,
      "risk_level": "HIGH",
      "relative_velocity_km_s": 14.2,
      "geometry": {
        "radial_km": 0.12,
        "in_track_km": 0.38,
        "cross_track_km": 0.18
      },
      "covariance_available": true,
      "data_quality": "GOOD"
    }
  ],
  "screening_window": {
    "start": "2026-01-21T00:00:00Z",
    "end": "2026-01-28T00:00:00Z"
  },
  "total_count": 12
}

Risk Levels

LevelProbability RangeRecommended Action
LOW< 1e-5Monitor
MEDIUM1e-5 to 1e-4Review, consider maneuver
HIGH1e-4 to 1e-3Plan maneuver
CRITICAL> 1e-3Execute maneuver

Conjunction Details

Get detailed information about a specific conjunction:
GET /v1/conjunctions/{conjunction_id}
conj = client.intelligence.conjunction("conj_abc123")

print(f"TCA: {conj.tca}")
print(f"Miss: {conj.miss_km} km")
print(f"Radial: {conj.geometry.radial_km} km")
print(f"In-track: {conj.geometry.in_track_km} km")
print(f"Cross-track: {conj.geometry.cross_track_km} km")

# Get avoidance options
if conj.risk_level in ["HIGH", "CRITICAL"]:
    options = conj.avoidance_options()
    for opt in options:
        print(f"Maneuver: {opt.delta_v_m_s} m/s at {opt.burn_time}")
        print(f"New miss distance: {opt.resulting_miss_km} km")

Detailed Response

{
  "id": "conj_abc123",
  "tca": "2026-01-23T14:32:15Z",
  "miss_km": 0.45,
  "probability": 2.3e-5,
  "risk_level": "HIGH",
  "primary": {
    "id": "12345",
    "name": "STARLINK-1234",
    "position_at_tca": {
      "lat": 45.2,
      "lon": -122.5,
      "altitude_km": 550
    }
  },
  "secondary": {
    "id": "45678",
    "name": "COSMOS 2251 DEB",
    "position_at_tca": {
      "lat": 45.3,
      "lon": -122.4,
      "altitude_km": 550.3
    }
  },
  "geometry": {
    "radial_km": 0.12,
    "in_track_km": 0.38,
    "cross_track_km": 0.18
  },
  "covariance": {
    "primary_sigma_r_km": 0.05,
    "primary_sigma_t_km": 0.15,
    "primary_sigma_n_km": 0.02,
    "secondary_sigma_r_km": 0.50,
    "secondary_sigma_t_km": 1.50,
    "secondary_sigma_n_km": 0.30
  },
  "avoidance_options": [
    {
      "type": "in_track",
      "delta_v_m_s": 0.5,
      "burn_time": "2026-01-23T10:00:00Z",
      "resulting_miss_km": 5.2,
      "fuel_cost_kg": 0.02
    },
    {
      "type": "radial",
      "delta_v_m_s": 0.3,
      "burn_time": "2026-01-23T08:00:00Z",
      "resulting_miss_km": 3.8,
      "fuel_cost_kg": 0.012
    }
  ],
  "updates": [
    {
      "timestamp": "2026-01-21T12:00:00Z",
      "miss_km": 0.52,
      "probability": 1.8e-5
    },
    {
      "timestamp": "2026-01-22T00:00:00Z",
      "miss_km": 0.45,
      "probability": 2.3e-5
    }
  ]
}

Monitoring Conjunctions

Set up continuous monitoring for your satellites:
# Create a watch for conjunction alerts
watch = client.intelligence.conjunctions.watch(
    satellites=["SAT-001", "SAT-002", "SAT-003"],
    threshold_km=5.0,
    min_probability=1e-6,
    webhook_url="https://your-app.com/conjunction-alerts"
)

print(f"Watch ID: {watch.id}")
print(f"Status: {watch.status}")

Fleet Screening

Screen multiple satellites at once:
# Screen entire constellation
results = client.intelligence.conjunctions.screen(
    satellites=["SAT-001", "SAT-002", "SAT-003", "SAT-004"],
    threshold_km=5.0,
    days_ahead=7
)

for sat_id, conjunctions in results.items():
    print(f"\n{sat_id}: {len(conjunctions)} conjunctions")
    for conj in conjunctions:
        print(f"  - {conj.secondary.name}: {conj.miss_km}km ({conj.risk_level})")

Next Steps