OpenSky Live Aircraft Tracker (ADS-B State Vectors)
Pricing
from $8.32 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
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
Table of contents
- What it does
- Use cases
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
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 exampleWSW) from the true track. - Human-readable
positionSourceLabel(ADS-B, ASTERIX, MLAT, FLARM) andcategoryLabel. - 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, soBAW178becomes 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
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
region | enum | no | europe | Predefined 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. |
latMin | string | no | (empty) | Bounding box south edge in decimal degrees (-90 to 90). Provide all four bounding box fields to override the region preset. |
lonMin | string | no | (empty) | Bounding box west edge in decimal degrees (-180 to 180). |
latMax | string | no | (empty) | Bounding box north edge in decimal degrees (-90 to 90). |
lonMax | string | no | (empty) | Bounding box east edge in decimal degrees (-180 to 180). |
icao24List | string[] | no | (empty) | Specific aircraft ICAO24 transponder hex ids, for example a835af, 4b1806. When provided, only these aircraft are returned. Highest precedence. |
onlyAirborne | boolean | no | false | When true, aircraft reported on the ground are filtered out. |
withAircraftMetadata | boolean | no | false | Optional 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. |
withFlightRoute | boolean | no | false | Optional 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. |
maxAircraft | integer | no | 100 | Maximum aircraft to return. Free Apify accounts are capped at 10 per run. |
proxyConfiguration | object | no | Apify Residential | Proxy 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.
| Field | Type | Description |
|---|---|---|
icao24 | string | Unique ICAO24 transponder address in hex. Stable per airframe. |
callsign | string | Flight callsign as broadcast, trimmed, or null when not transmitted. |
originCountry | string | Country inferred from the transponder address range. |
longitude | number | Last known longitude in decimal degrees. |
latitude | number | Last known latitude in decimal degrees. |
baroAltitudeM | number | Barometric altitude in meters. |
baroAltitudeFt | integer | Barometric altitude in feet (derived). |
geoAltitudeM | number | Geometric (GPS) altitude in meters. |
geoAltitudeFt | integer | Geometric (GPS) altitude in feet (derived). |
onGround | boolean | true when the aircraft reports being on the ground. |
velocityMs | number | Ground speed in meters per second. |
velocityKnots | integer | Ground speed in knots (derived). |
trueTrack | integer | Track over ground in degrees clockwise from geographic north. |
headingCardinal | string | Cardinal compass direction of travel, for example N, NE, WSW (derived). |
verticalRateMs | number | Vertical rate in meters per second. Positive is climbing. |
verticalRateFtMin | integer | Vertical rate in feet per minute (derived). |
squawk | string | Transponder squawk (Mode A) code, or null. |
spi | boolean | Special purpose indicator flag. |
positionSource | integer | Position source code: 0 ADS-B, 1 ASTERIX, 2 MLAT, 3 FLARM. |
positionSourceLabel | string | Human-readable position source (derived). |
category | integer | Aircraft category code, or null when not broadcast. |
categoryLabel | string | Human-readable aircraft category, for example Large (75000 to 300000 lbs) (derived). |
timePosition | integer | Unix time of the last position update. |
timePositionIso | string | ISO 8601 timestamp of the last position update (derived). |
lastContact | integer | Unix time of the last message received from the aircraft. |
lastContactIso | string | ISO 8601 timestamp of the last message received (derived). |
stateTimestamp | string | ISO 8601 timestamp of the state snapshot returned by OpenSky. |
sensors | integer[] | Sensor ids that received messages, when available, otherwise null. |
queriedRegion | string | Region preset used for the query, or null for bounding box and ICAO24 modes. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
registration | string | Aircraft registration / tail number. Populated by the withAircraftMetadata add-on, otherwise null. |
aircraftType | string | Aircraft type / model. withAircraftMetadata add-on. |
manufacturer | string | Aircraft manufacturer. withAircraftMetadata add-on. |
operator | string | Registered owner / operating airline. withAircraftMetadata add-on. |
operatorCountry | string | Operator country name. withAircraftMetadata add-on. |
photoUrl | string | Aircraft photo URL. withAircraftMetadata add-on. |
airlineName | string | Operating airline name for the callsign. Populated by the withFlightRoute add-on, otherwise null. |
flightIata | string | IATA flight number for the callsign. withFlightRoute add-on. |
originAirport | string | Origin airport name. withFlightRoute add-on. |
originIata | string | Origin airport IATA code. withFlightRoute add-on. |
destinationAirport | string | Destination airport name. withFlightRoute add-on. |
destinationIata | string | Destination airport IATA code. withFlightRoute add-on. |
error | string | null 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. headingCardinalmapstrueTrackonto a 16-point compass rose.categoryLabelfollows the OpenSky aircraft category list. Many aircraft do not broadcast a category, in which casecategoryandcategoryLabelarenull.
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:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "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 (
resultevent). 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
errorfield and does not charge for it. Empty runs cost nothing. - Aircraft identity add-on (
aircraft_metadata, $0.012). Opt-in viawithAircraftMetadata, 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 viawithFlightRoute, 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
maxTotalChargeUsdon 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
maxAircraftand 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.
