Drones and light aviation
Flight planning and traffic awareness for drones, ultralights and pilots: what you see at low altitude with the network’s data, and what you don’t.
It isn’t a certified tool
Don’t use it to separate from traffic or to avoid collisions: an aircraft that doesn’t transmit, or that no receiver hears, isn’t in the data. Use it to plan and to know who is in the air, together with the rules of the air and what you see.
What shows up at low altitude
ADS-B
The aircraft transmits its GPS position and shows up if a receiver hears it. The lower the aircraft, the closer the receiver must be: line of sight is what counts.
Multilateration (MLAT)
For aircraft that transmit without a position: we compute it, but it takes at least four receivers hearing it at once. At low altitude that rarely happens.
Gliders and ultralights
Those with FLARM come from the Open Glider Network, where there are OGN receivers.
Whoever doesn’t transmit
Many drones, paragliders and aircraft without a transponder: they aren’t in the data.
How much low-level traffic we see
On 26 October 2026, 20:24 UTC, worldwide:
- 1,748 of the 10,980 aircraft with a position were below 3,000 ft.
- 255 helicopters with a position, 8 in 10 seen via ADS-B.
- In every record
typesays where the position comes from (adsb_icao,mlat, …),seen_poshow many seconds old it is,alt_barothe altitude in feet (or"ground"), andcategoryA7marks a helicopter.
The code
# low.py: aircraft below 3,000 ft within 15 km of a launch site (Python 3.9+)
import json, os, urllib.request
LAT, LON, KM = 45.63, 8.72, 15
req = urllib.request.Request(
f"https://api.flyitalyadsb.com/v2/lat/{LAT}/lon/{LON}/dist/{KM}",
headers={"X-Api-Key": os.environ["FIA_API_KEY"], "User-Agent": "my-flight-tool/1.0"})
with urllib.request.urlopen(req, timeout=15) as r:
data = json.load(r)
for a in data["ac"]:
alt = a.get("alt_baro") # feet, or "ground"
if alt == "ground" or (isinstance(alt, (int, float)) and alt < 3000):
print(a["hex"], (a.get("flight") or "").strip() or "-", a.get("t", "?"),
alt, a.get("type"), f"{a.get('seen_pos', 0):.0f} s")
# type = where the position comes from (adsb_icao, mlat, ...); seen_pos = age in seconds curl -H "X-Api-Key: YOUR_KEY" \
"https://api.flyitalyadsb.com/v2/events?lat=45.63&lon=8.72&dist=50" Replace YOUR_KEY with your key: it’s free, get it here. Full specification in openapi.json.
Watch out for
- Altitudes are in feet, barometric:
alt_baroisn’t height above the ground. - Positions have an age: check
seen_pos; those older than about 60 seconds aren’t returned. - The Free plan’s radius goes up to 500 km: plenty for a field. The plans.
- Attribution where you show the data: the line to use.
A receiver near your field is the most effective way to see low-level traffic, for you and for everyone: become a feeder. Whoever feeds the network also gets Pro limits for free, for non-commercial use.