AeroDefense — Scalable Drone Detection

AeroDefense API

Bring Real-Time Drone Detection Data Into Your Existing Systems

AirWarden® Essentials provides real-time visibility into drone activity, including drone and pilot/controller locations. Through the AeroDefense API, organizations can bring AirWarden® Essentials detection data into the platforms and workflows their teams already use.

Whether you’re exploring AirWarden® Essentials or ready to connect your existing deployment, use the documentation below to learn more about the available data and get started with your integration.

API Reference

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>
Browser clients cannot authenticate this way A browser's native 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 type field.
  • 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 NameData TypeDescriptionExample
_idobjectInternal ID"6a79fe3337e17a29681b206a"
EVENT_IDstringUnique 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_IDstringDuplicates EVENT_ID"wXoqheQW"
SERVICE_LISTstringA list of unique IDs of the service zones["678e755d372a341c9a2d6434"]
COMPLETEint0 means the event is ongoing, 1 means the event is complete1
DEVICE_IDstringThe 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_IDstringRaw device identifier sent by sensor"RID_60601f10d5e9"
SSIDstringWireless network name"RID-1581F5BKD225U00BE556"
MACstringMAC address"60:60:1f:10:d5:e9"
WARNINGintWarning status code0
DEVICE_TYPEintType of the device, DEPRECATED4
DURATIONfloatCurrent duration of an event in seconds91.64587306976318
START_TIMEISO timestampThe start time of an event"2025-01-23T22:29:19.597862+00:00"
END_TIMEISO timestampThe end time of an event"2025-01-23T22:30:51.243735+00:00"
UAS_IDstringThe official registered identifier of the drone as broadcast in the Remote ID telemetry."1581F1633H2T001H0070"
UAS_ID_TYPEstringType of the UAS ID"Serial Number (ANSI/CTA-2063-A)"
UAS_ID_LISTlistList of UAS IDs["1581F5BKD225U00BE556"]
UAS_ID_RECORDSlistList of UAS ID records[{"id": "...", "type": 1, "type_label": "..."}]
OPERATOR_IDstringUnique registration ID of the pilot, if provided 
__IDstringInternal ID, DEPRECATED""
NODE_LISTlist of stringA list of node IDs that detect the device["2ccf6707adb2"]
H3_LISTlist of stringA list of H3 indexes the device accessed["8544e837fffffff"]
MANUFACTURERstringDevice manufacturer, DEPRECATEDnull
MAX_ALTITUDEfloatMaximum altitude recorded56.5
MAX_SPEEDfloatMaximum speed recorded14.5
MAKEstringManufacturer brand"DJI"
MODELstringDevice model"M30T"
INFO.DEVICE_IDstringSame as DEVICE_ID"RID_60601f240f99"
INFO.EVENT_IDstringSame as INCIDENT_ID"wXoqheQW"
INFO.TOPICstringTopic of the data"DETECTION"
INFO.H3_INDEXstringH3 index of current GPS point"8544e837fffffff"
INFO.H3_LEVELintH3 resolution level5
INFO.LATfloatLatitude of the drone33.503394
INFO.LONfloatLongitude of the drone-86.797812
INFO.SYSTEM_LATfloatLatitude of the pilot33.503394
INFO.SYSTEM_LONfloatLongitude of the pilot-86.797812
INFO.ALTITUDEfloatHeight above takeoff location or ground level for a UA's current location75.5
INFO.SPEEDfloatSpeed of the drone in meters per second4.75
INFO.VSPEEDfloatVertical speed of the drone in meters per second0
INFO.HEIGHT_TYPEintHeight reference type0
INFO.ANALYSISobjectFlight analysis data, measures the altitude and distance from target to sensor{"altitude_diff_m": -19.787, ...}
INFO.TIME_DELAYfloatData transmission delay0.178536
INFO.RAW_DEVICE_IDstringRaw device ID"RID_60601f10d5e9"
INFO.HEADINGintDrone heading direction339
INFO.UA_TYPEintAircraft type ID2
INFO.UA_TYPE_LABELstringAircraft type description"Helicopter/Multirotor"
INFO.LOC_STATUSintOperational status code3
INFO.LOC_STATUS_LABELstringStatus description"Emergency"
INFO.OPERATOR_TYPEstringOperator typenull
INFO.OPERATOR_TYPE_LABELstringOperator type descriptionnull
INFO.NODE_IDstringUnique id of the node that detected the data"2ccf6707adb2"
INFO.TIME_STAMPISO timestampTimestamp when the node reported the data"2026-08-10T16:39:18.003337+00:00"
INFO.INFOobjectSee 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 NameData TypeDescriptionExample
radio_typestringType of the device that broadcasted the signal, either wlan or bluetooth"wlan"
frame_timestringLocal time of the broadcasted signal"Aug 10, 2026 16:39:07.545514 UTC"
radio_channelintChannel of the broadcasted signal6
radio_frequencyintFrequency of the broadcasted signal2437
radio_rssintSignal strength in dBm-83
radio_bssidstringUnique identifier for a specific access point within a wireless network"60:60:1f:10:d5:e9"
radio_ssidstringName of a wireless network"RID-1581F5BKD225U00BE556"
ODID_basicID_idstringThe id field within the ODID_basicID object list. Consists of four options (Serial, Registration, UTM, or Session ID)."1581F5BKD225U00BE556"
ODID_basicID_uaTypeintThe type of UAS; see Reference #12
ODID_loc_statusintOperational status of the UA; see Reference #23
ODID_loc_directionintDirection of the drone339
ODID_loc_speedfloatGround speed of flight13.75
ODID_loc_vspeedfloatDrone vertical speed0
ODID_loc_latfloatThe latitude of the drone40.880783
ODID_loc_lonfloatThe longitude of the drone-74.042946
ODID_loc_geoAltintThe aircraft distance above or below the ellipsoid29
ODID_loc_heightfloatHeight above takeoff location or ground level56.5
ODID_loc_baroAltintBarometric altitude of the aircraft-1000
ODID_loc_heightTypeintIndicates if height is relative to takeoff or ground level0
ODID_loc_horizAccintHorizontal position accuracy10
ODID_loc_vertAccintVertical position accuracy3
ODID_loc_baroAccintBarometric altitude accuracy0
ODID_loc_speedAccintSpeed accuracy2
ODID_loc_tsAccintTimestamp accuracy10
ODID_loc_timestampfloatTimestamp of the location report2347.199951
ODID_authlistAuthentication data for the drone[]
ODID_system_latfloatThe latitude of the pilot40.885262
ODID_system_lonfloatThe longitude of the pilot-74.045097
ODID_system_geoAltintThe pilot distance above or below the ellipsoid0
ODID_system_opLocTypeintIndicates if system location is takeoff, fixed, or dynamic; see Reference #31
ODID_system_classTypeintUAS class type definition0
ODID_system_areaCountintNumber of defined operational areas1
ODID_system_areaRadiusintRadius of the operational area0
ODID_system_areaCeilingfloatMaximum altitude of the area-1000
ODID_system_areaFloorfloatMinimum altitude of the area-1000
ODID_system_categoryEUintEU regulation category0
ODID_system_classEUintEU regulation class0
ODID_system_timestampintTimestamp of the system report240079147

References

Reference #1 — ODID_basicID_uaType

ValueMeaning
0None/Not Declared
1Aeroplane
2Helicopter/Multirotor
3Gyroplane
4Hybrid Lift (Fixed wing that can take off vertically)
5Ornithopter
6Glider
7Kite
8Free Balloon
9Captive Balloon
10Airship (such as a blimp)
11Free Fall/Parachute (unpowered)
12Rocket
13Tethered Powered Aircraft
14Ground Obstacles
15Other

Reference #2 — ODID_loc_status

ValueMeaning
0Undeclared
1Ground
2Airborne
3Emergency
4Remote ID System Failure
5–14Reserved

Reference #3 — ODID_operator_type

ValueMeaning
0Takeoff
1Dynamic
2Fixed

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.