New rate limits now apply to all accounts.

AIRMET/SIGMET

AIRMETs and SIGMETs are official aviation weather advisories for hazardous en-route conditions. AIRMET (Airmen's Meteorological Information) covers moderate hazards; SIGMET (Significant Meteorological advisory) covers higher-severity events. This endpoint returns every active advisory whose affected area intersects your bounding box — use it for en-route hazard overlays on maps and pre-flight briefings. Filter with type=airmet or type=sigmet when you only need one severity class. Empty results (no active advisories) are normal and very common in good weather.

Request

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →

Send a GET with a geographic bounding box and optional type filter.

GEThttps://data.skylinkapi.com/v3/weather/airsigmet
ParameterTypeRequiredDefaultDescription
bboxstringYes-Bounding box as lat1,lon1,lat2,lon2 — southwest corner first. Example: 38,-90,45,-80 (Midwest corridor)
typestringNoallFilter: airmet or sigmet. Omit to return both

Bounding box tips. Keep boxes route-sized — very large bboxes can stress upstream processing. An empty reports array means no active advisories intersect the area (common in fair weather).

Response

{
  "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
}

When no advisories intersect the bbox, the API returns "reports": [] and "total": 0.

FieldTypeRequiredDescription
bboxstringYesEcho of the queried bounding box
reportsarrayYesMatching advisories (may be empty)
totalintegerYesCount of items in reports
filter_typestring | nullYes (key always present)Filter applied: "airmet", "sigmet", or null when unfiltered

Report

JSON path: reports[]. Only raw is guaranteed non-null. All decoded fields are null when not parsed from the advisory.

FieldTypeRequiredNull?Description
rawstringYesNeverFull advisory text as issued
bulletin_typestring | nullYes (key always present)Yes"AIRMET" or "SIGMET"
report_typestring | nullYes (key always present)YesAdvisory type, e.g. "AIRMET", "SIGMET", "CONVECTIVE SIGMET"
countrystring | nullYes (key always present)YesIssuing country code, e.g. "US"
issuerstring | nullYes (key always present)YesIssuing authority identifier, e.g. "KKCI"
areastring | nullYes (key always present)YesAffected area identifier, e.g. "S" (Sierra)
regionstring | nullYes (key always present)YesFlight Information Region (FIR) or region code, e.g. "KZAU"
start_timestring | nullYes (key always present)YesValid from (UTC, ISO 8601)
end_timestring | nullYes (key always present)YesValid until (UTC, ISO 8601)
bodystring | nullYes (key always present)YesHuman-readable advisory body text
observationobject | nullYes (key always present)YesObserved hazard details — see Observation and forecast
forecastobject | nullYes (key always present)YesForecast hazard details — same shape as observation. null when not present

Object schemas and nullability

Every key in a Report object is always present — nothing is omitted when a section is not decoded. The observation and forecast objects themselves may be null, but when present every key inside them is always included.

SituationWhat you getNot this
No hazard polygon decodedobservation.coords: []null, key missing
No forecast sectionforecast: nullkey missing
No observation sectionobservation: nullkey missing
Advisory has no altitude floorobservation.floor: nullkey missing or "0"
No movement informationobservation.movement: null{}, key missing
No active advisoriesreports: [], total: 0null, HTTP error
Unfiltered requestfilter_type: nullkey missing

AIRMET families

FamilyHazards covered
SIERRAIFR conditions, mountain obscuration
TANGOModerate turbulence, strong surface winds
ZULUModerate icing, freezing levels

SIGMETs cover higher-intensity en-route hazards. Convective SIGMETs are issued for severe thunderstorms, hail, and tornadoes over the contiguous US.

Observation and forecast schemasExpand section

JSON path: reports[].observation and reports[].forecast (same shape). Present when decoded from the advisory; null otherwise.

FieldTypeRequiredNull?Description
typestring | nullYes (key always present)YesPhenomenon type — IFR (instrument conditions), TURB (turbulence), ICE (icing), VA (volcanic ash)
intensitystring | nullYes (key always present)YesIntensity token, e.g. "MOD", "SEV"
floorstring | nullYes (key always present)YesLower altitude bound, e.g. "SFC", "FL100"
ceilingstring | nullYes (key always present)YesUpper altitude bound, e.g. "FL180", "FL450"
coordsarrayYesNeverPolygon vertices for map rendering. [] when no boundary is decoded
coords[].latnumberYes (per item)NeverVertex latitude
coords[].lonnumberYes (per item)NeverVertex longitude
movementobject | nullYes (key always present)YesAdvisory movement — direction and speed strings when present; null when stationary or not reported

Client types

"""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

Integration

Fetch active advisories for a route bbox and build polygon overlays.

The example queries a corridor bbox, caches for 15 minutes (advisories update on a fixed schedule), and extracts advisory polygons with valid time windows for map rendering. Empty results are expected in VFR conditions — render "no active advisories," not an error.

import osimport timeimport requestsHEADERS = {    "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3"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])

Implementation notes

Empty is normal. Fair-weather routes often return total: 0. Your map layer can hide overlays when empty.

Validity windows. Use start_time and end_time to expire polygons client-side. Do not show advisories past end_time even if cached. If end_time is null, treat the advisory as active until the next poll.

Polygon rendering. Draw observation.coords (or forecast.coords) as closed polygons. When coords is [], show the body text in a list view instead of a map overlay. Always close the polygon ring (last vertex → first vertex) before passing to a mapping library.

Filter strategically. Pre-flight briefing UIs often fetch type=airmet for dispatch and type=sigmet for higher-severity overlays. Omit type when you need the full picture.

Large bboxes. Size the query to your route plus a modest buffer (approximately 1–2° latitude/longitude) and split long routes into segments if needed.

Error responses

Endpoint-specific failures only. For auth, validation, rate limits, and server errors, see Error Handling.

400 — invalid bbox format

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

503 — upstream unavailable

Returned when the advisory feed is temporarily unreachable or the bbox is too large for upstream processing. Retry with exponential backoff and a smaller 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*string

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

type?string

Filter by type: 'airmet' or 'sigmet'

Match^(airmet|sigmet)$

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3/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": {}
    }
  ]
}

Related: Weather hub · PIREPs · METAR · AIRMET route use case