Open data
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.
| What | URL |
|---|---|
| JSON, every leg on the board | https://emptylegslist.com/feed/empty-legs.json |
| CSV, same rows | https://emptylegslist.com/feed/empty-legs.csv |
| Filter: departure airport | https://emptylegslist.com/feed/empty-legs.json?from=NCE |
| Filter: arrival airport | https://emptylegslist.com/feed/empty-legs.json?to=LTN |
| Filter: one departure day | https://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.
{
"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"
}
]
}
| Field | Meaning |
|---|---|
id | Stable identifier of the leg. The same leg keeps its id across refreshes; use it to spot new legs and legs that have gone. |
url | The leg's own page on this site, which also shows its history after it leaves the board. |
from, to | label 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_date | ISO date. Operators publish the date, rarely the time, so there is no time field. |
aircraft_type, seats | As published by the operator. Null when not published. |
est_flight_time | The operator's own estimate when it publishes one. Null otherwise; we do not compute it. |
price | The 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. |
notes | Anything else the operator published with the leg, for example occupancy or timing remarks. |
region | Europe, North America, Middle East, Asia, Africa, South America or Oceania, from the departure airport. |
first_seen_at, last_seen_at | When 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. |
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.
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.
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.
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.