New rate limits now apply to all accounts.

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

Auth
x-api-key on every request (direct subscription). Learn more →
GEThttps://data.skylinkapi.com/v3/airports/search
ParameterTypeRequiredDefaultDescription
icaostringOne of icao / iata-4-letter ICAO code, e.g. KJFK
iatastringOne 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

FieldTypeRequiredNull?Description
idintegerYesNeverNumeric record identifier
identstringYesNeverPrimary identifier (usually ICAO)
typestringYesNeverAirport class — see table below
namestringYesNeverOfficial airport name
latitude_degnumberYesNeverWGS-84 latitude
longitude_degnumberYesNeverWGS-84 longitude
elevation_ftnumber | nullNoYesField elevation in feet MSL
municipalitystring | nullNoYesCity or town served
iso_countrystring | nullNoYesISO 3166-1 alpha-2 country code
iso_regionstring | nullNoYesISO region code, e.g. US-NY
icao_codestring | nullNoYesICAO location indicator
iata_codestring | nullNoYesIATA location code
scheduled_servicestring | nullNoYesyes / no when known
search_codestring | nullNoYesEcho of the code you queried
search_typestring | nullNoYesICAO or IATA
runwaysarrayYesNeverRunway records (may be [])
frequenciesarrayYesNeverRadio frequencies (may be [])
navaidsarrayYesNeverNearby navaids (may be [])
countryobject | nullNoYesResolved country metadata
regionobject | nullNoYesResolved region metadata

Airport type values

ValueMeaning
large_airportMajor commercial airport
medium_airportRegional commercial
small_airportGeneral aviation
heliportHeliport
seaplane_baseSeaplane base
closedClosed facility (still in database)
balloonportBalloon launch site

Runway object (runways[])

FieldTypeRequiredNull?Description
length_ftnumber | nullNoYesRunway length in feet
width_ftnumber | nullNoYesRunway width in feet
surfacestring | nullNoYesSurface code — ASP (asphalt), PEM (pavement), GRS (gravel), etc.
lightedinteger | nullNoYes1 when lighted
closedinteger | nullNoYes1 when closed
le_identstring | nullNoYesLow-end runway designator
he_identstring | nullNoYesHigh-end runway designator

Frequency object (frequencies[])

FieldTypeRequiredDescription
typestringYesService type — ATIS, GND, TWR, APP, DEP, etc.
descriptionstring | nullNoHuman-readable label
frequency_mhznumberYesFrequency in MHz
FieldTypeRequiredNull?Description
identstringYesNeverNavaid identifier
namestringYesNeverNavaid name
typestringYesNevere.g. VOR, VOR-DME, NDB
frequency_khzinteger | nullNoYesFrequency in kHz
latitude_degnumberYesNeverNavaid latitude
longitude_degnumberYesNeverNavaid longitude
associated_airportstring | nullNoYesLinked 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 | None

Integration

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"
}
GET
/airports/search
x-api-key<token>

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

In: header

Query Parameters

icao?string

4-letter ICAO airport code (e.g., KJFK, EGLL)

Length4 <= length <= 4
iata?string

3-letter IATA airport code (e.g., JFK, LHR)

Length3 <= length <= 3
ident?string

Any 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