Höhenwinde
Höhenwind-Vorhersagen beschreiben die erwartete Windrichtung, Windgeschwindigkeit und Temperatur in Standardhöhenstufen für die Flugplanung in den USA. FB Winds (Winds and Temperatures Aloft) werden nach einem festen Zeitplan herausgegeben und decken Stationen im gesamten US-Festland ab; dieser Endpoint liefert jede Station, deren Koordinaten innerhalb Ihres Begrenzungsrahmens (Bounding Box) liegen. Verwenden Sie ihn zusammen mit METAR und TAF, wenn Sie Windkomponenten in Reiseflughöhe für die Kraftstoff- und Zeitplanung benötigen — nicht die Bodenbedingungen an einem einzelnen Flughafen. Die Abdeckung umfasst nur die USA: Abfragen für Gebiete außerhalb der USA liefern 404 ohne Stationen.
Anfrage
Voraussetzungen
x-api-key bei jeder Anfrage (Direktabonnement). Mehr erfahren →Senden Sie eine GET-Anfrage mit einem geografischen Begrenzungsrahmen. Optionale Query-Flags wählen den Vorhersagezeitraum und das Höhenband aus.
https://data.skylinkapi.com/v3.1/weather/winds-aloft| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
bbox | string | Ja | - | Begrenzungsrahmen als lat1,lon1,lat2,lon2 — südwestliche Ecke zuerst, nordöstliche als zweite. Beispiel: 40,-80,42,-73 (Raum New York) |
forecast | integer | Nein | 12 | Vorhersagezeitraum in Stunden — 6, 12 oder 24 |
level | string | Nein | low | Höhenband: low (3.000–39.000 ft MSL) oder high (6.000–45.000 ft MSL) |
Tipps zum Begrenzungsrahmen. Legen Sie den Rahmen eng um Ihre Route — kleinere Gebiete liefern weniger Stationen und schnellere Antworten. Koordinaten werden in Dezimalgrad angegeben (WGS-84). Längengrade westlich des Nullmeridians sind negativ (z. B. -73.78 für JFK).
Antwort
{
"bbox": "40.0,-80.0,42.0,-73.0",
"forecast_hour": 12,
"level": "low",
"valid_time": "131800Z",
"stations": [
{
"station": "JFK",
"latitude": 40.6413,
"longitude": -73.7781,
"winds": [
{
"altitude_ft": 3000,
"wind_direction": 310,
"wind_speed_kt": 7,
"temperature_c": null,
"light_and_variable": false,
"raw": "3107"
},
{
"altitude_ft": 18000,
"wind_direction": 270,
"wind_speed_kt": 35,
"temperature_c": -9,
"light_and_variable": false,
"raw": "2735-09"
}
],
"raw_text": "JFK 3107 3215+13 2926+08 2827+06 2735-09 2645-23 255637 256344 255852"
}
],
"total": 1
}| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
bbox | string | Ja | Wiedergabe des abgefragten Begrenzungsrahmens |
forecast_hour | integer | Ja | Angewendeter Vorhersagezeitraum (6, 12 oder 24) |
level | string | Ja | Angewendetes Höhenband (low oder high) |
valid_time | string | null | Ja (Schlüssel immer vorhanden) | Gültigkeitszeit der Vorhersage (UTC), z. B. 131800Z. null, wenn nicht angegeben |
stations | array | Ja | FB-Winds-Stationen innerhalb der bbox. [], wenn keine passt — in der Regel zusammen mit 404 |
total | integer | Ja | Anzahl der Stationen in stations |
Höhenbänder
level | Typischerweise gelieferte Höhen (ft MSL) |
|---|---|
low | 3.000 / 6.000 / 9.000 / 12.000 / 18.000 / 24.000 / 30.000 / 34.000 / 39.000 |
high | 6.000 / 9.000 / 12.000 / 18.000 / 24.000 / 30.000 / 34.000 / 39.000 / 45.000 |
Die genauen Höhenstufen pro Station hängen vom FB-Produkt ab — nicht jede Station liefert jede Höhe.
Objektschemas und Nullbarkeit
Jeder Schlüssel in einem Stationsobjekt ist immer vorhanden. Jeder Schlüssel in einem Windstufenobjekt ist immer vorhanden, sobald das Objekt existiert. Verwenden Sie null, 0 oder [] gemäß den folgenden Mustern — prüfen Sie niemals auf fehlende Schlüssel.
| Situation | Was Sie erhalten | Nicht so |
|---|---|---|
| Niedrige Höhenstufe ohne Temperatur | temperature_c: null | 0, Schlüssel fehlt |
| Windgruppe nicht dekodiert | wind_direction: null, wind_speed_kt: null | Schlüssel fehlt oder 0 |
| Schwache, umlaufende Winde | light_and_variable: true, wind_direction kann null sein | null für light_and_variable |
| Station ohne dekodierte Höhenstufen | winds: [] | null, Schlüssel fehlt |
| Keine rohe FB-Zeile für die Station | raw_text: null | Schlüssel fehlt |
| Vorgelagerte Quelle lässt die Gültigkeitszeit weg | valid_time: null | Schlüssel fehlt |
| Keine Stationen innerhalb der bbox | stations: [] + HTTP 404 | null |
Schemas für Station und WindstufeAbschnitt aufklappen
Station
JSON-Pfad: stations[]. Jedes Element steht für eine FB-Winds-Station innerhalb der bbox.
| Feld | Typ | Erforderlich | Null? | Beschreibung |
|---|---|---|---|---|
station | string | Ja | Nie | Dreistellige Kennung der FB-Winds-Station (entspricht oft einem nahegelegenen Flughafen, z. B. JFK) |
latitude | number | Ja | Nie | Breitengrad der Station (Dezimalgrad) |
longitude | number | Ja | Nie | Längengrad der Station (Dezimalgrad) |
winds | array | Ja | Nie | Wind-/Temperaturstufen für diese Station. [], wenn keine Stufen dekodiert wurden |
raw_text | string | null | Ja (Schlüssel immer vorhanden) | Ja | Vollständige rohe FB-Winds-Zeile für diese Station. null, wenn nicht angegeben |
Windstufe
JSON-Pfad: stations[].winds[]. Jedes Element steht für eine Höhenstufe der übergeordneten Station.
| Feld | Typ | Erforderlich | Null? | Beschreibung |
|---|---|---|---|---|
altitude_ft | integer | Ja | Nie | Höhe dieser Stufe in Fuß MSL |
wind_direction | integer | null | Ja (Schlüssel immer vorhanden) | Ja | Grad rechtweisend (0–360). null, wenn nicht dekodiert |
wind_speed_kt | integer | null | Ja (Schlüssel immer vorhanden) | Ja | Geschwindigkeit in Knoten. null, wenn nicht dekodiert |
temperature_c | integer | null | Ja (Schlüssel immer vorhanden) | Ja | Temperatur in °C. In den niedrigsten Stufen (3.000–6.000 ft) oft null |
light_and_variable | boolean | Ja | Nie | true bei schwachen, umlaufenden Winden (< 5 kt). Standard false |
raw | string | Ja | Nie | Kodiertes Wind-Token für diese Stufe, z. B. 2735-09 (270°/35 kt, −9 °C) |
Schwach und umlaufend. Ist light_and_variable gleich true, liegen die Winde unter 5 Knoten ohne bestimmte Richtung — wind_direction und wind_speed_kt können null oder null sein.
Client-Typen
"""Winds aloft response types - matches winds-aloft field tables."""from dataclasses import dataclassfrom typing import Literal@dataclassclass WindLevel: altitude_ft: int wind_direction: int | None wind_speed_kt: int | None temperature_c: int | None light_and_variable: bool raw: str@dataclassclass WindsAloftStation: station: str latitude: float longitude: float winds: list[WindLevel] raw_text: str | None@dataclassclass WindsAloftResponse: bbox: str forecast_hour: int level: str valid_time: str | None stations: list[WindsAloftStation] total: int@dataclassclass CruiseWindSummary: station: str altitude_ft: int direction_deg: int | None speed_kt: int | None temperature_c: int | NoneIntegration
Winde für den Begrenzungsrahmen einer Route abrufen und die Höhenstufe wählen, die Ihrer geplanten Reiseflughöhe am nächsten liegt.
Das Beispiel fragt einen Rahmen um den Raum New York ab, speichert die Antwort eine Stunde im Cache (FB-Produkte werden nach einem festen Zeitplan aktualisiert) und liefert die Windstufe, die einer Zielhöhe am nächsten liegt. Bei 404 gibt die Hilfsfunktion null zurück, und der Aufrufer zeigt einen leeren Zustand statt eines Fehlers an.
import osimport timefrom typing import TypedDictimport requests# CruiseWindSummary - helper return type. Full wire types are in the Client types section.class WindLevel(TypedDict): altitude_ft: int wind_direction: int | None wind_speed_kt: int | None temperature_c: int | None light_and_variable: bool raw: strclass Station(TypedDict): station: str latitude: float longitude: float winds: list[WindLevel] raw_text: str | Noneclass WindsAloftResponse(TypedDict): bbox: str forecast_hour: int level: str valid_time: str | None stations: list[Station] total: intclass CruiseWindSummary(TypedDict): station: str altitude_ft: int direction_deg: int | None speed_kt: int | None temperature_c: int | NoneHEADERS = { "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3.1"CACHE: dict[str, tuple[WindsAloftResponse, float]] = {}WINDS_TTL = 3600 # 1 h - FB products update on a fixed scheduledef fetch_winds_aloft(bbox: str, forecast: int = 12, level: str = "low") -> WindsAloftResponse | None: cache_key = f"winds:{bbox}:{forecast}:{level}" cached = CACHE.get(cache_key) if cached and time.time() < cached[1]: return cached[0] try: r = requests.get( f"{BASE}/weather/winds-aloft", headers=HEADERS, params={"bbox": bbox, "forecast": forecast, "level": level}, timeout=(10, 20), ) except requests.Timeout as exc: raise RuntimeError(f"SkyLink timeout fetching winds aloft for {bbox}") from exc if r.status_code == 404: return None r.raise_for_status() data: WindsAloftResponse = r.json() CACHE[cache_key] = (data, time.time() + WINDS_TTL) return datadef nearest_cruise_wind( bbox: str, target_altitude_ft: int = 18_000, forecast: int = 12,) -> CruiseWindSummary | None: """Pick the wind level closest to target altitude from the first station in the bbox.""" payload = fetch_winds_aloft(bbox, forecast=forecast, level="low") if not payload or not payload["stations"]: return None station = payload["stations"][0] levels = station["winds"] if not levels: return None best = min(levels, key=lambda w: abs(w["altitude_ft"] - target_altitude_ft)) return { "station": station["station"], "altitude_ft": best["altitude_ft"], "direction_deg": best["wind_direction"], "speed_kt": best["wind_speed_kt"], "temperature_c": best["temperature_c"], }if __name__ == "__main__": import json from dataclasses import asdict bbox = "-74.5,40.3,-73.5,41.0" cruise = nearest_cruise_wind(bbox, target_altitude_ft=18_000) print(json.dumps(asdict(cruise), indent=2) if cruise else "No winds data")Hinweise zur Implementierung
Nur US-Abdeckung. FB Winds sind ein US-Produkt. Eine bbox über Europa oder dem Ozean ohne US-Stationen liefert 404 — keinen Authentifizierungs- oder Kontingentfehler. Bilden Sie Ihre bbox aus den Wegpunkten von US-Routen.
Leer vs. 404. Liegen keine Stationsmittelpunkte innerhalb der bbox, liefert die API 404 mit einer detail-Meldung, die Vorhersage und Höhenstufe nennt. Erweitern Sie die bbox leicht oder verschieben Sie sie entlang der Route.
Wahl von level. Verwenden Sie low für den typischen Reiseflug von Fluggesellschaften unterhalb von FL390. Verwenden Sie high, wenn Sie Daten für FL390–FL450 benötigen. Ist der Dienst für eine Höhenstufe vorübergehend nicht verfügbar, erhalten Sie möglicherweise 503 — wiederholen Sie die Anfrage mit Backoff.
Fehlende Temperaturen in niedrigen Höhen. Die Stufe 3.000 ft und manchmal auch 6.000 ft lassen die Temperatur häufig weg (temperature_c: null). Verwenden Sie Windrichtung und -geschwindigkeit für die Planung; behandeln Sie eine fehlende Temperatur als „in dieser Höhenstufe nicht gemeldet“.
Fehlerantworten
Nur endpoint-spezifische Fehler. Fehler bei Authentifizierung, Validierung, Rate Limits und Serverfehler, die alle Endpoints gemeinsam haben, finden Sie unter Fehlerbehandlung.
404 — keine Stationen in der bbox
{
"detail": "No FB winds stations found in the given bounding box for forecast=12h, level=low"
}Häufige Ursachen: bbox außerhalb der US-Abdeckung, bbox zu klein zwischen den Stationen oder Koordinaten außerhalb der USA. Erweitern Sie den Rahmen oder prüfen Sie, ob die Route über den USA verläuft.
400 — ungültiges bbox-Format
{
"detail": "Invalid bounding box format. Expected 'lat1,lon1,lat2,lon2'"
}503 — vorgelagerter Dienst nicht verfügbar
{
"detail": "Winds aloft service temporarily unavailable"
}Wiederholen Sie die Anfrage nach einem kurzen Backoff. Besteht das Problem fort, versuchen Sie den anderen level-Wert oder eine andere forecast-Stunde.
Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Query Parameters
Bounding box as 'lat1,lon1,lat2,lon2' (SW corner → NE corner)
Forecast period in hours (6, 12, or 24)
126 <= value <= 24Altitude range: 'low' (3K-39K ft) or 'high' (6K-45K ft)
"low"^(low|high)$Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3.1/weather/winds-aloft?bbox=string"{
"bbox": "40,-80,42,-73",
"forecast_hour": 12,
"level": "low",
"valid_time": "130000Z",
"stations": [
{
"station": "JFK",
"latitude": 40.6413,
"longitude": -73.7781,
"winds": [
{
"altitude_ft": 3000,
"wind_direction": 270,
"wind_speed_kt": 9,
"light_and_variable": false,
"raw": "2709"
}
],
"raw_text": "JFK 2709 3012+08 ..."
}
],
"total": 1
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}Siehe auch: Wetter-Übersicht · METAR · TAF · Anwendungsfall Reiseflugwind
TAF
Flugplatzvorhersagen (TAF) für jeden ICAO-Flughafen abrufen. Die optionale dekodierte Ausgabe enthält Vorhersageperioden und die erwartete Flugwetterkategorie.
PIREPs (Pilotenmeldungen)
Pilotenmeldungen (PIREPs) in einer Bounding Box – von Piloten gemeldete Turbulenz, Vereisung und Wetter im Flug innerhalb eines Rückblickzeitraums.