BYTETOOLS

adsb.lol API

Free live ADS-B aircraft tracking API with no key: query aircraft by position radius, callsign, registration, hex code or squawk, with altitude, speed and heading. Tested example included.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the adsb.lol API?

adsb.lol is a free, key-free API serving live aircraft positions from a volunteer network of ADS-B receivers. You can query by radius around a coordinate, by callsign, registration, ICAO hex code, aircraft type or squawk, and every result carries position, altitude, speed and heading.

The commercial flight-tracking APIs all gate their live feed behind a key and a contract; adsb.lol is fed by hobbyists running receivers at home and gives the raw feed away. That means coverage is dense over Europe and North America and patchy over oceans and sparsely populated regions — you are seeing what volunteers within roughly 400 kilometres of an aircraft happen to hear, not a global surveillance picture.

The field names are terse because they come straight from the readsb decoder rather than a friendly API layer. `gs` is ground speed in knots, `alt_baro` is barometric altitude in feet, `t` is the ICAO type designator and `r` the registration, while `seen` and `seen_pos` say how many seconds ago the aircraft was last heard and last reported a position. Watch for `alt_baro` arriving as the string "ground" instead of a number — an aircraft on the tarmac breaks any code that assumes the field is numeric.

Quick facts

Base URL
https://api.adsb.lol/v2
Authentication
No API key or account. Community-run, funded by donations, with data contributed by volunteer receiver operators.
Rate limit
No published numeric quota. The project asks for reasonable polling — once every few seconds per query is plenty, since positions update at that cadence anyway.
Pricing
Free.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the adsb.lol API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. List aircraft within 25 nautical miles of a point

GET https://api.adsb.lol/v2/lat/51.47/lon/-0.45/dist/25

curl
curl 'https://api.adsb.lol/v2/lat/51.47/lon/-0.45/dist/25'
JavaScript (fetch)
const res = await fetch("https://api.adsb.lol/v2/lat/51.47/lon/-0.45/dist/25");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://api.adsb.lol/v2/lat/51.47/lon/-0.45/dist/25", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "ac": [
    {
      "hex": "40641d",
      "type": "adsb_icao",
      "flight": "VIR130C ",
      "r": "G-VLUV",
      "t": "A333",
      "alt_baro": 14000,
      "alt_geom": 14175,
      "gs": 286.0,
      "ias": 220,
      "tas": 272,
      "mach": 0.432,
      "wd": 258,
      "ws": 14,
      "oat": -12,
      "tat": -2,
      "track": 90.6,
      "track_rate": 0.03,
      "roll": 0.18,
      "mag_heading": 90.35,
      "true_heading": 91.24,
      "baro_rate": 0,
      "geom_rate": 0,
      "squawk": "7663",
      "emergency": "none",
      "category": "A5",
      "nav_qnh": 1013.6,
      "nav_altitude_mcp": 14016,
      "nav_heading": 0.0,
      "lat": 51.312057,
      "lon": -1.055727,
      "nic": 8,
      "rc": 186,
      "seen_pos": 0.318,
      "version": 2,
      "nic_baro": 1,
      "nac_p": 9,
      "nac_v": 1,
      "sil": 3,
      "sil_type": "perhour",
      "gva": 2,
      "sda": 2,
      "alert": 0,
      "spi": 0,
      "mlat": [],
      "tisb": [],
      "messages": 71212,
      "seen": 0.1,
      "rssi": -12.0,
      "dst": 24.553,
      "dir": 247.6
    },
    {
      "hex": "4007ef",
      "type": "adsb_icao",
      "flight": "BAW2278 ",
      "r": "G-YMMD",
      "t": "B772",
      "alt_baro": 15000,
      "alt_geom": 15150,
      "gs": 286.4,
      "ias": 220,
      "tas": 276,
      "mach": 0.44,
      "wd": 259,
      "ws": 25,
      "oat": -14,
      "tat": -4,
      "track": 143.09,
      "track_rate": -0.09,
      "roll": 15.12,
      "mag_heading": 146.25,
      "true_heading": 147.13,
      "baro_rate": 0,
      "geom_rate": 0,
      "squ

Parameters

ParameterTypeRequiredDescription
lat / lon / distpathOptional`/lat/{lat}/lon/{lon}/dist/{nm}` returns aircraft within that many nautical miles of the point. 51.47 / -0.45 / 25
callsignpathOptional`/callsign/{callsign}` finds an aircraft by the flight identifier it is broadcasting. BAW117
registrationpathOptional`/registration/{reg}` finds an aircraft by tail number. G-VLUV
hexpathOptional`/hex/{icao24}` looks up the 24-bit ICAO address, which is the aircraft's permanent identifier. 40641d
typepathOptional`/type/{icao_type}` returns every airborne aircraft of one type. A333
squawkpathOptional`/squawk/{code}` finds aircraft transmitting a transponder code — 7700 is a general emergency. 7700
(military)pathOptional`/mil` returns aircraft flagged as military by the community database. mil

Response fields

acarray
The matched aircraft. Empty when nothing is being heard in that area or for that identifier.
hexstring
24-bit ICAO address in hex — the permanent identifier that survives repainting and re-registration.
flightstring
Broadcast callsign, space-padded to eight characters. Trim it before comparing.
r / tstring
Registration and ICAO type designator, joined in from a community aircraft database.
alt_baro / alt_geominteger or string
Barometric and geometric altitude in feet. `alt_baro` becomes the literal string "ground" when the aircraft is on the surface.
gs / ias / tas / machfloat
Ground speed, indicated and true airspeed in knots, and Mach number where transmitted.
track / true_heading / mag_headingfloat
Ground track and headings in degrees.
lat / lonfloat
Last reported position, as plain numbers rather than GeoJSON.
squawk / emergencystring
Transponder code and emergency state.
seen / seen_posfloat
Seconds since the aircraft was last heard, and since it last reported a position. Stale entries persist briefly.
dst / dirfloat
Distance in nautical miles and bearing from the query point, on radius searches only.

What you can build with the adsb.lol API

  • Show aircraft overhead on a map or a departure-board display
  • Build an overhead-flight notifier for a fixed location
  • Monitor emergency squawk codes such as 7700 and 7600
  • Analyse approach and departure patterns near an airport
  • Look up an aircraft's type and registration from its ICAO hex address

Common errors and how to fix them

Empty ac array

Nothing is being heard there — either no aircraft, or no receiver within range.

Fix: Coverage is volunteer-supplied and thin over oceans, deserts and much of the southern hemisphere. An empty result is not evidence that the sky is empty.

alt_baro is the string "ground"

The aircraft is on the surface, and the field switches type.

Fix: Test for the string before doing arithmetic. This is the single most common crash in code that consumes ADS-B feeds.

CORS error in the browser

The API sends no Access-Control-Allow-Origin header.

Fix: Proxy the request through your own server. There is no key to protect, so a minimal pass-through is enough.

An aircraft appears without a position

Some transponders send identification without positional data, or the receiver has not yet decoded a position message.

Fix: Check `seen_pos` and treat a missing or stale `lat`/`lon` as unknown rather than plotting the last one indefinitely.

adsb.lol API — frequently asked questions

Is adsb.lol free?

Yes, free with no key or account. It is a community project fed by volunteers running ADS-B receivers, funded by donations rather than by selling access.

How complete is the coverage?

It depends entirely on where volunteers have receivers. Europe and North America are well covered at cruise altitude; oceans, polar routes and thinly populated regions are not, because ADS-B is line-of-sight and needs a ground station within a few hundred kilometres.

Can I track a specific flight?

Yes, by callsign, registration or ICAO hex address. The hex address is the most reliable of the three because it is tied to the airframe rather than to a scheduled flight number that changes daily.

Does it show military aircraft?

There is a `/mil` endpoint listing aircraft flagged as military in the community database. Many military aircraft do not broadcast ADS-B at all, or broadcast with identification suppressed, so the list is necessarily partial.

Tools that pair with this API

adsb.lol is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.