Somewhere around 2018, alternative-data teams at hedge funds started buying flight data feeds. The thesis was straightforward: if you can count how many flights an airline operates each day, and compare that to the same period last year, you have a real-time read on capacity changes that won't show up in SEC filings for weeks. The approach worked well enough that "flight activity" is now a recognized alternative data category, sitting alongside satellite imagery of parking lots and credit-card transaction panels.
This post covers what financial analysts actually do with aviation data, which signals are useful and which are noise, and what the integration looks like for a quant team or research desk that wants to add flight activity to their data stack.
What the signal actually is
Airlines publish capacity data quarterly — available seat miles (ASMs), revenue passenger miles (RPMs), load factors. Between those quarterly reports, the market trades on estimates. Anyone who can measure capacity changes in real time has an information edge, because they know before the report whether the airline expanded or contracted.
ADS-B data lets you measure this directly. Every commercial flight transmits its position; if you count distinct flights per airline per day, you have a daily proxy for capacity. It's not perfect — you don't know the seat count or load factor — but it's correlated enough to be useful, especially at the margin. An airline that suddenly adds 15% more flights on a route pair is almost certainly adding capacity there, and an airline whose daily flight count drops 8% week-over-week is pulling down capacity, which is a data point the market doesn't have yet.
The signal gets more specific than total counts:
Route-pair analysis. Capacity changes don't happen uniformly. An airline might be adding flights to leisure destinations while cutting business routes. Breaking the data down by origin-destination pair tells you where the growth is, which is more useful than a blended number.
Frequency vs gauge. If an airline switches from three daily 737 flights to two daily A321neo flights on the same route, the daily flight count drops but the seat count might stay flat or increase. Pure flight counts miss this, which is why serious analysis cross-references the ADS-B callsign with an aircraft data lookup to get the aircraft type, and from there estimates seat count.
Cargo as a leading indicator. Freighter activity — identifiable by operator or aircraft type (747F, 777F, A330F) — correlates with trade volumes and can lead economic data. If transpacific freighter flights drop 20% before the trade numbers are published, that's a signal.
import requests
from collections import Counter
BASE = "https://skylink-api.p.rapidapi.com"
H = {"X-RapidAPI-Key": KEY, "X-RapidAPI-Host": "skylink-api.p.rapidapi.com"}
# Count departures from a major hub by airline
r = requests.get(f"{BASE}/schedules/departures", headers=H,
params={"icao": "KATL"})
flights = r.json().get("data", [])
airline_counts = Counter()
for f in flights:
cs = f.get("callsign", "")
if cs:
# Extract airline prefix (first 3 chars of ICAO callsign)
airline_counts[cs[:3]] += 1
for airline, count in airline_counts.most_common(10):
print(f"{airline}: {count} departures")
What's actually useful vs what's noise
Not every flight-data metric has alpha. Here's what quant teams have found works and what doesn't, based on what we've seen from the research desks that use our data:
Useful:
- Daily flight counts by airline, aggregated weekly and compared year-over-year. This is the core signal. It's high-frequency and it correlates with ASMs closely enough to be predictive of quarterly earnings. The important thing is consistency — you need the same measurement methodology every day, not a different bounding box or feed on different days.
- Hub-level activity. If you're analysing Delta, watching ATL matters more than watching total US domestic flights. Concentrate on the carrier's top 5 hubs and you capture most of the signal.
- Widebody vs narrowbody mix. An airline shifting widebody flying from one route to another is making a strategic capacity decision. The aircraft-type lookup from the aircraft endpoint gives you this.
- New route launches and cancellations. A callsign appearing on a route pair that had zero flights last month is a new route. One that disappears is a cut. These are leading indicators of strategic direction.
Less useful than people expect:
- Real-time position tracking for individual flights. Knowing where UA456 is right now doesn't help a financial analyst unless they're specifically tracking a charter carrying a CEO to an acquisition target (which is a different use case, and one with its own legal considerations). The value is in aggregate patterns, not individual flights.
- Delay metrics as a predictor of financial performance. On-time performance is correlated with customer satisfaction, but the correlation between delay rates and quarterly revenue is weak. Airlines can be highly profitable with mediocre OTP, and operationally excellent airlines can lose money. Don't over-index on delays.
Building the data pipeline
A financial-data team's requirements are different from an app builder's. You don't need sub-second latency; you need complete, consistent, daily snapshots that you can compare across time. The typical architecture:
-
Daily snapshot collection. Poll the schedule endpoints for every airport (or your target airline's hubs) once or twice a day and store the result. You're building a time series of "flights operated on this date," not a live tracker.
-
Aircraft-type enrichment. For each unique ICAO24 hex code or registration you see, call the aircraft endpoint to get the type, and cache it. Aircraft types don't change (the aircraft is always a 737-800), so this is a one-time lookup per airframe.
# Enrich a hex code to get aircraft type
r = requests.get(f"{BASE}/aircraft/icao24/a1b2c3", headers=H)
data = r.json()
print(f"Type: {data.get('aircraft_type')} "
f"Operator: {data.get('operator')} "
f"Registration: {data.get('registration')}")-
Normalisation and storage. Load the daily snapshots into a time-series database or a plain Postgres table with a date column. The schema is simple: date, airline, origin, destination, aircraft_type, flight_count. Aggregate at whatever granularity your model needs.
-
Comparison and signal generation. The useful output is typically a year-over-year or month-over-month percentage change in flight counts, broken out by airline and optionally by route or aircraft type. Spike detection on this time series is the alert layer.
The global statistics endpoint (GET /adsb/aircraft/statistics) gives you a quick macro read — total aircraft tracked globally right now, broken down by airborne and on-ground. It's useful as a sanity check and as a "market temperature" gauge, though it's too broad for per-airline analysis.
# Global aviation activity snapshot
r = requests.get(f"{BASE}/adsb/aircraft/statistics", headers=H)
stats = r.json()
print(f"Total tracked: {stats.get('total_aircraft')} "
f"Airborne: {stats.get('airborne')} "
f"On ground: {stats.get('on_ground')}")
Licensing and compliance
Alternative-data purchases in financial markets come with compliance scrutiny that normal API customers don't face. Two things to address up front:
Material non-public information (MNPI). ADS-B is a public broadcast. Anyone with a receiver can pick it up, and aggregated flight counts derived from publicly observable data are not MNPI under current SEC guidance. That said, compliance teams will want to see your data-sourcing chain documented — where the data comes from, how it's collected, and that it's not derived from a non-public source like an airline's internal ops feed. An API with clear terms of service and a documented data-sourcing methodology makes this review straightforward.
Redistribution rights. If your fund produces a research note that includes "Delta operated 8% more ATL-LAX flights this quarter," that's a derived insight, and virtually all data licenses permit derived insights. If you redistribute the raw data itself — actual flight counts per route in a table — check the license terms. The data licensing post covers the general licensing landscape for aviation data.
Most quant teams run the analysis internally and publish conclusions, not underlying data. That's almost always fine.
Getting started
A research desk that wants to prototype a capacity-tracking model needs the schedule endpoint for flight counts, the aircraft data endpoint for type enrichment, and the statistics endpoint for macro reads. The free trial gives you 1,000 requests/month — enough to pull daily snapshots for one or two airlines for a month and validate the signal against their published quarterly data.
For production alternative-data pipelines pulling daily snapshots across multiple carriers and hubs, the volume pricing is on the pricing page, or reach out about Enterprise if your compliance team needs a signed data-licensing agreement.
