Performance specs

Runnable examples for pulling and comparing aircraft performance data by ICAO type designator. See the full Aircraft Performance reference for field definitions and coverage notes.

#QuestionData used
1What are the performance specs for a Boeing 737-800?/aircraft/performance/{icao_type}
2How do the A320, B738, and A35K compare on range and cruise speed?/aircraft/performance/{icao_type}

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →

Install

The scripts below use requests for API calls and rich for terminal output. Install once:

pip install requests rich

1. Look up performance specs for a Boeing 737-800 (B738)

Question: What are the cruise speed, range, dimensions, and operational limits for a B738?

Performance data is keyed by ICAO type designator. A 404 means the type is not yet in the performance database — this is normal for rare or very new types.

import os

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"

ICAO_TYPE = "B738"


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


def main() -> None:
    data = fetch_performance(ICAO_TYPE)

    if data is None:
        console.print(f"[yellow]Type {ICAO_TYPE} not in performance database.[/yellow]")
        return

    cruise_kt = data["cruise_speed_ktas"]
    cruise_kmh = round(cruise_kt * 1.852)
    range_nm = data["max_range_nm"]
    range_km = round(range_nm * 1.852)
    mtow_t = data["mtow_t"]
    mtow_lb = round(mtow_t * 2204.6)

    table = Table(title=f"Performance — {data['icao_type']} {data['name']}", border_style="cyan")
    table.add_column("Field", style="bold")
    table.add_column("Value")

    table.add_row("ICAO Type", data["icao_type"])
    table.add_row("Name", data["name"])
    table.add_row("Engine Type", data["engine_type"])
    table.add_row("Wake Category", data["wake_category"])
    table.add_row("Cruise Speed", f"{cruise_kt} kt  ({cruise_kmh} km/h)")
    table.add_row("Service Ceiling", f"{data['service_ceiling_ft']:,} ft")
    table.add_row("Max Range", f"{range_nm:,} nm  ({range_km:,} km)")
    table.add_row("Wingspan", f"{data['wing_span_m']} m")
    table.add_row("Length", f"{data['length_m']} m")
    table.add_row("MTOW", f"{mtow_t} t  ({mtow_lb:,} lb)")
    table.add_row("Max Passengers", str(data["max_passengers"]))

    console.print(table)


if __name__ == "__main__":
    main()

Output: A table with all performance fields including derived unit conversions (km/h, km, lb).


2. Compare cruise speed and range for A320 vs B738 vs A35K

Question: Among three common narrowbody and widebody types, which has the greatest range and how do they stack up on cruise speed?

Fetch each type concurrently, sort by max_range_nm descending, and mark the longest-range type with ★. Types that 404 are skipped with a warning.

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"

TYPES = ["A320", "B738", "A35K"]


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


def main() -> None:
    found: list[dict] = []
    missing: list[str] = []

    with ThreadPoolExecutor(max_workers=5) as pool:
        futures = {pool.submit(fetch_performance, t): t for t in TYPES}
        for future in as_completed(futures):
            icao_type, data = future.result()
            if data is None:
                missing.append(icao_type)
            else:
                found.append(data)

    if missing:
        console.print(f"[yellow]Skipped (not in database): {', '.join(missing)}[/yellow]")

    if not found:
        console.print("[red]No performance data available for any of the requested types.[/red]")
        return

    found.sort(key=lambda d: d["max_range_nm"], reverse=True)
    best_range = found[0]["icao_type"]

    table = Table(title="Aircraft Performance Comparison", border_style="cyan")
    table.add_column("Type", style="bold")
    table.add_column("Name")
    table.add_column("Cruise (kt)", justify="right")
    table.add_column("Range (nm)", justify="right")
    table.add_column("Ceiling (ft)", justify="right")
    table.add_column("Wake", justify="center")

    for d in found:
        star = " ★" if d["icao_type"] == best_range else ""
        table.add_row(
            d["icao_type"] + star,
            d["name"],
            str(d["cruise_speed_ktas"]),
            f"{d['max_range_nm']:,}",
            f"{d['service_ceiling_ft']:,}",
            d["wake_category"],
        )

    console.print(table)


if __name__ == "__main__":
    main()

Output: A comparison table sorted by range descending. The longest-range type is marked with ★.