Ticketsuche
Lauffähige Beispiele für die Suche nach Flugticketpreisen: günstigste und schnellste Optionen, vollständige Reiseverlaufsdetails und Vergleiche für mehrere Passagiere. Feldbeschreibungen finden Sie in der Referenz Flugtickets. Verwendet IATA-Codes (nicht ICAO). Ergebnisse werden 1 Stunde lang gecacht — Preise sind Richtwerte und können sich bis zur Buchung ändern.
| # | Frage | Verwendete Daten |
|---|---|---|
| 1 | Günstigste und schnellste Optionen für JFK → LAX finden | GET /tickets/search |
| 2 | Vollständigen Reiseverlauf mit Umstiegsdetails für LHR → JFK anzeigen | GET /tickets/search |
| 3 | Für 2 Passagiere LHR → CDG suchen — alle Optionen vergleichen | GET /tickets/search |
Voraussetzungen
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 rich1. Günstigste und schnellste Option: JFK → LAX
Frage: Welches sind die günstigsten und schnellsten Ticketoptionen auf der Route JFK–LAX?
Die API liefert die Ergebnisse nach Preis aufsteigend sortiert. Die schnellste Option finden Sie, indem Sie total_duration_min durchsuchen.
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"
def fetch_tickets(
origin: str,
destination: str,
date: str | None = None,
passengers: int = 1,
) -> dict | None:
params: dict[str, str | int] = {
"origin": origin,
"destination": destination,
"passengers": passengers,
}
if date:
params["date"] = date
r = requests.get(
f"{BASE}/tickets/search",
headers=HEADERS,
params=params,
timeout=(10, 15),
)
if r.status_code == 404:
return None
r.raise_for_status()
return r.json()
def fmt_mins(minutes: int | None) -> str:
if minutes is None:
return "—"
return f"{minutes // 60}h {minutes % 60:02d}m"
def stops_label(stops: int) -> str:
return "Nonstop" if stops == 0 else f"{stops} stop(s)"
def flight_summary(flight: dict) -> str:
legs = flight.get("legs", [])
first_leg = legs[0] if legs else {}
return (
f"${flight.get('price_usd', 0):.2f} · "
f"{stops_label(flight.get('stops', 0))} · "
f"{fmt_mins(flight.get('total_duration_min'))} · "
f"{first_leg.get('flight_number', '—')} ({first_leg.get('airline', '—')})"
)
def main() -> None:
data = fetch_tickets("JFK", "LAX")
if not data:
console.print("[red]No ticket data returned.[/red]")
return
flights = data.get("flights", [])
if not flights:
console.print("[yellow]No flights available for JFK → LAX.[/yellow]")
return
cheapest = flights[0]
fastest = min(flights, key=lambda f: f.get("total_duration_min") or 99999)
console.print(
Panel(
f"[bold green]Cheapest[/bold green]\n{flight_summary(cheapest)}",
title="JFK → LAX",
style="green",
)
)
if fastest is not cheapest:
console.print(
Panel(
f"[bold cyan]Fastest[/bold cyan]\n{flight_summary(fastest)}",
title="JFK → LAX",
style="cyan",
)
)
else:
console.print("[dim]Cheapest option is also the fastest.[/dim]")
if __name__ == "__main__":
main()Ausgabe: Zwei Panels — die günstigste und die schnellste Option — mit jeweils Preis, Anzahl der Umstiege, Gesamtdauer sowie Flugnummer und Fluggesellschaft der ersten Teilstrecke. Ist die günstigste Option zugleich die schnellste, wird nur ein Panel angezeigt.
2. Vollständiger Reiseverlauf mit Umstiegsdetails: LHR → JFK
Frage: Wie sieht ein Reiseverlauf mit Umstieg aus, einschließlich jeder Teilstrecke und der Wartezeiten beim Umstieg?
Suchen Sie die erste Umsteigeverbindung in den Ergebnissen, zeigen Sie jede Teilstrecke als Zeile an und listen Sie dann die Umstiegsorte mit Wartezeiten auf.
import os
import requests
from rich.console import Console
from rich.panel import Panel
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"
def fetch_tickets(origin: str, destination: str) -> dict | None:
r = requests.get(
f"{BASE}/tickets/search",
headers=HEADERS,
params={"origin": origin, "destination": destination, "passengers": 1},
timeout=(10, 15),
)
if r.status_code == 404:
return None
r.raise_for_status()
return r.json()
def fmt_mins(minutes: int | None) -> str:
if minutes is None:
return "—"
return f"{minutes // 60}h {minutes % 60:02d}m"
def print_itinerary(flight: dict, label: str) -> None:
console.print(
Panel(
f"[bold]{label}[/bold] · ${flight.get('price_usd', 0):.2f} · "
f"{fmt_mins(flight.get('total_duration_min'))}",
style="blue",
)
)
legs_table = Table(show_header=True, show_lines=True)
legs_table.add_column("Airline", style="cyan")
legs_table.add_column("Flight")
legs_table.add_column("From")
legs_table.add_column("To")
legs_table.add_column("Departs")
legs_table.add_column("Arrives")
legs_table.add_column("Duration")
for leg in flight.get("legs", []):
legs_table.add_row(
leg.get("airline", "—"),
leg.get("flight_number", "—"),
f"{leg.get('departure_airport', '—')} ({leg.get('departure_airport_name', '—')[:20]})",
f"{leg.get('arrival_airport', '—')} ({leg.get('arrival_airport_name', '—')[:20]})",
leg.get("departure_time", "—"),
leg.get("arrival_time", "—"),
fmt_mins(leg.get("duration_min")),
)
console.print(legs_table)
layovers = flight.get("layovers", [])
if layovers:
console.print("[bold]Layovers[/bold]")
for lw in layovers:
console.print(
f" {lw.get('airport', '—')} {lw.get('airport_name', '—')} "
f"[yellow]{fmt_mins(lw.get('duration_min'))} wait[/yellow]"
)
def main() -> None:
data = fetch_tickets("LHR", "JFK")
if not data:
console.print("[red]No ticket data returned.[/red]")
return
flights = data.get("flights", [])
if not flights:
console.print("[yellow]No flights available for LHR → JFK.[/yellow]")
return
connecting = next((f for f in flights if f.get("stops", 0) > 0), None)
if connecting:
print_itinerary(connecting, "Connecting Itinerary — LHR → JFK")
else:
console.print("[dim]No connecting flights in results — showing cheapest nonstop.[/dim]")
print_itinerary(flights[0], "Nonstop — LHR → JFK")
if __name__ == "__main__":
main()Ausgabe: Eine Reiseverlaufskarte mit jeder Teilstrecke (Fluggesellschaft, Flugnummer, Flughäfen, Abflug-/Ankunftszeiten, Dauer), gefolgt von einer Liste der Umstiege mit den Wartezeiten pro Halt. Fällt auf die günstigste Nonstop-Verbindung zurück, wenn keine Umsteigeverbindungen verfügbar sind.
3. Alle Optionen für 2 Passagiere: LHR → CDG
Frage: Welche Ticketoptionen sind für 2 Passagiere auf LHR–CDG verfügbar?
Zeigen Sie jede zurückgegebene Option in einer Vergleichstabelle an. Zeigen Sie die Originalwährung an, wenn sie von USD abweicht.
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"
def fetch_tickets(
origin: str, destination: str, passengers: int
) -> dict | None:
r = requests.get(
f"{BASE}/tickets/search",
headers=HEADERS,
params={
"origin": origin,
"destination": destination,
"passengers": passengers,
},
timeout=(10, 15),
)
if r.status_code == 404:
return None
r.raise_for_status()
return r.json()
def fmt_mins(minutes: int | None) -> str:
if minutes is None:
return "—"
return f"{minutes // 60}h {minutes % 60:02d}m"
def stops_label(stops: int) -> str:
return "Nonstop" if stops == 0 else f"{stops} stop(s)"
def main() -> None:
passengers = 2
data = fetch_tickets("LHR", "CDG", passengers=passengers)
if not data:
console.print("[red]No ticket data returned.[/red]")
return
flights = data.get("flights", [])
if not flights:
console.print("[yellow]No flights available for LHR → CDG.[/yellow]")
return
table = Table(
title=f"LHR → CDG — {len(flights)} option(s) for {passengers} passengers",
show_lines=True,
)
table.add_column("#", justify="right", style="dim")
table.add_column("Price (USD)", justify="right", style="bold green")
table.add_column("Price/pax", justify="right")
table.add_column("Duration", justify="center")
table.add_column("Stops", justify="center")
table.add_column("First Flight")
for i, flight in enumerate(flights, start=1):
price = flight.get("price_usd", 0.0)
per_pax = price / passengers if passengers else price
orig_price = flight.get("original_price")
orig_currency = flight.get("original_currency", "USD")
price_cell = f"${price:.2f}"
if orig_currency and orig_currency != "USD" and orig_price:
price_cell += f"\n[dim]({orig_price:.0f} {orig_currency})[/dim]"
legs = flight.get("legs", [])
first = legs[0] if legs else {}
first_flight = (
f"{first.get('flight_number', '—')} {first.get('airline', '—')}"
)
table.add_row(
str(i),
price_cell,
f"${per_pax:.2f}",
fmt_mins(flight.get("total_duration_min")),
stops_label(flight.get("stops", 0)),
first_flight,
)
console.print(table)
console.print(
"[dim]Prices are market snapshots — confirm at booking. "
"Results cached for 1 hour.[/dim]"
)
if __name__ == "__main__":
main()Ausgabe: Eine Tabelle mit allen verfügbaren Optionen mit Gesamtpreis, Preis pro Passagier, Dauer, Anzahl der Umstiege und Flugnummer der ersten Teilstrecke. Die Originalwährung wird unter dem USD-Preis angezeigt, wenn sie abweicht.