Under active development. Breaking changes expected. APIs, installers, and UI may shift between releases.
Build on the agent.
Usable today. Early access — some pieces run behind a feature flag and APIs may shift between releases.
REST API
Eight endpoints, full control.
The control surface binds port 8080. Responses are JSON. Every request carries an X-ADOS-Key header.
/api/status/api/telemetry/api/params/api/commands/api/config/api/config/api/services/api/logsTRANSPORTS
Ports and topics.
The agent exposes local ports for direct integration and MQTT topics for the optional cloud relay. Every transport speaks the same underlying MAVLink.
- REST control surface
- :8080
- MAVLink WebSocket relay
- :8765
- WebRTC video (WHEP)
- :8889
- Cloud MAVLink uplink
- ados/{id}/mavlink/tx
- Cloud MAVLink downlink
- ados/{id}/mavlink/rx
- Cloud WebRTC signaling
- ados/{id}/webrtc/offer
EXAMPLES
Quick start.
curl -s http://<board-ip>:8080/api/telemetry \
-H "X-ADOS-Key: <your-key>" | jq
{
"armed": true,
"mode": "GUIDED",
"battery": { "voltage": 22.4, "pct": 78 },
"gps": { "fix": 3, "satellites": 14, "alt": 50.2 },
"attitude": { "roll": 0.02, "pitch": -0.01, "yaw": 182.5 }
}import httpx
BASE = "http://<board-ip>:8080"
headers = {"X-ADOS-Key": "<your-key>"}
telem = httpx.get(f"{BASE}/api/telemetry", headers=headers).json()
print(telem["battery"]["pct"], telem["gps"]["satellites"])
httpx.post(
f"{BASE}/api/commands",
headers=headers,
json={"command": "takeoff", "params": {"alt": 10}},
)WEBSOCKET
Raw MAVLink relay.
The relay on port 8765 forwards raw MAVLink v2 between the flight controller and any number of consumers. Wire-compatible with the ArduPilot SITL WebSocket bridge.
- ✓Bidirectional: read telemetry and send commands
- ✓Raw binary MAVLink v2 frames, no JSON wrapping
- ✓Multi-consumer: many clients connect at once
- ✓Wire-compatible with the ArduPilot SITL bridge
- ✓Sub-5 ms latency on the local network
const ws = new WebSocket("ws://<board-ip>:8765");
ws.binaryType = "arraybuffer";
// inbound: raw MAVLink v2 frames from the flight controller
ws.onmessage = (e) => decodeMavlink(new Uint8Array(e.data));
// outbound: send a frame straight to the FC
ws.send(encodeCommandLong(sysid, compid, cmd, params));PYTHON SDK
ados.sdk
The SDK is for plugin and driver authors. It ships with the agent and exposes stable base classes for hardware drivers, the on-vehicle vision bus, and a plugin test harness.
CameraDriverCamera drivers over CSI, USB UVC, IP, and vendor SDKs
GimbalDriverGimbal drivers with pan, tilt, and roll control
LidarDriverLiDAR and rangefinder drivers
GpsDriverGPS and GNSS receiver drivers
EscDriverESC drivers with telemetry feedback
VisionClientRead frames and detections from the on-vehicle vision bus
SECURITY
API-key authentication.
Every request carries a key in the X-ADOS-Key header. Keys hold a permission level that bounds what they can do.
readTelemetry, status, config, logs, params. No state changes.commandSend flight commands: takeoff, land, goto. Requires read.missionUpload and execute mission files. Requires command.configModify agent and FC configuration. Requires read.adminFull access: updates, service restart, key management.MESSAGE INTEGRITY
MAVLink frame signing.
Signing is managed from the ground station. The agent exposes a small REST surface for capability detection and one-shot enrollment. The agent holds no key material.
When MAVLink v2 signing is enabled for a drone, every outbound frame carries an HMAC-SHA256 tag derived from a 32-byte key the browser generated. The flight controller validates each frame and drops anything that does not match once signing is required.
The key is pushed to the flight controller exactly once, over the authenticated REST channel. After that the agent is a transparent pipe for signed frames and knows nothing about the key. Your browser holds it as a non-extractable Web Crypto key, so a compromised companion computer cannot forge commands.
GET /api/mavlink/signing/capability
X-ADOS-Key: <your-key>
{
"supported": true,
"reason": "ok",
"firmware_name": "ArduPilot",
"firmware_version": "4.5.0",
"signing_params_present": true
}RELATED
Extend the agent.
Read the full API reference.
Complete endpoints, the WebSocket protocol, and the SDK documentation on GitHub.
View on GitHub