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
x-api-key on every request (direct subscription). Learn more →Pro, Ultra, or Mega — use the path prefix that matches the window you need.
Learn more →Request
https://data.skylinkapi.com/v3.1/ultra/history/airport/{icao}/traffic| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
icao | string | Yes | - | Airport ICAO code (4 characters) |
start | string | No | 24 h ago | Window start — ISO 8601 |
end | string | No | now | Window end — ISO 8601 |
direction | string | No | both | dep, arr, or both |
limit | integer | No | 100 | Max flights returned (max 1,000 on ULTRA path) |
Query window cannot exceed 90 days on /ultra/history/....
MEGA path (`/mega/history/...`)Expand section
https://data.skylinkapi.com/v3.1/mega/history/airport/{icao}/traffic| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
icao | string | Yes | - | Airport ICAO |
start | string | No | 24 h ago | Window start — ISO 8601 (max 365 days span on MEGA path) |
end | string | No | now | Window end |
direction | string | No | both | dep, arr, or both |
limit | integer | No | 200 | Max 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
}
]
}| Field | Type | Required | Description |
|---|---|---|---|
icao | string | Yes | Queried airport ICAO |
direction | string | Yes | Applied filter — dep, arr, or both |
count | integer | Yes | Number of items in flights |
flights | array | Yes | Matching arrivals/departures |
Traffic flight (flights[])
Each item uses the same airport and timing fields as flight summary.
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
flight_id | string | Yes | Never | UUID for detail/track lookups |
icao24 | string | null | No | Yes | Aircraft hex |
callsign | string | null | No | Yes | ADS-B callsign |
flight_number | string | null | No | Yes | Normalized flight number when resolved |
aircraft_type_icao | string | null | No | Yes | ICAO type code |
airline_name | string | null | No | Yes | Airline display name |
departure_airport_icao | string | null | No | Yes | Departure airport ICAO |
departure_airport_iata | string | null | No | Yes | Departure airport IATA |
arrival_airport_icao | string | null | No | Yes | Arrival airport ICAO |
arrival_airport_iata | string | null | No | Yes | Arrival airport IATA |
flight_state | string | null | No | Yes | Archive state (e.g. ARCHIVED) |
takeoff_time | string | null | No | Yes | Takeoff time (ISO 8601) |
landing_time | string | null | No | Yes | Landing time (ISO 8601) |
flight_duration_min | number | null | No | Yes | Duration in minutes |
distance_nm | number | null | No | Yes | Distance 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/..."
}Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
Query Parameters
Start datetime ISO 8601. Defaults to 24 h ago.
End datetime ISO 8601. Defaults to now.
Filter direction: 'dep', 'arr', or 'both'
"both"Max records (default 100, max 1000)
1001 <= value <= 1000Response 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": {}
}
]
}Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
Query Parameters
Start datetime ISO 8601. Defaults to 24 h ago.
End datetime ISO 8601. Defaults to now.
'dep', 'arr', or 'both'
"both"Max records (default 200, max 2000)
2001 <= value <= 2000Response 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": {}
}
]
}