New rate limits now apply to all accounts.

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.

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.

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →
EndpointWhen to use
GET /v3/aircraft/registration/{registration}Tail-number lookup for flight cards, fleet pages, or photo galleries
GET /v3/aircraft/icao24/{icao24}Enrich live ADS-B hex addresses from tracker feeds
GET /v3/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.

Lookup by registration

Request

GEThttps://data.skylinkapi.com/v3/aircraft/registration/{registration}
ParameterTypeRequiredDefaultDescription
registrationstringYes (path)-Tail number, e.g. G-STBC, N12345
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

Aircraft object

FieldTypeRequiredNull?Description
registrationstring | nullNoYesTail number
icao24string | nullNoYesICAO 24-bit transponder hex
icao_typestring | nullNoYesICAO aircraft type designator
type_namestring | nullNoYesModel name
manufacturerstring | nullNoYesManufacturer name
manufacturer_and_modelstring | nullNoYesCombined manufacturer + model
owner_operatorstring | nullNoYesRegistered owner or operator
airline_codestring | nullNoYesOperator airline code
is_private_operatorboolean | nullNoYestrue for private operators
serial_numberstring | nullNoYesManufacturer serial number
year_builtstring | nullNoYesYear of manufacture
photosarrayNoNeverPresent when photos=true
GET
/aircraft/registration/{registration}
x-api-key<token>

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

In: header

Path Parameters

registration*string

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

Length2 <= length <= 10

Query Parameters

photos?boolean

Include aircraft photos from airport-data.com

Defaulttrue

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3/aircraft/registration/N12345"
{
  "query": "G-STBC",
  "found": true,
  "aircraft": {
    "registration": "G-STBC",
    "icao24": "40621d",
    "icao_type": "B77W",
    "type_name": "Boeing 777-36N",
    "owner_operator": "British Airways",
    "is_military": false,
    "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

Request

GEThttps://data.skylinkapi.com/v3/aircraft/icao24/{icao24}
ParameterTypeRequiredDefaultDescription
icao24stringYes (path)-6-character ICAO 24-bit hex address (case-insensitive)
photosbooleanNotrueInclude community aircraft photos

Response

Same envelope as registration lookup.

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

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

In: header

Path Parameters

icao24*string

ICAO24 hex address (e.g. 40621D)

Length4 <= length <= 6

Query Parameters

photos?boolean

Include aircraft photos from airport-data.com

Defaulttrue

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3/aircraft/icao24/a835af"
{
  "query": "40621D",
  "found": true,
  "aircraft": {
    "registration": "G-STBC",
    "icao24": "40621d",
    "icao_type": "B77W",
    "type_name": "Boeing 777-36N",
    "owner_operator": "British Airways",
    "is_military": false,
    "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

Request

GEThttps://data.skylinkapi.com/v3/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"
}
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/aircraft/database/stats"
{
  "loaded": true,
  "total_icao_entries": 615656,
  "total_registration_entries": 613252,
  "database_file": "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

import osimport timefrom dataclasses import dataclassimport requestsHEADERS = {    "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3"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. Pass photos=false on list views and batch enrichment jobs.

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

Error responses

200 — aircraft not found

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

Related: ADS-B · Flight Status