API
Live aircraft, flights with expected arrival times, flight paths, airport boards and traffic corridors, as JSON. No key needed.
https://planedata.io · all times are Unix seconds (UTC) · distances in km
unless named otherwise · CORS is open, so you can call it from a web page.
Fair use
Each address can make 120 requests a minute. Feeders get 1,200: requests from the address your
receiver feeds from are recognised automatically, with nothing to sign up for (start feeding).
Every response carries X-RateLimit-Limit and X-RateLimit-Remaining; over the limit you get
429 with Retry-After. Live positions change every few seconds at most, so polling
/api/states/all more than once every 5 seconds gains nothing.
Data licences
The data is combined from planedata.io feeders and other networks, each with its own terms. Using it means
respecting them: OpenSky Network data is for research and non-commercial use with credit to “The OpenSky Network”;
adsb.lol data is under the ODbL (credit adsb.lol and share alike). Aircraft, airline and airport reference data
comes from tar1090-db, OurAirports (public domain) and Virtual Radar Server’s standing data (CC0).
/api/states/all names the sources in its attribution field.
Endpoints: Live aircraftAircraft detailsFlight number Flight pathAircraft historyRaw positions Airport boardCorridorsFeeders wanted Feeders
GET/api/states/all
Every aircraft heard recently, in the OpenSky state-vector layout, so OpenSky clients work unchanged. Each row is
[icao24, callsign, country, time_position, last_contact, lon, lat, baro_alt_m, on_ground, speed_m_s,
track_deg, vertical_rate_m_s, null, geo_alt_m, squawk, false, position_source] followed by planedata extras:
17 registration, 18 ICAO type, 19 origin, 20 destination,
21/22 destination lat/lon, 23 destination observed (true) or expected (false).
The lost list has aircraft that are out of coverage but still being estimated (cruising, not
landed), in the same layout with their last known values.
curl https://planedata.io/api/states/all
Supports ETag / If-None-Match and gzip.
GET/api/flight?icao24={hex}
One aircraft: registration, type, year and operator; airline and flight number; and its current or last flight
with origin, destination, takeoff and landing times and, in the air, progress: time in the air,
distance left and expected landing (eta, with eta_method speed,
history or blend).
curl "https://planedata.io/api/flight?icao24=a2000d"
GET/api/callsign/{flight}
A flight number’s current flight (with position and expected landing), its previous flights over the last 60 days
(departure and arrival airports and times, duration, aircraft) and its usual pattern: airport pairs, typical
departure time, typical duration and days of the week. Accepts ICAO callsigns (ASA673) and airline
flight numbers (AS673).
curl https://planedata.io/api/callsign/ASA673
Each airport carries how it was determined: ground, climb or
approach (observed), history (this flight number’s earlier flights), schedule
(published route list) or manual.
GET/api/flights/{id}/path
One flight’s path as GeoJSON lines, each with a kind: observed (positions received),
gap (great circle across a coverage gap, estimated) and estimate (the rest of the way to the
destination, for a flight still in the air). Flight ids come from the two endpoints above.
GET/api/flights?icao24={hex}
An aircraft’s last 25 flights, newest first.
GET/api/tracks/all?icao24={hex}
The aircraft’s current flight track in OpenSky’s track format (with speed and vertical rate added).
GET/api/positions?icao24={hex}&from={t}&to={t}
Recorded fixes (about one a minute) for up to 31 days at a time: time, position, altitudes, speed, track, vertical
rate, squawk, containment radius rc_m (useful as measurement noise for filtering) and how the position
was obtained.
GET/api/airports/{code}/board
An airport’s arrivals in the air (with expected landing and distance left), departures, landings in the last
6 hours and aircraft on the ground. ICAO or IATA codes. The same board as a page:
/airport/KLAX, and embeddable with ?embed=1.
curl https://planedata.io/api/airports/KLAX/board
GET/api/airways?s={lat}&w={lon}&n={lat}&e={lon}&band={0|1}
Traffic corridors from the last 24 hours as GeoJSON: per corridor a median line (kind: center), the
area holding the middle 80% of its flights (band) and the furthest flight on each side
(outer), with flights per day, width, and two-way counts. band=1 above 18,000 ft,
0 below.
GET/api/coverage/wanted
Airports where a receiver would help most: many movements in the last 7 days, few of them seen near the airport.
GET/api/feeders
Feeders connected now: MLAT name, area rounded to ~10 km (hidden for private feeders), message and position rates, MLAT peers.
GET/api/feeders/me
Your own feeder, recognised by the address you call from: connection status, rates, MLAT status and UUID.
Other endpoints
/api/health (server status) · /logo/{airline}.svg (airline logo or badge).