Encrypted v13+ logs supported

DJI flight log parser, as an API

Upload any DJI flight record — DJIFlightRecord_*.txt from DJI Fly or DJI GO 4, or FTR_Record_*.txt from DJI Pilot 2 — and get back a clean CSV. Encrypted logs are decrypted for you. No desktop software, no parsing code to maintain.

Free tier includes 100 API calls/month. No credit card required. Just want to look at one flight? Try the free DJI flight log viewer.

Terminal
# Parse a DJI flight record
curl -X POST \
https://dronelogapi.com/api/v2/logs/upload/dji \
-H "Authorization: Bearer YOUR_KEY" \
-F "file=@DJIFlightRecord.txt"
# 200 — text/csv
OSD.flyTime [s],OSD.latitude,OSD.longitude,OSD.height [m],BATTERY.chargeLevel 0.0,55.676098,12.568337,0.0,98 0.1,55.676098,12.568337,0.3,98 0.2,55.676099,12.568338,0.9,98 ...
.TXT
DJI Fly & DJI GO 4 flight records
FTR
DJI Pilot 2 & FlightHub 2 records
v13+
Encrypted logs decrypted for you
40+
DJI models supported
How the parser works

From raw log file to structured data

01

Upload the flight record

POST the flight record straight from the DJI Fly, DJI GO 4 or DJI Pilot 2 app's FlightRecord folder — single .txt file or a .zip, no conversion needed. Not sure where they are? See where DJI flight logs are stored.

02

We decrypt & parse

The parser decrypts DJI's proprietary format and walks every record — telemetry, battery, GPS, gimbal, RC signal, app warnings — while your request waits. Curious what is inside the file? Read how the DJI flight log format works.

03

Get CSV back

The response is the parsed CSV — all 477 DJI log fields, or only the columns you ask for — ready for your dashboard, spreadsheet or database.

Code examples

Convert a DJI flight log to CSV in a few lines

One multipart POST with your API key and the flight record. Pass fields[] to pick columns — field names are listed in the DJI flight log field reference.

curl -X POST https://dronelogapi.com/api/v2/logs/upload/dji \
  -H "Authorization: Bearer YOUR_KEY" \
  -F "file=@DJIFlightRecord_2026-05-16_[19-02-56].txt" \
  -F "fields[]=OSD.flyTime [s]" \
  -F "fields[]=OSD.latitude" \
  -F "fields[]=OSD.longitude" \
  -F "fields[]=OSD.height [m]" \
  -F "fields[]=BATTERY.chargeLevel" \
  -o flight.csv
import requests

with open("DJIFlightRecord_2026-05-16_[19-02-56].txt", "rb") as log:
    response = requests.post(
        "https://dronelogapi.com/api/v2/logs/upload/dji",
        headers={"Authorization": "Bearer YOUR_KEY"},
        files={"file": log},
        data={"fields[]": ["OSD.flyTime [s]", "OSD.latitude", "OSD.longitude", "OSD.height [m]", "BATTERY.chargeLevel"]},
    )

response.raise_for_status()

with open("flight.csv", "wb") as out:
    out.write(response.content)
import { openAsBlob } from "node:fs";
import { writeFile } from "node:fs/promises";

const form = new FormData();
form.append("file", await openAsBlob("DJIFlightRecord_2026-05-16_[19-02-56].txt"), "DJIFlightRecord_2026-05-16_[19-02-56].txt");
for (const field of ["OSD.flyTime [s]", "OSD.latitude", "OSD.longitude", "OSD.height [m]", "BATTERY.chargeLevel"]) {
  form.append("fields[]", field);
}

const response = await fetch("https://dronelogapi.com/api/v2/logs/upload/dji", {
  method: "POST",
  headers: { Authorization: "Bearer YOUR_KEY" },
  body: form,
});

if (!response.ok) throw new Error(await response.text());
await writeFile("flight.csv", await response.text());
flight.csv
OSD.flyTime [s],OSD.latitude,OSD.longitude,OSD.height [m],BATTERY.chargeLevel
0.0,55.676098,12.568337,0.0,98
0.1,55.676098,12.568337,0.3,98
0.2,55.676099,12.568338,0.9,98
...

Full request and error reference in the API documentation. Flying ArduPilot too? See the ArduPilot flight log parser. Weighing your options? See DJI flight log parsers compared.

Parser output

What the parser pulls out of every log

Telemetry & GPS

Lat/lng flight path, height, altitude, speed, heading, satellite count and flight state for every sample.

Battery data

Voltage, current, temperature, per-cell readings, charge level and charge cycles — including dual-battery aircraft.

Gimbal & camera

Gimbal pitch/roll/yaw, camera mode, photo/video capture events, and SD card status.

RC & signal

Stick positions, button states, and uplink/downlink signal quality throughout the flight.

Warnings & incidents

Signal loss, low battery, obstacle avoidance triggers, and other in-flight app messages.

Aircraft identity

Drone model, serial numbers for flight controller, camera, gimbal, battery, and remote controller.

Browse the full DJI flight log field reference →

Supported drones

DJI aircraft the parser recognizes

The aircraft model is read from the flight record itself, so you never have to tell the API which drone flew.

Mini

  • DJI Mavic Mini
  • DJI Mini SE
  • DJI Mini 2
  • DJI Mini 2 SE
  • DJI Mini 3
  • DJI Mini 3 Pro
  • DJI Mini 4 Pro
  • DJI Mini 5 Pro

Air

  • DJI Mavic Air
  • DJI Mavic Air 2
  • DJI Air 2S

Mavic

  • DJI Mavic Pro
  • DJI Mavic 2
  • DJI Mavic 3
  • DJI Mavic 3 Pro

Enterprise

  • DJI Mavic 2 Enterprise
  • DJI Mavic 3 Enterprise
  • DJI Mavic 3 Thermal
  • DJI Matrice 4E
  • DJI Matrice 4T
  • DJI Matrice 30T

Matrice

  • DJI Matrice 100
  • DJI Matrice 200 / 210 (V1 & V2)
  • DJI Matrice 300 RTK
  • DJI Matrice 350 RTK
  • DJI Matrice 400
  • DJI Matrice 600 / 600 Pro

Phantom

  • DJI Phantom 3 (all variants)
  • DJI Phantom 4
  • DJI Phantom 4 Pro / Pro V2
  • DJI Phantom 4 Advanced
  • DJI Phantom 4 RTK
  • DJI Phantom 4 Multispectral

Inspire

  • DJI Inspire 1 / 1 Pro / 1 RAW
  • DJI Inspire 2

FPV & other

  • DJI DJI FPV
  • DJI Avata
  • DJI Avata 2
  • DJI Spark
FAQ

DJI flight log parser — common questions

DJI flight record files: the DJIFlightRecord_*.txt logs written by DJI Fly and DJI GO 4, the FTR_Record_*.txt flight records from DJI Pilot 2 and FlightHub 2, and ZIP archives containing them. Despite the .txt extension these are binary files, and newer ones (format v13 and up) are encrypted — you upload them as-is and decryption is handled for you. The aircraft-side .DAT logs pulled with DJI Assistant 2 are not supported.
Yes. Since flight record version 13, DJI encrypts the log contents and the decryption keys have to be fetched from DJI. The parser does that automatically, so encrypted logs from current DJI Fly and DJI Pilot 2 versions return the same CSV as older plaintext ones.
Logs from the Mini, Air, Mavic, Phantom, Inspire, Matrice, Avata and FPV lines — anything that records a flight log through DJI Fly, DJI GO 4 or DJI Pilot 2. The aircraft model and serial numbers are read from the log itself.
A CSV file with one row per telemetry sample (roughly every 100 ms) and one column per field. Send a fields[] list to get only the columns you need — fewer columns means a faster response and a smaller file. Omit it to get every field.
DJI logs are parsed synchronously: the CSV comes back in the response to the upload request, usually within a few seconds. There is no job to poll.
Yes. After signing up you can upload logs from the dashboard and download the CSV, using the same parser and free monthly quota as the API.
Every account gets 100 free API calls per month, no credit card required — enough to parse and inspect real logs before committing to a paid plan.

Stop parsing DJI logs by hand

Get your API key in 30 seconds. 100 free calls per month, no credit card needed.

Free tier included No credit card Cancel anytime