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
x-api-key on every request (direct subscription). Learn more →| Endpoint | When to use |
|---|---|
GET /v3/adsb/aircraft | Live positions — map tiles, traffic boards, filtered feeds |
GET /v3/adsb/aircraft/statistics | Fleet-wide aggregates — airborne vs on-ground, altitude stats |
GET /v3/adsb/health | Feed health — connection status and active aircraft count |
Live aircraft
Request
https://data.skylinkapi.com/v3/adsb/aircraft| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
icao24 | string | No | - | Filter by 6-character hex transponder address |
callsign | string | No | - | Partial callsign match (case-insensitive) |
lat | number | No | - | Centre latitude for radius search |
lon | number | No | - | Centre longitude for radius search |
radius | number | No | - | Search radius in kilometres (max 1000) |
bbox | string | No | - | Bounding box lat1,lon1,lat2,lon2 — SW corner first |
min_alt | number | No | - | Minimum altitude in feet |
max_alt | number | No | - | Maximum altitude in feet |
min_speed | number | No | - | Minimum ground speed in knots |
max_speed | number | No | - | Maximum ground speed in knots |
registration | string | No | - | Filter by tail number |
airline | string | No | - | Filter by operating airline name |
photos | boolean | No | false | Fetch 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 mode | Required parameters | Notes |
|---|---|---|
| Circle | lat + lon + radius | All three together |
| Rectangle | bbox | SW 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[])
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
icao24 | string | Yes | Never | ICAO 24-bit hex identifier |
callsign | string | null | No | Yes | Flight callsign when broadcast |
latitude | number | null | No | Yes | WGS-84 latitude |
longitude | number | null | No | Yes | WGS-84 longitude |
altitude | number | null | No | Yes | Barometric altitude in feet MSL |
ground_speed | number | null | No | Yes | Ground speed in knots |
track | number | null | No | Yes | Track angle in degrees (0–360) |
vertical_rate | number | null | No | Yes | Vertical rate in feet per minute |
is_on_ground | boolean | null | No | Yes | true when on the surface |
last_seen | string (ISO 8601) | Yes | Never | Last observation time |
first_seen | string (ISO 8601) | Yes | Never | First seen in current tracking session |
registration | string | null | No | Yes | Tail number when resolved |
aircraft_type | string | null | No | Yes | Type description or ICAO designator |
airline | string | null | No | Yes | Operating airline when resolved |
photo_url | string | null | No | Yes | Thumbnail URL when photos=true |
Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Query Parameters
Filter by ICAO 24-bit aircraft identifier (6 hex characters)
Filter by flight callsign (partial match, case-insensitive)
Center latitude for radius search
-90 <= value <= 90Center longitude for radius search
-180 <= value <= 180Search radius in kilometers
0 < value <= 1000Bounding box as 'lat1,lon1,lat2,lon2' (SW,NE corners)
Minimum altitude in feet
0 <= value <= 60000Maximum altitude in feet
0 <= value <= 60000Minimum ground speed in knots
0 <= value <= 1000Maximum ground speed in knots
0 <= value <= 1000Filter by aircraft registration
Filter by operating airline
Fetch aircraft photos from airport-data.com (slower, max 50 aircraft)
falseResponse 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
https://data.skylinkapi.com/v3/adsb/aircraft/statisticsNo 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"
}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
https://data.skylinkapi.com/v3/adsb/healthNo query or path parameters.
{
"status": "healthy",
"connected": true,
"active_aircraft_count": 9889,
"connection_uptime": null,
"last_message_received": "2026-06-16T14:21:46.212802"
}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: boolIntegration
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