Welcome to the Developers section of the Dronetag Help Website.
This area is dedicated to providing you with the developer resources and technical guidance. Here, you can access detailed API documentation, which will help you establish connections with our Remote ID solutions.
In addition to the APIs, you'll find guidelines, best practices, and other supporting information that are essential for building reliable integrations. Whether you're working on connecting our products to your existing platforms or experimenting with new ideas, this section offers the tools and knowledge base to support your development efforts.
Dive in to explore how Dronetag can fit into your systems and unlock new possibilities.
Using our API is subject to our Terms of Service.
Dronetag provides several integration options to allow access to data from our devices, focusing primarily on Remote ID data. This guide will help you choose the most suitable method for integrating Dronetag into your systems, whether you are working with UTM platforms or building custom solutions.
If you prefer to work with established platforms, Dronetag supports several ready-made integrations:
The integrations currently implemented by Dronetag include:
| Integration | What it is used for | Access method |
|---|---|---|
| Aloft | Sharing Dronetag telemetry with Aloft services. | Dronetag App integration |
| SafeSky | Making Dronetag flights visible in SafeSky. | Dronetag App integration or Data Push |
| InterUSS | Exchanging flight data with U-Space / UTM systems through InterUSS services. | Platform integration |
| TAK Server | Streaming Remote ID data to TAK-compatible systems. | Data Push using Cursor on Target (CoT) XML |
| SAPIENT | Sending Remote ID telemetry as SAPIENT detection reports. | Data Push |
Data Push can also deliver Dronetag's own formats, including DUMP JSON, DUMP JSON Typed, and Dronetag Legacy JSON. These are useful when you are building a custom integration instead of connecting to one of the platforms listed above. See Protocols and Formats for recommended combinations.
For custom solutions or new integrations, we provide multiple options for building the integrations:
If you're unsure which integration method is right for you, check out our guide on Choosing the Right Integration Method for more information and guidance.
Integrating via our API provides a straightforward way to exchange information programmatically with third-party systems or services. We offer two primary methods to facilitate this integration.
By pulling data from our API, you can easily retrieve up-to-date information as needed. We provide an HTTP REST API for standard requests, as well as Socket.io for real-time data access. This method is ideal for server-client integrations, personal scripts, and other applications.
For a more permanent approach, you can set up a data flow that allows our systems to push real-time traffic directly to your API as soon as it arrives on our servers. This method ensures continuous updates without the need for constant requests, making it an excellent choice for server-to-server integrations.
Our cloud platform supports InterUSS services, enabling the exchange of flight data with distributed UTM systems. If your system already implements the InterUSS protocol, it is likely capable of exchanging data with our platform, ensuring a smooth integration process.
Due to limited demand, Dronetag currently offers only a subset of InterUSS services, and development of full compatibility is on hold. We are seeking partners interested in utilizing the InterUSS network for flight data exchange and are open to resuming development for collaborative projects.
If you're interested in exploring this integration further, please contact us to discuss potential collaboration.
Operating within the same Distributed Situational Awareness (DSS) instance as our system facilitates seamless data exchange between both platforms, enhancing operational coordination.
To learn more, visit the InterUSS Platform Official Website.
Currently Supported Services:
If you need to integrate our hardware directly without relying on cloud services, there are several options available to achieve this.
This section is a work in progress.
Some of our products are specifically designed for integration with existing systems. For detailed instructions, please refer to the user manuals for each product:
All Dronetag devices utilize standard Remote ID data formats that comply with the FAA's Remote Identification of Unmanned Aircraft Systems (UAS) rule and the ASTM F3411-22 standard, ensuring seamless interoperability and regulatory compliance.
If you're interested in receiving Remote ID data directly via Bluetooth, you can create your own Remote ID application to decode the signals transmitted by our devices according to the standard.
Please note that we do not provide an SDK for Remote ID decoding or documentation for our proprietary Bluetooth characteristics. If you have a specific project you’d like to discuss with us, please don’t hesitate to contact us for further assistance.
The REST API is best for retrieving absolute current & historical telemetry data, accessing account data such as assets, devices, aircraft and more. Because you need to request data manually, it's not very suitable for real-time data streaming. For real-time data, we recommend looking at using our Socket.io endpoints.
To access our API, you’ll need to authenticate. There are two ways to do this:
Once you have your credentials, you’re ready to start using the API. We recommend familiarizing yourself with the API documentation, which outlines all available endpoints and the data structures you’ll be working with.
Our API uses a variety of data schemas, each designed for a specific API resource. One of them is used more consistently across our services, and that is the Dronetag Unified Message Protocol (DUMP) format. If you're dealing with Remote ID data, this protocol will be particularly important to understand.
To help you better understand, we've created a detailed guide that breaks down the structure of DUMP messages and explains how to work with them effectively:
Keep in mind that when making telemetry requests to our airspace endpoints (/v2/airspace/*), you must specify both a time range (from and to) and a geographical region (bbox).
There are a few exceptions to this requirement:
operation_id, no other parameters are needed.uas_id, you can omit the bbox geographical region, but the time range is still required.Please note that the bbox size is limited and intended for moderately sized regions. It is not possible to use bbox to cover large areas such as entire countries, continents, or the world.
If this condition poses a challenge, we recommend exploring our data push methods.
We offer several other guides to help you navigate common use cases with our API. Whether you’re looking to retrieve current airspace information or historical data, these resources will give you the tools you need:
Explore more guides through the left sidebar to enhance your API usage.
The Socket.io API is designed for real-time telemetry data streaming, offering only live telemetry updates (no historical or absolute data). This guide will walk you through setting up a real-time connection between Dronetag and your application using Socket.io.
To establish a connection, use the following configuration parameters in your Socket.io client:
https://api.dronetag.app/v2/airspace/socket.ioBe careful with your configuration—ensure that the host is set to the domain only (https://api.dronetag.app) and that the path is specified separately. Confusing these two can result in connection errors.
Socket.io is supported by many libraries across various programming languages. You can find the full list of supported client implementations here.
You can authenticate your Socket.io session using the same access token that you use for REST API requests. Refer to the API credentials guide for details on obtaining your access token.
The authentication section linked above mentions two possible types of API authentication: Personal Access Tokens (PAT) and OpenID Connect (OIDC). For Socket.io, the PAT option will not work correctly, so only use OIDC tokens when working with Socket.io.
For clients that support native Socket.io authentication, you can pass the access token directly in the auth configuration option.
let socket = io("https://api.dronetag.app", {
path: "/v2/airspace/socket.io",
auth: "eyJhbGciOiJSUzI1NiIsInR5c...",
});
More information on using Socket.io authentication can be found in the Socket.io documentation.
If your client does not support the auth option, you can send the access token as an Authorization header in the handshake request:
let socket = io("https://api.dronetag.app", {
path: "/v2/airspace/socket.io",
extraHeaders: { Authorization: "Bearer eyJhbGciOiJSUzI1NiIsInR5c..." }
});
This approach is also handy when using tools like Postman for testing, which typically don’t support native authentication. You can simply add the Authorization header in the Headers tab of Postman.
Once connected, you can listen for several types of telemetry events:
telemetry_ua – Unmanned Aircraft telemetrytelemetry_operator – Operator telemetrytelemetry_system – System telemetryoperation – Updates on ongoing operationsFor the most up-to-date and comprehensive list of available events, refer to our AsyncAPI documentation.
Just as with the REST API, you must specify the geographical region your application is interested in. For more details, see the conditions for REST API telemetry requests.
After connecting, your client must send an initial viewport event to define the geographical area it wants to monitor. Additionally, the client must update this area by sending new viewport events whenever the region of interest changes. If you don't set a viewport, your session won't receive any telemetry data.
For example, in Dronetag’s own applications, the map moves dynamically based on user interactions. After establishing a connection, the app sends the initial viewport, and as the user moves the map, the viewport is updated. It's important to debounce these updates to prevent rapid viewport changes, which could lead to the server disconnecting your clients.
Always set your viewport carefully. It is important to cover the whole area of your interest. On the other hand, do not set viewports too large, as it could provide data you do not want and also cause performance issues. It is recommended to add a sufficient margin of a few kilometers (or miles, if you wish) on each side. The maximal supported viewport area is around 6 million square kilometers, but try avoiding such extreme values.
For example, to set the viewport to Prague, you may use something like emit("viewport", "14,49.9,15,50.3").
Below are some quick examples to help you get started with Socket.io in different programming languages:
const { io } = require('socket.io-client');
const socket = io('https://api.dronetag.app', {
path: '/v2/airspace/socket.io',
auth: 'eyJhbGciOiJSUzI1NiIsInR5c...'
});
socket.on('connect', () => {
socket.emit('viewport', viewportRectangle.getBounds().toBBoxString());
});
socket.on('telemetry_ua', (data) => {
console.log('UA telemetry received:', data);
});
import socketio
sio = socketio.Client()
@sio.event
def connect():
sio.emit('viewport', viewportRectangle.get_bounds().to_bbox_string())
@sio.event
def telemetry_ua(data):
print(f'UA telemetry received: {data}')
sio.connect(
'https://api.dronetag.app',
socketio_path='/v2/airspace/socket.io',
auth='eyJhbGciOiJSUzI1NiIsInR5c...'
)
sio.wait()
Here, you will learn how to authenticate your requests to access resources available on Dronetag accounts.
We offer two authentication methods: Personal Access Tokens (PATs) and OpenID Connect. Each method serves different use cases, so please read on to determine which is best suited for your project.
If you plan to work with personal data from your own Dronetag account, such as post-processing data, creating a personal command-line interface (CLI) tool, or integrating data into other software, Personal Access Tokens (PATs) are available for easy and straightforward access to the API.
These tokens provide a simple to use, although less secure, method for accessing your resources via our API services. For more robust integrations intended for public access, we recommend considering the OpenID Connect method instead.
Personal Access Tokens provide full access to your account's resources. Please ensure you store these tokens securely and avoid sharing them inadvertently (e.g., by posting them online).
For enhanced security, PATs have a maximum validity of 90 days.
Personal Access Tokens are still in experimental phase, please let us know if you encounter any issues while using them.
Here you can create a new token by clicking the Create token button.
If you need to create a Personal Access Token programmatically, you can do so by sending a POST request to the /v2/pats/tokens endpoint. However, you must first further authenticate your request using an access token obtained from the OpenID Connect flow.
Sending a POST request with your account password is required to make this request — this password is not stored, it's only used for authorizing the token issue process.
{
"password": "hunter2",
"expires_at": "2025-09-09"
}
After you issue a new Personal Access Token, be sure to store this token securely. You won't be able to retrieve this token again.
You can now use the token in X-Personal-Access-Token HTTP header when making requests.
You can use Personal Access Tokens only for HTTP requests. Authenticating Websockets is not possible with PATs.
POST /v2/airspace/telemetry/ua HTTP/1.1
Host: api.dronetag.app
Accept: */*
X-Personal-Access-Token: 4c5250130bbce349.b0dc901facd944e999b32ebf984c5250130bbce349b0dc901facd944e999b32e
By implementing Sign in with Dronetag, you can allow users to access their data through your application. This method is more reliable and offers a standardized approach to authentication.
Our implementation is based on OpenID Connect (which should not be confused with OpenID). OIDC allows you to leverage existing libraries and may already be supported by your application. Learn more on the OpenID Foundation website.
To utilize OIDC in your application, you will need your own client ID and secret. If you have not yet received these credentials, please contact us for assistance.
We recommend exploring the certified OpenID Connect implementations to choose the best library for your project.
If your OIDC client supports it, you can utilize the OpenID configuration JSON available at:
https://auth.dronetag.app/realms/dcp/.well-known/openid-configuration
Alternatively, you can manually configure your OIDC client using the following endpoints:
| Item | URL |
|---|---|
| Authorization Endpoint | https://auth.dronetag.app/realms/dcp/protocol/openid-connect/auth |
| Token Endpoint | https://auth.dronetag.app/realms/dcp/protocol/openid-connect/token |
| User Info Endpoint | https://auth.dronetag.app/realms/dcp/protocol/openid-connect/userinfo |
| Client ID | Provided to your application |
| Client Secret | Provided to your application |
If you do not wish to use an OIDC library, you can manually request tokens using an HTTP request.
https://auth.dronetag.app/realms/dcp/protocol/openid-connect/token
Send the following parameters in the request body:
grant_type: passwordclient_id: Your client IDclient_secret: Your client secretusername: Dronetag user account e-mailpassword: Dronetag user account passwordcurl -X POST "https://auth.dronetag.app/realms/dcp/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=password" \
-d "client_id=<your-client-id>" \
-d "client_secret=<your-client-secret>" \
-d "username=<your-username>" \
-d "password=<your-password>"
If successful, you will receive a JSON response containing the following:
{
"access_token": "eyJhbGc...",
"expires_in": 1200,
"refresh_expires_in": 604800,
"refresh_token": "eyJhbGc...",
"token_type": "Bearer",
"not-before-policy": 0,
"session_state": "35d764ee-c27c-4763-bc05-5ffa2e2b822e",
"scope": "email"
}
The table above assumes your application has been assigned its "Client ID" and "Client Secret". For testing purposes, you may use a generic Client ID of dronetag-integration-test with no secret needed. For production use, each individual application should be assigned its own unique Client ID. Otherwise, limits on the volume of pulled data may be applied. Contact Dronetag support to get your credentials.
Both Personal Access Tokens and access tokens retrieved using OIDC can be added as a Bearer token in the Authorization header to authenticate your API requests.
POST /v2/airspace/telemetry/ua HTTP/1.1
Host: api.dronetag.app
Accept: */*
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICItQllNT2...
Access tokens issued as JWTs are short-lived and require refreshing upon expiration. We recommend reviewing the following resources for more information on refresh tokens and their secure usage:
One way to access telemetry data from Dronetag devices is by letting our servers initiate the connection and push the data to yours. You can manage these connections through our Integration Portal, where you can configure everything yourself. This portal gives you full control over the integration settings, allowing you to select connection protocols like HTTP webhooks, MQTT, TCP, or UDP. You can for example easily switch between your testing and production environments and adjust other settings as needed.
To set up Data Push integration, you'll need access to the portal, which is available for users subscribed to our Pro plan or for business partners participating in our cooperative projects. If you're interested in gaining access, reach out to us.
Access the portal at https://integrations.dronetag.app.
The user-friendly web interface makes it simple to configure your integration in just a few steps.
Our integration framework is designed to be highly flexible, allowing you to customize many parameters for each integration without needing our help. Here’s what you can configure:
To start transferring data, you'll need to create a distribution target. This represents the service where you want to send your data. You can create multiple targets, but there is a limit. Once a target is created, our system will automatically distribute data until you deactivate or remove it.
To temporarily stop the data from being sent to your services, you can pause the distribution by marking it as inactive. If you no longer need the distribution, you can permanently delete it.
Each Data Push distribution combines two separate choices:
Most formats are technically transport-independent, but not every combination is useful in practice. Choose the protocol based on how your system receives data, then choose a format that your target system can parse.
| Product / integration name | Recommended protocol | Recommended output format | Typical settings |
|---|---|---|---|
| Custom HTTP API or webhook | HTTP Webhooks | DUMP JSON, DUMP JSON Typed or a partner-specific socket format | Use an HTTPS target URL, HTTP Basic Authentication or OAuth 2.0 if required, and custom headers for API keys or tenant IDs. |
| Custom MQTT telemetry feed | MQTT Client | DUMP JSON, DUMP JSON Typed or a partner-specific socket format | Use MQTT over TLS when available, username/password authentication, QoS selected by your broker requirements, and {msgtype} in the topic if you want message-type routing. |
| Custom TCP socket feed | TCP Socket | DUMP JSON, DUMP JSON Typed or a partner-specific socket format | Use TLS or mTLS when crossing public networks. Enable embedded metadata only if your receiver expects the wrapper. |
| Custom UDP socket feed | UDP Socket | DUMP JSON or DUMP JSON Typed or a partner-specific socket format | Use only when packet loss is acceptable. Add AES payload encryption if the receiver supports it and the network path is not trusted. |
| TAK Server / CoT feed | TCP Socket | Cursor on Target XML | Use TCP mTLS when the TAK deployment requires client certificates. |
| SAPIENT feed | TCP Socket | SAPIENT | Set TCP protocol mode to sapient, configure heartbeat interval when required, and use TLS/mTLS if the receiving node requires certificate security. |
| Output format | HTTP Webhooks | MQTT Client | TCP Socket | UDP Socket | Notes |
|---|---|---|---|---|---|
| DUMP JSON | Recommended | Recommended | Supported | Supported | Best default for custom integrations. |
| DUMP JSON Typed | Recommended | Recommended | Supported | Supported | Same as DUMP JSON, with a $type field in the payload. |
| Cursor on Target XML | Possible | Not supported | Recommended | Possible | Used by TAK-compatible systems. |
| SAPIENT | Not supported | Not supported | Recommended | Not supported | Requires the SAPIENT TCP protocol mode. |
Some integrations are better known by the product or ecosystem name than by their protocol and format:
| Protocol + format | Product / integration name |
|---|---|
| HTTP Webhooks + DUMP JSON | Custom webhook / custom API integration |
| MQTT + DUMP JSON | Custom MQTT integration |
| TCP or UDP + Cursor on Target XML | TAK Server integration |
| TCP + SAPIENT | SAPIENT integration |
The Integration Portal uses these connection labels:
| Portal connection type | Compatible authentication choices | Transport and payload security |
|---|---|---|
| HTTP Webhooks | HTTP Basic Authentication, OAuth 2.0 | HTTPS target URL |
| MQTT Client | HTTP Basic Authentication | MQTT over TLS, AES data encryption |
| TCP Socket | None | TLS/mTLS, AES data encryption |
| UDP Socket | None | AES data encryption |
You can also leave authentication empty when your receiver does not require it. In this table, HTTPS, MQTT over TLS, and TLS/mTLS are transport security options, and AES data encryption is a payload encryption option, not a login method. The portal label HTTP Basic Authentication is also used for MQTT username/password credentials.
mTLS settings are shown in the portal only for TCP Socket distributions. The portal accepts either separate PEM files or PKCS#12 .p12 bundles:
.p12 with one or more certificates used to verify the server, and client .p12 with the client certificate and matching private key. Each bundle can have its own optional password. The portal converts both bundles to PEM before the integration uses them.The selected Data Source controls which messages a distribution target may receive before protocol or format conversion. See Message Coverage for details about which message types each output format can send.
The portal also exposes delivery controls:
Use this for custom APIs, webhooks, and most partner API integrations.
Typical settings:
https://.Use this when your infrastructure expects telemetry on MQTT topics.
Typical settings:
tcp or websockets, depending on your broker.{msgtype} for DUMP JSON routing.0 or 1, depending on whether low latency or delivery acknowledgement is more important.Use this for TAK Server, ATAK, WinTAK, iTAK, or TAK-compatible middleware.
Typical settings:
Use this only for systems that explicitly implement SAPIENT.
Typical settings:
sapient.HTTP is the best option when your system exposes an API endpoint. Dronetag sends POST requests to your target URL. The URL must start with http:// or https://.
Use plain HTTP only for development and testing. For production environments, HTTPS is strongly recommended.
HTTP can include metadata as headers, such as content type, message type, integration client ID, and public data visibility. You can also configure additional HTTP headers for your distribution.
Use HTTP for partner-specific API formats such as Altitude Angel, ASTRA, Highlander, and similar integrations.
MQTT is the best option when your system already operates an MQTT broker and expects telemetry on topics. Dronetag connects as an MQTT client and publishes converted messages to the configured topic.
MQTT works well with JSON payloads. If you use DUMP JSON, you can include {msgtype} in the topic name to route UA telemetry, operator telemetry, system telemetry, and operation updates to separate topics.
TCP is useful when the target system expects a persistent socket connection. It is also the recommended protocol for SAPIENT and one of the recommended protocols for TAK Server.
For SAPIENT, configure the TCP protocol mode as sapient. This enables the SAPIENT registration flow and length-prefixed binary messages.
TCP can also use TLS or mutual TLS when your target requires certificate-based security.
UDP is useful for simple fire-and-forget delivery, especially when integrating with systems that already accept UDP feeds, such as some TAK deployments.
Because UDP does not provide delivery confirmation, use TCP or HTTP when your integration requires stronger delivery guarantees.
HTTP sends metadata as request headers. MQTT, TCP, and UDP can optionally embed metadata into the payload for formats where that is useful.
Embedded metadata wraps the payload in an object with data and metadata fields. Use it only if your receiver is built to parse that wrapper.
For custom integrations, start with:
While configuring your integration distribution in our integration portal, you will encounter the field "data source". This article provides a detailed explanation of what data sources are and how they can be utilized in your integration.
The data source controls which messages are eligible for a distribution target. The selected output format can further limit which eligible message types are actually sent. See Message Coverage for details.
Requirements: None
Data shared: Only the data associated with the distribution owner account
This data source is available to anyone using the integration portal. It is primarily intended for initial testing and evaluation. When selected, it provides access only to the data associated with the same account as the account creating the distribution (owner). Only devices registered to this account are visible, ensuring privacy and isolation from other users' data.
Requirements: Existing device group related to an order of Dronetag devices
Data shared: All data, regardless of privacy settings or registration status
Device Group is intended for customers who have entered into a partnership with Dronetag and have purchased a group of devices. These devices are assigned to a pre-defined static group, which can be selected as a data source. The group membership is fixed and can only be changed upon request. Device groups are not visible or accessible to regular Dronetag users.
Requirements: Partnership registration with Dronetag
Data shared: Opt-in by users, all data regardless of privacy settings
Partner Integrations are visible and accessible to users, who have full control over which integrations can access their data.
Users can allow or deny access to their data for each integration via the Dronetag App, in the "Integrations" section. This means that users can choose to share their data with specific integrations while keeping it private from others.
Partner Integrations can be configured to prompt users for an arbitrary token, identifier, or authorization value when enabling the integration in the Dronetag App. This allows users to enter credentials or identifiers required by the third-party service, which can reliably associate Dronetag users with their own user accounts or authorization systems.
The partner integration approach increases transparency and user awareness, allowing users to remain in private mode while still enabling third-party integrations. This is the recommended approach for most integrations.
Each partner integration requires the following information to be provided, which is then displayed in the Dronetag App 'Integrations' section:
Previous requirements: None
Data shared: All public data of all Dronetag users (but not private data)
This data source previously allowed all public data available in the Dronetag App to be shared with any third party via the integration portal.
To enhance user experience and privacy, this option has been deprecated and is no longer available.
The most common distribution type uses HTTP protocol to distribute the data.
For each telemetry message, a new HTTP request is created and sent to your service's HTTP server.
Currently, only additional HTTP headers can be set using the specific configuration.
| Name | Description | Valid values |
|---|---|---|
target_additional_http_headers | Additional HTTP headers sent with each request | JSON object |
Following is an example of configuration JSON where custom headers are used to send a Bearer token with each request.
{
"target_additional_http_headers": {
"X-My-Custom-Id": "12345"
}
}
If your service is equipped with an MQTT Broker Server, you can use the MQTT Client type to connect to your server and publish the data.
| Name | Description | Valid values |
|---|---|---|
mqtt_dist_client_id | MQTT Client ID | Any string |
mqtt_dist_transport | Transport type used to connect to the server | tcp or websockets |
mqtt_dist_tls | Should TLS be used to connect? | true or false |
mqtt_dist_json_datastream_topic | Topic used for sending telemetry messages | Any string |
mqtt_dist_publish_qos_default | QoS parameter of messages sent from the client | Any integer number |
embed_metadata | Adds message metadata like account_visibility or integration_client_id to payload | true or false |
Following is an example of configuration JSON.
{
"mqtt_dist_client_id": "dronetag_0001",
"mqtt_dist_transport": "tcp",
"mqtt_dist_tls": false,
"mqtt_dist_json_datastream_topic": "dronetag/telemetry/{msgtype}",
"mqtt_dist_publish_qos_default": 0
}
{msgtype} in topic nameIf you use Dronetag DUMP format and you'd like to send different types of messages to different topics, you can use the {msgtype} placeholder in the topic name. It will be replaced with the actual message type before sending. For example, if the message type is "UA telemetry", the topic dronetag/telemetry/{msgtype} will become dronetag/telemetry/tele-ua.
Available message types are:
tele-ua - UA telemetry messagestele-operator - Operator telemetry messagestele-system - System telemetry messagesoperation-update - Operation update messagesRefer to the 'Understanding DUMP' page for more information about the message types.
This distribution type uses plain TCP or UDP socket to distribute the data.
| Name | Description | Valid values |
|---|---|---|
embed_metadata | Adds message metadata like account_visibility or integration_client_id to payload | true or false |
Following is an example of configuration JSON
{
"embed_metadata": true
}
Data Push uses two separate filters before sending data to your target:
For example, a target using the My account data source can receive only messages accessible to that account. If the same target uses a partner-specific UAV-position format, only eligible aircraft position messages are sent because that format cannot represent operator position, system telemetry, or operation updates.
| Data type | DUMP JSON / DUMP JSON Typed | Cursor on Target XML | SAPIENT | Partner-specific UAV-position formats |
|---|---|---|---|---|
| UA telemetry | Sent as tele-ua | Sent as aircraft CoT events | Sent as SAPIENT detections | Sent when the format can represent the position message |
| Operator position telemetry | Sent as tele-operator | Sent as operator CoT events | Not sent | Not sent |
| System telemetry | Sent as tele-system by default | Sent as system CoT events | Not sent | Not sent |
| Operation updates | Sent as operation-update | Not sent | Not sent | Not sent |
| ADS-B, UAT, FLARM, and OGN traffic | Not sent | Not sent | Not sent | Not sent |
DUMP JSON and DUMP JSON Typed are the best choices when your target needs the complete Data Push message set.
System telemetry can be disabled for a target with the distribute_system_telemetry connection setting.
After setting up your first distribution, your next step will likely be monitoring to ensure it's working correctly. You can do this in several ways.
To view the current status of your distribution, visit the Integration Portal and confirm that your distribution is enabled and configured correctly.
Click on the View & Edit link to see details such as uptime and statistics for the last 24 hours. You'll also see a small chart that provides a quick overview of how many messages were sent through this distribution during that period.
If you want more advanced monitoring, including historical data and alerts, you can integrate Prometheus to scrape metrics from our system. This feature is available for all integration portal users and provides detailed data for each running integration.
To visualize the data, we recommend using Grafana.

The URL format will look like this:
https://relay.dronetag.app/metrics/[[your_distribution_id]]
Make sure to note your distribution ID.
Prometheus is an open-source monitoring system that can scrape our metrics export. To learn more and find installation instructions, refer to the official Prometheus documentation.
Here’s a recommended configuration to start scraping our metrics:
global:
scrape_interval: 10s
scrape_configs:
- job_name: 'dronetag_distribution_metrics'
scrape_interval: 10s
metrics_path: '/metrics/[[your_distribution_id]]'
static_configs:
- targets: ['relay.dronetag.app']
This configuration will scrape metrics every 10 seconds from the URL: https://relay.dronetag.app/metrics/[[your_distribution_id]].
| Name | Description |
|---|---|
relay_messages_read_total | Total number of messages read on the input |
relay_messages_distributed_total | Total number of messages distributed. This may be lower than the input due to filters or delivery failures. |
relay_message_conversion_seconds | Average time to convert a message to the selected output format (in seconds) |
relay_message_distribution_seconds | Average time to distribute a message to your target (in seconds), mostly representing server latency. |
Grafana is an open-source monitoring and analytics tool that works with Prometheus as a data source.
Check out the guide 'Get started with Grafana and Prometheus' to learn how to install Grafana and set up Prometheus as a data source.
We provide a basic Grafana dashboard example. You can import the JSON file into your Grafana instance and modify it to suit your needs.
{ "annotations": { "list": [ { "builtIn": 1, "datasource": { "type": "grafana", "uid": "-- Grafana --" }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "target": { "limit": 100, "matchAny": false, "tags": [], "type": "dashboard" }, "type": "dashboard" } ] }, "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, "id": 47, "links": [ { "asDropdown": false, "icon": "cloud", "includeVars": false, "keepTime": false, "tags": [], "targetBlank": false, "title": "Dronetag Integration Portal", "tooltip": "", "type": "link", "url": "https://integrations.dronetag.app" } ], "liveNow": false, "panels": [ { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "dark-purple", "value": null } ] }, "unit": "string" }, "overrides": [] }, "gridPos": { "h": 3, "w": 16, "x": 0, "y": 0 }, "id": 3, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "/^relay_distribution_name$/", "values": false }, "text": { "valueSize": 40 }, "textMode": "value" }, "pluginVersion": "10.1.1", "targets": [ { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "editorMode": "code", "expr": "relay_messages_read_created{distribution_id=\"$distribution_id\"}", "format": "table", "instant": false, "legendFormat": "__auto", "range": true, "refId": "A" } ], "transformations": [], "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "dark-blue", "value": 80 } ] }, "unit": "dateTimeFromNow" }, "overrides": [] }, "gridPos": { "h": 3, "w": 8, "x": 16, "y": 0 }, "id": 2, "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "center", "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "/^Created$/", "values": false }, "textMode": "value_and_name" }, "pluginVersion": "10.1.1", "targets": [ { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "editorMode": "code", "expr": "relay_messages_read_created{distribution_id=\"$distribution_id\"}", "format": "time_series", "instant": false, "legendFormat": "Created at", "range": true, "refId": "A" } ], "transformations": [ { "id": "calculateField", "options": { "alias": "Created", "binary": { "left": "Created at", "operator": "*", "reducer": "sum", "right": "1000" }, "mode": "binary", "reduce": { "reducer": "sum" }, "replaceFields": true } } ], "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "description": "Average rates of sent (distributed) messages. Dotted line shows source input rate, which can be higher if there are filters applied (such as filter to specific device group).", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "bars", "fillOpacity": 100, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 0, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "mps" }, "overrides": [ { "matcher": { "id": "byName", "options": "Input rate" }, "properties": [ { "id": "custom.lineWidth", "value": 1 }, { "id": "custom.lineStyle", "value": { "dash": [ 2, 6 ], "fill": "dot" } }, { "id": "color", "value": { "mode": "fixed" } }, { "id": "custom.drawStyle", "value": "line" }, { "id": "custom.fillOpacity", "value": 0 } ] } ] }, "gridPos": { "h": 8, "w": 24, "x": 0, "y": 3 }, "id": 1, "interval": "15s", "maxDataPoints": 128, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "single", "sort": "none" } }, "targets": [ { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "editorMode": "code", "expr": "sum(rate(relay_messages_distributed_total{distribution_id=\"$distribution_id\"}[$__rate_interval])) by (distribution_id)", "instant": false, "legendFormat": "Distributed rate", "range": true, "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "editorMode": "code", "expr": "sum(rate(relay_messages_read_total{distribution_id=\"$distribution_id\"}[$__rate_interval])) by (distribution_id)", "hide": false, "instant": false, "legendFormat": "Input rate", "range": true, "refId": "B" } ], "title": "Average distribution rate", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "description": "The duration of how long it takes to convert the source input data to the output format. Includes filtering or other data pre-processing.", "fieldConfig": { "defaults": { "color": { "mode": "fixed", "seriesBy": "last" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "line" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "blue", "value": null } ] }, "unit": "s" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 11 }, "id": 4, "interval": "15s", "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "single", "sort": "none" } }, "targets": [ { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "editorMode": "code", "expr": "sum(rate(relay_message_conversion_seconds_sum{distribution_id=\"$distribution_id\"}[$__rate_interval]) / rate(relay_message_conversion_seconds_count{distribution_id=\"$distribution_id\"}[$__rate_interval])) by (distribution_id)", "instant": false, "legendFormat": "__auto", "range": true, "refId": "A" } ], "title": "Average conversion duration", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "description": "The duration of how long it takes to distribute the data. The largest part is usually the server latency. Some distribution types can be missing a support for this metric.", "fieldConfig": { "defaults": { "color": { "mode": "thresholds", "seriesBy": "max" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "dashed" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "blue", "value": null }, { "color": "dark-orange", "value": 0.7 }, { "color": "semi-dark-red", "value": 1 } ] }, "unit": "s" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 11 }, "id": 5, "interval": "15s", "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "single", "sort": "none" } }, "targets": [ { "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "editorMode": "code", "expr": "sum(rate(relay_message_distribution_seconds_sum{distribution_id=\"$distribution_id\"}[$__rate_interval]) / rate(relay_message_distribution_seconds_count{distribution_id=\"$distribution_id\"}[$__rate_interval])) by (distribution_id)", "instant": false, "legendFormat": "__auto", "range": true, "refId": "A" } ], "title": "Average distribute duration", "type": "timeseries" } ], "refresh": "", "schemaVersion": 38, "style": "dark", "tags": [ "dronetag" ], "templating": { "list": [ { "current": { "selected": false, "text": "cc2129b7-30e4-469e-8b13-92e7e097d528", "value": "cc2129b7-30e4-469e-8b13-92e7e097d528" }, "datasource": { "type": "prometheus", "uid": "aRT0ZzYnk" }, "definition": "label_values(relay_messages_read_total,distribution_id)", "hide": 0, "includeAll": false, "label": "Distribution ID", "multi": false, "name": "distribution_id", "options": [], "query": { "query": "label_values(relay_messages_read_total,distribution_id)", "refId": "PrometheusVariableQueryEditor-VariableQuery" }, "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, "type": "query" } ] }, "time": { "from": "now-1h", "to": "now" }, "timepicker": { "nowDelay": "", "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m" ] }, "timezone": "", "title": "Dronetag Single Distribution Monitoring", "uid": "f2370455-bdac-4098-baf5-ea8857bc199d", "version": 5, "weekStart": "" }
If you're encountering issues with your Data Push integration or distribution setup, this guide will help you identify and resolve common problems.
If your distribution has been set up but no data is being sent, try the following steps:
If data is delayed or experiencing high latency, the issue might be related to:
If your distribution is failing due to authentication errors:
If the system is failing to deliver messages, or if you notice a lower count of distributed messages compared to input messages:
If you're using Prometheus to scrape metrics but aren't seeing any data:
https://relay.dronetag.app/metrics/[[your_distribution_id]].prometheus.yml configuration file to confirm that the metrics path is correct and that Prometheus is scraping at the correct interval.If these steps don’t resolve your issue, feel free to contact our support team for assistance. Make sure to include any relevant details, such as error logs or screenshots, to help us quickly diagnose the problem.
This guide is for our customers and partners looking to integrate Dronetag solutions into their systems. Below, you’ll find helpful resources and links tailored to your specific integration needs.
Before proceeding, it's important to clarify your integration requirements:
“I want to just import my flight data to another application.”
If real-time access and continuous data collection aren’t required, you can export data from our apps in open formats such as CSV, KML, or GPX.
Learn more about the Dronetag app here.
“I want to write a script to collect all my flight data from last week in KML format.”
For automated collection of historical data, our REST API allows exporting in multiple formats. By default, we use our JSON format, but you can also request CSV, KML, GPX, or GeoJSON by specifying the desired MIME type in your Accept header.
Since you'll be accessing your own devices under your account, Personal Access Tokens are the most straightforward authentication method for you.
Refer to our guide on obtaining telemetry data or explore our API documentation for more details.
“I want to display my Dronetag devices in real-time in different software.”
If real-time data is your priority, we recommend using either an existing integration, or a combination of our REST API and Socket.io real-time API.
Check our getting started page, which lists the currently available existing integrations with our partners and third-party software.
If such integration is not available, you're given an option to integrate with our REST API and Socket.io API. Since you'll be accessing your own devices under your account, Personal Access Tokens are the most straightforward authentication method for you.
See our guide on retrieving real-time data or check out the API documentation.
“I have a web application and I want to allow Dronetag users to display their data in my application and manage their Dronetag assets.”
To allow your users to view their Dronetag data within your client-side application, we recommend integrating OpenID Connect. This enables seamless login using Dronetag accounts directly from your application.
Learn more about API authentication.
“I have a cloud solution and I would like to collect data from Dronetag devices from other users.”
If you have a server-side application and want to give your users access to their telemetry data in it, we suggest using our integration portal. You can establish a persistent connection between the Dronetag Cloud Platform and your server. Users will then be able to authorize your integration through the Dronetag App, allowing telemetry data from their devices to be sent to your servers.
Start with the Data Push Getting Started guide.
If you need to integrate with U-Space services, we also support U-Space reporting via InterUSS. We can send data to several DSS (Discovery and Synchronization Service) instances. If your system already implements the InterUSS protocol, we may be able to work with your existing DSS or include your DSS instance.
For more details on U-Space integration, refer to our InterUSS section.
We provide a robust real-time API available for general use. However, if your integration requirements are more complex, we offer dedicated support as part of our Enterprise subscription plan. Contact us to discuss your needs further.
This detailed guide will show you how to retrieve flight data from our API after completing flights with your Dronetag devices.
There are two main approaches depending on what flight details you have. You can either retrieve a list of past flights, select one, and gather all available data for that specific flight, or if you only know the general time frame and location, you can pull a segment of the airspace history. Both options are supported via our REST API.
This method allows you to retrieve the full telemetry history for one specific flight from a single device. The API response will provide data collected by that device.
Before proceeding, ensure you have access to the necessary resources. Visit the authentication guide for instructions on how to authenticate your API requests.
Retrieve a list of available flights associated with your authenticated Dronetag account. Take note of the id of the flight you’re interested in.
Use the flight’s id as the operation_id query parameter. This will give you the telemetry data for the selected flight without needing to specify time ranges or geographical areas.
Our telemetry endpoints support multiple output formats. Choose your preferred format and set it in the Accept header of your request.
You can also access additional telemetry streams for tracking the UA operator or the RID system.
For more details, check out the DUMP guide.
You may notice a /v1/flights/{id}/telemetry endpoint. However, we recommend using the v2 endpoint, as v1 is planned for deprecation.
This method allows you to pull historical airspace data for a defined location and time period.
Ensure you have access to the necessary resources. Visit the authentication guide for instructions on how to authenticate your API requests.
Based on the information you have, you can retrieve airspace history by either:
from, to) and geographical region (bbox), orfrom, to) and UAS ID (device serial number, uas_id).Select your preferred output format and set it in the Accept header of your request.
You can also access additional telemetry streams for tracking the UA operator or the RID system.
Learn more about these telemetry types in the DUMP guide.
While the previous request provides telemetry data, it does not include all the information about the flight, such as the UA's identification and type. To gather additional details, use the Operation API endpoint to retrieve more comprehensive operation information.
This guide explains how to access and visualize real-time telemetry, typically by using a combination of the REST API and real-time Socket.io to monitor airspace activity in real-time.
Make sure you have the required access to the necessary resources. For detailed instructions, refer to the authentication guide.
Decide whether you want to monitor a specific geographical area (bbox) or a particular device (uas_id).
Note: The geographical region has limitations. Large areas such as continents or countries cannot be observed. For details, see the REST API guide.
Before starting real-time updates, we recommend fetching the initial airspace state. This helps initialize your application’s state. For example, retrieve the last 5 minutes of airspace data to create a starting point for real-time monitoring.
Using Socket.io allows you to receive real-time updates with low latency, without needing to worry about time range query parameters. This is the preferred option for responsive applications.
Alternatively, you can periodically poll the API for updates. However, this approach is less efficient for applications that need frequent updates.
If you choose this option, ensure you use the Date header (needs to be converted to ISO 8601) from the last response for the from parameter in subsequent calls, to avoid receiving duplicate data.
Polling is generally not suitable for high-frequency updates. Polling this endpoint with high frequency (> 1 per second) can result in rate limiting errors.
While telemetry data provides real-time flight information, it may not include essential details such as UA identification and type. You can retrieve additional information about the operation itself.
With Socket.io, you can listen to the operation channel for updates when a new operation is created or existing operations are modified. However, network interruptions can cause data loss, so it's best to combine this with occasional HTTP requests to ensure your application remains in sync.
When necessary, you can request the operation details via the Operation API using the operation_id. This will give you the stored information about the airspace operation.
If your application displays a dynamic map or the area of interest changes over time, ensure you update the bbox query parameter in your API requests or send viewport events when using Socket.io.
For more information, refer to the API documentation and the Socket.io guide.
You can also access additional telemetry streams for tracking the UA operator or the RID system in real time. For more details, see the DUMP guide.
This guide explains how you can monitor the real-time status of your Dronetag device, such as battery charge, LTE, and GNSS signal strengths, and other key metrics. You can retrieve this data using either the REST API or the real-time Socket.io API.
Unlike other telemetry data such as Telemetry-UA or Telemetry-Operator, which are sent frequently, telemetry related to the device’s system status (Telemetry-System) is generally sent at lower intervals—typically every 10 to 15 seconds or more.
Learn more about all telemetry types in the DUMP guide.
To retrieve the status of your Dronetag device in real-time, you must use the device’s UAS ID, which is equivalent to the serial number of the Dronetag device. Unlike other telemetry types that allow observation based on a geographical region (via bbox), this endpoint does not support monitoring by geographical region. Instead, you’ll need to specify the UAS ID to access data for a particular device.
Ensure you have access to the necessary resources by authenticating your API requests. You can find more details on the authentication process in the authentication guide.
Before making any requests, confirm the UAS ID (serial number) of the device you wish to observe. You can find the UAS ID on the physical Dronetag device, within your account settings in the Dronetag App, or in other API responses.
To access the device's real-time status data through the REST API, use the following endpoint:
Set the uas_id query parameter to the serial number of the Dronetag device, and define a time range using the from parameter, or both from and to.
This option is not yet available
For real-time updates, connect to the telemetry_system channel via Socket.io. This method delivers lower-latency updates compared to REST polling.
All of our cloud-connected Dronetag products can be integrated with TAK Server by using our integration portal and can stream their Drone Remote ID data in the Cursor on Target (CoT) format directly to your TAK server in real-time.
Network Remote ID (NRI) devices (such as Dronetag Mini) can stream their UA positions. Direct Remote ID (DRI) receivers (such as Dronetag RIDER or Dronetag Scout) can additionally stream the operator location, and the location of the receiver itself.
This article is about setting up TAK Server integration from our cloud environment over public internet. We're working on enabling Dronetag Scout in Sensor+ Mode to integrate with TAK directly. Please contact us if you're interested in direct TAK integration and would like to inquire about the current state of the integration.
Before you begin, ensure you have:
Before setting up the integration, ensure your TAK Server is ready:
tak.yourcompany.com or 203.0.100.200)8087)If unfamiliar with TAK Server configuration, refer to the official TAK Server documentation.
Visit https://integrations.dronetag.app and sign in using your account credentials
Create a new distribution using the following configuration:
tak.yourcompany.com or 203.0.100.200)8087)Leave the other options to default values, or customize to your preferences. Please note that not all options are relevant to TCP+XML integration.
Take note of the selected data source. The default, "My account", streams data from all devices registered to your account. Other options include "Device Groups" (a static list of devices) and "Partnered Integration" (allows any Dronetag user to share data to your TAK server). Contact us for details.
If your TAK Server requires mutual TLS authentication, enable the mTLS option and upload the necessary client certificate and private key files in PEM format. This option is available only for TCP connections.
If you're experiencing issues, try these steps in order:
Verify TAK Server connectivity — Ensure your TAK Server IP/domain is correct and publicly accessible. Check that firewall rules allow incoming connections on the specified port.
Check device status — Confirm your Dronetag device is powered on, has GNSS lock, shows as "Online" and is visible on the map in your account at https://dronetag.app.
Review integration portal logs — Check the "Server logs" section in the integration portal and refresh the view several times (logs are not real-time). Look for connection errors or status messages.
Allow time for initialization — The integration needs 2-3 minutes to establish connection. If issues persist beyond this, restart the distribution in the integration portal by disabling and re-enabling the distribution.
If problems persist, contact support with your server logs and configuration details.
When using our API, you will encounter three distinct altitude values related to flight telemetry data points. This section provides an overview of what these values represent, how they are obtained, and how you can utilize them in your applications.
WGS84 HAE (Height Above Ellipsoid) — Altitude above the WGS84 ellipsoid, in meters
HAE-WGS84QNE (Pressure Altitude) — Altitude calculated from barometric pressure, in meters
PA-QNEATO (Above Takeoff Level) — Altitude above takeoff point, in meters
ATOWe are planning to introduce MSL (Mean Sea Level) altitudes soon, which will provide a more standardized altitude measurement based on global models.
We do not offer AGL altitude because our devices do not have sensors capable of directly measuring the distance to the ground or terrain at all locations globally. Without consistent and accurate ground-level pressure or elevation data, calculating true AGL altitude is unreliable.
However, users can calculate their own AGL estimates if they have access to reliable ground-level pressure data from their region. Using the raw pressure values reported by the device, you could compare them to known ground-level pressure to estimate the altitude.
The ATO field is calculated relative to the recorded pressure altitude at takeoff. There are two key factors that can cause negative values:
Takeoff Pressure: If you start tracking your flight when the drone is already airborne (e.g., 10m above the ground), the takeoff pressure will reflect that height. When the drone lands, the height will then show a negative value (e.g., -10m) because it's now below the original takeoff point.
Pressure Changes Over Time: Atmospheric pressure changes throughout the day due to weather conditions. If you're tracking a long flight that spans hours, the height might gradually drift because the reference pressure from takeoff no longer matches the current ground pressure. This can lead to incorrect readings, especially for long-duration flights.
Most commercial drones do not actually show AGL altitude; instead, they use a method similar to our ATO (height above takeoff). The drone's controller records the takeoff pressure and subsequently displays the difference between the takeoff altitude and the current altitude. This is presented as the drone's height above ground, even though it's technically just height relative to the takeoff point, not true AGL.

The DUMP (Dronetag Unified Message Protocol) is Dronetag's internal messaging format, used consistently across all our services. Whether you are interacting with our REST API, Socket.io, or integrating through our portal, you can rely on DUMP to be the standard data exchange format.
The current version is DUMP v1.
The details of these message types, including when and how they are used, are explained further below.
Although we aim for full consistency, some services may still use older message formats. We are actively working on migrating all services to the DUMP format, but backward compatibility with older APIs is required for now. Until we fully deprecate v1 APIs, you might encounter formats that are not DUMP-compliant.
| Property | Type | Description | Required |
|---|---|---|---|
id | string | Unique operation ID (typically in the form of a UUID) | Yes |
status | Object 'DUMPOperationStatus' | Current operation status | Yes |
sensor_id | string | The unique identifier for the sensor or device of this operation. | Yes |
uas_operator_id | any | ID of the UAS operator (typically in the form of a UUID) | No |
ua_classification | any | TODO | No |
ua_classification_type | any | TODO | No |
ua_identifiers | array of 'DUMPUAIdentifier' objects | Collection of UA identifiers | No |
authentication | array of 'DUMPSignature' objects | Collection of signatures to prove authenticity | No |
descriptions | array of 'DUMPOperationDescription' objects | Collection of various operation descriptions, for example for the purpose of verbosely describing the state of the operation | No |
warnings | array of 'DUMPWarning' objects | A list of warnings related to the operation. These warnings are usually produced while receiving the telemetry data which are non-compliant or have problematic values. For example, if the telemetry data contains invalid fields or timestamps, a warning will be generated. | No |
📋 See the full JSON schema in our API documentation
An Operation message contains static information about a specific flight. The purpose of separating this data into an operation object is to avoid repeating unchanged information, such as the drone’s serial number or the Remote ID (RID) module’s ID, in every telemetry message.
It’s important to understand that a single operation may not always correspond directly to a single flight. In cases where a flight is recorded using multiple systems—like a combination of Network Remote ID and ground-based Direct Remote ID receivers—the flight might be divided into multiple operations.
The difference between Operation and OperationUpdate is significant. The Operation message represents the full state of the flight at the time of the request and is returned when you query through the REST API. On the other hand, OperationUpdate messages represent partial updates, sent primarily in real-time scenarios (e.g., via Socket.io or our integration portal). OperationUpdate only includes recent changes, not the entire state.
{
"id": "a45cb00e-b600-4111-bd52-42537c28feb3",
"status": "current",
"uas_operator_id": "FIN87astrdge12k8",
"ua_classification": "class1",
"ua_classification_type": "open",
"ua_identifiers": [
{
"type": "serial_number",
"value": "15968AB92D361"
},
{
"type": "caa_assigned",
"value": "JA.JU12345ABCDE"
}
],
"authentication": [],
"descriptions": []
}
| Property | Type | Description | Required |
|---|---|---|---|
timestamp | string (date-time) | The original telemetry timestamp. Time from GNSS receiver (UTC) | Yes |
timestamp_accuracy | number | Timestamp accuracy (max. error) [s] | No |
sensor_id | string | The unique identifier for the sensor or device that originally received the telemetry data. In Telemetry-System messages, this field specifies the originating system. | Yes |
operation_id | string | Operation ID (typically in the form of a UUID) | Yes |
operational_state | Object 'DUMPOperationalState' | UA’s current state | Yes |
location | any | UA’s location from GNSS | No |
altitudes | array of 'DUMPAltitude' objects | Collection of altitudes | No |
velocity | any | UA’s velocity and speed related information | No |
air_pressure | any | Measured air pressure [hPa] | No |
📋 See the full JSON schema in our API documentation
The Telemetry-UA message is the primary data object for Remote ID. It provides a snapshot of the unmanned aircraft’s (UA) geographical position, status, and other relevant information required by Remote ID regulations.
Each Telemetry-UA message is associated with an Operation through the operation_id field. Every Remote ID-enabled device generates Telemetry-UA messages during operation.
{
"operation_id": "a45cb00e-b600-4111-bd52-42537c28feb3",
"timestamp": "2024-10-05T10:15:06.100Z",
"timestamp_accuracy": 0.1,
"operational_state": "airborne",
"location": {
"latitude": 50.073873, "longitude": 14.466586, "accuracy": 50
},
"altitudes": [
{ "type": "WGS84", "value": 192.5, "accuracy": 10 },
{ "type": "QNE", "value": 323.1, "accuracy": 0.5 },
{ "type": "AGL", "value": -10.0, "accuracy": 0.5 }
],
"velocity": {
"heading": 92, "horizontal_speed": 9.72, "vertical_speed": 1.22, "speed_accuracy": 0.5
},
"air_pressure": 1017.712
}
| Property | Type | Description | Required |
|---|---|---|---|
timestamp | string (date-time) | The original telemetry timestamp. Time from GNSS receiver (UTC) | Yes |
timestamp_accuracy | number | Timestamp accuracy (max. error) [s] | No |
sensor_id | string | The unique identifier for the sensor or device that originally received the telemetry data. In Telemetry-System messages, this field specifies the originating system. | Yes |
operation_id | string | Operation ID (typically in the form of a UUID) | Yes |
location | Object 'DUMPLocation' | Location from GNSS | Yes |
altitude | Object 'DUMPAltitude' | Operator’s altitude | Yes |
source_type | Object 'DUMPOperatorSourceType' | The nature of the operator’s position | Yes |
📋 See the full JSON schema in our API documentation
The Telemetry-Operator message tracks the operator’s location. Some UAV systems report the pilot’s real-time position through their control equipment. Standard Remote ID drones can provide operator tracking, while Remote ID modules typically only supply the takeoff location.
{
"operation_id": "a45cb00e-b600-4111-bd52-42537c28feb3",
"timestamp": "2024-10-05T10:15:06.100Z",
"timestamp_accuracy": 0.1,
"location": {
"latitude": 50.073873, "longitude": 14.466586, "accuracy": 50
},
"altitude": {
"type": "WGS84", "value": 202.5, "accuracy": 10
},
"source_type": "take_off"
}
| Property | Type | Description | Required |
|---|---|---|---|
timestamp | string (date-time) | The original telemetry timestamp. Time from GNSS receiver (UTC) | Yes |
timestamp_accuracy | number | Timestamp accuracy (max. error) [s] | No |
sensor_id | string | The unique identifier for the sensor or device that originally received the telemetry data. In Telemetry-System messages, this field specifies the originating system. | Yes |
operation_id | any | Operation ID (typically in the form of a UUID) Optional, as Telemetry-SYSTEM are linked to Operations only in specific cases, such as the System being the NRI (Network Remote ID) system. | No |
system_type | Object 'DUMPSystemType' | Type of the device | Yes |
system_status | Object 'DUMPSystemStatus' | Current system state | Yes |
location | any | The current system location | No |
altitude | any | The current system altitude | No |
power_source | any | Current system’s power source and its state | No |
lte_connectivity | any | Current system’s LTE connection and its state | No |
gnss_connectivity | any | Current system’s GNSS connection and its state | No |
📋 See the full JSON schema in our API documentation
The Telemetry-System message provides information about the status of the Remote ID module itself, rather than the aircraft. It includes details on battery charge, GNSS connectivity, LTE signal, and other system parameters. Currently, only Dronetag devices generate Telemetry-System messages.
{
"operation_id": "a45cb00e-b600-4111-bd52-42537c28feb3",
"timestamp": "2024-10-05T10:15:06.100Z",
"timestamp_accuracy": 0.1,
"system_type": "rid_module",
"system_status": "operational",
"power_source": {
"type": "battery",
"input_voltage": 4.11,
"charge_percentage": 90,
"is_being_charged": false
},
"lte_connectivity": {
"status": "connected",
"rsrq": -10,
"rsrp": -97,
"snr": 9,
"tac": "291E",
"cell_id": "555CA02"
},
"gnss_connectivity": {
"status": "connected",
"satellites": 12
}
}
Dronetag provides a simulation tool called Mocker that lets you test your integration during development without a physical device. With Mocker, you can create virtual flights and verify that your system correctly receives and processes Dronetag data.
The simulator is great for validating connections and general data exchange, but it may not produce data identical to real Dronetag devices. We strongly recommend testing with a physical device before going to production.
To get a virtual device, contact us with your Dronetag account details. We are generally happy to provide virtual devices for testing and development purposes. Once a virtual device is registered to your account, you can use it to simulate flights and test your integration.
Mocker supports two simulation engines depending on the type of device you want to simulate:
| Engine | Device type | Example devices |
|---|---|---|
nri_via_live | NRI (Network Remote ID) device | Dronetag Mini |
dri_via_funnel | DRI receiver device | Dronetag Scout, RIDER |
nri_via_live)An NRI simulation mimics a device that reports its own position to the network. Only one identifier is needed because the simulated device reports itself.
nri_via_live enginedri_via_funnel)A DRI receiver simulation mimics a device that detects and reports nearby Remote ID aircraft. This requires two identifiers: one for the receiver and one for the detected aircraft.
dri_via_funnel engineOnce created, the simulated device appears on the map and in the left sidebar. From the sidebar you can:
Simulations continue running even if you close the browser and will automatically end once their time limit expires. Please dismiss any simulations you are no longer using.
As part of our improvements, Dronetag is transitioning to region-based and timeline-based telemetry retrieval. This change requires you to update how you query telemetry and real-time data by specifying a geographical region or time range for telemetry retrieval. Follow this guide to ensure a smooth transition to the new system.
api.dronetag.app
https://api.dronetag.app/v1/flights/*/telemetry*https://api.dronetag.app/v1/devices/*/status-historylive.dronetag.app
https://live.dronetag.app/api/v2/airspace/overviewhttps://live.dronetag.app/api/v2/devices/*/telemetryhttps://live.dronetag.app/api/v2/devices/*/status_historyhttps://live.dronetag.app/api/v2/flights/*/telemetrylive.dronetag.apphttps://live.dronetag.app/api/v2/airspace/overview, will be deprecated by February 2025.live.dronetag.app will be removed. Complete your migration by this date.api.dronetag.app/v2/airspace for Telemetry RetrievalTo retrieve telemetry, replace live.dronetag.app queries with api.dronetag.app/v2/airspace.
GET https://live.dronetag.app/api/v2/airspace/overviewGET https://api.dronetag.app/v2/airspace/telemetry/ua./operations/{operation_id}.GET https://live.dronetag.app/api/v2/devices/*/telemetryGET https://api.dronetag.app/v2/airspace/telemetry/ua?uas_id=xxx with a UAS ID filter./operations/{operation_id} to retrieve the UAS ID.GET https://live.dronetag.app/api/v2/devices/*/status_historyGET https://api.dronetag.app/v2/airspace/telemetry/system?uas_id=xxx with a UAS ID filter.GET https://live.dronetag.app/api/v2/flights/*/telemetryGET https://api.dronetag.app/v2/airspace/telemetry/ua?operation_id=xxx.api.dronetag.app/v2/airspace for Socket.IO Connectionslive.dronetag.app will be deprecated. Use api.dronetag.app/v2/airspace for real-time telemetry.api.dronetag.app/v2/airspace for Post-Flight DataPost-flight telemetry is now retrieved through the same API as real-time data. Use your flight_id as operation_id in new requests.
GET https://api.dronetag.app/v1/flights/*/telemetry*GET https://api.dronetag.app/v2/airspace/telemetry/ua?operation_id=xxx with Operation ID and flight start/end times.GET https://api.dronetag.app/v1/flights/*/status-history*GET https://api.dronetag.app/v2/airspace/telemetry/system?operation_id=xxx with Operation ID and flight start/end times.As we roll out updates to improve our cloud platform, it's essential to migrate your authentication method to our new system. This guide will help you update to the reworked authentication layer, which includes enhanced security, better compatibility, and the introduction of OpenID Connect (OIDC) support. Please follow the steps below to ensure a smooth transition.
https://api.dronetag.app/v1/auth/*) are now deprecated. You must migrate to the new service (https://auth.dronetag.app).To simplify the transition, we recommend using an existing OIDC library for OAuth 2.0. These libraries manage the OAuth 2.0 flow, handling access tokens, refresh tokens, and other OIDC-related tasks.
You can find a list of certified OIDC implementations here: OpenID Connect Certified Libraries.
All authorization requests must be migrated to the new endpoint:
POST https://api.dronetag.app/v1/auth/jwt/tokenPOST https://auth.dronetag.app/realms/master/protocol/openid-connect/tokenEnsure you update your request logic to point to the new URL and expect a different JSON response structure. The new response includes access_token and refresh_token fields, in addition to other fields.
Every chapter of this document is a page of the Dronetag help site. Use these addresses to reach the latest version.