ADS-B Exchange is the best-known source of unfiltered flight tracking data. It's fed by a large network of volunteer receivers, and unlike most consumer trackers it doesn't hide aircraft that have asked to be blocked, including many military and private flights. That makes it popular with researchers, journalists and hobbyists, and its API is often the first one developers try.

The licensing is where people get stuck. Most of ADS-B Exchange's affordable API access is for personal, non-commercial use, and many developers only find that out after building on it. This guide explains what each access option costs and allows in 2026, when you need an enterprise licence, and what the alternatives are if you're building a commercial product.

We sell a commercial flight data API, so we're one of the alternatives. We've tried to be clear about where ADS-B Exchange is the better choice.

The three ways to access the data

ADS-B Exchange currently offers three tiers of API access, listed on its Developer Hub:

OptionPriceLicenceNotes
Community API (formerly API Lite)Not publishedNon-commercial: side projects, research, experimentsAimed at the community
Personal Use Aircraft Data API, on RapidAPI$10/month for 10,000 requestsPersonal useBought and billed through RapidAPI
Enterprise API productsQuoted on requestCommercialHigher volume, historical and enriched data, production use

The enterprise products include a REST API, a gRPC streaming service for low-latency position updates, and bulk historical data delivered through Amazon S3. ADS-B Exchange advertises position updates every 500 milliseconds. Pricing isn't published; you request a demo and get a quote.

What counts as commercial use

This is the question most people searching for the ADS-B Exchange API actually need answered, and the answer is broader than many expect.

ADS-B Exchange's support guidance is that a project for a commercial entity needs a commercial licence whether or not it makes money, including projects used only internally. So:

  • a hobby flight tracker on your own website is personal use
  • an academic research project is generally non-commercial
  • an internal dashboard at your company is commercial, even if nobody pays for it
  • a feature inside a product you sell is commercial
  • a free app published by a company is commercial

If any of the last three describe your project, the $10 RapidAPI plan and the Community API don't cover it. You either need an enterprise agreement with ADS-B Exchange or a different provider.

How things got here

ADS-B Exchange was founded in 2016 as a community project. In January 2023 it was acquired by JETNET, an aviation data and market intelligence company. Since then, access has moved towards a paid, licensed model. Free services have been retired along the way: in 2025, users of the free flight-simulator traffic feed were moved to the paid RapidAPI plan.

None of this is unusual for a data business, but it means older tutorials that describe a free, open ADS-B Exchange API are out of date.

A communications mast fitted with radio antennas

When ADS-B Exchange is the right choice

ADS-B Exchange is the better option when unfiltered data is the point of your product. Most commercial flight data providers, and the trackers built on them, honour the FAA's LADD programme and owners' block requests. ADS-B Exchange is known for showing those aircraft anyway, along with many military flights. If you're building an OSINT tool, a newsroom investigation tool, or research on aircraft that others hide, that's a real difference, and its enterprise products are the natural fit. Why some planes don't show up on flight trackers explains how the blocking works.

It's also a good choice for personal projects. At $10 for 10,000 requests a month, the personal plan is inexpensive for a hobby map.

When you need an alternative

You need something else if you're building a commercial product and either:

  • want to get started without a sales process and an enterprise contract, or
  • need more than positions, such as flight status, schedules, weather, NOTAMs or airport data, in the same integration.

Free community networks

Several community-run networks, including adsb.fi, airplanes.live and adsb.lol, publish free APIs, and some use a format compatible with ADS-B Exchange's v2 API. Their terms vary: some are personal and non-commercial only and require attribution, and some publish data under open-data licences with conditions of their own. None of them offers a service-level agreement or commercial support. Read each network's terms before relying on it for a product, and test its coverage in the regions you care about, because community coverage follows where volunteers live.

OpenSky Network

The OpenSky Network is a non-profit research network with a free API for research and education. Commercial use has to be arranged with OpenSky directly. Its state vectors are raw positions without registration, aircraft type or airline.

Commercial APIs

Commercial providers license their data for products and publish their prices or plans. The main differences are how they price and what else they include:

ProviderStarting priceCommercial useBeyond positions
ADS-B Exchange EnterpriseQuoteYesHistorical, enriched data, streaming
SkyLink API$19/month for 5,000 requestsYes, on every paid planFlight status, schedules, weather, NOTAMs, airports, charts
FlightAware AeroAPI$100/month minimum (Standard)Business and B2C on Standard; B2B needs Premium ($1,000/month)Flight status, history, Foresight ETAs
Flightradar24 APICredit-based plansPer its termsHistory, airline and airport data

FlightAware AeroAPI pricing explained works through what AeroAPI costs for common builds, and Flightradar24 API alternatives covers that side of the market.

Migrating from the ADS-B Exchange v2 format

If you've built on ADS-B Exchange's v2 API, the main work in switching is mapping fields. ADS-B Exchange returns aircraft in an ac array using short field names from the readsb decoder (hex, flight, alt_baro, gs), with area queries given as a centre point and a distance in nautical miles. SkyLink's ADS-B endpoint uses descriptive names and takes a radius in kilometres or a bounding box.

Here's an adapter that fetches SkyLink positions and returns them in the v2 shape, so the rest of your code doesn't have to change:

import requests

BASE = "https://data.skylinkapi.com/v3.1"
HEADERS = {"x-api-key": API_KEY}
NM_TO_KM = 1.852

def aircraft_near(lat, lon, dist_nm):
    """SkyLink positions returned in ADS-B Exchange v2 shape: {"ac": [...], "total": n}."""
    r = requests.get(
        f"{BASE}/adsb/aircraft",
        headers=HEADERS,
        params={"lat": lat, "lon": lon, "radius": min(dist_nm * NM_TO_KM, 1000)},
        timeout=(5, 15),
    )
    r.raise_for_status()
    rows = r.json()["aircraft"]
    ac = [
        {
            "hex": a["icao24"].lower(),
            "flight": (a.get("callsign") or "").ljust(8),
            "r": a.get("registration"),
            "t": a.get("aircraft_type"),
            "lat": a.get("latitude"),
            "lon": a.get("longitude"),
            "alt_baro": "ground" if a.get("is_on_ground") else a.get("altitude"),
            "gs": a.get("ground_speed"),
            "track": a.get("track"),
            "baro_rate": a.get("vertical_rate"),
        }
        for a in rows
    ]
    return {"ac": ac, "total": len(ac)}

A few differences to handle:

  • Distance units. ADS-B Exchange uses nautical miles; SkyLink uses kilometres, up to 1,000 km. The adapter converts.
  • Callsign padding. ADS-B Exchange pads callsigns to eight characters with spaces. If your code calls .strip(), you can drop the ljust.
  • Altitude on the ground. ADS-B Exchange reports "ground" as the altitude for aircraft on the surface; SkyLink has a separate is_on_ground flag. The adapter reproduces the old behaviour.
  • Aircraft type. ADS-B Exchange's t is an ICAO type designator such as B738. SkyLink's aircraft_type may be a designator or a description, so check before matching on it. ICAO type designators explained covers the codes.
  • Fields SkyLink adds. Each record can also include airline, plus first_seen and last_seen timestamps.
  • Fields you won't get. Squawk codes and signal-quality fields such as rssi and seen_pos aren't in SkyLink's live response.

For a map, prefer a bounding box (bbox=south,west,north,east) matching the viewport over a radius search; it returns exactly the aircraft on screen.

A radar dome against a grey sky

Polling and cost

ADS-B Exchange updates every 500 ms. SkyLink's ADS-B data refreshes every few seconds, and the docs recommend polling every 5–15 seconds; faster polling rarely shows new positions. For a server that polls one region every 10 seconds, eight hours a day, that's 86,400 requests a month, or $125.40 a month on SkyLink's Pro plan ($59 for 20,000 requests plus $0.001 for each extra one). Polling every 30 seconds brings it to 28,800 requests, or $67.80. Share one poll across all your users rather than polling per visitor.

Choosing

  • Personal project or hobby map? ADS-B Exchange's $10 personal plan or a community network is the cheapest option.
  • Research on blocked or military aircraft? ADS-B Exchange, under an enterprise licence if it's commercial.
  • Commercial product that needs positions plus flight status, weather or airport data, without a sales process? A self-serve commercial API such as SkyLink.
  • Non-commercial research using raw positions? OpenSky.

Getting started

The ADS-B tracking page shows what SkyLink's live feed includes, and the ADS-B docs have the full parameter reference. Paid plans start at $19 a month with a commercial licence and an immediate key; see the pricing page. For personal projects, you can apply for the free trial.