OpenSky Live Aircraft Tracker (ADS-B State Vectors) avatar

OpenSky Live Aircraft Tracker (ADS-B State Vectors)

Pricing

from $8.32 / 1,000 results

Go to Apify Store
OpenSky Live Aircraft Tracker (ADS-B State Vectors)

OpenSky Live Aircraft Tracker (ADS-B State Vectors)

Track every aircraft in the air right now via ADS-B. Query by bounding box, region preset or ICAO24 hex ids and get live position, altitude, speed, heading, squawk and identity as clean decoded fields. Export to JSON, CSV or Excel.

Pricing

from $8.32 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Lat

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

OpenSky Live Aircraft Tracker (ADS-B State Vectors)

OpenSky Live Aircraft Tracker (ADS-B State Vectors)

Here is one real result, with every field the actor returns:

{
"icao24": "44028a",
"callsign": "EJU62FU",
"originCountry": "Austria",
"longitude": -0.6368,
"latitude": 51.1368,
"baroAltitudeM": 3009.9,
"baroAltitudeFt": 9875,
"geoAltitudeM": 3169.92,
"geoAltitudeFt": 10400,
"onGround": false,
"velocityMs": 141.29,
"velocityKnots": 275,
"trueTrack": 248,
"headingCardinal": "WSW",
"verticalRateMs": 7.48,
"verticalRateFtMin": 1472,
"squawk": "5245",
"spi": false,
"positionSource": 0,
"positionSourceLabel": "ADS-B",
"category": null,
"categoryLabel": null,
"timePosition": 1786872409,
"timePositionIso": "2026-08-16T09:26:49.000Z",
"lastContact": 1786872409,
"lastContactIso": "2026-08-16T09:26:49.000Z",
"stateTimestamp": "2026-08-16T09:26:49.000Z",
"sensors": null,
"queriedRegion": "uk_ireland",
"observedAt": "2026-08-16T09:26:59.204Z",
"registration": "HB-JCO",
"aircraftType": "C Series 300",
"manufacturer": "Bombardier",
"operator": "Swiss International Air Lines",
"operatorCountry": "Switzerland",
"photoUrl": "https://airport-data.com/images/aircraft/001/682/001682490.jpg",
"airlineName": "British Airways",
"flightIata": "BA178",
"originAirport": "John F Kennedy International Airport",
"originIata": "JFK",
"destinationAirport": "London Heathrow Airport",
"destinationIata": "LHR",
"error": null
}

Track every aircraft in the air right now with a live flight tracker built on ADS-B state vectors. Point the actor at a bounding box, a named region preset, or a list of specific aircraft, and it returns one clean record per aircraft with live position, altitude, speed, heading, squawk and identity. The raw ADS-B state vector is decoded into labeled and derived fields, so you get altitude in both meters and feet, speed in knots, a cardinal compass heading, and a human-readable aircraft category label with no extra parsing. Two optional enrichments turn a raw transponder hex into a real identified aircraft (tail number, type, manufacturer and operating airline) and a bare callsign into a full flight route (airline, origin and destination airports).

📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples

Apify Coverage Output Billing

Table of contents

What it does

The actor queries the OpenSky Network live state vector feed, decodes every aircraft it returns, and writes one normalized record per aircraft to the run's dataset. It resolves your target airspace in one of three ways, applies the optional airborne filter, deduplicates by aircraft, and caps the output at your maxAircraft value.

Each raw state vector is decoded into named fields and enriched with derived values so you can sort, map and analyze immediately:

  • Altitude in meters and feet (baroAltitudeFt, geoAltitudeFt).
  • Ground speed in knots (velocityKnots) alongside meters per second.
  • Vertical rate in feet per minute (verticalRateFtMin).
  • Cardinal compass heading (headingCardinal, for example WSW) from the true track.
  • Human-readable positionSourceLabel (ADS-B, ASTERIX, MLAT, FLARM) and categoryLabel.
  • ISO timestamps for the position, last contact and the snapshot itself.

This is a live snapshot tool. It reports where aircraft are at the moment of the run.

Two optional paid add-ons enrich each aircraft from the keyless adsbdb reference database:

  • Aircraft identity (withAircraftMetadata): resolves the ICAO24 hex to its registration (tail number), aircraft type, manufacturer, operator (airline) and operator country, plus a photo URL.
  • Flight route (withFlightRoute): resolves the callsign to its scheduled route, so BAW178 becomes British Airways, JFK to LHR, with IATA flight number and airport codes.

Use cases

  • Live flight tracking and aircraft tracking over any region, bounding box or country.
  • Turn an ADS-B transponder hex (ICAO24) into a real aircraft: tail number, type, manufacturer and operating airline.
  • Resolve a flight callsign to its route: airline name, origin and destination airport with IATA codes.
  • Airspace monitoring and geofence alerts for airports, borders and no-fly zones.
  • Fleet and airline tracking: filter live aircraft by operator, aircraft type or region.
  • Aviation data feeds for dashboards, maps and analytics that need real-time plane positions.
  • Spotting and OSINT research on specific aircraft by ICAO24 hex or callsign.
  • Build a flight radar style map with altitude, speed, heading and squawk for every aircraft in view.

Quickstart

Open the actor, paste this into the input, and press Run. It returns 10 aircraft currently over the United Kingdom and Ireland.

{
"region": "uk_ireland",
"onlyAirborne": true,
"maxAircraft": 10
}

Every input field is optional. With an empty input the actor scans the europe region preset. Provide a bounding box or an ICAO24 list for finer control.

Input reference

FieldTypeRequiredDefaultDescription
regionenumnoeuropePredefined airspace to scan. One of europe, north_america, south_america, usa, uk_ireland, mediterranean, worldwide. worldwide uses no bounding box and returns a large result set. Ignored when a bounding box or ICAO24 list is provided.
latMinstringno(empty)Bounding box south edge in decimal degrees (-90 to 90). Provide all four bounding box fields to override the region preset.
lonMinstringno(empty)Bounding box west edge in decimal degrees (-180 to 180).
latMaxstringno(empty)Bounding box north edge in decimal degrees (-90 to 90).
lonMaxstringno(empty)Bounding box east edge in decimal degrees (-180 to 180).
icao24Liststring[]no(empty)Specific aircraft ICAO24 transponder hex ids, for example a835af, 4b1806. When provided, only these aircraft are returned. Highest precedence.
onlyAirbornebooleannofalseWhen true, aircraft reported on the ground are filtered out.
withAircraftMetadatabooleannofalseOptional paid add-on. Resolves each aircraft hex to its registration (tail number), type, manufacturer, operator and operator country plus a photo URL. Billed only per aircraft that is identified ($0.012 each). Disabled for free Apify plans.
withFlightRoutebooleannofalseOptional paid add-on. Resolves each callsign to its scheduled route (airline, IATA flight number, origin and destination airports and IATA codes). Billed only per callsign with a resolved route ($0.012 each). Disabled for free Apify plans.
maxAircraftintegerno100Maximum aircraft to return. Free Apify accounts are capped at 10 per run.
proxyConfigurationobjectnoApify ResidentialProxy settings. Residential is enabled by default and recommended, because OpenSky does not accept requests from datacenter IP ranges.

Precedence when more than one target is given: icao24List wins, then an explicit bounding box (all four fields set), then the region preset.

Output reference

One dataset item per aircraft. Types: string, number, integer, boolean, string[], or null when the source value is absent.

FieldTypeDescription
icao24stringUnique ICAO24 transponder address in hex. Stable per airframe.
callsignstringFlight callsign as broadcast, trimmed, or null when not transmitted.
originCountrystringCountry inferred from the transponder address range.
longitudenumberLast known longitude in decimal degrees.
latitudenumberLast known latitude in decimal degrees.
baroAltitudeMnumberBarometric altitude in meters.
baroAltitudeFtintegerBarometric altitude in feet (derived).
geoAltitudeMnumberGeometric (GPS) altitude in meters.
geoAltitudeFtintegerGeometric (GPS) altitude in feet (derived).
onGroundbooleantrue when the aircraft reports being on the ground.
velocityMsnumberGround speed in meters per second.
velocityKnotsintegerGround speed in knots (derived).
trueTrackintegerTrack over ground in degrees clockwise from geographic north.
headingCardinalstringCardinal compass direction of travel, for example N, NE, WSW (derived).
verticalRateMsnumberVertical rate in meters per second. Positive is climbing.
verticalRateFtMinintegerVertical rate in feet per minute (derived).
squawkstringTransponder squawk (Mode A) code, or null.
spibooleanSpecial purpose indicator flag.
positionSourceintegerPosition source code: 0 ADS-B, 1 ASTERIX, 2 MLAT, 3 FLARM.
positionSourceLabelstringHuman-readable position source (derived).
categoryintegerAircraft category code, or null when not broadcast.
categoryLabelstringHuman-readable aircraft category, for example Large (75000 to 300000 lbs) (derived).
timePositionintegerUnix time of the last position update.
timePositionIsostringISO 8601 timestamp of the last position update (derived).
lastContactintegerUnix time of the last message received from the aircraft.
lastContactIsostringISO 8601 timestamp of the last message received (derived).
stateTimestampstringISO 8601 timestamp of the state snapshot returned by OpenSky.
sensorsinteger[]Sensor ids that received messages, when available, otherwise null.
queriedRegionstringRegion preset used for the query, or null for bounding box and ICAO24 modes.
observedAtstringISO 8601 timestamp of when the record was collected.
registrationstringAircraft registration / tail number. Populated by the withAircraftMetadata add-on, otherwise null.
aircraftTypestringAircraft type / model. withAircraftMetadata add-on.
manufacturerstringAircraft manufacturer. withAircraftMetadata add-on.
operatorstringRegistered owner / operating airline. withAircraftMetadata add-on.
operatorCountrystringOperator country name. withAircraftMetadata add-on.
photoUrlstringAircraft photo URL. withAircraftMetadata add-on.
airlineNamestringOperating airline name for the callsign. Populated by the withFlightRoute add-on, otherwise null.
flightIatastringIATA flight number for the callsign. withFlightRoute add-on.
originAirportstringOrigin airport name. withFlightRoute add-on.
originIatastringOrigin airport IATA code. withFlightRoute add-on.
destinationAirportstringDestination airport name. withFlightRoute add-on.
destinationIatastringDestination airport IATA code. withFlightRoute add-on.
errorstringnull on success. On a failed run, a single item with a populated error field is written instead.

Derived field notes

  • Feet, knots and feet-per-minute are computed from the source SI values (meters × 3.28084, m/s × 1.94384, m/s × 196.85) and rounded to whole numbers.
  • headingCardinal maps trueTrack onto a 16-point compass rose.
  • categoryLabel follows the OpenSky aircraft category list. Many aircraft do not broadcast a category, in which case category and categoryLabel are null.

Example output record

Real record from a live run (input {"region": "uk_ireland", "onlyAirborne": true, "maxAircraft": 10}):

{
"icao24": "500402",
"callsign": "T7ZAM",
"originCountry": "San Marino",
"longitude": 0.1545,
"latitude": 51.3083,
"baroAltitudeM": 7338.06,
"baroAltitudeFt": 24075,
"geoAltitudeM": 7650.48,
"geoAltitudeFt": 25100,
"onGround": false,
"velocityMs": 238.84,
"velocityKnots": 464,
"trueTrack": 97,
"headingCardinal": "E",
"verticalRateMs": 9.1,
"verticalRateFtMin": 1791,
"squawk": "5257",
"spi": false,
"positionSource": 0,
"positionSourceLabel": "ADS-B",
"category": null,
"categoryLabel": null,
"timePosition": 1786872409,
"timePositionIso": "2026-08-16T09:26:49.000Z",
"lastContact": 1786872409,
"lastContactIso": "2026-08-16T09:26:49.000Z",
"stateTimestamp": "2026-08-16T09:26:49.000Z",
"sensors": null,
"queriedRegion": "uk_ireland",
"observedAt": "2026-08-16T09:26:59.288Z",
"error": null
}

Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.

Run synchronously and get dataset items in one call:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~opensky-live-aircraft-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"region":"europe","onlyAirborne":true,"maxAircraft":100}'

Start a run asynchronously:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~opensky-live-aircraft-scraper/runs?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"latMin":"49.5","lonMin":"-11.0","latMax":"61.0","lonMax":"2.0","maxAircraft":200}'

Apify CLI:

apify call scrapers_lat/opensky-live-aircraft-scraper \
--input '{"icao24List":["a835af","4b1806"]}'

Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.

Billing and limits

  • Pay per result. You are charged per aircraft record returned (result event). See the pricing tab for the current per-result price.
  • No charge on failure. If a run errors or is rate-limited by the source, the actor writes a single item with a populated error field and does not charge for it. Empty runs cost nothing.
  • Aircraft identity add-on (aircraft_metadata, $0.012). Opt-in via withAircraftMetadata, default off. Charged only per aircraft that is successfully identified (registration, type, operator). No match means no charge. Disabled for free Apify plans.
  • Flight route add-on (flight_route, $0.012). Opt-in via withFlightRoute, default off. Charged only per callsign with a resolved route (airline, origin, destination). Unknown callsign means no charge. Disabled for free Apify plans.
  • Spend cap respected. Set maxTotalChargeUsd on the run; once reached, the actor stops emitting and charging further billable results and add-ons.
  • Free Apify plans are capped at 10 aircraft per run, and the paid add-ons are disabled. Upgrade for a higher maxAircraft and to enable enrichments.

FAQ and troubleshooting

A run returned 0 aircraft. Why? No aircraft were in the requested airspace at that moment, or your ICAO24 ids are not currently being tracked. Widen the bounding box, choose a busier region, or try again. Zero-result runs are not charged.

Why do I need the Residential proxy? The OpenSky Network does not accept requests from datacenter IP ranges, so the actor routes through Apify Residential proxy by default. Leave the default proxy setting in place for reliable results.

How fresh is the data? It is a live snapshot at run time. OpenSky anonymous access serves current state vectors at roughly 10-second time resolution. Each record carries lastContactIso and stateTimestamp so you know exactly how recent the position is.

Can I get historical flights or tracks? No. This actor returns live states only. OpenSky historical endpoints (past flights and tracks) require an authenticated account and return HTTP 403 for anonymous access, so they are out of scope here.

Can I get the flight route (origin and destination)? Yes. Enable the withFlightRoute add-on and each aircraft with a callsign is resolved to its scheduled route: airline name, IATA flight number, and origin and destination airports with IATA codes. Unknown callsigns are left as null and are not charged.

How do I turn a transponder hex into a real aircraft? Enable the withAircraftMetadata add-on. Each ICAO24 hex is resolved to its registration (tail number), type, manufacturer, operator and operator country plus a photo URL. Hexes with no reference match are left as null and are not charged.

I got a rate-limit message. What happened? OpenSky anonymous access is rate-limited (roughly 400 requests per day across the network). If the quota is hit, the actor retries once with backoff and, if still limited, writes an unbilled error row instead of crashing. Wait a short while and run again.

Why is callsign, category, or squawk null? Not every aircraft broadcasts every field. Missing source values are returned as null, never invented. Aircraft category in particular is frequently absent from ADS-B transmissions.

Is this an official OpenSky tool? No. This actor is independent and has no affiliation with the OpenSky Network. It reads only data that is publicly available through the OpenSky live states API. Use it in accordance with the OpenSky Network terms of use.

More scrapers at scrapers.lat

Built and maintained by scrapers.lat, where we publish scrapers for public platforms: company registries, government data, aviation, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.


Independent tool, not affiliated with the OpenSky Network. Accesses only publicly available OpenSky live states data. Use in accordance with the OpenSky Network terms of use.