Save up to 17% with yearly billing

See pricing

Flugzeugsuche

Lauffähige Beispiele, um Kennzeichen und ICAO-Hexcodes in Metadaten von Luftfahrzeugen aufzulösen. Felddefinitionen und Antwortstruktur finden Sie in der vollständigen Referenz Flugzeugsuche.

#FrageVerwendete Daten
1Welcher Flugzeugtyp fliegt unter dem Kennzeichen N636JB, und wer ist der Betreiber?/aircraft/registration/{registration}
2Ein Foto eines Flugzeugs anhand des Kennzeichens für eine Flottenanzeige abrufen/aircraft/registration/{registration} mit photos=true
3Drei Kennzeichen gebündelt in Typen und Betreiber auflösen/aircraft/registration/{registration}

Voraussetzungen

Auth
x-api-key bei jeder Anfrage (Direktabonnement). Mehr erfahren →

Installation

Die folgenden Skripte verwenden requests für API-Aufrufe und rich für die Terminalausgabe. Einmalig installieren:

pip install requests rich

1. Kennzeichen in Flugzeugtyp und Betreiber auflösen

Frage: Welcher Flugzeugtyp ist N636JB, und wer betreibt das Flugzeug?

Registerabfragen sind der Ausgangspunkt für Analysen der Flottenzusammensetzung, Fotoanzeigen und die Verkettung mit Leistungsdaten. Das Feld found gibt Ihnen eine eindeutige Auskunft darüber, ob das Kennzeichen im SkyLink-Luftfahrzeugregister existiert.

import os

import requests
from rich.console import Console
from rich.panel import Panel

console = Console()

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"

REGISTRATION = "N636JB"


def fetch_aircraft(registration: str) -> dict | None:
    r = requests.get(
        f"{BASE}/aircraft/registration/{registration}",
        headers=HEADERS,
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()


def main() -> None:
    data = fetch_aircraft(REGISTRATION)

    if data is None or not data.get("found"):
        console.print(f"[yellow]⚠ Registration {REGISTRATION} not found in registry.[/yellow]")
        return

    ac = data["aircraft"]
    lines = [
        f"[bold]Registration:[/bold]  {ac['registration']}",
        f"[bold]ICAO24:[/bold]        {ac['icao24']}",
        f"[bold]ICAO Type:[/bold]     {ac['icao_type']}",
        f"[bold]Full Name:[/bold]     {ac['type_name']}",
        f"[bold]Operator:[/bold]      {ac['owner_operator']}",
    ]
    console.print(Panel("\n".join(lines), title=f"Aircraft — {REGISTRATION}", border_style="cyan"))


if __name__ == "__main__":
    main()

Ausgabe: Ein Panel mit Kennzeichen, Hexcode, ICAO-Musterkennung, vollständigem Typnamen und Betreiber.

Tipp: Speichern Sie Registerantworten bis zu 24 Stunden im Cache — Registrierungsdaten von Luftfahrzeugen ändern sich selten, und wiederholte Abfragen desselben Kennzeichens verbrauchen unnötig Kontingent.


2. Flugzeugfoto anhand des Kennzeichens abrufen

Frage: Gibt es für N636JB ein Community-Foto, das ich in einer Flottenkarte anzeigen kann?

Übergeben Sie photos=true, um das Array photos in die Antwort aufzunehmen. Fotos stammen aus der Community und sind nicht immer vorhanden — prüfen Sie vor dem Rendern die Länge des Arrays.

import os

import requests
from rich.console import Console
from rich.panel import Panel

console = Console()

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"

REGISTRATION = "N636JB"


def fetch_aircraft_with_photos(registration: str) -> dict | None:
    r = requests.get(
        f"{BASE}/aircraft/registration/{registration}",
        headers=HEADERS,
        params={"photos": "true"},
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()


def main() -> None:
    data = fetch_aircraft_with_photos(REGISTRATION)

    if data is None or not data.get("found"):
        console.print(f"[yellow]⚠ Registration {REGISTRATION} not found.[/yellow]")
        return

    ac = data["aircraft"]
    photos = ac.get("photos") or []

    if not photos:
        console.print(f"[yellow]No photos available for {REGISTRATION}.[/yellow]")
        console.print("Photos are community-sourced and may not be present for every aircraft.")
        return

    first_photo = photos[0]["image"]
    icao_type = ac["icao_type"]

    lines = [
        f"[bold]Registration:[/bold]  {ac['registration']}",
        f"[bold]Type:[/bold]          {ac['type_name']}",
        f"[bold]Operator:[/bold]      {ac['owner_operator']}",
        f"[bold]Photo URL:[/bold]     [link={first_photo}]{first_photo}[/link]",
        f"[bold]Total photos:[/bold]  {len(photos)}",
    ]
    console.print(Panel("\n".join(lines), title="Fleet Card", border_style="blue"))
    console.print(
        f"\n[dim]Chain to /aircraft/performance/{icao_type} for performance specs.[/dim]"
    )


if __name__ == "__main__":
    main()

Ausgabe: Ein Panel mit der URL des ersten Fotos, dem Typ und dem Betreiber. Sind keine Fotos verfügbar, wird eine Warnung ausgegeben.

Nächster Schritt: Verketten Sie die Abfrage über das Feld icao_type mit /aircraft/performance/{icao_type}, um zusätzlich zum Foto die Leistungsdaten abzurufen.


3. Gebündelte Abfrage: mehrere Kennzeichen in Typen auflösen

Frage: Welche Typen und Betreiber gehören zu einer Liste von Kennzeichen aus verschiedenen Registern?

Verwenden Sie ThreadPoolExecutor, um Kennzeichen parallel abzurufen. Behandeln Sie found=false für nicht registrierte oder unbekannte Luftfahrzeuge ohne Absturz.

import os
from concurrent.futures import ThreadPoolExecutor, as_completed

import requests
from rich.console import Console
from rich.table import Table

console = Console()

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"

REGISTRATIONS = ["N636JB", "G-EUUU", "D-AIBL"]


def fetch_aircraft(registration: str) -> tuple[str, dict | None]:
    r = requests.get(
        f"{BASE}/aircraft/registration/{registration}",
        headers=HEADERS,
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return registration, None
    r.raise_for_status()
    return registration, r.json()


def main() -> None:
    results: dict[str, dict | None] = {}

    with ThreadPoolExecutor(max_workers=5) as pool:
        futures = {pool.submit(fetch_aircraft, reg): reg for reg in REGISTRATIONS}
        for future in as_completed(futures):
            reg, data = future.result()
            results[reg] = data

    table = Table(title="Batch Aircraft Lookup", border_style="cyan")
    table.add_column("Registration", style="bold")
    table.add_column("Found", justify="center")
    table.add_column("ICAO Type")
    table.add_column("Full Name")
    table.add_column("Operator")

    for reg in REGISTRATIONS:
        data = results.get(reg)
        if data is None or not data.get("found"):
            table.add_row(reg, "[red]✗[/red]", "—", "—", "—")
        else:
            ac = data["aircraft"]
            table.add_row(
                ac["registration"],
                "[green]✓[/green]",
                ac["icao_type"],
                ac["type_name"],
                ac["owner_operator"],
            )

    console.print(table)


if __name__ == "__main__":
    main()

Ausgabe: Eine Tabelle mit einer Zeile pro Kennzeichen: Registration | Found | ICAO Type | Full Name | Operator. Nicht aufgelöste Kennzeichen zeigen ✗ und Gedankenstriche.