Overview
When Live Telemetry is enabled, telemetry data for in-flight vehicles will be available via a Skydio External API websocket. Live Telemetry can be enabled by going to Settings > Live Streaming > Live APIs > Toggle on Live Telemetry:

This requires either a vehicle or controller with an active internet connection. Once Live Telemetry has been enabled, websocket URLs with the following structure will be available for vehicles in your organization by going to Settings > Devices > Vehicles > Select a drone > Connectivity:

Live Telemetry Websocket URL
Websocket clients that do not support headers can authenticate by providing an API Token via the
tokenquery parameter.
wss://stream.skydio.com/data/<skydio_serial>
The websocket will become active in the following scenarios:
- Remote Operations: whenever the vehicle enters prep, either for a manual flight or mission execution, its stream will start. The stream will continue for the remainder of the flight.
- Standard flights (not remote operations): whenever a live stream is started by the pilot, until the pilot ends it.
Webhooks are available for the vehicle's flight phase, and can be used to determine when the Live Telemetry websocket is available. The websocket will close gracefully by sending a websocket close control message with the text "data stream has not started" if the stream has not started yet.
A demo stream is also always available for testing purposes, and can be accessed without an API token:
Note that Skydio websocket URLs are case-sensitive, and vary depending on your region. URLs can be found on the Vehicle Page -> Settings -> Streaming.
wscat -c wss://stream.skydio-dev.com/data/demo
Request Parameters
| name | type | required | description |
|---|---|---|---|
| token | string | false | Skydio API token. Websocket clients that do not support headers can authenticate by providing the token via this query parameter. |
| skydioSerials | string | false | Comma-separated list of Skydio Serials. See Multi-Drone Connection Example below. |
| markerInfo | boolean | false | For DFR customers. If true, the event JSON object will include information about the markers that the vehicle has responded to during the current flight, ordered by response time. See Event Information below. |
Connection Example
Skydio Live Telemetry can be consumed using off-the-shelf websocket tooling. For example, a simple utility like wscat can be used. The following is an example of viewing the Live Telemetry for an X2 with serial SkydioX2-xxxx using wscat:
wscat -c "wss://stream.skydio.com/data/SkydioX2-xxxx?token=<api_token_secret>"To generate an API token, go to Settings > API Tokens > Generate Token. Give your token a name and ensure it has read-only access to Live Telemetry. Upon clicking "Generate", you will be presented the API Token Secret.
⚠️ Treat your API Token Secret like a password. Do not share it or expose it in public repositories.

Multi-Drone Connection Example
The websocket endpoint supports consuming data from multiple drones at once. The following is an example of viewing Live Telemetry for two X10s, one with the serial SkydioX10-xxxx and the other with the serial SkydioX10-yyyy.
wscat -c "wss://stream.skydio.com/data?skydioSerials=SkydioX10-xxxx,SkydioX10-yyyy&token=<api_token_secret>"The drones must be part of the same organization that the API token corresponds to. The websocket will return data as long as one drone is producing telemetry.
In Code
API Example RepoView sample code for connecting to vehicle's websocket in our API Example Repo.
Event Information
Vehicle and device orientation is only available on X10 vehicles, and vehicles in organizations using docks/remote operations on release 10 or later. This feature will be available on all vehicles in the next version update.
This websocket will publish the requested vehicle's status at approximately 5Hz, subject to the network conditions of the vehicle whose telemetry data is being requested. Events are JSON objects with the following structure:
{
"type": "status", // the type of the message; will always be "status"
"tm": 1687660762176, // unix time the included fields were recorded on the device (ms)
// basic device information
"serial": "Skydio2-xxx", // the Skydio serial of the device
"rssi": -58, // the received signal strength indicator of the device
"battery": 0.95, // battery percentage
"pilot": "[email protected]", // current pilot's email
"nickname": "My Skydio", // the nickname assigned to the device
// position and speed
"speed": 0.024186773, // speed of the device in m/s
"alt_above_launch": 45.2, // Altitude above launch point in m
"alt_msl": 61.9, // GPS altitude in mean sea level (msl) in m
"alt_agl": 60.4, // Altitude above ground level (agl) in m; omitted if unavailable. See Altitude below.
"lat": 37.627006, // GPS latitude
"lon": -122.1077802, // GPS longitude
"gps_satellites_used": 10, // number of satellites used for GPS
// device orientation in the East, North, Up (ENU) coordinate system
"roll": 0.0, // device roll in rad
"pitch": 0.0, // device pitch in rad
"yaw": 0.0, // device yaw (heading) in rad
// absolute gimbal orientation in the East, North, Up (ENU) coordinate system.
// this orientation is not relative to the device body.
"gimbal_roll": 0.0, // gimbal roll in rad
"gimbal_pitch": 0.0, // gimbal pitch in rad
"gimbal_yaw": 0.0, // gimbal yaw (heading) in rad
// where the color camera's view meets the ground; omitted if it can't be computed.
// See Camera Projections below.
"camera_projections": {
"center": { // point on the ground at the center of the image
"latitude": 37.627006, // latitude in degrees
"longitude": -122.107095, // longitude in degrees
"altitude_msl": 1.6 // altitude of the ground at this point in mean sea level (msl) in m
},
// points on the ground at the corners of the image, in the same format as "center";
// each is omitted if it doesn't meet the ground
"top_left": { "latitude": 37.6281199, "longitude": -122.1058912, "altitude_msl": 1.4 },
"top_right": { "latitude": 37.6258921, "longitude": -122.1059027, "altitude_msl": 1.8 },
"bottom_left": { "latitude": 37.6274102, "longitude": -122.1075281, "altitude_msl": 1.5 },
"bottom_right": { "latitude": 37.6266018, "longitude": -122.1075334, "altitude_msl": 1.7 }
},
// where the thermal camera's view meets the ground, in the same format as camera_projections;
// omitted if it can't be computed
"ir_camera_projections": {
"center": { "latitude": 37.627006, "longitude": -122.107095, "altitude_msl": 1.6 },
"top_left": { "latitude": 37.6276043, "longitude": -122.1063088, "altitude_msl": 1.5 },
"top_right": { "latitude": 37.6264077, "longitude": -122.1063131, "altitude_msl": 1.7 },
"bottom_left": { "latitude": 37.6272854, "longitude": -122.1074589, "altitude_msl": 1.5 },
"bottom_right": { "latitude": 37.6267266, "longitude": -122.1074617, "altitude_msl": 1.7 }
},
// mission status; omitted if no mission is being run
"mission": {
"state": "VEHICLE_PREP", // state of the mission
"name": "Skydio Sample Mission", // name of the mission
"waypoint_index": -1, // most recently completed waypoint index (-1 means mission has not started)
"total_waypoints": 2, // total waypoints in the mission
"remaining_time_estimate": 0, // remaining time estimate in s
"remaining_distance_estimate": 0 // remaining distance estimate in m
},
// marker info; included when markerInfo=true and the vehicle has responded to markers during the
// current flight
"markers": [
{
"uuid": "0146c122-d11f-4985-ade9-298fbdc2e2f1", // UUID of the marker
"incident_id": "INC-001" // omitted if not set
},
{
"uuid": "9016ec51-cef0-4be3-9641-614598496990",
"incident_id": "INC-002"
}
],
// live video streams published by the device for this flight
// always present with one entry per stream type ("color", "thermal"), in that order
"streams": [
{
"name": "color", // stream type: "color" or "thermal"
"live": true, // whether this stream is currently being published
"rtsp_url": "rtsp://stream.skydio.com/SkydioX10-xxxx/color" // RTSP URL to connect
},
{
"name": "thermal",
"live": false,
"rtsp_url": "rtsp://stream.skydio.com/SkydioX10-xxxx/thermal"
}
]
}
Possible values for mission state:
IDLE: Mission runner is up and running, and ready to receive a mission.VEHICLE_PREP: Vehicle is preparing based on mission parametersREADY: Ready to execute a mission.IN_PROGRESS: A mission is running.RETURNING_TO_FLIGHT_PATH: The mission is returning to the flight path before resuming.PAUSED: The mission has is paused.COMPLETED: The mission has completed.LOW_BATTERY_RETURN: Low battery encountered, mission is aborting and returning to home.ABORTED: The mission has been aborted.ERROR: An error occurred during mission execution.POST_MISSION_ACTION: Post mission actions are being run.POST_MISSION_TASK: Post mission tasks are being run.
Altitude
Each status message reports the device's altitude in three ways, all in meters:
alt_above_launch: Height above the point the device took off from. For docked vehicles, this is the height above the dock.alt_agl: Height above ground level (AGL) at the device's current position, computed on the device from terrain elevation data. Omitted when terrain data is not available.alt_msl: Altitude above mean sea level (MSL).
alt_above_launch and alt_agl differ whenever the ground below the device is higher or lower than the launch point, such as when the device launches from a rooftop dock or flies over hills. For example, a device that launched from a dock on a 15 m tall building and is hovering 45 m above the dock over flat ground reports an alt_above_launch of about 45 and an alt_agl of about 60. To show height above the ground, use alt_agl, and fall back to alt_above_launch when alt_agl is not present. Terrain elevation data may not reflect structures such as buildings.
Camera Projections
camera_projections describes where the color camera's view meets the ground. center is the point on the ground at the center of the image, and top_left, top_right, bottom_left, and bottom_right are the points on the ground at the corners of the image, which together outline the camera's field of view (frustum) on the ground. Each point has a latitude and longitude in degrees and an altitude_msl in meters, which is the altitude of the ground at that point above mean sea level. ir_camera_projections uses the same format for the thermal camera.
The device computes projections by intersecting the camera's view with terrain elevation data. They are only available if the device has terrain data and is flying, and may be unavailable in some camera and flight modes. A point is omitted when its line of sight doesn't meet the ground within range, such as the top corners when the camera is pointed near the horizon. camera_projections or ir_camera_projections is omitted entirely when none of its points can be computed, or when its most recent projection is more than 5 seconds older than tm.
Projections are delivered with telemetry rather than embedded in the video, so they are not synchronized frame-by-frame with the RTSP stream.
Live Video Streams
The streams field reports the device's live video streams and how to connect to them over
RTSP. It is always present in a status message as an array with one object per stream type,
in a fixed order: color first, then thermal.
Debugging
If you are receiving an Unexpected server response, curl the endpoint to see more information.
curl "https://stream.skydio.com/data/SkydioX10-xxxx"
Provided IDs could not be resolved: [data/SkydioX10-xxxx]. Please ensure your device is online and streaming is enabled