Skip to content

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 type says where the position comes from (adsb_icao, mlat, …), seen_pos how many seconds old it is, alt_baro the altitude in feet (or "ground"), and category A7 marks a helicopter.

The code

Aircraft below 3,000 ft within 15 km (Python)
# 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
Emergencies, military and notable aircraft in the area, up to 7 days
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_baro isn’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.

Check the coverage in your area

Further reading

← For product builders