NOTAMs
Retrieve currently active Notices to Air Missions (NOTAMs — authoritative operational notices affecting a location or airspace) for any ICAO airport code worldwide. Use this endpoint in briefing workflows, dispatch dashboards, and preflight checklists when you need operational notices without maintaining a separate NOTAM feed.
Important: Three-letter US location codes (e.g. JFK) are automatically prefixed with K. An empty notams array is a normal 200 response when no active notices apply — not an error.
Each entry includes the full NOTAM text in standard ICAO format (raw), ICAO and domestic identifiers where applicable, effective/expiration times, the individual parsed items, and optional scope metadata. Filter client-side on scope and type, or use exclude_qcode/exclude_scope to drop NOTAM categories server-side and cut response size before it reaches you.
Request
Requirements
x-api-key on every request (direct subscription). Learn more →https://data.skylinkapi.com/v3/notams/{icao}exclude_qcode and exclude_scope filter server-side; scope and type remain available on the response for additional client-side filtering.
| Parameter | Type | Required | Description |
|---|---|---|---|
icao | string | Yes | 4-letter ICAO airport code (e.g. KJFK, EGLL). US 3-letter codes are auto-prefixed with K |
exclude_qcode | string (query) | No | Comma-separated ICAO Q-code prefixes to drop server-side, e.g. QK (whole subject category — drops every QK* checklist NOTAM) or QKKKK (exact code only) |
exclude_scope | string (query) | No | Comma-separated scope values to drop server-side: AERODROME, FIR |
Server-side filtering example: GET /notams/EGLL?exclude_qcode=QK&exclude_scope=FIR drops monthly checklist NOTAMs (Q-code subject QK*, e.g. QKKKK) and FIR-wide administrative/en-route notices, returning only aerodrome-specific items for EGLL.
Response
{
"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"
}
],
"total": 1
}raw is a multi-line string (\n separated) holding the notice exactly as an AIS briefing publishes it. See ICAO format below.
Top-level fields
| Field | Type | Required | Description |
|---|---|---|---|
icao | string | Yes | Resolved ICAO code for the request |
notams | array | Yes | Active NOTAM entries (may be empty) |
total | integer | No | Count of items in notams (defaults to 0) |
NOTAM item (notams[])
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
raw | string | Yes | Never | Full NOTAM text in standard ICAO format (multi-line, \n separated) |
notam_id | string | No | Yes | ICAO NOTAM identifier (e.g. 373/2026) |
notam_id_domestic | string | No | Yes | FAA domestic identifier (e.g. 03/373) |
type | string | No | Yes | N (new), R (replace), C (cancel) |
location | string | No | Yes | Affected location identifier |
effective | string | No | Yes | Effective start (UTC, provider format) |
expiration | string | No | Yes | Expiration end (UTC, provider format) |
body | string | No | Yes | NOTAM body (E item) without header |
schedule | string | No | Yes | Activation schedule (D item), e.g. MON-FRI 0600-1800 |
lower_limit | string | No | Yes | Lower altitude limit (e.g. SFC, FL050) |
upper_limit | string | No | Yes | Upper altitude limit (e.g. FL195, UNL) |
affected_fir | string | No | Yes | FIR/ARTCC the NOTAM is filed under |
q_code | string | No | Yes | ICAO NOTAM Q-code when present — may be null on FAA domestic notices |
qline | string | No | Yes | Full ICAO Q-line when supplied |
scope | string | No | Yes | AERODROME (airport facility) or FIR (en-route airspace) |
raw is always present. Most metadata fields may be null depending on how the upstream message was encoded.
Important: scope: "AERODROME" notices affect the airport directly — show these prominently in briefing panels. scope: "FIR" notices are en-route airspace items that also appear in the response — surface them in a separate section or collapse by default.
ICAO format
raw carries the notice in the standard ICAO layout pilots are trained to read — the identification line followed by the lettered items. Render it in a monospace block without re-wrapping:
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| Item | Meaning | Matching field |
|---|---|---|
| Q) | Q-line — FIR, Q-code, traffic, purpose, scope, limits, centre/radius | qline, q_code, affected_fir |
| A) | Location the notice applies to | location |
| B) | Effective from (YYMMDDHHMM, UTC) | effective |
| C) | Effective until, or PERM | expiration |
| D) | Activation schedule, when the notice is intermittent | schedule |
| E) | The notice text itself | body |
| F) / G) | Lower and upper vertical limits | lower_limit, upper_limit |
Where the originating authority published its own ICAO translation, raw reproduces it byte-for-byte; otherwise it is composed from the parsed items above.
Items appear as filed. An item is present only when the originator supplied it:
- Q) — international notices carry a full Q-line. Many US domestic notices are filed without a Q-code at all, so
Q),q_codeandqlineare absent for them. - D) — only on notices with an activation schedule; most run continuously between B) and C).
- F)/G) — only on airspace and navigation notices that specify a vertical band.
Parse raw for display and the individual fields for logic — do not require every item to be present.
Client types
"""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 | NoneIntegration
Poll active NOTAMs for a departure airport and surface a compact summary list in a briefing UI.
The example below caches NOTAM responses for 5 minutes because notices can change frequently during operational windows. Each request uses a 30 s read timeout to accommodate large NOTAM sets at busy hubs. The helper maps entries to a trimmed NotamSummary for list rendering while preserving raw for detail views.
import osimport timefrom dataclasses import dataclassimport requestsHEADERS = { "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3"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))Implementation notes
Short TTL caching. Use 2–5 minute cache windows in production; bypass cache within an hour of departure for GA and charter workflows.
Cancel handling. type: "C" entries cancel a prior NOTAM — track by notam_id if you maintain local state.
US code prefixing. Accept JFK from users; the API resolves to KJFK.
Error responses
Shared platform errors: Error Handling. Endpoint-specific:
422 — invalid ICAO length
{
"detail": [
{
"type": "string_too_short",
"loc": ["path", "icao"],
"msg": "String should have at least 4 characters"
}
]
}Returned when the path parameter is shorter than four characters and cannot be normalized.
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.
Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3/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",
"type": "N",
"location": "OMDB",
"effective": "202607162130",
"expiration": "202607302215",
"body": "RWY 12L/30R CLSD"
}
],
"total": 1
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}Related: Flight Briefing · FAA Delays · METAR