Airports
Fetch full airport details by ICAO (4-letter location indicator, globally unique) or IATA (3-letter passenger code — not always unique). The response includes runways, radio frequencies, nearby navaids (VOR, NDB, ILS, and similar radio navigation aids), and resolved country/region objects. Call this endpoint after the user selects an airport from search results, or when you already have a code and need facility data for briefing screens, runway analysis, or map pins.
Provide either icao or iata as a query parameter — never both.
Request
Requirements
x-api-key on every request (direct subscription). Learn more →https://data.skylinkapi.com/v3/airports/search| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
icao | string | One of icao / iata | - | 4-letter ICAO code, e.g. KJFK |
iata | string | One of icao / iata | - | 3-letter IATA code, e.g. JFK |
Response
The API returns a single airport object (not wrapped in a list).
{
"id": 3622,
"ident": "KJFK",
"type": "large_airport",
"name": "John F. Kennedy International Airport",
"latitude_deg": 40.639447,
"longitude_deg": -73.779317,
"elevation_ft": 13.0,
"municipality": "New York",
"iso_country": "US",
"iso_region": "US-NY",
"icao_code": "KJFK",
"iata_code": "JFK",
"scheduled_service": "yes",
"search_code": "KJFK",
"search_type": "ICAO",
"runways": [
{
"length_ft": 12079.0,
"width_ft": 200.0,
"surface": "PEM",
"le_ident": "04L",
"he_ident": "22R"
}
],
"frequencies": [
{
"type": "TWR",
"description": "JFK TOWER",
"frequency_mhz": 119.1
}
],
"navaids": [
{
"ident": "JFK",
"name": "Kennedy",
"type": "VOR-DME",
"frequency_khz": 115900,
"associated_airport": "KJFK"
}
],
"country": {
"code": "US",
"name": "United States"
},
"region": {
"code": "US-NY",
"name": "New York",
"iso_country": "US"
}
}Top-level fields
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
id | integer | Yes | Never | Numeric record identifier |
ident | string | Yes | Never | Primary identifier (usually ICAO) |
type | string | Yes | Never | Airport class — see table below |
name | string | Yes | Never | Official airport name |
latitude_deg | number | Yes | Never | WGS-84 latitude |
longitude_deg | number | Yes | Never | WGS-84 longitude |
elevation_ft | number | null | No | Yes | Field elevation in feet MSL |
municipality | string | null | No | Yes | City or town served |
iso_country | string | null | No | Yes | ISO 3166-1 alpha-2 country code |
iso_region | string | null | No | Yes | ISO region code, e.g. US-NY |
icao_code | string | null | No | Yes | ICAO location indicator |
iata_code | string | null | No | Yes | IATA location code |
scheduled_service | string | null | No | Yes | yes / no when known |
search_code | string | null | No | Yes | Echo of the code you queried |
search_type | string | null | No | Yes | ICAO or IATA |
runways | array | Yes | Never | Runway records (may be []) |
frequencies | array | Yes | Never | Radio frequencies (may be []) |
navaids | array | Yes | Never | Nearby navaids (may be []) |
country | object | null | No | Yes | Resolved country metadata |
region | object | null | No | Yes | Resolved region metadata |
Airport type values
| Value | Meaning |
|---|---|
large_airport | Major commercial airport |
medium_airport | Regional commercial |
small_airport | General aviation |
heliport | Heliport |
seaplane_base | Seaplane base |
closed | Closed facility (still in database) |
balloonport | Balloon launch site |
Runway object (runways[])
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
length_ft | number | null | No | Yes | Runway length in feet |
width_ft | number | null | No | Yes | Runway width in feet |
surface | string | null | No | Yes | Surface code — ASP (asphalt), PEM (pavement), GRS (gravel), etc. |
lighted | integer | null | No | Yes | 1 when lighted |
closed | integer | null | No | Yes | 1 when closed |
le_ident | string | null | No | Yes | Low-end runway designator |
he_ident | string | null | No | Yes | High-end runway designator |
Frequency object (frequencies[])
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Service type — ATIS, GND, TWR, APP, DEP, etc. |
description | string | null | No | Human-readable label |
frequency_mhz | number | Yes | Frequency in MHz |
Navaid object (navaids[])
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
ident | string | Yes | Never | Navaid identifier |
name | string | Yes | Never | Navaid name |
type | string | Yes | Never | e.g. VOR, VOR-DME, NDB |
frequency_khz | integer | null | No | Yes | Frequency in kHz |
latitude_deg | number | Yes | Never | Navaid latitude |
longitude_deg | number | Yes | Never | Navaid longitude |
associated_airport | string | null | No | Yes | Linked airport ICAO when known |
Client types
"""Airport lookup response types - matches airports.mdx field tables."""from __future__ import annotationsfrom dataclasses import dataclass@dataclassclass AirportLookupRequest: """Query input for GET /airports/search - provide icao or iata, not both.""" icao: str | None = None iata: str | None = None@dataclassclass Runway: id: int airport_ident: str length_ft: float | None width_ft: float | None surface: str | None lighted: int | None closed: int | None le_ident: str | None he_ident: str | None@dataclassclass Frequency: id: int type: str description: str | None frequency_mhz: float airport_ref: int@dataclassclass Navaid: ident: str name: str type: str frequency_khz: int | None latitude_deg: float longitude_deg: float associated_airport: str | None@dataclassclass CountryRef: code: str name: str@dataclassclass RegionRef: code: str name: str iso_country: str@dataclassclass AirportDetail: id: int ident: str type: str name: str latitude_deg: float longitude_deg: float elevation_ft: float | None municipality: str | None iso_country: str | None icao_code: str | None iata_code: str | None scheduled_service: str | None runways: list[Runway] frequencies: list[Frequency] navaids: list[Navaid] country: CountryRef | None = None region: RegionRef | None = None search_code: str | None = None search_type: str | None = None@dataclassclass AirportSummary: """Shape returned by airport_summary() in the lookup example.""" icao: str | None iata: str | None name: str municipality: str | None country: str | None latitude: float longitude: float elevation_ft: float | None airport_type: str longest_runway_ft: int | NoneIntegration
import osimport timefrom dataclasses import dataclassfrom typing import Literalimport requests# AirportSummary - helper return type. Full wire types are in the Client types section.AirportType = Literal[ "large_airport", "medium_airport", "small_airport", "heliport", "seaplane_base", "closed", "balloonport",]HEADERS = { "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3"CACHE: dict[str, tuple[dict, float]] = {}AIRPORT_TTL = 86_400 # 24 h - OurAirports metadata changes slowly@dataclassclass AirportSummary: icao: str | None iata: str | None name: str municipality: str | None country: str | None latitude: float longitude: float elevation_ft: float | None airport_type: str longest_runway_ft: int | Nonedef fetch_airport(*, icao: str | None = None, iata: str | None = None) -> dict | None: if bool(icao) == bool(iata): raise ValueError("Provide exactly one of icao or iata") code = icao or iata or "" cache_key = f"airport:{icao or ''}:{iata or ''}" cached = CACHE.get(cache_key) if cached and time.time() < cached[1]: return cached[0] params: dict[str, str] = {} if icao: params["icao"] = icao else: params["iata"] = iata or "" try: r = requests.get( f"{BASE}/airports/search", headers=HEADERS, params=params, timeout=(10, 20), ) except requests.Timeout as exc: raise RuntimeError(f"SkyLink timeout fetching airport {code}") from exc if r.status_code == 404: return None r.raise_for_status() data = r.json() CACHE[cache_key] = (data, time.time() + AIRPORT_TTL) return datadef airport_summary(icao: str) -> AirportSummary | None: airport = fetch_airport(icao=icao) if not airport: return None runways = airport.get("runways") or [] longest = max((int(rw.get("length_ft") or 0) for rw in runways), default=0) country = airport.get("country") or {} return AirportSummary( icao=airport.get("icao_code"), iata=airport.get("iata_code"), name=airport["name"], municipality=airport.get("municipality"), country=country.get("code") if isinstance(country, dict) else airport.get("iso_country"), latitude=airport["latitude_deg"], longitude=airport["longitude_deg"], elevation_ft=airport.get("elevation_ft"), airport_type=airport["type"], longest_runway_ft=longest or None, )if __name__ == "__main__": import json from dataclasses import asdict summary = airport_summary("KJFK") print(json.dumps(asdict(summary), indent=2) if summary else "Airport not found")Implementation notes
Incomplete data. GA strips and heliports often lack runways or frequencies. Check array lengths before rendering runway tables.
Downstream data. After resolving ICAO here, chain to METAR, TAF, NOTAMs, or Aerodrome Charts with the same code.
Navaid overlays. Embedded navaids cover the airport vicinity. For bbox or type filters across a region, use Navaids.
ICAO vs IATA and closed airportsExpand section
ICAO vs IATA. Prefer ICAO for internal storage — it is globally unique.
Closed airports. Records with type: "closed" remain in the database for historical reference.
Error responses
404 - airport not found
{
"detail": "Airport not found for ICAO code: XXXX"
}400 - both codes provided
{
"detail": "Provide either ICAO or IATA code, not both"
}400 - neither code provided
{
"detail": "Either ICAO or IATA code must be provided"
}Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Query Parameters
4-letter ICAO airport code (e.g., KJFK, EGLL)
4 <= length <= 43-letter IATA airport code (e.g., JFK, LHR)
3 <= length <= 3Any airport identifier as returned by the /airports/search/location, /airports/search/text or /airports/search/ip endpoints' ident field — including OurAirports pseudo-codes for airports without a real ICAO code (e.g., 'GB-0888')
Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3/airports/search"{
"id": 3682,
"ident": "KJFK",
"type": "large_airport",
"name": "John F Kennedy International Airport",
"latitude_deg": 40.63980103,
"longitude_deg": -73.77890015,
"elevation_ft": 13,
"continent": "NA",
"iso_country": "US",
"iso_region": "US-NY",
"municipality": "New York",
"scheduled_service": "yes",
"gps_code": "KJFK",
"iata_code": "JFK",
"local_code": "JFK",
"runways": [
{
"length_ft": 14511,
"width_ft": 150,
"surface": "ASP",
"lighted": 1,
"closed": 0,
"le_ident": "04L",
"he_ident": "22R"
}
],
"frequencies": [
{
"type": "TWR",
"description": "JFK TWR",
"frequency_mhz": 119.1
}
],
"navaids": [
{
"ident": "JFK",
"name": "Kennedy",
"type": "VOR-DME",
"frequency_khz": "115900"
}
],
"search_code": "KJFK",
"search_type": "ICAO"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}Related: Airport Search · METAR · NOTAMs