Airport Traffic

Reconstruct historical arrivals and departures at an airport for a given time window. Use this endpoint for operational analytics, capacity planning, and airline-performance dashboards — not for real-time schedules (see Schedules).

Plan tiers: Historical ADS-B hub.

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →
Plan

Pro, Ultra, or Mega — use the path prefix that matches the window you need.

Learn more →

Request

GEThttps://data.skylinkapi.com/v3.1/ultra/history/airport/{icao}/traffic
ParameterTypeRequiredDefaultDescription
icaostringYes-Airport ICAO code (4 characters)
startstringNo24 h agoWindow start — ISO 8601
endstringNonowWindow end — ISO 8601
directionstringNobothdep, arr, or both
limitintegerNo100Max flights returned (max 1,000 on ULTRA path)

Query window cannot exceed 90 days on /ultra/history/....

MEGA path (`/mega/history/...`)Expand section
GEThttps://data.skylinkapi.com/v3.1/mega/history/airport/{icao}/traffic
ParameterTypeRequiredDefaultDescription
icaostringYes-Airport ICAO
startstringNo24 h agoWindow start — ISO 8601 (max 365 days span on MEGA path)
endstringNonowWindow end
directionstringNobothdep, arr, or both
limitintegerNo200Max flights returned (max 2,000 on MEGA path)

Requires Ultra or Mega plan. Same response shape as ULTRA.

Response

{
  "icao": "EGLL",
  "direction": "both",
  "count": 1,
  "flights": [
    {
      "flight_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "icao24": "4006f2",
      "callsign": "BAW117",
      "flight_number": "BAW117",
      "aircraft_type_icao": "B77W",
      "airline_name": "British Airways",
      "departure_airport_icao": "EGLL",
      "departure_airport_iata": "LHR",
      "arrival_airport_icao": "KJFK",
      "arrival_airport_iata": "JFK",
      "flight_state": "ARCHIVED",
      "takeoff_time": "2026-05-12T09:10:00Z",
      "landing_time": "2026-05-12T09:28:00Z",
      "flight_duration_min": 18.0,
      "distance_nm": 205.7
    }
  ]
}
FieldTypeRequiredDescription
icaostringYesQueried airport ICAO
directionstringYesApplied filter — dep, arr, or both
countintegerYesNumber of items in flights
flightsarrayYesMatching arrivals/departures

Traffic flight (flights[])

Each item uses the same airport and timing fields as flight summary.

FieldTypeRequiredNull?Description
flight_idstringYesNeverUUID for detail/track lookups
icao24string | nullNoYesAircraft hex
callsignstring | nullNoYesADS-B callsign
flight_numberstring | nullNoYesNormalized flight number when resolved
aircraft_type_icaostring | nullNoYesICAO type code
airline_namestring | nullNoYesAirline display name
departure_airport_icaostring | nullNoYesDeparture airport ICAO
departure_airport_iatastring | nullNoYesDeparture airport IATA
arrival_airport_icaostring | nullNoYesArrival airport ICAO
arrival_airport_iatastring | nullNoYesArrival airport IATA
flight_statestring | nullNoYesArchive state (e.g. ARCHIVED)
takeoff_timestring | nullNoYesTakeoff time (ISO 8601)
landing_timestring | nullNoYesLanding time (ISO 8601)
flight_duration_minnumber | nullNoYesDuration in minutes
distance_nmnumber | nullNoYesDistance in nautical miles

Client types

"""Typed models for Historical ADS-B - matches historical-adsb.mdx field tables."""from __future__ import annotationsfrom dataclasses import dataclassfrom typing import Literal@dataclassclass HistoricalFlightSummary:    flight_id: str    icao24: str | None    callsign: str | None    flight_number: str | None    tail_number: str | None    departure_airport_icao: str | None    arrival_airport_icao: str | None    flight_start: str    flight_end: str    takeoff_time: str | None    landing_time: str | None    flight_duration_min: float | None    distance_nm: float | None@dataclassclass HistoricalPosition:    timestamp: str    icao24: str    latitude: float    longitude: float    altitude_baro: float | None    ground_speed: float | None    track: float | None    vertical_rate: float | None    is_on_ground: bool@dataclassclass HistoricalFlightWindow:    flight_id: str    callsign: str | None    departure_airport_icao: str | None    arrival_airport_icao: str | None    takeoff_time: str | None    landing_time: str | None    flight_start: str    flight_end: str    flight_state: str | None@dataclassclass AirportTrafficFlight:    flight_id: str    icao24: str | None    callsign: str | None    departure_airport_icao: str | None    arrival_airport_icao: str | None    takeoff_time: str | None    landing_time: str | None    flight_duration_min: float | None    distance_nm: float | None@dataclassclass AirportTrafficResponse:    icao: str    direction: Literal["dep", "arr", "both"]    count: int    flights: list[AirportTrafficFlight]

Integration

Reconstruct arrivals and departures at a hub airport for a chosen time window. The example below fetches 48 hours of bidirectional traffic at EGLL, filters departures only, and groups by airline. Extend to the MEGA path for rolling 90-day windows that need direction: arr and limit: 2000 per batch.

import osfrom datetime import datetime, timedelta, timezoneimport requestsBASE = "https://data.skylinkapi.com/v3.1"HEADERS = {    "x-api-key": os.getenv("SKYLINK_API_KEY") or os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}def fetch_airport_traffic(icao: str, *, direction: str = "both", tier: str = "ultra", hours: int = 24) -> dict:    now = datetime.now(timezone.utc)    start = (now - timedelta(hours=hours)).strftime("%Y-%m-%dT%H:%M:%SZ")    end = now.strftime("%Y-%m-%dT%H:%M:%SZ")    r = requests.get(        f"{BASE}/{tier}/history/airport/{icao.upper()}/traffic",        headers=HEADERS,        params={"start": start, "end": end, "direction": direction, "limit": 50},        timeout=(10, 30),    )    r.raise_for_status()    return r.json()if __name__ == "__main__":    import json    data = fetch_airport_traffic("EGLL")    print(json.dumps({"icao": data.get("icao"), "count": data.get("count")}, indent=2))

Implementation notes

Important: With direction: both, infer movement direction by comparing departure_airport_icao and arrival_airport_icao against the queried icao — if departure_airport_icao equals the queried airport, it is a departure; if arrival_airport_icao equals it, it is an arrival. Do not assume list order.

Direction filtering. Request dep or arr instead of both when only one movement type is needed — smaller response and easier to paginate.

Pagination. When count equals your requested limit, narrow the start/end window or raise limit (up to 1,000 on ULTRA, 2,000 on MEGA) and merge across overlapping windows.

Error responses

Plan-gate 401/403: Historical ADS-B hub. Endpoint-specific:

422 — window too wide

Returned when start/end span exceeds the path maximum — 90 days on /ultra/history/... or 365 days on /mega/history/...:

{
  "detail": "Query window exceeds maximum of 90 days for your plan on /ultra/history/..."
}
GET
/ultra/history/airport/{icao}/traffic
x-api-key<token>

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

In: header

Path Parameters

icao*Icao

Query Parameters

start?|

Start datetime ISO 8601. Defaults to 24 h ago.

end?|

End datetime ISO 8601. Defaults to now.

direction?Direction

Filter direction: 'dep', 'arr', or 'both'

Default"both"
limit?Limit

Max records (default 100, max 1000)

Default100
Range1 <= value <= 1000

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3.1/ultra/history/airport/KJFK/traffic"
null
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}
GET
/mega/history/airport/{icao}/traffic
x-api-key<token>

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

In: header

Path Parameters

icao*Icao

Query Parameters

start?|

Start datetime ISO 8601. Defaults to 24 h ago.

end?|

End datetime ISO 8601. Defaults to now.

direction?Direction

'dep', 'arr', or 'both'

Default"both"
limit?Limit

Max records (default 200, max 2000)

Default200
Range1 <= value <= 2000

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3.1/mega/history/airport/KJFK/traffic"
null
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}