AirWarden Broadcast Stream — Connection Guide
Endpoint, authentication, message format, and the full detection-event schema for the live drone detection stream.
Overview
AirWarden streams real-time drone detection events over a WebSocket connection, filtered to the service zones assigned to your organization. Each message is a single JSON object describing a detection event, including location, Remote ID (RID) telemetry, and tracking metadata.
There is no polling required — once connected, events matching your organization's zones arrive on the socket as they occur.
Connecting to the Stream
Endpoint
wss://daas.aerodefense.tech/stream
Authentication
Send your API key in an X-Api-Key header on the initial WebSocket
handshake request:
X-Api-Key: <your-api-key>
WebSocket API cannot set custom request headers,
so it cannot send X-Api-Key during the handshake. Connect from a
server-side or Node.js client, or proxy the connection through your own backend
that attaches the header.
Protocol
This is a plain WebSocket endpoint. Any standard
WebSocket client works: a browser WebSocket (once the header
constraint above is handled server-side), Postman's WebSocket request type,
wscat, ws (Node.js), websockets (Python), etc.
Message Format
Every message on the connection is a single JSON object.
-
Detection events are sent as-is, matching the
Event Data Format below. Detection events never
have a
typefield. -
Errors — if your connection is about to be rejected or dropped,
exactly one error message is sent immediately before the socket closes:
{"type": "error", "message": "<reason>"}
Checking for a type field is a safe, reliable way to distinguish an
error message from a real detection event.
Code Examples
Both examples connect, authenticate, and log each incoming detection event.
// Node.js — requires the "ws" package: npm install ws
const WebSocket = require('ws');
// Never hardcode your API key — load it from the environment.
const API_KEY = process.env.AIRWARDEN_API_KEY;
const socket = new WebSocket('wss://daas.aerodefense.tech/stream', {
headers: { 'X-Api-Key': API_KEY },
});
socket.on('open', () => {
console.log('Connected to the AirWarden broadcast stream');
});
socket.on('message', (data) => {
const payload = JSON.parse(data.toString());
if (payload.type === 'error') {
console.error('Stream error:', payload.message);
return;
}
console.log(
`Detection event ${payload.EVENT_ID} — zones: ${payload.SERVICE_LIST.join(', ')}`,
);
});
socket.on('close', (code, reason) => {
console.log('Connection closed:', code, reason.toString());
});
socket.on('error', (err) => {
console.error('Connection error:', err.message);
});
# Python — requires the "websockets" package: pip install websockets
import asyncio
import json
import os
import websockets
# Never hardcode your API key — load it from the environment.
API_KEY = os.environ["AIRWARDEN_API_KEY"]
ENDPOINT = "wss://daas.aerodefense.tech/stream"
async def stream_events():
# Parameter name depends on your "websockets" version:
# "additional_headers" on 14.x+, "extra_headers" on older releases.
async with websockets.connect(
ENDPOINT, additional_headers={"X-Api-Key": API_KEY}
) as ws:
print("Connected to the AirWarden broadcast stream")
async for message in ws:
payload = json.loads(message)
if payload.get("type") == "error":
print(f"Stream error: {payload['message']}")
break
zones = ", ".join(payload["SERVICE_LIST"])
print(f"Detection event {payload['EVENT_ID']} — zones: {zones}")
asyncio.run(stream_events())
AirWarden Essential Broadcast Data Schema
I. Introduction
AirWarden simultaneously detects and tracks multiple targets, broadcasting real-time incident information upon confirmation. Each broadcast includes a continuous tracking event, encompassing the event ID, device ID, location coordinates (latitude, longitude, altitude), and the original Remote ID telemetry.
II. Event Data Format
Overview
| Field Name | Data Type | Description | Example |
|---|---|---|---|
_id | object | Internal ID | "6a79fe3337e17a29681b206a" |
EVENT_ID | string | Unique ID for each drone flight. An event is defined as continuous tracking; if the drone signal is lost for only a few minutes, it remains the same event. If the drone returns after several hours, it is recorded as a new, separate event. | "wXoqheQW" |
INCIDENT_ID | string | Duplicates EVENT_ID | "wXoqheQW" |
SERVICE_LIST | string | A list of unique IDs of the service zones | ["678e755d372a341c9a2d6434"] |
COMPLETE | int | 0 means the event is ongoing, 1 means the event is complete | 1 |
DEVICE_ID | string | The internal system identifier for the device, typically formatted as UAS_ID or falling back to SSID/MAC if UAS_ID is unavailable. | "1581F1633H2T001H0070" |
RAW_DEVICE_ID | string | Raw device identifier sent by sensor | "RID_60601f10d5e9" |
SSID | string | Wireless network name | "RID-1581F5BKD225U00BE556" |
MAC | string | MAC address | "60:60:1f:10:d5:e9" |
WARNING | int | Warning status code | 0 |
DEVICE_TYPE | int | Type of the device, DEPRECATED | 4 |
DURATION | float | Current duration of an event in seconds | 91.64587306976318 |
START_TIME | ISO timestamp | The start time of an event | "2025-01-23T22:29:19.597862+00:00" |
END_TIME | ISO timestamp | The end time of an event | "2025-01-23T22:30:51.243735+00:00" |
UAS_ID | string | The official registered identifier of the drone as broadcast in the Remote ID telemetry. | "1581F1633H2T001H0070" |
UAS_ID_TYPE | string | Type of the UAS ID | "Serial Number (ANSI/CTA-2063-A)" |
UAS_ID_LIST | list | List of UAS IDs | ["1581F5BKD225U00BE556"] |
UAS_ID_RECORDS | list | List of UAS ID records | [{"id": "...", "type": 1, "type_label": "..."}] |
OPERATOR_ID | string | Unique registration ID of the pilot, if provided | |
__ID | string | Internal ID, DEPRECATED | "" |
NODE_LIST | list of string | A list of node IDs that detect the device | ["2ccf6707adb2"] |
H3_LIST | list of string | A list of H3 indexes the device accessed | ["8544e837fffffff"] |
MANUFACTURER | string | Device manufacturer, DEPRECATED | null |
MAX_ALTITUDE | float | Maximum altitude recorded | 56.5 |
MAX_SPEED | float | Maximum speed recorded | 14.5 |
MAKE | string | Manufacturer brand | "DJI" |
MODEL | string | Device model | "M30T" |
INFO.DEVICE_ID | string | Same as DEVICE_ID | "RID_60601f240f99" |
INFO.EVENT_ID | string | Same as INCIDENT_ID | "wXoqheQW" |
INFO.TOPIC | string | Topic of the data | "DETECTION" |
INFO.H3_INDEX | string | H3 index of current GPS point | "8544e837fffffff" |
INFO.H3_LEVEL | int | H3 resolution level | 5 |
INFO.LAT | float | Latitude of the drone | 33.503394 |
INFO.LON | float | Longitude of the drone | -86.797812 |
INFO.SYSTEM_LAT | float | Latitude of the pilot | 33.503394 |
INFO.SYSTEM_LON | float | Longitude of the pilot | -86.797812 |
INFO.ALTITUDE | float | Height above takeoff location or ground level for a UA's current location | 75.5 |
INFO.SPEED | float | Speed of the drone in meters per second | 4.75 |
INFO.VSPEED | float | Vertical speed of the drone in meters per second | 0 |
INFO.HEIGHT_TYPE | int | Height reference type | 0 |
INFO.ANALYSIS | object | Flight analysis data, measures the altitude and distance from target to sensor | {"altitude_diff_m": -19.787, ...} |
INFO.TIME_DELAY | float | Data transmission delay | 0.178536 |
INFO.RAW_DEVICE_ID | string | Raw device ID | "RID_60601f10d5e9" |
INFO.HEADING | int | Drone heading direction | 339 |
INFO.UA_TYPE | int | Aircraft type ID | 2 |
INFO.UA_TYPE_LABEL | string | Aircraft type description | "Helicopter/Multirotor" |
INFO.LOC_STATUS | int | Operational status code | 3 |
INFO.LOC_STATUS_LABEL | string | Status description | "Emergency" |
INFO.OPERATOR_TYPE | string | Operator type | null |
INFO.OPERATOR_TYPE_LABEL | string | Operator type description | null |
INFO.NODE_ID | string | Unique id of the node that detected the data | "2ccf6707adb2" |
INFO.TIME_STAMP | ISO timestamp | Timestamp when the node reported the data | "2026-08-10T16:39:18.003337+00:00" |
INFO.INFO | object | See III. Drone Remote ID Data Example | |
III. Drone Remote ID Data Example
This is an example of broadcast data that contains Drone Remote ID (RID) information:
{
"_id": { "$oid": "6a79fe3337e17a29681b206a" },
"EVENT_ID": "BeRE4iPVMggu",
"SERVICE_LIST": ["6710033d108ae2704b7fb90f"],
"DEVICE_ID": "1581F5BKD225U00BE556",
"RAW_DEVICE_ID": "RID_60601f10d5e9",
"SSID": "RID-1581F5BKD225U00BE556",
"MAC": "60:60:1f:10:d5:e9",
"WARNING": 0,
"UAS_ID": "1581F5BKD225U00BE556",
"UAS_ID_TYPE": "Serial Number (ANSI/CTA-2063-A)",
"UAS_ID_LIST": ["1581F5BKD225U00BE556"],
"UAS_ID_RECORDS": [
{
"id": "1581F5BKD225U00BE556",
"type": 1,
"type_label": "Serial Number (ANSI/CTA-2063-A)"
}
],
"OPERATOR_ID": "",
"__ID": "",
"H3_LIST": ["852a100bfffffff"],
"NODE_LIST": ["2ccf6707b3bd"],
"START_TIME": "2026-08-10T16:37:07.002662+00:00",
"END_TIME": "2026-08-10T16:39:18.003337+00:00",
"DURATION": 131.00067496299744,
"MANUFACTURER": null,
"DEVICE_TYPE": 4,
"COMPLETE": 1,
"MAX_ALTITUDE": 56.5,
"MAX_SPEED": 14.5,
"MAKE": "DJI",
"MODEL": "M30T",
"INFO": {
"EVENT_ID": "BeRE4iPVMggu",
"NODE_ID": "2ccf6707b3bd",
"TOPIC": "DETECTION",
"DEVICE_ID": "1581F5BKD225U00BE556",
"LAT": 40.880783,
"LON": -74.042946,
"H3_INDEX": "852a100bfffffff",
"H3_LEVEL": 5,
"ALTITUDE": 56.5,
"SPEED": 13.75,
"HEIGHT_TYPE": 0,
"TIME_STAMP": "2026-08-10T16:39:18.003337+00:00",
"ANALYSIS": {
"altitude_diff_m": -19.787,
"distance_diff_m": 793.1454555670937
},
"TIME_DELAY": 0.178536,
"RAW_DEVICE_ID": "RID_60601f10d5e9",
"HEADING": 339,
"VSPEED": 0,
"UA_TYPE": 2,
"UA_TYPE_LABEL": "Helicopter/Multirotor",
"LOC_STATUS": 3,
"LOC_STATUS_LABEL": "Emergency",
"OPERATOR_TYPE": null,
"OPERATOR_TYPE_LABEL": null,
"SYSTEM_LAT": 40.885262,
"SYSTEM_LON": -74.045097,
"INFO": {
"radio_type": "wlan",
"frame_time": "Aug 10, 2026 16:39:07.545514 UTC",
"radio_channel": 6,
"radio_frequency": 2437,
"radio_rss": -83,
"radio_bssid": "60:60:1f:10:d5:e9",
"radio_ssid": "RID-1581F5BKD225U00BE556",
"ODID_basicID": [
{ "id": "1581F5BKD225U00BE556", "uaType": 2, "idType": 1 }
],
"ODID_loc_status": 3,
"ODID_loc_direction": 339,
"ODID_loc_speed": 13.75,
"ODID_loc_vspeed": 0,
"ODID_loc_lat": 40.880783,
"ODID_loc_lon": -74.042946,
"ODID_loc_geoAlt": 29,
"ODID_loc_height": 56.5,
"ODID_loc_baroAlt": -1000,
"ODID_loc_heightType": 0,
"ODID_loc_horizAcc": 10,
"ODID_loc_vertAcc": 3,
"ODID_loc_baroAcc": 0,
"ODID_loc_speedAcc": 2,
"ODID_loc_tsAcc": 10,
"ODID_loc_timestamp": 2347.199951,
"ODID_auth": [],
"ODID_system_lat": 40.885262,
"ODID_system_lon": -74.045097,
"ODID_system_geoAlt": 0,
"ODID_system_opLocType": 1,
"ODID_system_classType": 0,
"ODID_system_areaCount": 1,
"ODID_system_areaRadius": 0,
"ODID_system_areaCeiling": -1000,
"ODID_system_areaFloor": -1000,
"ODID_system_categoryEU": 0,
"ODID_system_classEU": 0,
"ODID_system_timestamp": 240079147
}
}
}
Raw RID Data Structure
Fields starting with ODID_ correspond to the data nested within the
INFO.INFO object shown above.
| Field Name | Data Type | Description | Example |
|---|---|---|---|
radio_type | string | Type of the device that broadcasted the signal, either wlan or bluetooth | "wlan" |
frame_time | string | Local time of the broadcasted signal | "Aug 10, 2026 16:39:07.545514 UTC" |
radio_channel | int | Channel of the broadcasted signal | 6 |
radio_frequency | int | Frequency of the broadcasted signal | 2437 |
radio_rss | int | Signal strength in dBm | -83 |
radio_bssid | string | Unique identifier for a specific access point within a wireless network | "60:60:1f:10:d5:e9" |
radio_ssid | string | Name of a wireless network | "RID-1581F5BKD225U00BE556" |
ODID_basicID_id | string | The id field within the ODID_basicID object list. Consists of four options (Serial, Registration, UTM, or Session ID). | "1581F5BKD225U00BE556" |
ODID_basicID_uaType | int | The type of UAS; see Reference #1 | 2 |
ODID_loc_status | int | Operational status of the UA; see Reference #2 | 3 |
ODID_loc_direction | int | Direction of the drone | 339 |
ODID_loc_speed | float | Ground speed of flight | 13.75 |
ODID_loc_vspeed | float | Drone vertical speed | 0 |
ODID_loc_lat | float | The latitude of the drone | 40.880783 |
ODID_loc_lon | float | The longitude of the drone | -74.042946 |
ODID_loc_geoAlt | int | The aircraft distance above or below the ellipsoid | 29 |
ODID_loc_height | float | Height above takeoff location or ground level | 56.5 |
ODID_loc_baroAlt | int | Barometric altitude of the aircraft | -1000 |
ODID_loc_heightType | int | Indicates if height is relative to takeoff or ground level | 0 |
ODID_loc_horizAcc | int | Horizontal position accuracy | 10 |
ODID_loc_vertAcc | int | Vertical position accuracy | 3 |
ODID_loc_baroAcc | int | Barometric altitude accuracy | 0 |
ODID_loc_speedAcc | int | Speed accuracy | 2 |
ODID_loc_tsAcc | int | Timestamp accuracy | 10 |
ODID_loc_timestamp | float | Timestamp of the location report | 2347.199951 |
ODID_auth | list | Authentication data for the drone | [] |
ODID_system_lat | float | The latitude of the pilot | 40.885262 |
ODID_system_lon | float | The longitude of the pilot | -74.045097 |
ODID_system_geoAlt | int | The pilot distance above or below the ellipsoid | 0 |
ODID_system_opLocType | int | Indicates if system location is takeoff, fixed, or dynamic; see Reference #3 | 1 |
ODID_system_classType | int | UAS class type definition | 0 |
ODID_system_areaCount | int | Number of defined operational areas | 1 |
ODID_system_areaRadius | int | Radius of the operational area | 0 |
ODID_system_areaCeiling | float | Maximum altitude of the area | -1000 |
ODID_system_areaFloor | float | Minimum altitude of the area | -1000 |
ODID_system_categoryEU | int | EU regulation category | 0 |
ODID_system_classEU | int | EU regulation class | 0 |
ODID_system_timestamp | int | Timestamp of the system report | 240079147 |
References
Reference #1 — ODID_basicID_uaType
| Value | Meaning |
|---|---|
| 0 | None/Not Declared |
| 1 | Aeroplane |
| 2 | Helicopter/Multirotor |
| 3 | Gyroplane |
| 4 | Hybrid Lift (Fixed wing that can take off vertically) |
| 5 | Ornithopter |
| 6 | Glider |
| 7 | Kite |
| 8 | Free Balloon |
| 9 | Captive Balloon |
| 10 | Airship (such as a blimp) |
| 11 | Free Fall/Parachute (unpowered) |
| 12 | Rocket |
| 13 | Tethered Powered Aircraft |
| 14 | Ground Obstacles |
| 15 | Other |
Reference #2 — ODID_loc_status
| Value | Meaning |
|---|---|
| 0 | Undeclared |
| 1 | Ground |
| 2 | Airborne |
| 3 | Emergency |
| 4 | Remote ID System Failure |
| 5–14 | Reserved |
Reference #3 — ODID_operator_type
| Value | Meaning |
|---|---|
| 0 | Takeoff |
| 1 | Dynamic |
| 2 | Fixed |
Need Help?
If you have questions about connecting to the AirWarden® Essentials API or need assistance with your integration, contact our support team at help@aerodefense.tech.