New rate limits now apply to all accounts.

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

Auth
x-api-key on every request (direct subscription). Learn more →
GEThttps://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.

ParameterTypeRequiredDescription
icaostringYes4-letter ICAO airport code (e.g. KJFK, EGLL). US 3-letter codes are auto-prefixed with K
exclude_qcodestring (query)NoComma-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_scopestring (query)NoComma-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

FieldTypeRequiredDescription
icaostringYesResolved ICAO code for the request
notamsarrayYesActive NOTAM entries (may be empty)
totalintegerNoCount of items in notams (defaults to 0)

NOTAM item (notams[])

FieldTypeRequiredNull?Description
rawstringYesNeverFull NOTAM text in standard ICAO format (multi-line, \n separated)
notam_idstringNoYesICAO NOTAM identifier (e.g. 373/2026)
notam_id_domesticstringNoYesFAA domestic identifier (e.g. 03/373)
typestringNoYesN (new), R (replace), C (cancel)
locationstringNoYesAffected location identifier
effectivestringNoYesEffective start (UTC, provider format)
expirationstringNoYesExpiration end (UTC, provider format)
bodystringNoYesNOTAM body (E item) without header
schedulestringNoYesActivation schedule (D item), e.g. MON-FRI 0600-1800
lower_limitstringNoYesLower altitude limit (e.g. SFC, FL050)
upper_limitstringNoYesUpper altitude limit (e.g. FL195, UNL)
affected_firstringNoYesFIR/ARTCC the NOTAM is filed under
q_codestringNoYesICAO NOTAM Q-code when present — may be null on FAA domestic notices
qlinestringNoYesFull ICAO Q-line when supplied
scopestringNoYesAERODROME (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
ItemMeaningMatching field
Q)Q-line — FIR, Q-code, traffic, purpose, scope, limits, centre/radiusqline, q_code, affected_fir
A)Location the notice applies tolocation
B)Effective from (YYMMDDHHMM, UTC)effective
C)Effective until, or PERMexpiration
D)Activation schedule, when the notice is intermittentschedule
E)The notice text itselfbody
F) / G)Lower and upper vertical limitslower_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_code and qline are 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 | None

Integration

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.

GET
/notams/{icao}
x-api-key<token>

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

In: header

Path Parameters

icao*string

4-letter ICAO airport code (e.g. KJFK, EGLL)

Length4 <= length <= 4

Query Parameters

exclude_qcode?string

Comma-separated ICAO Q-code prefixes to exclude, e.g. QKKKK (exact code) or QK (whole subject category — drops every QK* checklist NOTAM).

exclude_scope?string

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