# METAR

Aktuelles METAR-Bodenwetter für jeden ICAO-Flughafen abrufen. Optional dekodiert mit Wind, Sicht, Wolken und Flugwetterkategorie.



[METARs (Meteorological Aerodrome Reports)](https://en.wikipedia.org/wiki/METAR) sind Bodenwetterbeobachtungen, die an einem bestimmten Flugplatz oder einer bestimmten Station erfasst werden. Standard-[METARs](https://en.wikipedia.org/wiki/METAR) werden in regelmäßigen Abständen herausgegeben (in der Regel stündlich oder halbstündlich), während eine Sondermeldung ([SPECI](https://en.wikipedia.org/wiki/METAR#Classification)) veröffentlicht wird, wenn sich die Bedingungen an einem besetzten Standort erheblich ändern. Jedes [METAR](https://en.wikipedia.org/wiki/METAR) enthält wichtige meteorologische Daten wie Temperatur, Windgeschwindigkeit und -richtung, Sicht, Bewölkung und Luftdruck. Piloten, Fluglotsen, Dispatcher und Meteorologen nutzen diese Meldungen, um das Wetter am Flughafen zu beurteilen – als Grundlage für Flugplanung, Navigation und betriebliche Entscheidungen.

## Anfrage [#request]

<DocRequirements>
  <DocRequirementAuth />

  <DocRequirementIcao />
</DocRequirements>

Senden Sie eine <HttpMethod>GET</HttpMethod>-Anfrage mit dem ICAO-Code des Flughafens im Pfad. Optionale Query-Flags steuern die Dekodierung.

<DocApiPath method="GET" path="/weather/metar/{icao}" />

| Parameter | Typ     | Erforderlich | Standard | Beschreibung                                                                             |
| --------- | ------- | ------------ | -------- | ---------------------------------------------------------------------------------------- |
| `icao`    | string  | Ja           | -        | Vierstelliger ICAO-Code — [Suche](/docs/v31/airport-search#search-by-text), z. B. `KJFK` |
| `parsed`  | boolean | Nein         | `false`  | Dekodierte Felder unter einem `parsed`-Schlüssel hinzufügen                              |

## Antwort [#response]

### Rohdaten (Standard) [#raw-default]

```json
{
  "raw": "METAR KJFK 062251Z 24017G23KT 10SM FEW060 FEW075 SCT110 BKN180 BKN250 28/17 A2974 RMK AO2 SLP072 T02830167 $",
  "icao": "KJFK",
  "airport_name": "John F. Kennedy International Airport",
  "timestamp": "2026-06-06T23:09:37Z"
}
```

| Feld           | Typ               | Erforderlich | Beschreibung                                                                     |
| -------------- | ----------------- | ------------ | -------------------------------------------------------------------------------- |
| `raw`          | string            | **Ja**       | Vollständiger METAR-String wie herausgegeben                                     |
| `icao`         | string            | **Ja**       | ICAO-Code                                                                        |
| `airport_name` | string            | **Ja**       | Name des Flughafens                                                              |
| `timestamp`    | string (ISO 8601) | **Ja**       | Zeitpunkt, zu dem die API diese Daten abgerufen hat — nicht die Beobachtungszeit |

<a id="parsed-parsedtrue" />

### Dekodiert (`parsed=true`) [#parsed-parsedtrue]

```json
{
  "raw": "METAR KJFK 062251Z 24017G23KT 10SM FEW060 FEW075 SCT110 BKN180 BKN250 28/17 A2974 RMK AO2 SLP072 T02830167 $",
  "icao": "KJFK",
  "airport_name": "John F. Kennedy International Airport",
  "timestamp": "2026-06-06T23:09:37Z",
  "parsed": {
    "time": "2026-06-07T00:51:00+02:00",
    "wind": {
      "direction": 240,
      "speed": 17,
      "gust": 23,
      "variable": []
    },
    "visibility": {
      "value": 10,
      "repr": "10"
    },
    "clouds": [
      { "type": "FEW", "base": 60, "repr": "FEW060" },
      { "type": "FEW", "base": 75, "repr": "FEW075" },
      { "type": "SCT", "base": 110, "repr": "SCT110" },
      { "type": "BKN", "base": 180, "repr": "BKN180" },
      { "type": "BKN", "base": 250, "repr": "BKN250" }
    ],
    "temperature": 28,
    "dewpoint": 17,
    "altimeter": 29.74,
    "flight_rules": "VFR",
    "wx_codes": [],
    "remarks": "RMK AO2 SLP072 T02830167 $",
    "density_altitude": 1792,
    "pressure_altitude": 193,
    "relative_humidity": 0.49
  }
}
```

| Feld                       | Typ               | Erforderlich                       | Beschreibung                                                                                                     |
| -------------------------- | ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `parsed`                   | object            | **Ja** (mit `parsed=true`)         | Fehlt bei `parsed=false` — ist dann nicht `null`                                                                 |
| `parsed.time`              | string (ISO 8601) | **Ja**                             | Beobachtungszeit aus dem METAR-Kopf — für das Datenalter diese verwenden, nicht `timestamp`                      |
| `parsed.wind.direction`    | integer           | **Ja**                             | Grad rechtweisend. `0` bei Windstille oder wenn keine Richtung gemeldet ist                                      |
| `parsed.wind.speed`        | integer           | **Ja**                             | Knoten. Nie `null` — `0` bedeutet Windstille                                                                     |
| `parsed.wind.gust`         | integer \| null   | **Ja** (Schlüssel immer vorhanden) | Knoten. `null`, wenn keine Böen gemeldet sind (nicht `0`)                                                        |
| `parsed.wind.variable`     | integer\[]        | **Ja**                             | Richtungsbereich bei wechselnder Windrichtung, z. B. `[180, 270]`. `[]`, wenn nicht wechselnd                    |
| `parsed.visibility.value`  | number \| null    | **Ja** (Schlüssel immer vorhanden) | Statute Miles. `null` bei `P6SM` (> 6 SM) — als „> 6“ behandeln                                                  |
| `parsed.visibility.repr`   | string            | **Ja**                             | Rohes Token aus dem METAR                                                                                        |
| `parsed.clouds`            | array             | **Ja**                             | Schichten von der niedrigsten zur höchsten. `[]` bei wolkenlosem Himmel                                          |
| `parsed.clouds[].type`     | string            | **Ja** (pro Element)               | [Codes für den Bedeckungsgrad](/docs/v31/weather#cloud-cover-codes)                                              |
| `parsed.clouds[].base`     | integer           | **Ja** (pro Element)               | Hunderte Fuß AGL. `60` = 6.000 ft                                                                                |
| `parsed.clouds[].repr`     | string            | **Ja** (pro Element)               | Rohes Token. `BKN050CB` = Cumulonimbus in 5.000 ft                                                               |
| `parsed.temperature`       | number            | **Ja**                             | °C                                                                                                               |
| `parsed.dewpoint`          | number            | **Ja**                             | °C                                                                                                               |
| `parsed.altimeter`         | number            | **Ja**                             | QNH-Einstellung in inHg                                                                                          |
| `parsed.flight_rules`      | string            | **Ja**                             | [Flugwetterkategorie](/docs/v31/weather#flight-categories) (`VFR`, `MVFR`, `IFR`, `LIFR`)                        |
| `parsed.wx_codes`          | array             | **Ja**                             | Aktuelles Wetter. `[]`, wenn keines gemeldet ist — siehe [Codes für das aktuelle Wetter](#present-weather-codes) |
| `parsed.remarks`           | string            | **Ja**                             | Alles nach `RMK` im Roh-String                                                                                   |
| `parsed.density_altitude`  | integer           | **Ja**                             | Fuß — effektive, um Temperatur und Luftdruck korrigierte Höhe (Dichtehöhe); relevant für die Flugleistung        |
| `parsed.pressure_altitude` | integer           | **Ja**                             | Fuß — auf die Standardatmosphäre bezogene Höhe (Druckhöhe)                                                       |
| `parsed.relative_humidity` | number            | **Ja**                             | Dezimalwert von 0 bis 1                                                                                          |

### Objektschemas und Nullbarkeit [#object-schemas-and-nullability]

Mit `parsed=true` enthält das `parsed`-Objekt **immer jeden Schlüssel** — bei fehlenden Daten wird nichts weggelassen. Verwenden Sie je nach Feld `null`, `0` oder `[]`. Ohne `parsed=true` **fehlt** der Schlüssel `parsed` (er ist nicht `null`).

| Situation                        | Was Sie erhalten                                  | Nicht so                 |
| -------------------------------- | ------------------------------------------------- | ------------------------ |
| Keine Böen                       | `wind.gust: null`                                 | Schlüssel fehlt oder `0` |
| Windstille                       | `wind.direction: 0`, `wind.speed: 0`              | `null`, Schlüssel fehlt  |
| Windrichtung nicht wechselnd     | `wind.variable: []`                               | `null`                   |
| Sicht > 6 SM (`P6SM`)            | `visibility.value: null`, `visibility.repr: "P6"` | `value: 0`               |
| Kein aktuelles Wetter            | `wx_codes: []`                                    | `null`, Schlüssel fehlt  |
| Wolkenloser Himmel (`SKC`/`CLR`) | `clouds: []`                                      | `null`, Schlüssel fehlt  |

<DocDetails title="Schemas der verschachtelten Objekte (Wind, Sicht, Wolken, aktuelles Wetter)">
  #### Wind [#wind]

  JSON-Pfad: `parsed.wind`. Immer als Objekt vorhanden.

  | Feld        | Typ             | Erforderlich | Null?  | Wenn leer                                                              |
  | ----------- | --------------- | ------------ | ------ | ---------------------------------------------------------------------- |
  | `direction` | integer         | **Ja**       | Nie    | `0` = Windstille oder keine Richtung angegeben                         |
  | `speed`     | integer         | **Ja**       | Nie    | `0` = Windstille                                                       |
  | `gust`      | integer \| null | **Ja**       | **Ja** | `null`, wenn das METAR keine Böen enthält                              |
  | `variable`  | integer\[]      | **Ja**       | Nie    | `[]`, wenn nicht wechselnd; `[180, 270]` bei `180V270` in den Rohdaten |

  #### Sicht [#visibility]

  JSON-Pfad: `parsed.visibility`. Immer als Objekt vorhanden.

  | Feld    | Typ            | Erforderlich | Null?  | Wenn leer                                                      |
  | ------- | -------------- | ------------ | ------ | -------------------------------------------------------------- |
  | `value` | number \| null | **Ja**       | **Ja** | `null` bei `P6SM` — als „> 6“ behandeln. Andernfalls numerisch |
  | `repr`  | string         | **Ja**       | Nie    | Rohes Token: `"10"`, `"3"`, `"P6"` usw.                        |

  #### Wolkenschichten [#cloud-layers]

  JSON-Pfad: `parsed.clouds[]`. Immer ein Array (möglicherweise leer).

  | Feld   | Typ     | Erforderlich | Null? | Beschreibung                                                        |
  | ------ | ------- | ------------ | ----- | ------------------------------------------------------------------- |
  | `type` | string  | **Ja**       | Nie   | [Codes für den Bedeckungsgrad](/docs/v31/weather#cloud-cover-codes) |
  | `base` | integer | **Ja**       | Nie   | Hunderte Fuß AGL                                                    |
  | `repr` | string  | **Ja**       | Nie   | Rohes Token, z. B. `BKN050CB`                                       |

  #### Codes für das aktuelle Wetter [#present-weather-codes]

  JSON-Pfad: `parsed.wx_codes[]`. Immer ein Array (möglicherweise leer). Wird aktuelles Wetter gemeldet, hat jedes Element **beide** Schlüssel:

  | Feld    | Typ    | Erforderlich | Null? | Beschreibung                                                   |
  | ------- | ------ | ------------ | ----- | -------------------------------------------------------------- |
  | `repr`  | string | **Ja**       | Nie   | Rohes Token, z. B. `-RA`, `TSRA`                               |
  | `value` | string | **Ja**       | Nie   | Ausgeschriebener Text, z. B. `Light Rain`, `Thunderstorm Rain` |

  Beispiel aus der Live-API (KORD):

  ```json
  "wx_codes": [{ "repr": "-RA", "value": "Light Rain" }]
  ```
</DocDetails>

## Client-Typen [#client-types]

Kopieren Sie diese in Ihr Projekt. Die Nullbarkeit entspricht den oben beschriebenen [Objektschemas und Nullbarkeit](#object-schemas-and-nullability).

<DocClientTypes id="v31/weather/metar-types" />

Die Wire-Typen (`MetarResponse`, `MetarParsed`) bilden das JSON von `parsed=true` ab. `MetarSummary` ist jeweils oben in jedem Tab des Codebeispiels definiert.

## Integration [#integration]

Beobachtungen abrufen, im Cache speichern und zusammenfassen — der nächste Schritt, nachdem Sie eine erfolgreiche Antwort geparst haben.

Das Beispiel speichert jedes [METAR](https://en.wikipedia.org/wiki/METAR&#x29; fünf Minuten im Cache (Beobachtungen werden höchstens alle 30–60 Minuten aktualisiert), verwendet Connect-/Read-Timeouts von 10 s / 15 s und erstellt eine Zusammenfassung auf Basis von &#x2A;*`parsed.time`** (Beobachtungszeit), nicht von `timestamp` (Abrufzeit der API).

<DocExample id="v31/weather/metar-fetch" />

Weitere Beispiele: [Wetter-Anwendungsfälle](/docs/v31/weather-integration-airport).

### Hinweise zur Implementierung [#implementation-notes]

**`timestamp` vs. `parsed.time`.** `timestamp` ändert sich bei jeder Anfrage. `parsed.time` ist die Beobachtungszeit aus dem [METAR](https://en.wikipedia.org/wiki/METAR)-Kopf — verwenden Sie sie für Angaben wie „Daten sind X Minuten alt“.

**`visibility.value` ist null.** Meldet die Station `P6SM`, ist `value` gleich `null` und `repr` gleich `"P6"`. Behandeln Sie null als „> 6 SM“, nicht als fehlende Daten.

**Verfügbarkeit von Stationen.** Nicht jeder ICAO-Code hat eine [METAR](https://en.wikipedia.org/wiki/METAR)-Station. Ein `404` bedeutet, dass keine Beobachtung verfügbar ist — der Flughafen kann trotzdem existieren. Zeigen Sie einen leeren Zustand an, kein Fehlerbanner.

**Caching.** Ein Client-Cache von 3–5 Minuten reduziert doppelte Aufrufe, ohne neue Beobachtungen zu verpassen.

## Fehlerantworten [#error-responses]

Hier stehen nur **[METAR](https://en.wikipedia.org/wiki/METAR)-spezifische** Fehler. Fehler bei Authentifizierung, Validierung, Rate Limits und Serverfehler finden Sie unter [Fehlerbehandlung](/docs/errors). Muster für den Fallback zwischen [METAR](https://en.wikipedia.org/wiki/METAR) und [TAF](https://en.wikipedia.org/wiki/Terminal_aerodrome_forecast) finden Sie unter [Wenn Wetterdaten fehlen](/docs/v31/weather-integration-errors#when-weather-data-is-missing).

### 404 — kein METAR für diesen ICAO-Code [#404--no-metar-for-this-icao]

```json
{
  "detail": "Airport not found for ICAO code: KXYZ"
}
```

Der Flughafen existiert möglicherweise nicht, oder er existiert, hat aber keine [METAR](https://en.wikipedia.org/wiki/METAR)-Station. Die Meldung unterscheidet diese Fälle nicht — behandeln Sie jeden [METAR](https://en.wikipedia.org/wiki/METAR)-`404` als **keine Beobachtung verfügbar**.

<APIPage document="&#x22;https://api.skylinkapi.com/v3.1/openapi.json&#x22;" operations="[{&#x22;path&#x22;:&#x22;/weather/metar/{icao}&#x22;,&#x22;method&#x22;:&#x22;get&#x22;}]" />

***

Siehe auch: [TAF](/docs/v31/weather-taf) · [Anwendungsfälle](/docs/v31/weather-integration-airport) · [Fehler](/docs/v31/weather-integration-errors) · [Produktivbetrieb](/docs/v31/weather-integration-production)
