New rate limits now apply to all accounts.

ADS-B Aircraft Tracking

Get live aircraft positions, filter them for your map viewport, and check the ADS-B feed health. ADS-B (Automatic Dependent Surveillance–Broadcast) is the transponder signal broadcasting aircraft identity and position. Each live record includes ICAO24 (6-character hex code uniquely identifying an aircraft's transponder), position, barometric altitude (altitude in feet MSL), ground speed, track (compass heading in degrees true), and vertical rate (rate of climb or descent in feet per minute).

Data refreshes every few seconds. For static registry details on a hex address, chain to Aircraft Lookup.

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →
EndpointWhen to use
GET /v3/adsb/aircraftLive positions — map tiles, traffic boards, filtered feeds
GET /v3/adsb/aircraft/statisticsFleet-wide aggregates — airborne vs on-ground, altitude stats
GET /v3/adsb/healthFeed health — connection status and active aircraft count

Live aircraft

Request

GEThttps://data.skylinkapi.com/v3/adsb/aircraft
ParameterTypeRequiredDefaultDescription
icao24stringNo-Filter by 6-character hex transponder address
callsignstringNo-Partial callsign match (case-insensitive)
latnumberNo-Centre latitude for radius search
lonnumberNo-Centre longitude for radius search
radiusnumberNo-Search radius in kilometres (max 1000)
bboxstringNo-Bounding box lat1,lon1,lat2,lon2 — SW corner first
min_altnumberNo-Minimum altitude in feet
max_altnumberNo-Maximum altitude in feet
min_speednumberNo-Minimum ground speed in knots
max_speednumberNo-Maximum ground speed in knots
registrationstringNo-Filter by tail number
airlinestringNo-Filter by operating airline name
photosbooleanNofalseFetch thumbnail photos (slower; max 50 aircraft per page)

v3 limitation: No limit or offset pagination — returns the full matched set (use filters to bound size). For paginated ADS-B queries, use v3.1 ADS-B.

Filter combination rules:

Search modeRequired parametersNotes
Circlelat + lon + radiusAll three together
RectanglebboxSW corner first, then NE
Neither—Do not mix circle and bbox parameters

Response

{
  "aircraft": [
    {
      "icao24": "0A0022",
      "callsign": "DAH2055",
      "latitude": 51.274109,
      "longitude": -0.675964,
      "altitude": 9075.0,
      "ground_speed": 298.3,
      "track": 153.09,
      "vertical_rate": 2880.0,
      "is_on_ground": false,
      "last_seen": "2026-06-16T14:21:45.674566",
      "first_seen": "2026-06-16T14:17:09.312068",
      "registration": "7T-VJP",
      "aircraft_type": "Boeing B738",
      "airline": "Air Algerie",
      "photo_url": null
    }
  ],
  "total_count": 67,
  "timestamp": "2026-06-16T14:21:49.178448"
}

Aircraft item (aircraft[])

FieldTypeRequiredNull?Description
icao24stringYesNeverICAO 24-bit hex identifier
callsignstring | nullNoYesFlight callsign when broadcast
latitudenumber | nullNoYesWGS-84 latitude
longitudenumber | nullNoYesWGS-84 longitude
altitudenumber | nullNoYesBarometric altitude in feet MSL
ground_speednumber | nullNoYesGround speed in knots
tracknumber | nullNoYesTrack angle in degrees (0–360)
vertical_ratenumber | nullNoYesVertical rate in feet per minute
is_on_groundboolean | nullNoYestrue when on the surface
last_seenstring (ISO 8601)YesNeverLast observation time
first_seenstring (ISO 8601)YesNeverFirst seen in current tracking session
registrationstring | nullNoYesTail number when resolved
aircraft_typestring | nullNoYesType description or ICAO designator
airlinestring | nullNoYesOperating airline when resolved
photo_urlstring | nullNoYesThumbnail URL when photos=true
GET
/adsb/aircraft
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Query Parameters

icao24?string

Filter by ICAO 24-bit aircraft identifier (6 hex characters)

callsign?string

Filter by flight callsign (partial match, case-insensitive)

lat?number

Center latitude for radius search

Range-90 <= value <= 90
lon?number

Center longitude for radius search

Range-180 <= value <= 180
radius?number

Search radius in kilometers

Range0 < value <= 1000
bbox?string

Bounding box as 'lat1,lon1,lat2,lon2' (SW,NE corners)

min_alt?number

Minimum altitude in feet

Range0 <= value <= 60000
max_alt?number

Maximum altitude in feet

Range0 <= value <= 60000
min_speed?number

Minimum ground speed in knots

Range0 <= value <= 1000
max_speed?number

Maximum ground speed in knots

Range0 <= value <= 1000
registration?string

Filter by aircraft registration

airline?string

Filter by operating airline

photos?boolean

Fetch aircraft photos from airport-data.com (slower, max 50 aircraft)

Defaultfalse

Response Body

application/json

application/json

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3/adsb/aircraft"
{
  "aircraft": [
    {
      "icao24": "40621D",
      "callsign": "BAW123",
      "latitude": 51.4706,
      "longitude": -0.4619,
      "altitude": 35000,
      "ground_speed": 450.5,
      "track": 89.2,
      "vertical_rate": 0,
      "is_on_ground": false,
      "last_seen": "2026-02-11T12:00:00Z",
      "first_seen": "2026-02-11T11:45:00Z",
      "registration": "G-STBC",
      "aircraft_type": "Boeing 777-36N",
      "airline": "British Airways",
      "photo_url": "https://image.airport-data.com/aircraft/001912010.jpg"
    }
  ],
  "total_count": 4691,
  "timestamp": "2026-02-11T12:00:30Z"
}
{
  "error": "string",
  "detail": "string",
  "timestamp": "2019-08-24T14:15:22Z"
}
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}
{
  "error": "string",
  "detail": "string",
  "timestamp": "2019-08-24T14:15:22Z"
}

Tracking statistics

GEThttps://data.skylinkapi.com/v3/adsb/aircraft/statistics

No query or path parameters.

{
  "total_aircraft": 9889,
  "positioned_aircraft": 9889,
  "on_ground": 412,
  "airborne": 9477,
  "altitude_stats": {
    "min_altitude": 100.0,
    "max_altitude": 56600.0,
    "avg_altitude": 21338.04
  },
  "timestamp": "2026-06-16T14:21:50.116343"
}
GET
/adsb/aircraft/statistics
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Response Body

application/json

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3/adsb/aircraft/statistics"
{
  "total_aircraft": 0,
  "positioned_aircraft": 0,
  "on_ground": 0,
  "airborne": 0,
  "altitude_stats": {
    "min_altitude": 0,
    "max_altitude": 0,
    "avg_altitude": 0
  },
  "timestamp": "2019-08-24T14:15:22Z"
}
{
  "error": "string",
  "detail": "string",
  "timestamp": "2019-08-24T14:15:22Z"
}
{
  "error": "string",
  "detail": "string",
  "timestamp": "2019-08-24T14:15:22Z"
}

Service health

GEThttps://data.skylinkapi.com/v3/adsb/health

No query or path parameters.

{
  "status": "healthy",
  "connected": true,
  "active_aircraft_count": 9889,
  "connection_uptime": null,
  "last_message_received": "2026-06-16T14:21:46.212802"
}
GET
/adsb/health
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Response Body

application/json

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3/adsb/health"
{
  "status": "string",
  "connected": true,
  "active_aircraft_count": 0,
  "connection_uptime": 0,
  "last_message_received": "2019-08-24T14:15:22Z"
}
{
  "error": "string",
  "detail": "string",
  "timestamp": "2019-08-24T14:15:22Z"
}
{
  "error": "string",
  "detail": "string",
  "timestamp": "2019-08-24T14:15:22Z"
}

Client types

"""ADS-B live aircraft models for GET /adsb/aircraft."""from __future__ import annotationsfrom dataclasses import dataclass@dataclassclass AdsbAircraft:    icao24: str    callsign: str | None    latitude: float | None    longitude: float | None    altitude: float | None    ground_speed: float | None    track: float | None    vertical_rate: float | None    is_on_ground: bool | None    last_seen: str    first_seen: str    registration: str | None    aircraft_type: str | None    airline: str | None    photo_url: str | None@dataclassclass AdsbAircraftListResponse:    aircraft: list[AdsbAircraft]    total_count: int    timestamp: str | None@dataclassclass MapMarker:    """Compact model for map overlays."""    icao24: str    label: str    lat: float    lon: float    altitude_ft: float | None    on_ground: bool

Integration

import osfrom dataclasses import dataclassimport requestsHEADERS = {    "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3"@dataclassclass MapMarker:    icao24: str    label: str    lat: float    lon: float    altitude_ft: float | None    on_ground: booldef fetch_aircraft_near(    *,    lat: float,    lon: float,    radius_km: float = 50,    limit: int = 100,) -> dict:    """Fetch live ADS-B aircraft within a radius. Do not cache - data is ephemeral."""    try:        r = requests.get(            f"{BASE}/adsb/aircraft",            headers=HEADERS,            params={                "lat": lat,                "lon": lon,                "radius": radius_km,                "limit": limit,                "photos": False,            },            timeout=(10, 15),        )    except requests.Timeout as exc:        raise RuntimeError("SkyLink timeout fetching ADS-B aircraft") from exc    r.raise_for_status()    return r.json()def to_map_markers(payload: dict) -> list[MapMarker]:    markers: list[MapMarker] = []    for ac in payload.get("aircraft", []):        lat = ac.get("latitude")        lon = ac.get("longitude")        if lat is None or lon is None:            continue        label = ac.get("callsign") or ac.get("registration") or ac["icao24"]        markers.append(            MapMarker(                icao24=ac["icao24"],                label=label,                lat=float(lat),                lon=float(lon),                altitude_ft=ac.get("altitude"),                on_ground=bool(ac.get("is_on_ground")),            )        )    return markersif __name__ == "__main__":    import json    payload = fetch_aircraft_near(lat=40.6413, lon=-73.7781, radius_km=80, limit=5)    print(json.dumps(payload, indent=2, default=str))

Implementation notes

Polling interval. Poll every 5–15 seconds depending on your quota and UX needs.

Bounding queries. Always pass lat/lon/radius or bbox for map views.

Enrichment gaps. registration and aircraft_type may be null for military, blocked, or unregistered hex codes.

Error responses

404 — ICAO24 filter not found

{
  "error": "Aircraft not found",
  "detail": "No aircraft found with ICAO24 000000",
  "timestamp": "2026-06-16T14:00:00Z"
}

Related: Aircraft Lookup · Flight Status