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 RotaStellarClient

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

# Get detected patterns for a satellite
patterns = client.list_patterns(
    satellite_id="44832",  # 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.list_patterns(
    satellite_id="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.list_patterns(
    satellite_id="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.list_patterns(
    satellite_id="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 via webhook
# See /intelligence/webhooks for full webhook setup
import requests

requests.post(
    "https://api.rotastellar.com/v1/patterns/monitor",
    headers={"Authorization": "Bearer rs_your_api_key"},
    json={
        "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.list_patterns(
    satellite_id="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
satellites = ["SAT-001", "SAT-002", "SAT-003"]
results = {}

for sat_id in satellites:
    patterns = client.list_patterns(satellite_id=sat_id, lookback_days=30)
    results[sat_id] = patterns

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