planedata.io

API

Live aircraft, flights with expected arrival times, flight paths, airport boards and traffic corridors, as JSON. No key needed.

Base URL 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).