Data Format Documentation
Overview
DroneCompare publishes its complete drone comparison dataset as a single JSON file. The data is updated whenever an admin refreshes the export and is available at:
https://cdn.dronecompare.org/data.json
The data is licensed under Creative Commons Attribution 4.0 International (CC-BY-4.0). You are free to use, share, and adapt the data for any purpose, as long as you provide appropriate attribution to DroneCompare (dronecompare.org).
Top-Level Structure
{
"license": "CC-BY-4.0",
"licenseUrl": "https://creativecommons.org/licenses/by/4.0/",
"attribution": "DroneCompare (dronecompare.org)",
"schema": { ... },
"entities": [ ... ],
"exportedAt": "2026-02-17T12:00:00.000Z"
}| Field | Type | Description |
|---|---|---|
license | string | SPDX license identifier (CC-BY-4.0) |
licenseUrl | string | URL to the full license text |
attribution | string | Required attribution text when reusing the data |
schema | object | Complete schema definition (fields, categories, units, tags) |
entities | array | All drone entities with their field values |
exportedAt | string | ISO 8601 timestamp of when the export was generated |
Schema Object
The schema describes all fields, their types, validation rules, translations, and display configuration. It contains four arrays:
{
"schema": {
"fields": [ ... ],
"categoryOrder": [ "identity", "pricing", "physical", ... ],
"units": [ ... ],
"tags": [ ... ]
}
}| Field | Type | Description |
|---|---|---|
fields | array | All schema field definitions |
categoryOrder | string[] | Display order of field categories |
units | array | Unit definitions (grams, meters, etc.) |
tags | array | Tag definitions for multi-instance fields (e.g., "primary", "secondary") |
Field Object
Each field in schema.fields has the following structure:
| Property | Type | Description |
|---|---|---|
id | string (UUID) | Unique field identifier |
key | string | Dotted key path (e.g., physical.weight, camera.resolution) |
type | string | Field type (see Field Types) |
required | boolean | Whether this field must have a value for every entity |
category | string | Display category (matches categoryOrder) |
unitId | string? | Reference to a unit in schema.units |
parentId | string? | Parent group field ID (for nested fields) |
sortOrder | number | Display order within category |
visible | boolean | Whether the field is shown in the comparison table |
filterable | boolean | Whether users can filter by this field |
highlightBest | boolean | Whether to highlight the best value among compared entities |
highlightDirection | string? | "highest" or "lowest": which direction is "best" |
allowsMultiple | boolean | Whether this group supports multiple instances (e.g., multiple cameras) |
collapsedByDefault | boolean | Whether the group is collapsed by default in the UI |
defaultExpandedInstances | number? | Number of instances to show expanded by default for multi-instance groups (null = all expanded) |
minValue / maxValue | number? | Validation constraints for numeric fields |
minLength / maxLength | number? | Validation constraints for string fields |
translations | object | Display names and descriptions keyed by locale (see below) |
unit | object? | Resolved unit object (if unitId is set) |
enumOptions | array? | Available options for enum type fields |
Field Translations
"translations": {
"en": {
"displayName": "Weight",
"description": "Total takeoff weight including battery"
},
"nb": {
"displayName": "Vekt",
"description": "Total startvekt inkludert batteri"
}
}Entity Object
Each entity (drone) in the entities array has this structure:
{
"id": "01900000-0000-0000-0000-000000000001",
"slug": "dji-mini-4-pro",
"values": {
"identity.name": "DJI Mini 4 Pro",
"physical.weight": 249,
"camera.resolution": [
{ "index": 0, "value": "48 MP", "tags": ["primary"] },
{ "index": 1, "value": "12 MP", "tags": ["secondary"] }
],
...
},
"createdAt": "2026-02-01T00:00:00.000Z",
"updatedAt": "2026-02-15T10:30:00.000Z"
}| Property | Type | Description |
|---|---|---|
id | string (UUID) | Unique entity identifier |
slug | string | URL-safe identifier (e.g., dji-mini-4-pro) |
values | object | Field values keyed by field key (see Value Formats) |
createdAt | string | ISO 8601 timestamp |
updatedAt | string | ISO 8601 timestamp |
Field Types Reference
| Type | Value Format | Example |
|---|---|---|
string | Plain string or LocalizedString | "DJI Mini 4 Pro" |
number | Numeric value | 249 |
boolean | true or false | true |
enum | String matching an enumOptions[].value | "manual" |
date | ISO 8601 date string | "2024-09-15" |
url | URL string | "https://www.dji.com/mini-4-pro" |
dimensions2d | String "L×W" | "148×94" |
dimensions3d | String "L×W×H" | "148×94×64" |
range | String "min:max" | "-10:40" |
group | No value; serves as a container for child fields | — |
Special Value Formats
LocalizedString
String fields that support translations use a special wrapper object instead of a plain string. Identified by the _localized: true flag:
{
"_localized": true,
"translations": {
"en": "Primary Camera",
"nb": "Hovedkamera"
}
}Multi-Instance Values
Fields inside a group with allowsMultiple: true store an array of instance values. Each instance has an index, value, and optional tags:
[
{ "index": 0, "value": "48 MP", "tags": ["primary"] },
{ "index": 1, "value": "12 MP", "tags": ["secondary"] }
]| Property | Type | Description |
|---|---|---|
index | number | Instance index (0-based) |
value | any | The field value (same types as single-value fields) |
tags | string[] | Semantic tags (e.g., "primary", "wide_angle"). References schema.tags[].key |
Null Values
Missing or unknown values are represented as null. Not every entity has a value for every field. This is by design (sparse data model).
Units
Units are defined in schema.units and referenced by fields via unitId:
{
"id": "...",
"key": "grams",
"translations": {
"en": {
"singular": "gram",
"plural": "grams",
"abbreviation": "g"
}
}
}Tags
Tags are used to semantically label multi-instance values (e.g., "primary camera", "wide-angle lens"):
{
"id": "...",
"key": "primary",
"category": "payload",
"sortOrder": 0,
"translations": {
"en": { "displayName": "Primary" },
"nb": { "displayName": "Primær" }
}
}Enum Options
Fields with type: "enum" include an enumOptions array defining all valid values:
{
"id": "...",
"fieldId": "...",
"value": "manual",
"sortOrder": 0,
"translations": {
"en": { "displayName": "Manual" },
"nb": { "displayName": "Manuell" }
}
}Attribution
When using DroneCompare data, please provide attribution. A suitable credit looks like:
Data from DroneCompare (https://dronecompare.org), licensed under CC-BY-4.0.
For code projects, including the attribution in your README or about page is sufficient. For data visualizations, a small credit line is appropriate.