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.
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 'https://api.adsb.lol/v2/lat/51.47/lon/-0.45/dist/25'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);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()){
"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,
"squParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
lat / lon / dist | path | Optional | `/lat/{lat}/lon/{lon}/dist/{nm}` returns aircraft within that many nautical miles of the point. 51.47 / -0.45 / 25 |
callsign | path | Optional | `/callsign/{callsign}` finds an aircraft by the flight identifier it is broadcasting. BAW117 |
registration | path | Optional | `/registration/{reg}` finds an aircraft by tail number. G-VLUV |
hex | path | Optional | `/hex/{icao24}` looks up the 24-bit ICAO address, which is the aircraft's permanent identifier. 40641d |
type | path | Optional | `/type/{icao_type}` returns every airborne aircraft of one type. A333 |
squawk | path | Optional | `/squawk/{code}` finds aircraft transmitting a transponder code — 7700 is a general emergency. 7700 |
(military) | path | Optional | `/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
Distance Calculator
Calculate the straight-line distance and bearing between two points on a map by latitude/longitude using the Haversine formula — km, miles and nautical miles.
Bearing Calculator
Calculate the initial and final bearing between two latitude/longitude points, with compass direction, quadrant bearing and great-circle distance.
Coordinate Converter
Convert GPS coordinates between decimal degrees, degrees-minutes-seconds and decimal minutes instantly. Paste any format like 40°26'46"N and copy the result.
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.