Save up to 17% with yearly billing

See pricing

AIRMET/SIGMET

AIRMET и SIGMET — официальные авиационные метеопредупреждения об опасных условиях на маршруте. AIRMET (Airmen's Meteorological Information) охватывает умеренные опасные явления; SIGMET (Significant Meteorological advisory) — явления повышенной интенсивности. Этот эндпоинт возвращает все активные предупреждения, зона действия которых пересекается с вашим ограничивающим прямоугольником (bounding box), — используйте его для наложения опасных явлений на маршруте на карты и для предполётных брифингов. Фильтруйте с помощью type=airmet или type=sigmet, если нужен только один класс серьёзности. Пустые результаты (нет активных предупреждений) — нормальная и очень частая ситуация в хорошую погоду.

Запрос

Требования

Авторизация
x-api-key в каждом запросе (прямая подписка). Подробнее →

Отправьте GET с географическим ограничивающим прямоугольником и необязательным фильтром по типу.

GEThttps://data.skylinkapi.com/v3.1/weather/airsigmet
ПараметрТипОбязательныйПо умолчаниюОписание
bboxstringДа-Ограничивающий прямоугольник в формате lat1,lon1,lat2,lon2 — сначала юго-западный угол. Пример: 38,-90,45,-80 (коридор над Средним Западом)
typestringНетвсеФильтр: airmet или sigmet. Не указывайте, чтобы получить оба типа

Советы по ограничивающему прямоугольнику. Подбирайте размер прямоугольника по маршруту — очень большие bbox могут перегружать обработку на стороне источника данных. Пустой массив reports означает, что ни одно активное предупреждение не пересекается с областью (обычное дело в ясную погоду).

Ответ

{
  "bbox": "38.0,-90.0,45.0,-80.0",
  "filter_type": "airmet",
  "reports": [
    {
      "raw": "WAUS46 KKCI 151445 WA6S AIRMET SIERRA ...",
      "bulletin_type": "AIRMET",
      "report_type": "AIRMET",
      "country": "US",
      "issuer": "KKCI",
      "area": "S",
      "region": "KZAU",
      "start_time": "2025-01-15T14:45:00Z",
      "end_time": "2025-01-15T20:45:00Z",
      "body": "AIRMET IFR...",
      "observation": {
        "type": "IFR",
        "intensity": null,
        "floor": "SFC",
        "ceiling": "FL180",
        "coords": [
          { "lat": 41.5, "lon": -87.5 },
          { "lat": 42.0, "lon": -86.0 }
        ],
        "movement": null
      },
      "forecast": null
    }
  ],
  "total": 1
}

Если ни одно предупреждение не пересекается с bbox, API возвращает "reports": [] и "total": 0.

ПолеТипОбязательныйОписание
bboxstringДаПовтор запрошенного ограничивающего прямоугольника
reportsarrayДаПодходящие предупреждения (может быть пустым)
totalintegerДаКоличество элементов в reports
filter_typestring | nullДа (ключ присутствует всегда)Применённый фильтр: "airmet", "sigmet" или null без фильтрации

Сводка

Путь в JSON: reports[]. Гарантированно не равно null только поле raw. Все декодированные поля равны null, если их не удалось извлечь из предупреждения.

ПолеТипОбязательныйДопускает nullОписание
rawstringДаНикогдаПолный текст предупреждения в исходном виде
bulletin_typestring | nullДа (ключ присутствует всегда)Да"AIRMET" или "SIGMET"
report_typestring | nullДа (ключ присутствует всегда)ДаТип предупреждения, например "AIRMET", "SIGMET", "CONVECTIVE SIGMET"
countrystring | nullДа (ключ присутствует всегда)ДаКод страны-эмитента, например "US"
issuerstring | nullДа (ключ присутствует всегда)ДаИдентификатор выпустившего органа, например "KKCI"
areastring | nullДа (ключ присутствует всегда)ДаИдентификатор затронутой зоны, например "S" (Sierra)
regionstring | nullДа (ключ присутствует всегда)ДаРайон полётной информации (FIR) или код региона, например "KZAU"
start_timestring | nullДа (ключ присутствует всегда)ДаДействует с (UTC, ISO 8601)
end_timestring | nullДа (ключ присутствует всегда)ДаДействует до (UTC, ISO 8601)
bodystring | nullДа (ключ присутствует всегда)ДаУдобочитаемый текст предупреждения
observationobject | nullДа (ключ присутствует всегда)ДаСведения о наблюдаемом опасном явлении — см. Наблюдение и прогноз
forecastobject | nullДа (ключ присутствует всегда)ДаСведения о прогнозируемом опасном явлении — та же структура, что у observation. null, если отсутствует

Схемы объектов и допустимость null

Каждый ключ объекта Report присутствует всегда — ничего не опускается, если раздел не декодирован. Сами объекты observation и forecast могут быть null, но если они есть, все ключи внутри них присутствуют всегда.

СитуацияЧто вы получитеЧего не будет
Полигон опасного явления не декодированobservation.coords: []null, отсутствующий ключ
Нет раздела прогнозаforecast: nullотсутствующий ключ
Нет раздела наблюденияobservation: nullотсутствующий ключ
У предупреждения нет нижней границы высотыobservation.floor: nullотсутствующий ключ или "0"
Нет информации о перемещенииobservation.movement: null{}, отсутствующий ключ
Нет активных предупрежденийreports: [], total: 0null, HTTP-ошибка
Запрос без фильтраfilter_type: nullотсутствующий ключ

Семейства AIRMET

СемействоОхватываемые опасные явления
SIERRAУсловия IFR, закрытие гор облачностью
TANGOУмеренная турбулентность, сильный приземный ветер
ZULUУмеренное обледенение, высота нулевой изотермы

SIGMET охватывают опасные явления на маршруте повышенной интенсивности. Конвективные SIGMET выпускаются для сильных гроз, града и торнадо над континентальной частью США.

Схемы наблюдения и прогнозаРазвернуть раздел

Путь в JSON: reports[].observation и reports[].forecast (одинаковая структура). Присутствуют, если декодированы из предупреждения; иначе null.

ПолеТипОбязательныйДопускает nullОписание
typestring | nullДа (ключ присутствует всегда)ДаТип явления — IFR (приборные условия), TURB (турбулентность), ICE (обледенение), VA (вулканический пепел)
intensitystring | nullДа (ключ присутствует всегда)ДаОбозначение интенсивности, например "MOD", "SEV"
floorstring | nullДа (ключ присутствует всегда)ДаНижняя граница по высоте, например "SFC", "FL100"
ceilingstring | nullДа (ключ присутствует всегда)ДаВерхняя граница по высоте, например "FL180", "FL450"
coordsarrayДаНикогдаВершины полигона для отрисовки на карте. [], если граница не декодирована
coords[].latnumberДа (для каждого элемента)НикогдаШирота вершины
coords[].lonnumberДа (для каждого элемента)НикогдаДолгота вершины
movementobject | nullДа (ключ присутствует всегда)ДаПеремещение зоны предупреждения — строки direction и speed, если указаны; null, если зона стационарна или данные не сообщаются

Клиентские типы

"""AIRMET/SIGMET response types - matches airsigmet field tables."""from dataclasses import dataclass, field@dataclassclass AirSigmetCoord:    lat: float    lon: float@dataclassclass AirSigmetObservation:    type: str | None = None    intensity: str | None = None    floor: str | None = None    ceiling: str | None = None    coords: list[AirSigmetCoord] = field(default_factory=list)    movement: dict | None = None@dataclassclass AirSigmetReport:    raw: str    bulletin_type: str | None = None    report_type: str | None = None    start_time: str | None = None    end_time: str | None = None    body: str | None = None    observation: AirSigmetObservation | None = None    forecast: AirSigmetObservation | None = None@dataclassclass AirSigmetResponse:    bbox: str    reports: list[AirSigmetReport]    total: int    filter_type: str | None = None

Интеграция

Запросите активные предупреждения для bbox маршрута и постройте наложения полигонов.

Пример запрашивает bbox коридора, кэширует результат на 15 минут (предупреждения обновляются по фиксированному графику) и извлекает полигоны предупреждений со сроками действия для отрисовки на карте. Пустые результаты ожидаемы в условиях VFR — отображайте «нет активных предупреждений», а не ошибку.

import osimport timeimport requestsHEADERS = {    "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3.1"CACHE: dict[str, tuple[dict, float]] = {}AIRSIG_TTL = 900  # 15 mindef fetch_airsigmets(bbox: str, advisory_type: str | None = None) -> dict:    cache_key = f"airsig:{bbox}:{advisory_type or 'all'}"    cached = CACHE.get(cache_key)    if cached and time.time() < cached[1]:        return cached[0]    params: dict[str, str] = {"bbox": bbox}    if advisory_type:        params["type"] = advisory_type    r = requests.get(        f"{BASE}/weather/airsigmet",        headers=HEADERS,        params=params,        timeout=(10, 25),    )    r.raise_for_status()    data = r.json()    CACHE[cache_key] = (data, time.time() + AIRSIG_TTL)    return datadef active_polygons(bbox: str) -> list[list[tuple[float, float]]]:    """Return coord rings for map overlays (may be empty)."""    payload = fetch_airsigmets(bbox, advisory_type="airmet")    rings: list[list[tuple[float, float]]] = []    for report in payload.get("reports", []):        obs = report.get("observation") or {}        coords = obs.get("coords") or []        if coords:            rings.append([(c["lat"], c["lon"]) for c in coords])    return ringsif __name__ == "__main__":    import json    bbox = "-74.5,40.3,-73.5,41.0"    payload = fetch_airsigmets(bbox, "airmet")    print(json.dumps(payload, indent=2, default=str)[:3000])

Примечания по реализации

Пустой результат — это нормально. Для маршрутов в хорошую погоду часто возвращается total: 0. Слой карты может скрывать наложения, когда данных нет.

Сроки действия. Используйте start_time и end_time, чтобы снимать полигоны с отображения на стороне клиента. Не показывайте предупреждения после end_time, даже если они закэшированы. Если end_time равно null, считайте предупреждение активным до следующего опроса.

Отрисовка полигонов. Рисуйте observation.coords (или forecast.coords) как замкнутые полигоны. Если coords равно [], показывайте текст body в виде списка вместо наложения на карту. Всегда замыкайте контур полигона (последняя вершина → первая вершина) перед передачей в картографическую библиотеку.

Фильтруйте с умом. Интерфейсы предполётного брифинга часто запрашивают type=airmet для диспетчерской службы и type=sigmet для наложений с явлениями повышенной интенсивности. Не указывайте type, если нужна полная картина.

Большие bbox. Подбирайте область запроса по маршруту с небольшим запасом (примерно 1–2° по широте/долготе) и при необходимости разбивайте длинные маршруты на сегменты.

Ответы с ошибками

Здесь описаны только ошибки, специфичные для эндпоинта. Об ошибках аутентификации, валидации, ограничениях частоты запросов и ошибках сервера см. Обработка ошибок.

400 — некорректный формат bbox

{
  "detail": "Invalid bounding box format. Expected 'lat1,lon1,lat2,lon2'"
}

503 — источник данных недоступен

Возвращается, когда поток предупреждений временно недоступен или bbox слишком велик для обработки на стороне источника данных. Повторите запрос с экспоненциальной задержкой (backoff) и меньшим bbox.

{
  "detail": "Upstream AIRMET/SIGMET service unavailable"
}
GET
/weather/airsigmet
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Query Parameters

bbox*Bbox

Bounding box as 'lat1,lon1,lat2,lon2' (SW corner → NE corner)

type?|

Filter by type: 'airmet' or 'sigmet'

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3.1/weather/airsigmet?bbox=string"
{
  "bbox": "38,-90,45,-80",
  "reports": [
    {
      "raw": "WAUS46 KKCI 151445 WA6S AIRMET SIERRA ...",
      "bulletin_type": "AIRMET",
      "report_type": "AIRMET",
      "area": "S",
      "body": "AIRMET IFR...",
      "observation": {
        "type": "IFR",
        "floor": "SFC",
        "ceiling": "FL180"
      }
    }
  ],
  "total": 1
}
Empty
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

См. также: Раздел «Погода» · PIREP · METAR · Сценарий: AIRMET на маршруте