# METAR

Текущая сводка METAR о приземной погоде для любого аэропорта ICAO. Опциональный декодированный вывод: ветер, видимость, облачность, категория полётных условий.



[METAR (регулярные метеорологические сводки по аэродрому)](https://en.wikipedia.org/wiki/METAR) — это наблюдения за приземной погодой на конкретном аэродроме или станции. Стандартные сводки [METAR](https://en.wikipedia.org/wiki/METAR) выпускаются через регулярные интервалы (обычно каждый час или каждые полчаса), а специальная сводка ([SPECI](https://en.wikipedia.org/wiki/METAR#Classification)) выпускается при значительном изменении условий на станции с персоналом. Каждая сводка [METAR](https://en.wikipedia.org/wiki/METAR) содержит ключевые метеорологические данные: температуру, скорость и направление ветра, видимость, облачность и атмосферное давление. Пилоты, авиадиспетчеры, диспетчеры по обеспечению полётов и метеорологи используют эти сводки для оценки погоды в аэропорту при планировании полётов, навигации и принятии оперативных решений.

## Запрос [#request]

<DocRequirements>
  <DocRequirementAuth />

  <DocRequirementIcao />
</DocRequirements>

Отправьте запрос <HttpMethod>GET</HttpMethod> с кодом ICAO аэропорта в пути. Необязательные query-флаги управляют декодированием.

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

| Параметр | Тип     | Обязательный | По умолчанию | Описание                                                                                      |
| -------- | ------- | ------------ | ------------ | --------------------------------------------------------------------------------------------- |
| `icao`   | string  | Да           | -            | Четырёхбуквенный код ICAO — [поиск](/docs/v31/airport-search#search-by-text), например `KJFK` |
| `parsed` | boolean | Нет          | `false`      | Добавить декодированные поля под ключом `parsed`                                              |

## Ответ [#response]

### Исходный ответ (по умолчанию) [#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"
}
```

| Поле           | Тип               | Обязательный | Описание                                         |
| -------------- | ----------------- | ------------ | ------------------------------------------------ |
| `raw`          | string            | **Да**       | Полная строка METAR в исходном виде              |
| `icao`         | string            | **Да**       | Код ICAO                                         |
| `airport_name` | string            | **Да**       | Название аэропорта                               |
| `timestamp`    | string (ISO 8601) | **Да**       | Время получения данных API — не время наблюдения |

<a id="parsed-parsedtrue" />

### Декодированный ответ (`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
  }
}
```

| Поле                       | Тип               | Обязательный                      | Описание                                                                                                |
| -------------------------- | ----------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `parsed`                   | object            | **Да** (при `parsed=true`)        | Отсутствует при `parsed=false` — а не равен `null`                                                      |
| `parsed.time`              | string (ISO 8601) | **Да**                            | Время наблюдения из заголовка METAR — используйте его для определения возраста данных, а не `timestamp` |
| `parsed.wind.direction`    | integer           | **Да**                            | Градусы (истинные). `0` при штиле или если направление не сообщается                                    |
| `parsed.wind.speed`        | integer           | **Да**                            | Узлы. Никогда не `null` — `0` означает штиль                                                            |
| `parsed.wind.gust`         | integer \| null   | **Да** (ключ присутствует всегда) | Узлы. `null`, если порывов нет (а не `0`)                                                               |
| `parsed.wind.variable`     | integer\[]        | **Да**                            | Диапазон направлений при переменном ветре, например `[180, 270]`. `[]`, если ветер не переменный        |
| `parsed.visibility.value`  | number \| null    | **Да** (ключ присутствует всегда) | Сухопутные мили. `null` для `P6SM` (> 6 SM) — трактуйте как «> 6»                                       |
| `parsed.visibility.repr`   | string            | **Да**                            | Исходный токен из METAR                                                                                 |
| `parsed.clouds`            | array             | **Да**                            | Слои от нижнего к верхнему. `[]` при ясном небе                                                         |
| `parsed.clouds[].type`     | string            | **Да** (для каждого элемента)     | [Коды облачности](/docs/v31/weather#cloud-cover-codes)                                                  |
| `parsed.clouds[].base`     | integer           | **Да** (для каждого элемента)     | Сотни футов AGL. `60` = 6000 ft                                                                         |
| `parsed.clouds[].repr`     | string            | **Да** (для каждого элемента)     | Исходный токен. `BKN050CB` = кучево-дождевые облака на 5000 ft                                          |
| `parsed.temperature`       | number            | **Да**                            | °C                                                                                                      |
| `parsed.dewpoint`          | number            | **Да**                            | °C                                                                                                      |
| `parsed.altimeter`         | number            | **Да**                            | Установка высотомера QNH в inHg                                                                         |
| `parsed.flight_rules`      | string            | **Да**                            | [Категория полётных условий](/docs/v31/weather#flight-categories) (`VFR`, `MVFR`, `IFR`, `LIFR`)        |
| `parsed.wx_codes`          | array             | **Да**                            | Текущая погода. `[]`, если явлений нет, — см. [Коды текущей погоды](#present-weather-codes)             |
| `parsed.remarks`           | string            | **Да**                            | Всё, что следует после `RMK` в исходной строке                                                          |
| `parsed.density_altitude`  | integer           | **Да**                            | Футы — эффективная высота с поправкой на температуру и давление; важна для лётных характеристик ВС      |
| `parsed.pressure_altitude` | integer           | **Да**                            | Футы — высота относительно стандартной атмосферы                                                        |
| `parsed.relative_humidity` | number            | **Да**                            | Десятичная дробь от 0 до 1                                                                              |

### Схемы объектов и допустимость null [#object-schemas-and-nullability]

При `parsed=true` объект `parsed` **всегда содержит все ключи** — при отсутствии данных ничего не опускается. В зависимости от поля используется `null`, `0` или `[]`. Без `parsed=true` ключ `parsed` **отсутствует** (а не равен `null`).

| Ситуация                   | Что вы получите                                   | Но не это                  |
| -------------------------- | ------------------------------------------------- | -------------------------- |
| Нет порывов                | `wind.gust: null`                                 | отсутствующий ключ или `0` |
| Штиль                      | `wind.direction: 0`, `wind.speed: 0`              | `null`, отсутствующий ключ |
| Ветер не переменный        | `wind.variable: []`                               | `null`                     |
| Видимость > 6 SM (`P6SM`)  | `visibility.value: null`, `visibility.repr: "P6"` | `value: 0`                 |
| Нет текущих явлений погоды | `wx_codes: []`                                    | `null`, отсутствующий ключ |
| Ясное небо (`SKC`/`CLR`)   | `clouds: []`                                      | `null`, отсутствующий ключ |

<DocDetails title="Схемы вложенных объектов (ветер, видимость, облачность, текущая погода)">
  #### Ветер [#wind]

  Путь в JSON: `parsed.wind`. Всегда присутствует как объект.

  | Поле        | Тип             | Обязательный | Null?   | Если пусто                                                                     |
  | ----------- | --------------- | ------------ | ------- | ------------------------------------------------------------------------------ |
  | `direction` | integer         | **Да**       | Никогда | `0` = штиль или направление не указано                                         |
  | `speed`     | integer         | **Да**       | Никогда | `0` = штиль                                                                    |
  | `gust`      | integer \| null | **Да**       | **Да**  | `null`, если в METAR нет порывов                                               |
  | `variable`  | integer\[]      | **Да**       | Никогда | `[]`, если ветер не переменный; `[180, 270]`, если в исходной строке `180V270` |

  #### Видимость [#visibility]

  Путь в JSON: `parsed.visibility`. Всегда присутствует как объект.

  | Поле    | Тип            | Обязательный | Null?   | Если пусто                                                         |
  | ------- | -------------- | ------------ | ------- | ------------------------------------------------------------------ |
  | `value` | number \| null | **Да**       | **Да**  | `null` для `P6SM` — трактуйте как «> 6». В остальных случаях число |
  | `repr`  | string         | **Да**       | Никогда | Исходный токен: `"10"`, `"3"`, `"P6"` и т. д.                      |

  #### Слои облачности [#cloud-layers]

  Путь в JSON: `parsed.clouds[]`. Всегда массив (может быть пустым).

  | Поле   | Тип     | Обязательный | Null?   | Описание                                               |
  | ------ | ------- | ------------ | ------- | ------------------------------------------------------ |
  | `type` | string  | **Да**       | Никогда | [Коды облачности](/docs/v31/weather#cloud-cover-codes) |
  | `base` | integer | **Да**       | Никогда | Сотни футов AGL                                        |
  | `repr` | string  | **Да**       | Никогда | Исходный токен, например `BKN050CB`                    |

  #### Коды текущей погоды [#present-weather-codes]

  Путь в JSON: `parsed.wx_codes[]`. Всегда массив (может быть пустым). Если сообщаются текущие явления погоды, каждый элемент содержит **оба** ключа:

  | Поле    | Тип    | Обязательный | Null?   | Описание                                                |
  | ------- | ------ | ------------ | ------- | ------------------------------------------------------- |
  | `repr`  | string | **Да**       | Никогда | Исходный токен, например `-RA`, `TSRA`                  |
  | `value` | string | **Да**       | Никогда | Расшифровка, например `Light Rain`, `Thunderstorm Rain` |

  Пример из рабочего API (KORD):

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

## Клиентские типы [#client-types]

Скопируйте в свой проект. Допустимость null соответствует разделу [Схемы объектов и допустимость null](#object-schemas-and-nullability) выше.

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

Типы данных (`MetarResponse`, `MetarParsed`) повторяют JSON ответа с `parsed=true`. `MetarSummary` определён в начале каждой вкладки примера кода.

## Интеграция [#integration]

Получение, кэширование и сводка наблюдений — следующий шаг после разбора успешного ответа.

Пример кэширует каждую сводку [METAR](https://en.wikipedia.org/wiki/METAR&#x29; на пять минут (наблюдения обновляются не чаще чем раз в 30–60 минут), использует таймауты 10 s / 15 s на подключение/чтение и строит сводку по &#x2A;*`parsed.time`** (время наблюдения), а не по `timestamp` (время запроса к API).

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

Другие примеры: [Сценарии использования погодных данных](/docs/v31/weather-integration-airport).

### Примечания по реализации [#implementation-notes]

**`timestamp` и `parsed.time`.** `timestamp` меняется при каждом запросе. `parsed.time` — время наблюдения из заголовка [METAR](https://en.wikipedia.org/wiki/METAR); используйте его для сообщений вида «данным X минут».

**`visibility.value` равно null.** Если станция сообщает `P6SM`, `value` равно `null`, а `repr` — `"P6"`. Трактуйте null как «> 6 SM», а не как отсутствие данных.

**Доступность станций.** Не для каждого кода ICAO есть станция [METAR](https://en.wikipedia.org/wiki/METAR). Ответ `404` означает, что наблюдение недоступно, — сам аэропорт при этом может существовать. Показывайте пустое состояние, а не баннер с ошибкой.

**Кэширование.** Клиентский кэш на 3–5 минут сокращает дублирующиеся вызовы, не пропуская новых наблюдений.

## Ответы с ошибками [#error-responses]

Здесь описаны только сбои, &#x2A;*специфичные для [METAR](https://en.wikipedia.org/wiki/METAR)**. Ошибки аутентификации, валидации, ограничения частоты запросов и ошибки сервера описаны в разделе [Обработка ошибок](/docs/errors). Паттерны резервного перехода между [METAR](https://en.wikipedia.org/wiki/METAR) и [TAF](https://en.wikipedia.org/wiki/Terminal_aerodrome_forecast) см. в разделе [Когда погодные данные отсутствуют](/docs/v31/weather-integration-errors#when-weather-data-is-missing).

### 404 — нет METAR для этого кода ICAO [#404--no-metar-for-this-icao]

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

Аэропорт может не существовать либо существовать, но не иметь станции [METAR](https://en.wikipedia.org/wiki/METAR). Сообщение не различает эти случаи — трактуйте любой ответ `404` для [METAR](https://en.wikipedia.org/wiki/METAR) как **отсутствие доступного наблюдения**.

<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;}]" />

***

См. также: [TAF](/docs/v31/weather-taf) · [Сценарии использования](/docs/v31/weather-integration-airport) · [Ошибки](/docs/v31/weather-integration-errors) · [Продакшн](/docs/v31/weather-integration-production)
