API Reference

The Flight Reader Web API follows REST conventions and uses predictable, resource-oriented URLs with standard HTTP methods and response codes.

Requests use JSON except when uploading a DJI TXT flight log, which uses multipart/form-data. Most responses are JSON encoded. Export endpoints return the requested KML, GPX, CSV, or SRT ZIP file directly.

Every request is authenticated with a private API key associated with a Flight Reader account. Flight log processing is asynchronous, so a successful upload returns a flight resource that can be retrieved until processing is completed.

Authentication

Authenticate requests with your private API key in the HTTP Authorization header. Create or rotate your key in Settings > API.

Keep API keys private. A key is shown only once when it is created or rotated. Rotating a key immediately invalidates the previous key.

Errors

The API uses standard HTTP status codes and returns a JSON error with a human-readable message.

400The request or one of its fields is invalid.
401The API key is missing, invalid, or rotated.
403The Free account has no API calls remaining. The response includes an upgrade link.
404The flight or account cannot be found or does not belong to the authenticated account.
409The account's flight log storage is full, or the flight's processing state prevents the requested action.
413The uploaded file exceeds 15 MB.
415The request is not multipart form data.
500The upload could not be accepted.
503Flight uploads are temporarily unavailable.
POST

/v1/flights

Uploads one DJI TXT flight log to the account associated with the API key. Send the request as multipart/form-data.

Request parameters

filefilerequired

The non-empty DJI TXT flight log. Maximum size: 15 MB.

filenamestringoptional

A filename ending in .txt. When omitted, the uploaded file's name is used.

flightNotesLocationstringoptional

The location entered in the Flight Notes section. Maximum length: 500 characters. An empty value does not clear an existing value during a duplicate upload.

flightNotesDescriptionstringoptional

The description entered in the Flight Notes section. Maximum length: 10,000 characters. An empty value does not clear an existing value during a duplicate upload.

flightNotesObservationsstringoptional

The observations entered in the Flight Notes section. Maximum length: 10,000 characters. The legacy flightNotes parameter is also accepted as an alias for this field. An empty value does not clear an existing value during a duplicate upload.

crewJSON arrayoptional

Crew members and roles. Each item contains name and role. An omitted or empty array leaves existing crew unchanged. A supplied role replaces the existing crew member in that role; a new role is added to the flight.

Response

A new flight returns 202 Accepted after it is queued for processing.

The response includes flightUrl (relative to the API base URL) and viewUrl (the flight in the web app). Poll the flight URL every 10–30 seconds until the status is completed or failed. The duplicate-upload response keeps its already_exists status; retrieve the flight to check its processing status.

Duplicate flights

Flight Reader calculates the file's SHA-256 checksum and checks for the same checksum in the authenticated account. Existing flight logs are not processed again. Non-empty crew or flight notes supplied with the request are applied to the existing flight.

GET

/v1/flights/{id}

Retrieve a flight owned by the authenticated account using the complete ID returned by an upload or flight listing. This is the same ID used in the web viewing URL. A missing flight or a flight owned by another account returns 404, even if public.

Processing status

status is queued, processing, completed, failed, or unknown. On failure, error contains an explanation; otherwise it is null.

Dates are UTC. Processing and flight dates may be null before processing finishes. Other derived details, such as location and record count, may be empty or zero until completion.

Opening viewUrl follows normal web sharing permissions. API access always requires your private key.

flightSummary contains the values shown in the Flight page's Flight Summary section. Distances and speeds use the authenticated account's current Imperial or Metric measurement setting. A value that was not recorded is returned as null.

GET

/v1/flights

List your account's flights, including uploads from the web app, newest flight ID first. All processing statuses are included.

Query parameters

limitinteger, optional

Page size from 1 to 100. Default: 20.

startingAfterstring, optional

Pass the previous response's nextCursor to fetch the next page. It must identify an existing flight in your account.

uploadedFromdate/time, optional

Include flights uploaded at or after this ISO 8601 date/time. A date without a time is midnight UTC.

uploadedBeforedate/time, optional

Include flights uploaded before this ISO 8601 date/time, exclusively. Must be later than uploadedFrom.

Each item in data has the same fields as Retrieve a flight. Continue while hasMore is true, keeping the same date filters. An empty result returns an empty array, false, and a null cursor. If the cursor flight is deleted, restart the listing.

PATCH

/v1/flights/{id}

Update notes or sharing for a flight in your account. Use the complete ID returned by the API and send a JSON object with at least one of the following fields. Omitted fields remain unchanged.

Request parameters

flightNotesLocationstring, optional

Up to 500 characters. An empty string clears the location. Null is not accepted.

flightNotesDescriptionstring, optional

Up to 10,000 characters. An empty string clears the description. Null is not accepted.

flightNotesObservationsstring, optional

Up to 10,000 characters. An empty string clears the observations. Null is not accepted. The legacy flightNotes field remains supported as an alias.

isPublicboolean, optional

True allows anyone with the viewing link to view the flight; false makes it private.

Returns the ID, all three flight note fields, the legacy flightNotes observations alias, and isPublic. Crew changes are currently available through the upload endpoint, not PATCH.

DELETE

/v1/flights/{id}

Permanently delete a flight in your account using the same deletion and file cleanup workflow as the web app. This cannot be undone. Queued, processing, or pending-reprocessing flights return 409; wait for processing to finish before retrying.

Returns 200 with the flight ID and deleted: true. A missing flight, including one already deleted, returns 404.

GET

/v1/flights/{id}/exports

List the downloads currently available for a successfully processed flight. Each item includes its export type, display name, and download URL. CSV entries include the account's built-in and custom field templates.

GET

/v1/flights/{id}/exports/original

Download the original DJI TXT flight log.

GET

/v1/flights/{id}/exports/kml

Download the Flight Path KML generated with the account's current KML settings. The more descriptive /exports/flight-path-kml URL produces the same file.

GET

/v1/flights/{id}/exports/flight-path-gpx

Download the Flight Path GPX generated by Flight Reader.

GET

/v1/flights/{id}/exports/flight-polygon-kml

Download the Flight Polygon KML generated with the account's current KML settings.

GET

/v1/flights/{id}/exports/adsb-kml

Download the ADS-B KML generated with the account's current ADS-B KML settings. This export is available when the flight contains ADS-B data.

GET

/v1/flights/{id}/exports/csv

Download the Aircraft Log CSV using the same field template, filters, headings, measurement selection, delimiter, and formatting used by the Flight page. Pass a different template with /exports/csv/{templateName}, including custom templates created in Flight Reader.

GET

/v1/flights/{id}/exports/srt

Download video telemetry subtitles using the account's current SRT field and formatting settings. The response is always a ZIP containing a separate SRT file for each video recording sequence. This paid export is available only when the flight contains video.

Download responses are file attachments. Flights that have not processed successfully return 409. Missing flights or another user's flights return 404, even when public. Temporarily unavailable source files return 503.

GET

/v1/account

Retrieve your plan and current flight log storage. No parameters are required.

Capacity includes additional flight packs. Used storage includes queued and processing flights. Remaining storage never falls below zero. The used percentage is rounded down and may exceed 100 for an account over capacity.

canUpload indicates whether storage is available at the time of this request. The upload endpoint checks capacity again; this response does not reserve storage.