NOTAM
Получайте действующие извещения для пилотов (Notices to Air Missions, NOTAM — официальные операционные извещения, относящиеся к определённому пункту или воздушному пространству) для любого кода аэропорта ICAO в мире. Используйте этот эндпоинт в процессах брифинга, на дашбордах диспетчеризации и в предполётных чек-листах, когда вам нужны операционные извещения без поддержки отдельного потока NOTAM.
Важно: к трёхбуквенным кодам пунктов США (например, JFK) автоматически добавляется префикс K. Пустой массив notams — это обычный ответ 200, когда действующих извещений нет, а не ошибка.
Каждая запись содержит полный текст NOTAM в стандартном формате ICAO (raw), идентификаторы ICAO и национальные идентификаторы (если применимо), время начала и окончания действия, отдельные разобранные пункты и необязательные метаданные об области действия. Фильтруйте записи на стороне клиента по scope и type или используйте exclude_qcode/exclude_scope, чтобы исключать категории NOTAM на стороне сервера и уменьшать размер ответа ещё до того, как он дойдёт до вас.
Планируете маршрут на более отдалённую дату? По умолчанию возвращаются только уже действующие NOTAM — так же, как в брифинге AIS в реальном времени. NOTAM, опубликованный с будущей датой вступления в силу (например, аэропорт заранее, за две недели, публикует изменение расписания работы), не появится до наступления этой даты. Передайте include_future=true, чтобы уже сейчас видеть такие предстоящие NOTAM с меткой status: "FUTURE", позволяющей отличить их от действующих сегодня.
Запрос
Требования
x-api-key в каждом запросе (прямая подписка). Подробнее →https://data.skylinkapi.com/v3.1/notams/{icao}exclude_qcode и exclude_scope фильтруют на стороне сервера; scope и type остаются в ответе для дополнительной фильтрации на стороне клиента.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
icao | string | Да | Четырёхбуквенный ICAO-код аэропорта (например, KJFK, EGLL). К трёхбуквенным кодам США автоматически добавляется префикс K |
exclude_qcode | string (query) | Нет | Префиксы Q-кодов ICAO через запятую для исключения на стороне сервера, например QK (вся тематическая категория — исключает все NOTAM-чек-листы QK*) или QKKKK (только точный код) |
exclude_scope | string (query) | Нет | Значения scope через запятую для исключения на стороне сервера: AERODROME, FIR |
include_future | boolean (query) | Нет | Также возвращать NOTAM, дата вступления в силу которых ещё не наступила, с меткой status: "FUTURE". Значение по умолчанию false возвращает только действующие в данный момент NOTAM. Истёкшие NOTAM не возвращаются ни в одном из случаев |
Пример фильтрации на стороне сервера: GET /notams/EGLL?exclude_qcode=QK&exclude_scope=FIR исключает ежемесячные NOTAM-чек-листы (тематика Q-кода QK*, например QKKKK) и административные извещения и извещения на маршруте для всего FIR, возвращая только записи, относящиеся непосредственно к аэродрому EGLL.
Ответ
{
"icao": "KJFK",
"notams": [
{
"raw": "A0373/26 NOTAMN\nQ) KZNY/QMXLC/IV/M/A/000/999/4038N07346W005\nA) KJFK\nB) 2603241038\nC) 2608311800\nE) TWY D HLDG PSN MARKINGS FOR RWY 13L/31R NORTH SIDE NOT STD",
"notam_id": "A0373/2026",
"notam_id_domestic": "03/0373",
"type": "N",
"location": "KJFK",
"effective": "202603241038",
"expiration": "202608311800",
"body": "TWY D HLDG PSN MARKINGS FOR RWY 13L/31R NORTH SIDE NOT STD",
"schedule": null,
"lower_limit": null,
"upper_limit": null,
"affected_fir": "KZNY",
"q_code": "QMXLC",
"qline": "KZNY/QMXLC/IV/M/A/000/999/4038N07346W005",
"scope": "AERODROME",
"status": "ACTIVE"
}
],
"total": 1
}raw — это многострочная строка (с разделителем \n), содержащая извещение точно в том виде, в каком его публикует брифинг AIS. См. раздел Формат ICAO ниже.
Поля верхнего уровня
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
icao | string | Да | Определённый для запроса код ICAO |
notams | array | Да | Действующие записи NOTAM (может быть пустым) |
total | integer | Нет | Количество элементов в notams (по умолчанию 0) |
Элемент NOTAM (notams[])
| Поле | Тип | Обязательный | Null? | Описание |
|---|---|---|---|---|
raw | string | Да | Никогда | Полный текст NOTAM в стандартном формате ICAO (многострочный, с разделителем \n) |
notam_id | string | Нет | Да | Идентификатор NOTAM ICAO (например, 373/2026) |
notam_id_domestic | string | Нет | Да | Национальный идентификатор FAA (например, 03/373) |
type | string | Нет | Да | N (новый), R (замена), C (отмена) |
location | string | Нет | Да | Идентификатор затрагиваемого пункта |
effective | string | Нет | Да | Начало действия (UTC, формат поставщика данных) |
expiration | string | Нет | Да | Окончание действия (UTC, формат поставщика данных) |
body | string | Нет | Да | Текст NOTAM (пункт E) без заголовка |
schedule | string | Нет | Да | Расписание действия (пункт D), например MON-FRI 0600-1800 |
lower_limit | string | Нет | Да | Нижний предел по высоте (например, SFC, FL050) |
upper_limit | string | Нет | Да | Верхний предел по высоте (например, FL195, UNL) |
affected_fir | string | Нет | Да | FIR/ARTCC, в котором зарегистрирован NOTAM |
q_code | string | Нет | Да | Q-код NOTAM ICAO, если присутствует — может быть null в национальных извещениях FAA |
qline | string | Нет | Да | Полная строка Q ICAO, если предоставлена |
scope | string | Нет | Да | AERODROME (объект аэропорта) или FIR (воздушное пространство на маршруте) |
status | string | Нет | Да | ACTIVE (действует сейчас) или FUTURE (дата вступления в силу ещё не наступила — присутствует, только если запрошен include_future=true) |
raw присутствует всегда. Большинство полей метаданных могут быть null в зависимости от того, как было закодировано исходное сообщение.
Важно: извещения с scope: "AERODROME" напрямую касаются аэропорта — показывайте их на видном месте в панелях брифинга. Извещения с scope: "FIR" относятся к воздушному пространству на маршруте и тоже присутствуют в ответе — выводите их в отдельном разделе или сворачивайте по умолчанию. Аналогично, считайте извещения с status: "FUTURE" предстоящими, а не текущими: в большинстве интерфейсов брифинга их следует показывать отдельно от действующих сегодня.
Формат ICAO
raw содержит извещение в стандартной структуре ICAO, которую пилоты учатся читать: строка идентификации, за которой следуют пункты, обозначенные буквами. Отображайте его в блоке с моноширинным шрифтом без повторного переноса строк:
A0373/26 NOTAMN
Q) KZNY/QMXLC/IV/M/A/000/999/4038N07346W005
A) KJFK
B) 2603241038
C) 2608311800
E) TWY D HLDG PSN MARKINGS FOR RWY 13L/31R NORTH SIDE NOT STD| Пункт | Значение | Соответствующее поле |
|---|---|---|
| Q) | Строка Q — FIR, Q-код, тип движения, назначение, область действия, пределы, центр/радиус | qline, q_code, affected_fir |
| A) | Пункт, к которому относится извещение | location |
| B) | Начало действия (YYMMDDHHMM, UTC) | effective |
| C) | Окончание действия или PERM | expiration |
| D) | Расписание действия, если извещение действует периодически | schedule |
| E) | Сам текст извещения | body |
| F) / G) | Нижний и верхний вертикальные пределы | lower_limit, upper_limit |
Если орган, издавший извещение, опубликовал собственный перевод в формате ICAO, raw воспроизводит его байт в байт; в противном случае текст составляется из перечисленных выше разобранных пунктов.
Пункты присутствуют в том виде, в каком были поданы. Пункт присутствует, только если его указал составитель:
- Q) — международные извещения содержат полную строку Q. Многие национальные извещения США подаются вообще без Q-кода, поэтому
Q),q_codeиqlineдля них отсутствуют. - D) — только в извещениях с расписанием действия; большинство действуют непрерывно между B) и C).
- F)/G) — только в извещениях о воздушном пространстве и навигации, в которых указан вертикальный диапазон.
Разбирайте raw для отображения, а отдельные поля — для логики; не требуйте наличия всех пунктов.
Клиентские типы
"""NOTAM response models for GET /notams/{icao}."""from __future__ import annotationsfrom dataclasses import dataclass@dataclassclass NotamEntry: raw: str notam_id: str | None = None notam_id_domestic: str | None = None type: str | None = None location: str | None = None effective: str | None = None expiration: str | None = None body: str | None = None schedule: str | None = None lower_limit: str | None = None upper_limit: str | None = None affected_fir: str | None = None q_code: str | None = None qline: str | None = None scope: str | None = None@dataclassclass NotamResponse: icao: str notams: list[NotamEntry] total: int = 0@dataclassclass NotamSummary: notam_id: str | None type: str | None body: str | None effective: str | None expiration: str | None scope: str | NoneИнтеграция
Опрашивайте действующие NOTAM для аэропорта вылета и выводите компактный сводный список в интерфейсе брифинга.
Пример ниже кэширует ответы NOTAM на 5 минут, поскольку в периоды активной работы извещения могут часто меняться. Каждый запрос использует тайм-аут чтения 30 с, чтобы справляться с большими наборами NOTAM в загруженных хабах. Вспомогательная функция преобразует записи в сокращённый NotamSummary для отображения в списке, сохраняя raw для детального просмотра.
import osimport timefrom dataclasses import dataclassimport 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]] = {}NOTAM_TTL = 300 # 5 min@dataclassclass NotamSummary: notam_id: str | None type: str | None body: str | None effective: str | None expiration: str | None scope: str | Nonedef fetch_notams(icao: str) -> dict: icao = icao.upper().strip() if len(icao) == 3: icao = f"K{icao}" key = f"notams:{icao}" cached = CACHE.get(key) if cached and time.time() < cached[1]: return cached[0] try: r = requests.get(f"{BASE}/notams/{icao}", headers=HEADERS, timeout=(10, 30)) except requests.Timeout as exc: raise RuntimeError(f"SkyLink timeout fetching NOTAMs for {icao}") from exc r.raise_for_status() data = r.json() CACHE[key] = (data, time.time() + NOTAM_TTL) return datadef notam_summaries(icao: str) -> list[NotamSummary]: data = fetch_notams(icao) return [ NotamSummary( notam_id=item.get("notam_id"), type=item.get("type"), body=item.get("body"), effective=item.get("effective"), expiration=item.get("expiration"), scope=item.get("scope"), ) for item in data.get("notams", []) ]if __name__ == "__main__": import json summaries = notam_summaries("KJFK") print(json.dumps(summaries[:5], indent=2, default=str))Примечания по реализации
Кэширование с коротким TTL. В продакшне используйте окна кэширования 2–5 минут; в процессах авиации общего назначения и чартерных перевозок обходите кэш в течение часа до вылета.
Обработка отмен. Записи с type: "C" отменяют ранее опубликованный NOTAM — если вы храните локальное состояние, отслеживайте их по notam_id.
Префикс для кодов США. Принимайте от пользователей JFK; API преобразует его в KJFK.
Планирование маршрута на будущие даты. В инструментах планирования полётов, проверяющих аэропорт на несколько дней или недель вперёд, запрашивайте ?include_future=true и разделяйте записи по status: показывайте извещения ACTIVE как текущие условия, а FUTURE — как предстоящие изменения, о которых экипаж должен знать до полёта.
Ответы с ошибками
Общие ошибки платформы: Обработка ошибок. Ошибки, специфичные для эндпоинта:
422 — недопустимая длина кода ICAO
{
"detail": [
{
"type": "string_too_short",
"loc": ["path", "icao"],
"msg": "String should have at least 4 characters"
}
]
}Возвращается, если параметр пути короче четырёх символов и не может быть нормализован.
Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
4-letter ICAO airport code (e.g. KJFK, EGLL)
4 <= length <= 4Query Parameters
Comma-separated ICAO Q-code prefixes to exclude, e.g. QKKKK (exact code) or QK (whole subject category — drops every QK* checklist NOTAM).
Comma-separated scopes to exclude: AERODROME, FIR. exclude_scope=FIR drops en-route/FIR-wide administrative notices.
Also include NOTAMs whose effective start date is still in the future (not yet active), tagged with status=FUTURE. Default false returns only currently-active NOTAMs, matching a live AIS briefing.
falseResponse Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3.1/notams/KJFK"{
"icao": "OMDB",
"notams": [
{
"raw": "A2161/26 NOTAMN\nQ) OMAE/QMRLC/IV/NBO/A/000/999/2515N05521E005\nA) OMDB B) 2607162130 C) 2607302215\nE) RWY 12L/30R CLSD",
"notam_id": "A2161/2026",
"notam_id_domestic": "07/2161",
"type": "N",
"location": "OMDB",
"effective": "202607162130",
"expiration": "202607302215",
"body": "RWY 12L/30R CLSD",
"qline": "OMAE/QMRLC/IV/NBO/A/000/999/2515N05521E005",
"scope": "AERODROME"
}
],
"total": 1
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}См. также: Полётный брифинг · Задержки FAA · METAR
Кэширование и мониторинг
Паттерны для продакшна при работе с данными ADS-B и о воздушных судах: интервалы опроса, кэширование и управление квотой.
Задержки FAA
Задержки FAA NAS в реальном времени: программы наземных задержек, запреты вылетов, закрытия и программы управления потоками для аэропортов США.