TAK Protocol Reference

March 12, 2026 · View on GitHub

Proto Definition: backend/api/proto/tak.proto Compiled Module: backend/api/proto/tak_pb2.py


Overview

Sovereign Watch uses a simplified Cursor on Target (CoT) protocol as its internal data exchange format. All intelligence pollers normalize external data (ADS-B JSON, AIS messages, TLE data, RF site records) into this format before publishing to the Redpanda message bus.

The schema is defined in Protocol Buffers (proto3) but in practice all inter-service messages are JSON-serialized — the .proto file serves as the canonical schema definition and is used for type-checked deserialization on the API side.

What is Cursor on Target (CoT)?

CoT is a U.S. military XML/JSON standard (MIL-STD-2525) for exchanging situational awareness data between tactical systems (ATAK, WinTAK, etc.). Sovereign Watch implements a lightweight subset focused on real-time telemetry for aviation, maritime, orbital, and infrastructure domains.


Top-Level Structure

{
  "uid": "unique-entity-identifier",
  "type": "a-f-A-C-F",
  "how": "m-g",
  "time": 1710000000000,
  "start": "2026-03-12T18:00:00Z",
  "stale": "2026-03-12T18:02:00Z",
  "point": { ... },
  "detail": { ... }
}

Top-Level Fields

FieldTypeRequiredDescription
uidstringYesGlobally unique entity identifier
typestringYesHierarchical CoT type string (see below)
howstringRecommendedHow position was obtained
timeuint64YesEvent timestamp (epoch milliseconds)
startstringYesEvent validity start (ISO 8601)
stalestringYesEvent expiry time (ISO 8601) — entity is removed from display after this
pointobjectYesGeospatial position
detailobjectYesDomain-specific metadata

CoT Type String

The type field is a hierarchical dot-notation string derived from MIL-STD-2525:

a  -  f  -  A  -  C  -  F
│     │     │     │     └── Sub-platform (F=Fixed Wing, H=Helicopter, Q=Drone)
│     │     │     └──────── Platform (C=Civilian, M=Military, S=Surface/Maritime)
│     │     └────────────── Domain (A=Air, G=Ground, S=Space, s=Sea)
│     └──────────────────── Affiliation (f=Friend/Friendly)
└────────────────────────── Atom type (a=Atom)

Type Values Used in Sovereign Watch

CoT TypeEntityDomain
a-f-A-C-FCivilian fixed-wing aircraftAviation
a-f-A-M-FMilitary fixed-wing aircraftAviation
a-f-A-C-HCivilian helicopterAviation
a-f-A-M-HMilitary helicopterAviation
a-f-A-C-QCivilian drone / RPVAviation
a-f-A-M-QMilitary drone / RPVAviation
a-f-G-E-V-CGround vehicle (emergency/service)Ground
a-f-S-C-MMaritime vessel (all types)Maritime
a-s-KSatellite (space vehicle)Space

how Field Values

ValueMeaning
m-gMachine — GPS (machine-calculated from GPS source)

Point Object

"point": {
  "lat": 45.5152,
  "lon": -122.6784,
  "hae": 10668.0,
  "ce": 10.0,
  "le": 10.0
}
FieldTypeUnitDescription
latdoubledegreesWGS84 latitude (-90 to +90)
londoubledegreesWGS84 longitude (-180 to +180)
haedoublemetersHeight Above Ellipsoid (WGS84). Use 0 for surface/sea-level.
cedoublemetersCircular Error — horizontal position uncertainty radius
ledoublemetersLinear Error — vertical position uncertainty

Detail Object

The detail object contains domain-specific metadata. All sub-objects are optional — only those relevant to the entity type are populated.

"detail": {
  "contact": { ... },
  "track": { ... },
  "classification": { ... },
  "vesselClassification": { ... },
  "group": { ... },
  "status": { ... },
  "category": "comms",
  "constellation": "Starlink",
  "period_min": 95.6,
  "inclination_deg": 53.0,
  "eccentricity": 0.0001,
  "internetOutage": { ... }
}

Contact

Identifies the entity callsign or name.

"contact": {
  "callsign": "UAL123",
  "endpoint": ""
}
FieldDescription
callsignHuman-readable identifier: ICAO flight number, vessel name, satellite name, MMSI
endpointNetwork endpoint (unused in current implementation)

Track

Kinematic state vector.

"track": {
  "course": 270.5,
  "speed": 245.3,
  "slope": 0.0,
  "vspeed": 0.0
}
FieldUnitDescription
coursedegrees (0–360, true north)Ground track heading
speedm/sGround speed (all domains)
slopedegreesFlight path angle (aviation)
vspeedft/minVertical rate (aviation — standard ICAO unit)

Classification (Aviation)

Aircraft-specific metadata.

"classification": {
  "affiliation": "civilian",
  "platform": "fixed_wing",
  "size_class": "heavy",
  "icao_type": "B77W",
  "category": "A5",
  "db_flags": 0,
  "operator": "United Airlines",
  "registration": "N12345",
  "description": "Boeing 777-300ER",
  "squawk": "2145",
  "emergency": ""
}
FieldDescription
affiliationcivilian or military
platformfixed_wing, helicopter, drone
size_classlight, medium, large, heavy
icao_type4-character ICAO aircraft type designator
squawkMode-C transponder squawk code
emergencyEmergency type if squawk is 7500/7600/7700

VesselClassification (Maritime)

Vessel-specific metadata derived from ITU-R M.1371.

"vesselClassification": {
  "category": "cargo",
  "shipType": 72,
  "navStatus": 0,
  "hazardous": false,
  "stationType": "Class A",
  "flagMid": 338,
  "imo": 9876543,
  "callsign": "ABCD1",
  "destination": "USLAX",
  "draught": 12.5,
  "length": 300.0,
  "beam": 40.0
}
FieldDescription
categoryVessel category string (see AIS Poller guide for full list)
shipTypeITU-R M.1371 ship type code (0–99)
navStatusAIS navigational status (0=Under Way, 1=At Anchor, etc.)
hazardousTrue for tankers carrying dangerous cargo
flagMidMID (Maritime Identification Digits) — national flag code
draughtMaximum static draught in meters
length / beamVessel dimensions in meters (from AIS dimension fields A+B and C+D)

Orbital Fields (Satellites)

Satellite-specific fields are placed directly on the detail object (not in a sub-message):

FieldTypeDescription
categorystringSatellite category: gps, weather, comms, intel, leo, sar
constellationstringNamed constellation (e.g., Starlink, GPS, NOAA)
period_mindoubleOrbital period in minutes
inclination_degdoubleOrbital inclination in degrees
eccentricitydoubleOrbital eccentricity (0 = circular, 1 = parabolic)
norad_idintNORAD catalog number
tle_line1 / tle_line2stringRaw TLE lines for client-side re-propagation

InternetOutage (Infrastructure)

"internetOutage": {
  "country_code": "RU",
  "region": "Russia",
  "severity": 78.5,
  "datasource": "IODA_OVERALL"
}
FieldDescription
country_codeISO 3166-1 alpha-2 country code
regionHuman-readable country name
severity0.0–100.0 normalized outage severity
datasourceIODA measurement methodology

UID Conventions

DomainFormatExample
AviationICAO Mode-S hex address (lowercase)a1b2c3
MaritimeMMSI number (string)123456789
SatelliteSAT-{NORAD_ID}SAT-25544
Internet Outageoutage-{country_code}outage-RU

Stale Time Conventions

DomainDefault Stale Duration
Aviation120 seconds (2 minutes)
Maritime300 seconds (5 minutes)
Satellite60 seconds (1 minute)

Entities not refreshed before their stale time are removed from the live display.


Protobuf Schema (Reference)

The full .proto definition is at backend/api/proto/tak.proto. The JSON messages used in Kafka are structurally equivalent to the Protobuf schema. Key message types:

TakMessage → CotEvent → Detail → Contact / Track / Classification / VesselClassification / InternetOutage