Skip to main content

Pattern Detection

Detect unusual behavior, maneuvers, and anomalies in satellite operations using AI-powered pattern analysis.
Status: Early Access — Request API key

Overview

Pattern detection identifies:
  • Maneuvers — Orbit-raising, lowering, plane changes
  • Anomalies — Unexpected behavior deviations
  • Operational changes — Mode changes, activation/deactivation
  • Proximity operations — Rendezvous and docking

Quick Start

from rotastellar import RotaStellar

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

# Get detected patterns for a satellite
patterns = client.intelligence.patterns(
    satellite="COSMOS-2542",
    lookback_days=30
)

for pattern in patterns:
    print(f"Type: {pattern.type}")
    print(f"Time: {pattern.timestamp}")
    print(f"Confidence: {pattern.confidence}")
    print(f"Description: {pattern.description}")
    print()

Get Patterns

GET /v1/patterns
satellite
string
required
Satellite ID or name
lookback_days
integer
default:"30"
Analysis window (1-365 days)
type
string
Filter by pattern type: maneuver, anomaly, proximity, operational
min_confidence
number
default:"0.7"
Minimum confidence threshold (0-1)

Response

{
  "satellite": {
    "id": "44832",
    "name": "COSMOS-2542"
  },
  "patterns": [
    {
      "id": "pat_xyz789",
      "type": "maneuver",
      "subtype": "orbit_raise",
      "timestamp": "2026-01-15T08:23:00Z",
      "confidence": 0.95,
      "description": "Orbit raising maneuver detected, altitude increased by 12km",
      "details": {
        "delta_altitude_km": 12.3,
        "delta_v_estimated_m_s": 2.1,
        "pre_altitude_km": 538,
        "post_altitude_km": 550.3
      }
    },
    {
      "id": "pat_abc456",
      "type": "proximity",
      "subtype": "approach",
      "timestamp": "2026-01-10T14:45:00Z",
      "confidence": 0.88,
      "description": "Approached USA-245 within 50km, maintained position for 6 hours",
      "details": {
        "target": "USA-245",
        "min_distance_km": 48.2,
        "duration_hours": 6.2
      }
    },
    {
      "id": "pat_def123",
      "type": "anomaly",
      "subtype": "attitude_change",
      "timestamp": "2026-01-05T22:10:00Z",
      "confidence": 0.72,
      "description": "Unusual attitude variation detected, possible sensor reorientation",
      "details": {
        "magnitude_deg": 15.3,
        "duration_min": 45
      }
    }
  ],
  "analysis_window": {
    "start": "2025-12-22T00:00:00Z",
    "end": "2026-01-21T00:00:00Z"
  }
}

Pattern Types

Maneuvers

Detected orbital changes:
SubtypeDescription
orbit_raiseAltitude increase
orbit_lowerAltitude decrease
plane_changeInclination adjustment
phasingAlong-track position adjustment
station_keepingMaintenance maneuver
deorbitEnd-of-life maneuver
# Get only maneuvers
maneuvers = client.intelligence.patterns(
    satellite="STARLINK-1234",
    type="maneuver",
    lookback_days=90
)

for m in maneuvers:
    print(f"{m.timestamp}: {m.subtype}")
    print(f"  Delta-V: {m.details.delta_v_estimated_m_s} m/s")

Anomalies

Unexpected behavior deviations:
SubtypeDescription
attitude_changeUnexpected orientation change
tumblingLoss of attitude control
fragmentationDebris generation event
signal_lossCommunication anomaly
trajectory_deviationUnexpected position change
# Get anomalies
anomalies = client.intelligence.patterns(
    satellite="DEBRIS-12345",
    type="anomaly",
    lookback_days=7
)

for a in anomalies:
    if a.subtype == "fragmentation":
        print(f"ALERT: Possible fragmentation at {a.timestamp}")

Proximity Operations

Close approaches and rendezvous:
# Detect proximity operations
proximity = client.intelligence.patterns(
    satellite="INSPECTOR-SAT",
    type="proximity",
    lookback_days=60
)

for p in proximity:
    print(f"Approached {p.details.target}")
    print(f"  Min distance: {p.details.min_distance_km} km")
    print(f"  Duration: {p.details.duration_hours} hours")

Real-Time Anomaly Detection

Get immediate alerts for anomalies:
# Set up anomaly monitoring
monitor = client.intelligence.patterns.monitor(
    satellites=["CRITICAL-SAT-1", "CRITICAL-SAT-2"],
    types=["anomaly", "proximity"],
    min_confidence=0.8,
    webhook_url="https://your-app.com/pattern-alerts"
)

Historical Analysis

Analyze long-term behavioral patterns:
# Get 1-year pattern history
history = client.intelligence.patterns(
    satellite="GEO-SAT-1",
    lookback_days=365
)

# Analyze maneuver frequency
maneuvers = [p for p in history if p.type == "maneuver"]
print(f"Total maneuvers: {len(maneuvers)}")
print(f"Station-keeping: {sum(1 for m in maneuvers if m.subtype == 'station_keeping')}")

Batch Analysis

Analyze patterns across multiple satellites:
# Analyze entire constellation
results = client.intelligence.patterns.batch(
    satellites=["SAT-001", "SAT-002", "SAT-003"],
    lookback_days=30
)

for sat_id, patterns in results.items():
    anomalies = [p for p in patterns if p.type == "anomaly"]
    if anomalies:
        print(f"{sat_id}: {len(anomalies)} anomalies detected")

Next Steps