OpenSky Live Flight Tracking Scraper avatar

OpenSky Live Flight Tracking Scraper

Pricing

from $1.75 / 1,000 results

Go to Apify Store
OpenSky Live Flight Tracking Scraper

OpenSky Live Flight Tracking Scraper

Live ADS-B aircraft positions worldwide plus airport arrival and departure history, from the OpenSky Network. Turns OpenSky's bare positional arrays into named fields, strips padded callsigns and keeps barometric and GNSS altitude apart.

Pricing

from $1.75 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Live ADS-B aircraft positions worldwide, plus airport arrival and departure history, from the community-run OpenSky Network. Around 8,600 aircraft are airborne at any moment.

Free, no API key, no login, no WAF.

What this actor is actually for

OpenSky returns each aircraft as a bare 17-element array:

["4bb143","THY4 ","Turkey",1787703164,1787703164,5.2191,52.5453,
10668,false,255.01,122.73,0,null,10980.42,"1166",false,0]

Nothing in the payload says what any position means. Every consumer has to carry the index table, and — worse — an index-based reader keeps working if OpenSky ever inserts a column, silently returning altitude where velocity used to be. This actor turns those into named fields, refuses a row whose layout does not match rather than guessing, and fixes three things upstream gets awkwardly right.

Input

FieldTypeDefaultMeaning
modeenumliveStatesliveStates (airborne now) or flights (airport history).
boundingBoxesstring[]lamin,lomin,lamax,lomax, e.g. 51,3,53,6. Empty = whole world.
icao24Codesstring[]Restrict to specific transponder addresses.
airportsstring[]flights mode. ICAO codes, e.g. EHAM.
directionenumbothflights mode.
hoursBackinteger6flights mode, max 24 — see below.
maxResultsPerQueryinteger5000 = unlimited.
{ "mode": "liveStates", "boundingBoxes": ["51,3,53,6", "40,-75,43,-70"] }

Four things this actor will not let you get wrong

1. Every callsign is whitespace-padded

"THY4 ", not "THY4" — measured on 8,436 of 8,450 non-empty callsigns worldwide. Any join, group-by or lookup on the raw value fails silently and completely. Stripped into callsign, with the wire value kept in callsignRaw.

2. There are two altitudes, both in metres, and they differ on every row

baroAltitude (barometric) and geoAltitude (GNSS) differed on every single row measured — commonly by 300–450 m. On one live sample the gap was 457 m: picking the wrong field is a 1,500 ft error.

Both are published, in metres and feet, under names that say which is which, plus altitudeDeltaM. Neither is presented as "the" altitude.

3. Nulls are invisible in a small sample

A 12-aircraft bounding box showed zero nulls in every field. The identical request over the whole world showed 97 aircraft with no position fix, 895 with no barometric altitude, and 168 with a blank callsign.

A null latitude read as 0 puts an aircraft in the Gulf of Guinea, so hasPosition is a field rather than something you infer, and the summary counts aircraftWithoutPosition and aircraftWithoutAltitude per run.

4. A 404 [] means "no flights" or "no such airport" — identically

/flights/arrival?airport=EHAM (quiet window) -> 404 []
/flights/arrival?airport=ZZZZ (no such code) -> 404 []

Byte-identical. Upstream cannot tell you which it was, so the ICAO code shape is validated here (4 letters), and when a well-formed code still returns nothing the error is no_results_or_unknown_airport — which says plainly that the two cannot be separated, instead of picking one and sounding confident.

Also: the anonymous history wall

A window 1 day back is served; 2 days back answers

403 "You cannot access historical flights"
. That 403 is reported as its own error and never folded into "no results" — those are the two answers a user must not see confused. hoursBack is capped at 24 with the measurement in the message.

Output

Envelope on every row: _input, _source, _scrapedAt, recordType.

  • AIRCRAFT_STATE — named fields, both altitudes in m and ft, speed in m/s, knots and km/h, vertical rate in m/s and ft/min, positionSourceName, ISO timestamps, hasPosition
  • FLIGHT — departure/arrival airports, first/last seen, duration
  • SEARCH_SUMMARY — counts, creditsRemaining, null counts, paddedCallsignsCleaned, malformedRowsSkipped
  • ERROR_error + _errorDetail

Credits

Anonymous users get 400 credits a day, shared per IP; a bounding box costs 1–4 depending on area. OpenSky publishes x-rate-limit-remaining — unusual enough that this actor surfaces it as creditsRemaining on every summary. It is reported, not used to predict cost: the counter is shared and was observed to refill mid-run. A free account raises the budget.