OpenSky Network / ADS-B: Intelligence Source Guide
OpenSky Network is a non-profit, research-governed ADS-B and Mode S receiver network that publishes live aircraft state vectors and, for researchers, a deep historical archive. It is the reference source for air movement analysis that has to survive scrutiny.
OpenSky Network is a non-profit, research-governed ADS-B and Mode S receiver network that publishes live aircraft state vectors and, for researchers, a deep historical archive. It is the reference source for air movement analysis that has to survive scrutiny.
At a glance
| Source | OpenSky Network / ADS-B |
|---|---|
| Category | Aviation & Space › ADS-B & Flight Tracking |
| Homepage | https://opensky-network.org/ |
| Machine interface | https://opensky-network.org/api/states/all |
| Format | JSON |
| Access | Open — no account required |
| Disciplines | Aviation Intelligence |
| Mission domains | Aviation Security, Military & Defense, Border Security & Migration |
Live aircraft tracking (ADS-B). — as catalogued in the platform’s own source registry.
OpenSky Network is a community sensor network operated by a non-profit association with roots in European academic and defence-research institutions. Volunteers and institutions run receivers that decode 1090 MHz Mode S and ADS-B transmissions and forward the raw messages to a central infrastructure, where they are timestamped, deduplicated, multilaterated where enough receivers heard the same aircraft, and assembled into state vectors. The live REST interface returns those state vectors: one row per aircraft currently tracked, carrying the 24-bit ICAO address, callsign, position, altitudes, velocity, heading, vertical rate, ground flag, transponder squawk and an indication of which technology produced the position. Alongside the live interface, the project maintains a large historical archive of raw and processed data made available to researchers, and publishes curated datasets built from it. The distinguishing architectural fact is that OpenSky retains the underlying messages rather than only the derived tracks, which is what makes retrospective and methodological work possible in a way that consumer flight trackers do not support.
The analytical job this source does that others do not is defensible air movement analysis over time. Consumer flight-tracking products are optimised for showing you a flight now; OpenSky is optimised for letting you demonstrate what was observed, by which sensors, with what confidence, months later. It is governed by a research association with a published methodology rather than by a commercial operator with customer relationships that shape what is displayed, and it does not apply the aircraft-blocking arrangements that commercial trackers maintain with owners and operators. For AVINT work on state aircraft, sanctions-relevant movements, military logistics or unusual flight behaviour, that difference is the whole point: the aircraft most worth watching are disproportionately the ones commercial platforms are asked not to show. The corpus also supports the meta-question that matters for any air movement claim – what was the sensor coverage at the time – because receiver metadata and the multilateration record are part of the archive rather than hidden behind a rendered map.
Who publishes it, and why that matters
The network is run by a Swiss-registered non-profit association that grew out of academic research on air traffic surveillance, and its funding comes from institutional members, research grants and contributions rather than from selling data. That produces genuine independence and a strong bias towards research access, and it also produces the constraints you will feel: limited engineering capacity, an API that changes when the association decides it needs to, and access policies that have tightened as costs rose. The association has moved its authentication model and its rate limiting more than once, most recently towards token-based authentication with a credit-style quota, and the practical effect is that integrations built two years ago break. Confirm the current authentication and quota model in the official documentation before you design anything around it. The longevity outlook is good by the standards of volunteer networks – institutional backing and a research constituency make abandonment unlikely – but the terms of access should be treated as subject to change rather than as a stable platform commitment.
Provenance is the first question to ask of any dataset and the one most often skipped. Who collects it, what their incentive is, whether they publish a methodology, and whether they correct the record when they get something wrong all bear directly on how much weight a finding drawn from it can carry.
What a record actually contains
The fields you will be working with, what each one means, and whether it is something you can pivot on. Read the meanings carefully — more analysis is wrecked by misreading a field than by failing to find one, and a field that looks like an observation is often an inference.
| Field | Type | What it means | Pivot value |
|---|---|---|---|
icao24 |
string | The 24-bit ICAO transponder address in lowercase hex. The only durable identity in the record, and even it changes when an airframe is re-registered to a different state. | Aircraft type and operator via adsbdb or hexdb.io, national registry, country allocation block, historical track queries. |
callsign |
string | The identifier the crew entered in the transponder, padded to eight characters with trailing spaces. It is typed by humans and is not authenticated by anything. | Route resolution, schedule matching, operator inference – all of which fail on charters, ferries and military callsigns. |
origin_country |
string | The country derived from the ICAO address allocation block. It is the state of registry, not the departure country, not the operator's nationality and not where the flight began. | State of registry only. Misreading this as flight origin is the single most common beginner error with this source. |
time_position |
timestamp | Unix time of the last position update. If it is significantly older than last_contact, the aircraft is still transmitting but its position has gone stale. | Track continuity assessment; detecting the moment an aircraft left coverage or stopped broadcasting position. |
last_contact |
timestamp | Unix time of the last message of any kind from this address. The difference between this and time_position is a direct measure of record freshness. | Data quality gating; distinguishing a departed aircraft from a coverage gap. |
longitude / latitude |
float | WGS84 position in decimal degrees, from ADS-B, multilateration or another source as indicated by position_source. Accuracy differs by an order of magnitude between those sources. | Geospatial correlation, airport and airspace assignment, corridor and pattern analysis. |
baro_altitude |
float | Barometric altitude in metres referenced to standard pressure. Below transition altitude this is not the aircraft's height above the ground and can be out by hundreds of feet. | Flight phase inference, but only in combination with geo_altitude and the on_ground flag. |
geo_altitude |
float | GNSS-derived altitude in metres. Present less often than barometric altitude, and the two disagree routinely and legitimately. | Cross-check on vertical profile; the better choice for terrain-relative work when available. |
on_ground |
bool | Aircraft-reported ground flag. It is derived from the aircraft's own logic and is wrong often enough that it should never be the sole basis for a landing or departure conclusion. | Movement segmentation, combined with altitude and velocity rather than alone. |
velocity |
float | Ground speed in metres per second. Not airspeed, and therefore heavily influenced by wind, which matters when comparing performance between flights. | Flight phase, aircraft class inference, anomaly detection against a route baseline. |
true_track |
float | Track angle over ground in degrees clockwise from true north. Not the aircraft's heading; in strong wind the two differ noticeably. | Route and corridor analysis, orbit and holding pattern detection. |
vertical_rate |
float | Climb or descent rate in metres per second, positive for climb. Noisy on a single sample and meaningful only when smoothed across a track. | Approach, departure and level-off detection; identifying unusual descent profiles. |
squawk |
string | The four-digit Mode 3/A transponder code. Reserved codes carry defined meanings and are among the few fields with standardised international semantics. | Emergency and special-status detection, conspicuity code analysis, national code block conventions. |
position_source |
enum | Which technology produced the position – ADS-B, a radar-derived feed, multilateration, or a general aviation network. Positional accuracy and trustworthiness differ substantially between them. | Confidence weighting; any precision claim must be conditioned on this field. |
sensors |
array | Identifiers of the receivers that contributed, where exposed. This is the provenance record that makes a coverage argument possible. | Coverage modelling, receiver reliability assessment, defensible negative findings. |
Coverage — and what is not in it
Coverage follows receivers, and receivers follow population, hobbyist density and institutional participation. Europe is exceptionally well covered, to the point where multilateration works over much of the continent and low-altitude traffic is visible. North America is well covered. Coverage across East Asia, Australia, the Gulf, India and parts of Latin America is good near major cities and thins quickly away from them. Large areas of Africa, Central Asia, Siberia and the interior of South America have sparse or no coverage. Oceans are effectively uncovered except close to coasts and islands, because 1090 MHz is line-of-sight and there are no mid-ocean receivers; the satellite-based ADS-B services that solve this problem commercially are not part of this network. Vertically, coverage is best at cruise altitude and degrades sharply near the ground, so departures and arrivals are frequently truncated even at well-covered airports. The live interface reflects the current instant; the historical archive extends back years and is the reason the source supports longitudinal work, with the crucial caveat that the network was much smaller in its early years, so any trend measured across the archive is confounded with the growth of the network itself.
Known blind spots
Absence of evidence here is not evidence of absence. These are the conditions under which OpenSky Network / ADS-B will not show you something that is nevertheless real:
- An aircraft with its transponder switched off is entirely invisible, and this is the normal operating condition for military aviation conducting operations rather than transiting the civil system.
- Ocean crossings and remote overflight disappear from the record between coastal receivers, so a track that ends mid-Atlantic and resumes hours later is a coverage artefact rather than an event.
- Older general aviation aircraft in jurisdictions without an ADS-B mandate transmit Mode S or nothing at all, and Mode S alone yields no position unless multilateration coverage is dense enough, which it usually is not.
- Privacy programmes allow some aircraft to broadcast a temporary or alternate 24-bit address, which breaks the link between the observed identity and the registry and does so precisely for the owners most motivated to avoid observation.
- Low-altitude and ground movement coverage is poor almost everywhere, so taxi, circuit and helicopter activity is systematically under-represented compared with airline cruise traffic.
- The archive's coverage grew enormously over its lifetime, which means any time series drawn from it measures the network as much as it measures aviation unless coverage is explicitly controlled for.
- ADS-B carries no authentication of any kind, so a deliberately falsified broadcast is indistinguishable from a real one at the message level and can only be caught by physical plausibility checks and multi-receiver geometry.
- Coverage in areas of active conflict is unpredictable in both directions – receivers go offline, and jamming or spoofing of navigation systems corrupts the positions aircraft themselves report.
- The live interface is a snapshot rather than a stream, so events shorter than your polling interval are simply absent from the record you build, without leaving any indication that they occurred.
Write the blind spot into the product. A statement that something “was not observed in OpenSky Network / ADS-B” is defensible; a statement that it “did not happen” is not, and the difference is what survives cross-examination.
Access, licensing and what you may do with it
Access model: Open — no account required
The live state vector interface is reachable without an account, but anonymous use is heavily constrained and is only suitable for evaluation. For any real work, create an account and use the authenticated route; the project has moved towards token-based authentication and away from older credential schemes, and the documentation is the only place to confirm what is current. Quota is applied in a credit style rather than a simple requests-per-minute cap, with the cost of a query scaled by the size of the area you request, so a well-bounded bounding box is not just polite but materially cheaper than a global pull. Contributing a receiver raises your allowance and is the recommended path for institutions with a sustained requirement. Historical data is a separate track: bulk and archival access is granted for research purposes through the project's own process rather than through the public API, and lead times should be planned for. There is also a mature Python ecosystem around the network, and using an established client library rather than hand-rolling requests will save you from most of the pagination, timing and quota mistakes.
Licence
The data is made available primarily for research and non-commercial use, and commercial or redistributive use requires a separate arrangement with the association. This is not boilerplate – the non-profit's funding model depends on it, and the distinction between analysis for an internal investigation, analysis sold as a product, and republication of the underlying data is exactly where the line falls. The terms have been revised as the project's access model changed, so confirm the current text on the project's own site before relying on any characterisation of them, including this one. If you are a commercial entity, the professional route is to approach the association and agree terms rather than to reason about whether your use case is arguably research. Separately, note that licence permission is not the same as legal permission: what you may do with the data under the association's terms and what you may lawfully do with tracking data on identifiable individuals under your local privacy law are different questions with different answers.
Rate limits and fair use
Plan around area-scaled quota rather than request counts. A tightly bounded bounding box costs a fraction of a global query, so define your area of interest precisely and query it repeatedly rather than pulling the world and filtering. Anonymous access is suitable only for testing. Registered access supports a modest continuous workload; contributing receivers raises it further. If you need higher temporal resolution than your quota supports, the correct answer is usually to narrow the geography rather than to open more accounts, which will be noticed and is a straightforward breach of the terms. For historical work, do not attempt to reconstruct an archive by polling the live interface for months – use the research access route, which exists precisely to avoid that pattern.
Licensing changes, and it changes without warning. A dataset that was free for research this year may not be free for commercial or evidential use next year. Confirm the current terms before you build a dependency on it, and record the terms you relied on alongside the data — the licence in force at the time of collection is part of the provenance.
Collecting it
How OpenSky Network / ADS-B is actually pulled, in the order you would set it up. Prefer the bulk or export interface over per-item lookups wherever one exists: it is kinder to the publisher, faster for you, and gives a reproducible snapshot rather than a series of point-in-time answers you cannot reconstruct later.
| Method | Format | Cadence | Notes |
|---|---|---|---|
| Live state vectors, bounded | JSON | poll every 10 to 60 seconds depending on quota and need | The default method. Constrain by bounding box, and record your polling interval alongside the data because it determines what you could and could not have seen. |
| Live state vectors, by aircraft | JSON | poll on a schedule matched to the target's operating pattern | Query specific 24-bit addresses when watching a defined set of airframes. Far cheaper in quota than geographic polling and far less revealing of your geographic interest. |
| Flight and track queries | JSON | on demand, after the fact | Retrieve assembled flights and tracks for an aircraft or airport over a past window. Useful for reconstruction, subject to the archive's retention and access policy. |
| Historical archive access | bulk | batch, on approval | The route for genuine longitudinal research. Requires an application and lead time, and returns data at a volume that needs real infrastructure to process. |
| Own receiver contribution | bulk | real time | Feeding raises your access tier and gives you a first-party stream for your own area, with provenance you control and no dependency on the aggregate for local coverage. |
| Curated published datasets | CSV | as published | The project and its research community publish prepared datasets for specific studies. These are cleaned and documented, which makes them a better starting point than raw data for methodological work. |
Ingesting it into the platform
Every step below is idempotent and cursor-based: interrupt one and it resumes from where it stopped rather than duplicating rows or losing progress. Collection is recorded per source, so a feed that quietly stops publishing shows up as a stale timestamp instead of silently thinning your coverage.
- Register and scope the source — Add OpenSky in sources.php with the areas of interest and polling cadence recorded explicitly, so the collection geometry is part of the source definition rather than buried in a script.
- Schedule bounded collection — Drive the pull from collect.php on a cron.php schedule with per-area bounding boxes, and treat a missed run as a recorded gap rather than something the data silently absorbs.
- Normalise the state vector — In ingest.php, trim callsign padding, convert altitudes and speeds to your standard units, and store position_source and the receiver provenance alongside every position rather than discarding them.
- Assemble tracks from snapshots — Group consecutive state vectors by 24-bit address into flight segments, breaking on long gaps, and mark every break as either a genuine end or a coverage loss based on whether other aircraft were being seen in the same area.
- Resolve aircraft identity — Run resolve-everything.php to attach type, operator and registration from the aircraft database sources, keeping the resolved identity separate from the broadcast callsign so that disagreement between them stays visible.
- Correlate with other collection — Use correlate.php to join tracks against datalink messages, sanctions and ownership records, and event reporting, so an aircraft becomes an entity in the case rather than a line on a map.
- Render and interrogate — Work the result in timeline.php and link-analysis.php, using explore.php and pivot.php to move between aircraft, operator, airport and country entities without losing the underlying observations.
- Alert on defined behaviour — Configure alert rules for watched addresses, emergency squawks, and appearances in defined geographies, so that a movement is reported when it happens rather than found in a later review.
Registered sources and their last-collected state are listed in sources.php, and the scheduled chain that keeps them current is in automation.php.
How it is wrong, and how to tell
Every dataset is wrong in characteristic ways. Knowing which ways is the difference between using a source and being used by one, and it is the part of source evaluation most often skipped because it is the part that takes work.
This is the highest-quality open air movement source available, and the basis for saying so is methodological rather than reputational. Positions originate from the aircraft's own navigation systems and are relayed without a commercial intermediary editing the result; the network retains provenance down to the contributing receivers; multilateration provides an independent positional method that can be checked against the broadcast one; and the research governance means the methodology is published and criticised rather than proprietary. Within its coverage, positional accuracy is limited by the aircraft's own equipment rather than by the network, which is to say it is good. The weaknesses are all about what is missing rather than what is wrong: coverage gaps that are structural, a total absence of message authentication that leaves the source open to deliberate falsification, and an archive whose own growth confounds long-run comparisons. Judge any specific finding by three things – the position_source, the density of receivers in that place and time, and whether the track is physically coherent – and be prepared to state all three in writing.
Characteristic false positives
- The origin_country field is the state of registry derived from the address block, and reading it as the flight's departure country or the operator's nationality produces confident and completely wrong geopolitical claims. This is the most frequently repeated error in published work using ADS-B.
- Callsigns are typed by crews and are neither unique nor authenticated; the same callsign recurs daily on different airframes, ferry and charter flights use ad hoc strings, and a typo produces a callsign that resolves to a real but unrelated route.
- Multilaterated positions are far less accurate than ADS-B positions and degrade badly with poor receiver geometry, so a track that looks jittery near the edge of coverage is usually a geometry artefact rather than erratic flying.
- Barometric altitude referenced to standard pressure is not height above ground, and treating it as such near an airport, in a mountainous area or on a non-standard pressure day yields altitude errors of hundreds of feet in the phase of flight where precision matters most.
- A stale state vector persists in the live response with an old time_position while last_contact continues to update, so an aircraft can appear parked at its last known position while actually flying outside coverage.
- ADS-B is unauthenticated, and deliberately falsified broadcasts – whether as research demonstrations, pranks or information operations – enter the network like any other message and are only detectable through physical implausibility or receiver geometry.
- GNSS jamming and spoofing in and around conflict zones corrupts the position the aircraft itself computes, so the network faithfully records a wrong position that no amount of downstream processing can correct.
- The on_ground flag is aircraft-derived and unreliable at the margins, so landings and departures inferred from it alone will include events that did not happen and miss ones that did.
None of these make the source unusable. They make it a source that requires corroboration before an assertion built on it goes into a product, which is true of every source and admitted by few.
Ageing
A state vector is stale within seconds – it describes an instant, and the live interface will happily return a record whose position update is minutes old. Check time_position against your query time on every record and set an explicit freshness threshold rather than assuming the response is current. Assembled tracks do not age at all as historical observations, but everything you attached to them does: aircraft change operators, registrations transfer, ICAO addresses change with re-registration, and callsign-to-route mappings change with the schedule season. A track analysed six months after collection with enrichment captured at collection time may attribute an aircraft to an operator that has since sold it, which in a sanctions or ownership context is the difference between a finding and a defamation risk. Re-resolve identity at the time of analysis, and record both the collection-time and analysis-time resolutions so the change itself is visible.
What this source feeds
A source is only worth what it lets you conclude. These are the disciplines that collect through it, the mission domains it serves and the data points it yields — every one is a tag, so you can follow any thread from here into the rest of the library.
Collected by these intelligence disciplines
Serves these mission domains
Yields these data points
How each sector uses OpenSky Network / ADS-B
The same dataset is worked very differently depending on who you are, what authority you hold, and what you are ultimately producing. A military analyst is supporting a commander’s decision; a journalist is meeting a publication standard; an NGO caseworker is protecting a person. The records are shared — the constraints, thresholds and outputs are not.
🎖 Military and defence
Used for airspace situational awareness, indications and warning on civil-pattern activity, and monitoring the logistics tail that supports operations. The network's practical value is that it shows contracted and leased transport, tanker support operating in the civil system, and the movement of state aircraft that commercial platforms may not display. It will not show aircraft operating with transponders off, which is the normal condition for the activity of most interest, so its correct role is baseline and change detection in the civil picture rather than air surveillance. The absence of oceanic coverage should be treated as a hard planning constraint rather than a limitation to be worked around.
🕵 National intelligence
The core AVINT collection route for state aircraft movement, sanctions-relevant flying and pattern-of-life on specific airframes. The reason to prefer it over commercial trackers is governance: no owner-request blocking, retained provenance, and an archive that supports retrospective reconstruction when a question is asked months later. Analytically it pairs with registry, ownership and sanctions data to convert a track into an entity relationship, and with datalink material to add content to movement. The tradecraft requirement is discipline about what the fields mean – particularly that state of registry is not nationality of operation – because ADS-B findings are easy to produce and easy to get badly wrong in a way that survives review.
👮 Law enforcement
Supports investigations into smuggling, trafficking, illegal charter and asset movement, and provides an evidentially useful reconstruction of an aircraft's movements when supported by a documented collection method. The archive can establish that an aircraft was at a location at a time, which is often the pivot that connects a ground investigation to an international dimension. For evidence, prefer data obtained through a documented route with retained provenance over a screenshot from a tracking site, and expect to explain to a court what ADS-B is, that it is self-reported by the aircraft, and that it is not authenticated. Licence terms restrict commercial use but investigative use by a public authority should be discussed with the association rather than assumed.
🔍 Private investigation and corporate security
For asset tracing, corporate due diligence and locating aircraft associated with a subject, this is the most complete open source available, and specifically the one least likely to have the subject's aircraft hidden on request. Combine it with registry and beneficial ownership work: the track establishes movement, the registry establishes who owns the airframe, and neither alone supports a conclusion about who was aboard. Be careful with that last point in particular – aircraft movement is not passenger movement, and the inferential leap from one to the other is the most common way this work becomes indefensible. Licence terms matter here, since commercial investigative use is not obviously research use.
📰 Journalism and OSINT media
The workhorse for flight-based reporting: deportation and rendition charters, sanctions-relevant movements, corporate and political aircraft use, and disaster or conflict-related air activity. Its independence from owner-blocking arrangements is the reason it appears in serious investigations where consumer trackers do not. Verification practice should be explicit in the published piece: state that positions are self-reported by the aircraft, that identity is derived from a transponder address rather than proven, and that gaps in a track usually mean gaps in receiver coverage. Where a story turns on an aircraft being somewhere, corroborate with imagery, ground reporting or a second network before publication.
🌍 NGO, humanitarian and human rights
Human rights, arms control and humanitarian monitoring use the archive to document flight patterns that states do not report – suspected rendition or deportation flights, arms logistics, and access flights into restricted areas. The archive's retrospective depth is the key property, because documentation work usually begins after the events. The coverage limitation is severe for exactly the geographies where this work concentrates, so build the coverage caveat into the methodology section of any published documentation and never present an absence of tracks as evidence that flights did not occur. Combine with datalink, vessel tracking and open reporting to build a case that does not rest on one unauthenticated broadcast channel.
🎓 University and research
The default dataset for air transport research, aviation security research and a substantial body of work on sensor networks and multilateration. Its advantages are documented methodology, retained raw messages, an access route designed for researchers, and a research community that has published curated derivative datasets and mature tooling. The methodological obligation is to model coverage explicitly: the network's own growth is a confound in every longitudinal analysis, and receiver density is a confound in every spatial one. Ethics review is appropriate for work on identifiable private aircraft, and the licence's non-commercial framing should be checked against your institution's funding arrangements rather than assumed to cover everything academic.
Playbook: working OpenSky Network / ADS-B end to end
A repeatable sequence from first pull to finished product. Each phase states what you are trying to establish, not merely what to click — the objective is a defensible chain of reasoning, not a completed checklist.
Phase 1 — Define the question as a coverage question
Before querying, state what you need to observe and where. Then ask whether the network can see it: altitude, geography, aircraft class and time of day all determine the answer. An hour spent establishing that your area of interest has three receivers rather than thirty prevents a week of analysis built on structural absence.
Phase 2 — Fix the identity anchor first
Resolve your target to a 24-bit ICAO address through a registry or aircraft database, and note whether the airframe is known to have changed registration. Never begin from a callsign or a tail number alone. If the target participates in a privacy address programme, establish that now, because it changes the entire approach.
Phase 3 — Choose the collection geometry deliberately
Decide between watching specific addresses and watching an area, and understand the tradeoff. Address-based collection is quota-efficient and reveals less about your geographic interest; area-based collection catches aircraft you did not know to look for. Most serious work runs both, with different cadences.
Phase 4 — Set and record the polling interval
Your polling interval is the temporal resolution of everything downstream. A sixty-second interval cannot see a two-minute orbit reliably and cannot establish a landing time to better than a minute. Write the interval into the case record so that later readers can tell what your data was capable of resolving.
Phase 5 — Assemble tracks and classify every gap
Turn snapshots into flight segments, then examine every break. For each, determine whether other aircraft were visible in the same area at the same time. If they were, the gap is about your target; if they were not, the gap is about coverage. Recording that distinction at assembly time is far cheaper than reconstructing it later.
Phase 6 — Condition every claim on position_source
Separate ADS-B positions from multilaterated ones before doing any precision work. Turn radius, altitude profile and distance-from-a-point analyses that are sound on ADS-B data become meaningless on multilateration at the edge of coverage. State which you used.
Phase 7 — Baseline before you call anything anomalous
Establish what this aircraft, this route or this airport normally looks like across weeks. Diversions, holding, unusual altitudes and odd hours are routine in aviation; they become significant only against a baseline. Analysts who skip this step generate a steady stream of false alarms and lose the confidence of their consumers.
Phase 8 — Test physical plausibility as a spoofing check
Because ADS-B is unauthenticated, run every unusual track through a physics check: are the speeds, climb rates and turn radii achievable by the claimed aircraft type, is the position consistent with the receivers that heard it, and does the track begin and end where a real flight would. Falsified broadcasts almost always fail one of these.
Phase 9 — Resolve identity to ownership, not just to type
The track plus the aircraft type is not a finding. Take the address to the registry, the registry to the owner, and the owner to corporate and sanctions data. Most of the analytical value of air movement work lives in that chain, and most of the errors live there too, because ownership structures for aircraft are deliberately layered.
Phase 10 — Corroborate with an independent channel
For any conclusion that will be published or acted on, find a second observation: datalink traffic from the same airframe, imagery, a notice to airmen, a port or airport record, ground reporting. A single unauthenticated broadcast channel is not a sufficient evidential base for a serious claim, however clean the track looks.
Phase 11 — Separate the aircraft from the people
Establish explicitly what you are claiming. That an aircraft flew a route is supportable. That a named individual was aboard is a different claim requiring different evidence, and conflating the two is the failure mode that turns aviation analysis into a legal problem. Write the distinction into the product rather than leaving it to the reader.
Phase 12 — Publish the method with the finding
State the source, the access route, the polling interval, the coverage situation, the position source mix and the corroboration. This is what makes air movement analysis reviewable, and it is the difference between an assessment that survives challenge and a map that does not.
The platform ships this as a step-checked workflow in playbooks.php, so progress is recorded against a case rather than held in someone’s head.
What to pair it with
No single source carries a finding. These are the datasets that corroborate, extend or contradict this one — and a source that contradicts is worth more than one that agrees, because it is the only thing that will tell you when you are wrong.
| Source | Relationship | What it adds |
|---|---|---|
| adsbdb | prerequisite | Resolves the 24-bit address to registration, type, operator and registered owner, which is the first step in turning a track into an entity. |
| hexdb.io | corroborates | An independently maintained second resolution path for the same lookup; disagreement between the two is a useful signal that a registry check is needed. |
| Airframes.io | extends | Adds message content to movement – operational, dispatch and ADS-C traffic from the same airframe, including from aircraft outside ADS-B receiver coverage. |
| NOAA Aviation Weather Center | corroborates | Explains a large share of apparently anomalous tracks: holding, diversion, altitude changes and route deviation are usually weather before they are anything else. |
| National aircraft registries | prerequisite | The authoritative link from transponder address and registration to owner. Community aircraft databases are convenience layers over these and inherit their lag. |
| OpenSanctions | extends | Screens resolved owners, operators and lessors against sanctions and PEP datasets, converting a movement observation into a compliance finding. |
| ADS-B Exchange | corroborates | A separate unfiltered receiver network with a different footprint, useful as an independent second observation and for filling gaps where OpenSky coverage is thin. |
| AIS vessel tracking | extends | The maritime analogue with the same structural properties – self-reported, unauthenticated, coverage-limited – and frequently the other half of a logistics or sanctions-evasion picture. |
Legal, ethical and operational constraints
Three constraints operate simultaneously. First, licence: the association's terms centre on research and non-commercial use, and commercial exploitation or redistribution needs an agreement. Second, privacy law: aircraft movement data can be personal data where the aircraft is identifiable and associated with an individual, which is exactly the situation in private-aviation investigations, and in most data-protection regimes that requires a lawful basis, a purpose limitation and a retention rule. The fact that a transponder broadcasts publicly does not by itself establish that you may compile, store and analyse a movement profile of an identifiable person. Third, proportionality: building a persistent movement history of an individual is intrusive and should be justified against the seriousness of the inquiry, documented, and reviewed. For law enforcement and government users there may be additional statutory frameworks governing surveillance that apply to systematic tracking even of public broadcasts. In publication contexts, remember that aircraft ownership is often layered specifically to obscure it, and that asserting an individual's presence or activity from a tail number is a defamation exposure as well as an analytical error.
Operational security
Your queries are authenticated and logged against your account, and the geography of your bounding boxes and the specific addresses you request describe your interest precisely. A sustained watch on a defined set of tail numbers is legible as a target list to anyone with access to those logs, whether through legitimate administration, compulsion or compromise. If that matters, prefer broad geographic collection with local filtering over narrow address queries, separate accounts by workstream rather than concentrating everything in one, and avoid query cadences that key to a target's operating pattern. Contributing a receiver publishes an approximate location, which is a disclosure in itself if the receiver is at a sensitive site. Note also that the aircraft you are watching may be watching the watchers: publicly visible interest in a specific airframe, whether through a public alerting service or a social account, is routinely noticed by owners and operators and prompts adoption of privacy addressing.
Two rules that hold regardless of jurisdiction. Collection that is lawful is not automatically proportionate, and a dataset assembled for one purpose does not carry consent for another. Where the records concern identifiable people, the question is not only whether you may hold the data but whether holding it serves the purpose you are accountable for.
Is it earning its place?
Sources accumulate. Feeds get added during an incident and are never reviewed again, and a decade later the pipeline is carrying dead weight that nobody dares remove. These are the measures that show whether OpenSky Network / ADS-B is contributing anything, and they are worth baselining now so the answer is available later.
- Track completeness for your priority aircraft, measured as the proportion of expected flight time with position updates, which tells you whether your coverage supports the conclusions you are drawing.
- Proportion of positions sourced from ADS-B rather than multilateration in your areas of interest, since that ratio governs how precise your analysis is allowed to be.
- Median staleness of state vectors at collection time, measured as query time minus time_position, tracked to catch degradation before it distorts a case.
- Quota consumption against area covered, which is the practical measure of whether your collection geometry is efficient or wasteful.
- Rate of identity disagreement between the broadcast callsign and the resolved registry identity, which is a leading indicator of address reuse, privacy addressing or data quality problems.
- Number of case findings where an OpenSky track supplied the pivot that connected two otherwise unconnected entities, as the real measure of analytical value.
- Count of tracks rejected by physical plausibility checks, tracked over time as a spoofing and data integrity indicator rather than as a nuisance statistic.
Beware of volume. Indicator counts rise easily and say almost nothing. Unique contribution — findings this source produced that no other source in your stack would have — is the measure that matters, and it is usually far lower than anyone expects.
Tradecraft notes
The distinctions that separate a competent analyst from a fast one:
- State of registry is not nationality of operation. The origin_country field derives from an address block allocated by ICAO, and a Bermuda or Isle of Man registration on an aircraft operated from elsewhere is a deliberate arrangement, not an error to be corrected by assuming the country is wrong.
- Gaps mean coverage until proven otherwise. Before treating a break in a track as an event, confirm that the network was seeing other aircraft in the same volume of airspace at the same time. This single habit prevents the majority of false conclusions from ADS-B data.
- Never compare across years without controlling for network growth. The archive contains far more receivers now than at the start, so any raw count of flights over time measures the network's expansion at least as much as it measures aviation.
- Altitude has two meanings in the same record. Barometric and geometric altitude disagree legitimately, and only one of them is useful for terrain-relative reasoning. Choose deliberately and say which you used.
- Treat the callsign as a hint and the hex address as the identity, but remember the hex address changes on re-registration. An airframe's history is a chain of addresses, not one, and asset-tracing work that assumes otherwise will lose the target at exactly the point of interest.
- Physical implausibility is your only spoofing detector. There is no authentication in ADS-B, so the check on falsified data is whether the claimed motion is achievable and consistent with receiver geometry. Build that check into the pipeline rather than applying it only when something looks odd.
- Aircraft movement is not person movement. Write products that keep the two claims separate, because the moment they merge, the analysis becomes both weaker and legally exposed.
- Privacy addressing is a signal, not just an obstacle. An airframe that begins broadcasting an alternate address at a particular date has told you something about its operator's intentions even though it has hidden its identity.
- Prefer the historical archive to a reconstructed one. Polling the live interface for months produces a dataset with your outages baked into it; the research archive does not have your outages in it, and the difference will show up under review.
Questions analysts actually ask
Why does OpenSky show aircraft that commercial trackers hide?
Because commercial platforms operate blocking arrangements with owners and operators, and a research non-profit does not have the same commercial reason to. This is the main practical argument for using OpenSky in investigative work, since the aircraft most likely to be blocked elsewhere are disproportionately the ones an investigation is about.
Does origin_country tell me where the flight departed?
No, and this is the most damaging misreading of the dataset. It is the state that allocated the aircraft's 24-bit address, meaning the state of registry. An aircraft registered in one country, owned in a second and operating between two others will show only the first. Use the track to determine departure.
Can ADS-B data be faked?
Yes. The protocol has no authentication, and injecting a false broadcast is well within amateur capability. Detection relies on physical plausibility and on whether the receiver geometry is consistent with the claimed position. Any single unusual track should be treated as unverified until it passes those checks or is corroborated independently.
My target's aircraft disappears over the ocean. Is it doing something?
Almost certainly not. 1090 MHz is line-of-sight and there are no mid-ocean receivers in this network, so oceanic tracks routinely stop at the coast and resume on the far side. Satellite-based ADS-B solves this commercially and is not part of OpenSky. Treat oceanic gaps as structural.
Can I use this commercially?
Not without an arrangement. The terms centre on research and non-commercial use, and the non-profit's funding depends on that boundary being respected. If you are a commercial user, approach the association directly. Reasoning that your analysis is research-like is not a substitute for permission.
How far back does the historical data go?
Years, and it is one of the source's main advantages, but the network was much smaller early on. Depth is real; comparability across the full period is not. Any long-run analysis has to control for the growth in receivers or it will report the network's expansion as an aviation trend.
Should I use this or ADS-B Exchange?
Both, for different jobs. OpenSky's strengths are the research archive, retained provenance and published methodology, which is what you want for defensible retrospective work. A second unfiltered network gives you independent observation and different coverage. Using one alone leaves you with a single point of failure on an unauthenticated data source.
Is watching a specific person's aircraft legal?
It depends on jurisdiction, purpose and how systematic it is. Receiving a public broadcast is generally lawful; compiling a persistent movement profile of an identifiable individual engages data-protection law in most regimes and may engage surveillance law for public authorities. Establish a lawful basis and a proportionality justification before you start, not after.
Why do two sources give different aircraft details for the same hex?
Because community aircraft databases are compiled from overlapping open datasets with different update lags, and registrations change. Disagreement is a signal to go to the national registry rather than to pick the answer you prefer. Record which source you used and when.
Standards, formats and interoperability
What this source speaks natively, and what it has to be translated into before a partner can consume it. Work that arrives in a recognised format is easier to defend, easier to hand over and easier to automate against:
- ADS-B Extended Squitter on 1090 MHz, defined in ICAO Annex 10 and elaborated in RTCA and EUROCAE standards, is the underlying broadcast this network receives.
- The 24-bit ICAO aircraft address is allocated in blocks to states of registry, which is what makes country attribution possible and also what makes it frequently misread.
- Mode 3/A squawk codes carry internationally standardised meanings for emergency, radio failure and unlawful interference, and are among the few transponder fields with fixed semantics.
- Multilateration derives position from time difference of arrival across receivers and is a fundamentally different measurement from a broadcast position, with different error characteristics.
- WGS84 is the positional reference frame, and barometric altitude referenced to the standard pressure setting is not a WGS84 height, which is why two altitude fields exist.
- Privacy address programmes operated by civil aviation authorities allow eligible aircraft to broadcast an alternate 24-bit address, breaking the registry linkage by design.
- The platform exports aircraft entities and movement observations in STIX 2.1, MISP, CSV, JSON and JSONL for onward analysis and sharing.
References
Primary documentation and authoritative references for this source. Publishers revise and retire material, so treat the retrieval date as part of the citation and re-check before relying on any of it in a formal product.
- OpenSky Network — OpenSky Network Association. The service, the association, the access policies and the current terms. The authoritative reference for anything about licensing or access tiers.
- OpenSky REST API documentation — OpenSky Network Association. Field definitions for the state vector, endpoint behaviour and the current authentication model. Read the field semantics carefully before writing any analysis.
- OpenSky API client libraries — OpenSky Network Association. Reference client implementations. Using these avoids most of the quota, pagination and timing errors of a hand-rolled integration.
- traffic — Xavier Olive. The mature Python toolkit for air traffic data processing built around this and similar sources. Its trajectory handling and airspace tooling save substantial work.
- International Civil Aviation Organization — ICAO. The standards authority for ADS-B, transponder addressing and the surveillance architecture that produces this data.
- EUROCONTROL — EUROCONTROL. European air traffic management authority; its published data and analyses are the reference point for validating European traffic counts derived from ADS-B.
- Federal Aviation Administration — FAA. US regulator; the source for the ADS-B mandate, privacy address arrangements and registry policy that shape what is observable over North America.
- ADS-B Exchange — ADS-B Exchange. An independent unfiltered network. Useful as a corroborating observation and as a contrast in governance and access model.
- readsb — wiedehopf. The widely used receiver decoder. Reading it clarifies what a receiver actually produces before aggregation, which matters for judging position quality.
- RTL-SDR — RTL-SDR.com. Practical guidance on building the receiver that raises your access tier and gives you independent local coverage.
Link integrity: every reference above was verified with a live request when this page was generated. Where a publisher had moved or withdrawn a document, the link was repointed at a preserved copy in the Internet Archive and marked as archived. Anything with no reachable copy anywhere had its link removed rather than left to rot — the source is still credited, it simply cannot be linked.
Put it into practice
The Quantus Intel threat intelligence platform operationalises this source: it schedules bounded collection, assembles snapshots into tracks with coverage gaps classified rather than smoothed, resolves every 24-bit address to an owned entity, and keeps the position source attached to the conclusion.. Browse the full source catalogue, or follow any tag above into the rest of the library.