Open data

The empty leg feed

Every empty leg on our board, as a JSON or CSV file anyone can read. No key, no sign-up, no rate card. Built for AI assistants, aviation sites, brokers' tools, researchers and spreadsheets. If you use it, say where it came from.

Reading the feed.

Where

WhatURL
JSON, every leg on the boardhttps://emptylegslist.com/feed/empty-legs.json
CSV, same rowshttps://emptylegslist.com/feed/empty-legs.csv
Filter: departure airporthttps://emptylegslist.com/feed/empty-legs.json?from=NCE
Filter: arrival airporthttps://emptylegslist.com/feed/empty-legs.json?to=LTN
Filter: one departure dayhttps://emptylegslist.com/feed/empty-legs.json?date=2026-09-20

Filters take IATA codes and combine. The JSON URL accepts ?format=csv as well. Responses carry Access-Control-Allow-Origin: *, so a browser page can read the feed directly, and are cached for 30 minutes; the board itself is refreshed several times a day.

What a leg looks like

{
  "source": "Empty Leg List, https://emptylegslist.com",
  "documentation": "https://emptylegslist.com/open-data",
  "licence": "Free to use with attribution to emptylegslist.com. Operator names are not included.",
  "generated_at": "2026-09-08T18:02:11.412Z",
  "count": 1624,
  "legs": [
    {
      "id": "daebef2b-27e3-4344-8304-477d281e29ee",
      "url": "https://emptylegslist.com/flight/daebef2b-27e3-4344-8304-477d281e29ee",
      "from": { "label": "Nice", "iata": "NCE", "icao": "LFMN", "country": "FR", "lat": 43.6584, "lon": 7.21587 },
      "to":   { "label": "London Luton", "iata": "LTN", "icao": "EGGW", "country": "GB", "lat": 51.8747, "lon": -0.368333 },
      "departure_date": "2026-09-12",
      "aircraft_type": "Cessna Citation XLS",
      "seats": 8,
      "est_flight_time": null,
      "price": "EUR 4,900 listed",
      "notes": null,
      "region": "Europe",
      "first_seen_at": "2026-09-06T04:32:24Z",
      "last_seen_at": "2026-09-08T10:41:26Z"
    }
  ]
}

Fields

FieldMeaning
idStable identifier of the leg. The same leg keeps its id across refreshes; use it to spot new legs and legs that have gone.
urlThe leg's own page on this site, which also shows its history after it leaves the board.
from, tolabel is the place as the operator wrote it. iata and icao are set when the operator gave an airport code, otherwise null. country is ISO 3166 two letter. lat and lon are the coordinates of the airport the operator named, or of an airport in the named city when only the city was given; null when we could not place it.
departure_dateISO date. Operators publish the date, rarely the time, so there is no time field.
aircraft_type, seatsAs published by the operator. Null when not published.
est_flight_timeThe operator's own estimate when it publishes one. Null otherwise; we do not compute it.
priceThe operator's published price for the whole aircraft, as text, with currency, or null when the operator asks for an enquiry. Nothing here is estimated.
notesAnything else the operator published with the leg, for example occupancy or timing remarks.
regionEurope, North America, Middle East, Asia, Africa, South America or Oceania, from the departure airport.
first_seen_at, last_seen_atWhen we first recorded the leg and when we last saw it still published. A leg leaves the feed when the operator withdraws it or when its date passes.

What is not in it

Operator names and the page each leg came from: the site keeps those private for now. Historical legs are not in the feed either; the feed is the board as it stands. Each leg's page keeps its own history, and the full record since 30 July 2026, with first seen, last seen and gone dates on every leg, is the paid Empty Legs API.

Using it

From a terminal:

curl -s "https://emptylegslist.com/feed/empty-legs.json?from=NCE" | jq '.legs[] | {to: .to.label, date: .departure_date, price}'

In Python:

import requests
legs = requests.get("https://emptylegslist.com/feed/empty-legs.json").json()["legs"]
priced = [l for l in legs if l["price"]]
print(len(legs), "legs on the board,", len(priced), "with a price")

In Google Sheets, one cell:

=IMPORTDATA("https://emptylegslist.com/feed/empty-legs.csv")

For an AI assistant or agent: point it at the JSON URL. The documentation and licence fields travel with every response, so the assistant knows what it is reading and where it came from.

Terms

Free to use, commercially or not, with attribution to emptylegslist.com and a link where a link is possible. Do not present the data as your own or strip the leg pages' URLs. We ask for nothing else. The feed is provided as is: an operator can withdraw a leg at any moment, and a leg in the feed is not a confirmed availability, only what was published when we last checked.

The underlying function is hosted at https://wscowiseslaovmmfuzyv.supabase.co/functions/v1/public-feed; the site URL above is the one to build against, and it will keep working if the hosting moves.

Planned

A per-operator version of the feed for operators who list with us by agreement, with their name on the legs. It does not exist yet; if it would be useful to you, say so.