Save up to 17% with yearly billing

See pricing

Aircraft Lookup

Look up an aircraft's type, operator, and photos by registration (nationally registered aircraft identifier, e.g. G-STBC, N12345) or ICAO24 (6-character hex transponder address broadcast on ADS-B, e.g. 40621D). The SkyLink aircraft registry holds 615,000+ records refreshed daily — new registrations and ownership changes may lag official authority records.

Use registration lookup when your UI or schedule row already has a tail number. Use ICAO24 lookup when you receive hex codes from a live ADS-B feed and need to enrich them with type and operator metadata. After resolving icao_type (4-character aircraft type code used in flight plans, e.g. B738), chain to Aircraft Performance for cruise speed, range, and wake category.

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →
EndpointWhen to use
GET /aircraft/registration/{registration}Tail-number lookup for flight cards, fleet pages, or photo galleries
GET /aircraft/icao24/{icao24}Enrich live ADS-B hex addresses from tracker feeds
GET /aircraft/database/statsHealth check — confirm the registry is loaded and see record counts

Important: Registration and ICAO24 lookups return HTTP 200 with found: false and aircraft: null when no match exists — never 404. Check found in the JSON body; do not treat it as an HTTP error.

Important: photos defaults to true for convenience but adds latency. Pass photos=false on list views, batch enrichment jobs, and map overlays where thumbnails are not needed.

Lookup by registration

Look up an aircraft by its registration / tail number. v3.1 adds manufacturer_and_model, airline_code, serial_number, and is_private_operator fields on the aircraft object.

Request

GEThttps://data.skylinkapi.com/v3.1/aircraft/registration/{registration}
ParameterTypeRequiredDefaultDescription
registrationstringYes (path)-Tail number, e.g. G-STBC, N12345 (2–10 characters)
photosbooleanNotrueInclude community aircraft photos when available

Response

{
  "query": "G-STBC",
  "found": true,
  "aircraft": {
    "registration": "G-STBC",
    "icao24": "40621D",
    "icao_type": "B77W",
    "type_name": "BOEING 777-36NER",
    "manufacturer": "Boeing Company",
    "manufacturer_and_model": "Boeing Company BOEING 777-36NER",
    "owner_operator": "British Airways",
    "airline_code": null,
    "is_private_operator": false,
    "serial_number": "38287",
    "year_built": null,
    "photos": [
      {
        "image": "https://image.airport-data.com/aircraft/001912010.jpg",
        "link": "https://airport-data.com/aircraft/photo/001912010",
        "photographer": "Roberto Cassar"
      }
    ]
  }
}
FieldTypeRequiredNull?Description
querystringYesNeverEcho of the registration searched
foundbooleanYesNeverWhether a registry match exists
aircraftobject | nullNoYesAircraft details when found is true; null when not found

Aircraft object (aircraft)

FieldTypeRequiredNull?Description
registrationstring | nullNoYesTail number
icao24string | nullNoYesICAO 24-bit transponder hex (uppercase in practice)
icao_typestring | nullNoYesICAO aircraft type designator, e.g. B77W
type_namestring | nullNoYesModel name, e.g. BOEING 777-36NER
manufacturerstring | nullNoYesManufacturer name
manufacturer_and_modelstring | nullNoYesCombined manufacturer + model string
owner_operatorstring | nullNoYesRegistered owner or operator
airline_codestring | nullNoYesOperator airline code when known
is_private_operatorboolean | nullNoYestrue for private operators
serial_numberstring | nullNoYesManufacturer serial number
year_builtstring | nullNoYesYear of manufacture
photosarrayNoNeverPresent when photos=true; may be [] if none exist

Photo item (aircraft.photos[])

FieldTypeRequiredDescription
imagestringYesFull-size photo URL
linkstringYesExternal photo page URL when provided
photographerstringYesPhotographer credit
GET
/aircraft/registration/{registration}
x-api-key<token>

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

In: header

Path Parameters

registration*Registration

Aircraft registration (e.g. N12345, G-STBC)

Length2 <= length <= 10

Query Parameters

photos?Photos

Include aircraft photos from airport-data.com

Defaulttrue

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3.1/aircraft/registration/N12345"
{
  "query": "G-STBC",
  "found": true,
  "aircraft": {
    "registration": "G-STBC",
    "icao24": "40621d",
    "icao_type": "B77W",
    "type_name": "777-36N",
    "manufacturer": "Boeing",
    "manufacturer_and_model": "Boeing 777-36N",
    "owner_operator": "British Airways",
    "airline_code": "BAW",
    "is_private_operator": false,
    "serial_number": "38695",
    "year_built": "2013",
    "photos": [
      {
        "image": "https://image.airport-data.com/aircraft/001912010.jpg",
        "link": "https://airport-data.com/aircraft/photo/001912010.html",
        "photographer": "Roberto Cassar"
      }
    ]
  }
}
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Lookup by ICAO24

Look up an aircraft by its ICAO24 hex transponder address — the same identifier broadcast on ADS-B (e.g. 40621D). Returns the same aircraft object shape as registration lookup.

Request

GEThttps://data.skylinkapi.com/v3.1/aircraft/icao24/{icao24}
ParameterTypeRequiredDefaultDescription
icao24stringYes (path)-6-character ICAO 24-bit hex address (case-insensitive), e.g. 40621D. Pad leading zeros when your ADS-B source omits them
photosbooleanNotrueInclude community aircraft photos when available

Response

Same envelope as registration lookup. query echoes the ICAO24 address.

GET
/aircraft/icao24/{icao24}
x-api-key<token>

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

In: header

Path Parameters

icao24*Icao24

ICAO24 hex address (e.g. 40621D)

Length4 <= length <= 6

Query Parameters

photos?Photos

Include aircraft photos from airport-data.com

Defaulttrue

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3.1/aircraft/icao24/a835af"
{
  "query": "40621D",
  "found": true,
  "aircraft": {
    "registration": "G-STBC",
    "icao24": "40621d",
    "icao_type": "B77W",
    "type_name": "777-36N",
    "manufacturer": "Boeing",
    "manufacturer_and_model": "Boeing 777-36N",
    "owner_operator": "British Airways",
    "airline_code": "BAW",
    "is_private_operator": false,
    "serial_number": "38695",
    "year_built": "2013",
    "photos": [
      {
        "image": "https://image.airport-data.com/aircraft/001912010.jpg",
        "link": "https://airport-data.com/aircraft/photo/001912010.html",
        "photographer": "Roberto Cassar"
      }
    ]
  }
}
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Database statistics

Returns counts and load status for the in-memory aircraft registry. No parameters required — useful for startup health checks and monitoring dashboards.

Request

GEThttps://data.skylinkapi.com/v3.1/aircraft/database/stats

No query or path parameters.

Response

{
  "loaded": true,
  "total_icao_entries": 612678,
  "total_registration_entries": 608905,
  "source_url": "https://api.skylinkapi.com/internal/aircraft.json"
}
FieldTypeRequiredDescription
loadedbooleanYesWhether the registry finished loading
total_icao_entriesintegerYesICAO24-indexed records
total_registration_entriesintegerYesRegistration-indexed records
source_urlstringYesOpaque dataset reference URL returned by the API
GET
/aircraft/database/stats
x-api-key<token>

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

In: header

Response Body

application/json

curl -X GET "https://data.skylinkapi.com/v3.1/aircraft/database/stats"
{
  "loaded": true,
  "total_icao_entries": 615656,
  "total_registration_entries": 613252,
  "source_url": "http://10.0.1.15:8090/aircraft.json"
}

Client types

"""Aircraft lookup response models for /aircraft/registration and /aircraft/icao24."""from __future__ import annotationsfrom dataclasses import dataclass@dataclassclass AircraftPhoto:    image: str    link: str    photographer: str@dataclassclass AircraftDetails:    registration: str | None    icao24: str | None    icao_type: str | None    type_name: str | None    manufacturer: str | None    manufacturer_and_model: str | None    owner_operator: str | None    airline_code: str | None    is_private_operator: bool | None    serial_number: str | None    year_built: str | None    photos: list[AircraftPhoto]@dataclassclass AircraftLookupResponse:    query: str    found: bool    aircraft: AircraftDetails | None@dataclassclass AircraftDatabaseStats:    loaded: bool    total_icao_entries: int    total_registration_entries: int    source_url: str@dataclassclass AircraftSummary:    """Compact model for UI cards."""    registration: str | None    icao24: str | None    icao_type: str | None    display_name: str    operator: str | None    photo_url: str | None

Integration

Resolve a tail number to a compact aircraft card for flight tracking or fleet displays.

The example below caches successful lookups for 24 hours because registry metadata changes infrequently. Each request uses explicit timeouts (10 s connect / 15 s read) so a slow upstream call cannot block your worker. The helper normalizes the response into a UI-friendly model and handles found: false without treating it as an HTTP error.

import osimport timefrom dataclasses import dataclassimport requestsHEADERS = {    "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3.1"CACHE: dict[str, tuple[dict, float]] = {}AIRCRAFT_TTL = 86_400  # 24 h@dataclassclass AircraftSummary:    registration: str | None    icao24: str | None    icao_type: str | None    display_name: str    operator: str | None    photo_url: str | Nonedef fetch_aircraft_by_registration(registration: str, *, photos: bool = False) -> dict | None:    """Look up aircraft by tail number. Returns None when found=false."""    reg = registration.strip().upper()    key = f"aircraft:reg:{reg}:{photos}"    cached = CACHE.get(key)    if cached and time.time() < cached[1]:        return cached[0]    try:        r = requests.get(            f"{BASE}/aircraft/registration/{reg}",            headers=HEADERS,            params={"photos": photos},            timeout=(10, 15),        )    except requests.Timeout as exc:        raise RuntimeError(f"SkyLink timeout fetching aircraft {reg}") from exc    r.raise_for_status()    payload = r.json()    if not payload.get("found"):        return None    CACHE[key] = (payload, time.time() + AIRCRAFT_TTL)    return payloaddef aircraft_summary(registration: str) -> AircraftSummary | None:    payload = fetch_aircraft_by_registration(registration, photos=True)    if not payload:        return None    ac = payload["aircraft"]    photos = ac.get("photos") or []    return AircraftSummary(        registration=ac.get("registration"),        icao24=ac.get("icao24"),        icao_type=ac.get("icao_type"),        display_name=ac.get("type_name") or ac.get("manufacturer_and_model") or registration,        operator=ac.get("owner_operator"),        photo_url=photos[0]["image"] if photos else None,    )if __name__ == "__main__":    import json    from dataclasses import asdict    summary = aircraft_summary("N636JB")    print(json.dumps(asdict(summary), indent=2) if summary else "Aircraft not found")

Implementation notes

Photos toggle. Default photos=true is convenient for galleries but slower. Pass photos=false on list views and batch enrichment jobs.

Chain to performance. When icao_type is present, call Aircraft Performance for cruise speed, range, and wake category.

ADS-B enrichment. For live tracks, prefer ICAO24 lookup after receiving hex codes from ADS-B.

Error responses

For shared platform errors (auth, rate limits, server errors), see Error Handling. Endpoint-specific behavior:

200 — aircraft not found (registration / ICAO24)

{
  "query": "ZZZZNOT",
  "found": false,
  "aircraft": null
}

Treat found: false as a normal empty result — do not retry.

422 — invalid registration or ICAO24

{
  "detail": [
    {
      "type": "string_too_short",
      "loc": ["path", "registration"],
      "msg": "String should have at least 2 characters"
    }
  ]
}

Occurs when the path parameter is too short or fails validation.


Related: Aircraft Performance · ADS-B · Historical ADS-B Positions