Features

Export

The export feature lets you download your flight data from AirTrail.

Export flights

  1. Open Settings > Export.
  2. Click .csv or .json.

The file downloads as airtrail.csv or airtrail.json. It contains every flight on which you are a passenger.

The Export page is available to users whose role includes the flight.export.own permission.

Export with the API

You can automate AirTrail backups with the v1 REST API. Create an API key with the flight.export.own scope, then call:

curl -H "Authorization: Bearer <api-key>" \
  "https://your-instance.com/api/v1/flights/export?format=json" \
  -o airtrail.json

Use format=yaml to export YAML instead:

curl -H "Authorization: Bearer <api-key>" \
  "https://your-instance.com/api/v1/flights/export?format=yaml" \
  -o airtrail.yaml

The API export has the same structure as the JSON format below.

By default, the API exports your own flights. To export another user's flights with scope=user&userId=<user-id>, or every flight on the instance with scope=all, you need both:

  • the flight.export.any scope on the API key, and
  • a role that includes the flight.export.any permission.

The in-app importer accepts .json files only. To restore a YAML export, convert it to JSON first.

The deprecated /api/flight/export endpoint still works for now. See migrating from the legacy API.

Calendar feed

The calendar feed publishes your flights as an iCal (.ics) calendar that other calendar apps can subscribe to. Subscribed apps pull the feed and show each flight as an event, including reminders, seat details, and notes.

Enabling the feed

  1. Open Settings > Export.
  2. Turn on Calendar feed.
  3. Copy the feed URL and add it as a subscribed calendar in your calendar app.

The URL looks like https://your-instance.com/api/calendar/<token>.ics, where <token> is a secret generated when you enable the feed. The URL needs no login, so anyone who has it can read your flight data - treat it like a password.

You can also click Subscribe on the same page. It opens a webcal:// version of the URL, which lets your device offer the feed to its default calendar app.

The feed is available to users whose role includes the flight.export.own permission.

Feed options

  • Reminder adds a reminder to every event: 30 minutes, 1 hour, 2 hours (the default), 3 hours, or 1 day before departure.
  • Show emoji in titles prefixes every event title with an airplane emoji.

Turning the feed off deletes the URL, and subscriptions to it stop working immediately. Enabling it again creates a new URL.

Managing the URL

Use Regenerate token if the URL has been shared further than you meant to. The old URL stops working, and calendar apps subscribed to it must be re-subscribed with the new URL.

Google Calendar refreshes subscribed calendars roughly once a day, so new flights can take up to a day to appear there. Apple Calendar and Outlook have similar, app-controlled refresh intervals.

Your calendar app shows events in its own timezone. Each event's description lists the local dates and times at the departure and arrival airports, along with airport, seat and flight details.

Export formats

CSV

The CSV export opens in any spreadsheet application, such as Microsoft Excel or Google Sheets. It has one row per flight.

Format

The CSV file contains these columns:

  • date: The flight date (YYYY-MM-DD).
  • datePrecision: How precise the date is: day, month, or year.
  • from, to: The names of the departure and arrival airports.
  • departure, arrival: The actual departure and arrival times (ISO 8601, if available).
  • departureScheduled, arrivalScheduled: The scheduled departure and arrival times.
  • takeoffScheduled, takeoffActual, landingScheduled, landingActual: The takeoff and landing times.
  • duration: The flight duration in seconds.
  • departureTerminal, departureGate, arrivalTerminal, arrivalGate: Terminal and gate information.
  • flightNumber: The flight number.
  • airline: The airline name.
  • aircraft: The aircraft type name.
  • aircraftReg: The aircraft registration.
  • note: The flight notes.
  • seat: Your seat type (for example window or aisle).
  • seatNumber: Your seat number.
  • seatClass: Your seat class (for example economy or business).
  • flightReason: Your reason for the flight.
  • fromId, toId, airlineId, aircraftId: Internal AirTrail IDs.

The seat and reason columns come from your own passenger entry. Other passengers, custom fields, and flight tracks are not included in the CSV export.

JSON

The JSON format can be reimported into AirTrail using the import feature. Use the AirTrail importer for current exports and AirTrail (pre-v3) for legacy exports.

The JSON export is the complete AirTrail backup format. It contains every passenger on each flight, custom field values, and flight tracks.

Format

The JSON file follows this structure:

{
  "users": [
    {
      "id": "user_id",
      "displayName": "User Name",
      "username": "username"
    }
  ],
  "flights": [
    {
      "date": "YYYY-MM-DD",
      "datePrecision": "day",
      "departure": "ISO_8601_DATETIME",
      "arrival": "ISO_8601_DATETIME",
      "departureScheduled": "ISO_8601_DATETIME",
      "arrivalScheduled": "ISO_8601_DATETIME",
      "takeoffScheduled": "ISO_8601_DATETIME",
      "takeoffActual": "ISO_8601_DATETIME",
      "landingScheduled": "ISO_8601_DATETIME",
      "landingActual": "ISO_8601_DATETIME",
      "duration": 25200,
      "departureTerminal": "TERMINAL",
      "departureGate": "GATE",
      "arrivalTerminal": "TERMINAL",
      "arrivalGate": "GATE",
      "flightNumber": "FLIGHT_NUMBER",
      "aircraftReg": "AIRCRAFT_REGISTRATION",
      "note": "FLIGHT_NOTE",
      "fromId": 1,
      "toId": 2,
      "aircraftId": 3,
      "airlineId": 4,
      "from": {
        "icao": "ICAO_CODE",
        "iata": "IATA_CODE",
        "lat": 55.0,
        "lon": 12.0,
        "tz": "Europe/Copenhagen",
        "name": "Airport Name",
        "municipality": "City",
        "type": "large_airport",
        "continent": "EU",
        "country": "DK",
        "custom": false
      },
      "to": {
        "icao": "ICAO_CODE",
        "iata": "IATA_CODE",
        "lat": 53.0,
        "lon": -6.0,
        "tz": "Europe/Dublin",
        "name": "Airport Name",
        "municipality": "City",
        "type": "large_airport",
        "continent": "EU",
        "country": "IE",
        "custom": false
      },
      "aircraft": {
        "name": "Aircraft Type",
        "icao": "ICAO_AIRCRAFT_TYPE",
        "sourceId": "aircraft-source-id"
      },
      "airline": {
        "name": "Airline Name",
        "icao": "ICAO_AIRLINE_CODE",
        "iata": "IATA_AIRLINE_CODE",
        "iconPath": null,
        "sourceId": "airline-source-id"
      },
      "passengers": [
        {
          "userId": "USER_ID",
          "guestName": null,
          "seat": "window",
          "seatNumber": "12A",
          "seatClass": "economy",
          "flightReason": "leisure",
          "user": {
            "id": "USER_ID",
            "displayName": "User Name",
            "username": "username"
          },
          "customFields": {
            "meal_preferences": ["Vegetarian", "Gluten-free"]
          }
        }
      ],
      "track": {
        "coordinates": [
          [12.65, 55.62, 0],
          [-6.27, 53.42, 0]
        ],
        "times": [1767261600, 1767269400],
        "sourceFormat": "gpx",
        "sourceName": "flight.gpx"
      },
      "customFields": {
        "booking_reference": "ABC123"
      }
    }
  ]
}

Notes on the structure:

  • users lists only the users who are passengers on the exported flights.
  • A passenger has either a userId or a guestName. user is null for guests.
  • track is present only for flights with a flight track. Track coordinates are [longitude, latitude, altitude] with altitude in meters. Depending on the source file, a track can also contain groundSpeedKt, trackDeg, ground, and estimated arrays.
  • customFields is present only when the flight or passenger has custom field values. Airport, airline, and aircraft fields are expanded to full objects.
  • The fromId, toId, aircraftId, and airlineId values are internal IDs of the source instance and are ignored on import.

When you reimport the file, AirTrail restores tracks but not custom field values.

Last updated on

On this page