New rate limits now apply to all accounts.

FAA Delays

Retrieve active FAA National Airspace System (NAS — US civilian airspace) delay programs for US airports and US territories. Use the nationwide feed for operations dashboards and the per-airport feed to decorate departure boards, crew alerts, and passenger notifications.

Delay categories:

CodeNameDescription
GDPGround Delay ProgramArrival metering into a facility — includes average and max delay strings
GSGround StopHolding departures to a specific facility
ClosureAirport/program closureFacility closed or restricted
AFPAirspace Flow ProgramARTCC-level traffic management rerouting

Coverage is limited to airports under FAA jurisdiction — continental US, Alaska, Hawaii, Puerto Rico, the US Virgin Islands, Guam, and other US Pacific territories. For international delay context, combine with Flight Status and airline ops data.

Important: Response arrays are always present but may be empty — total_alerts: 0 with a message string is a valid "no active programs" response, not an error. Do not cache longer than 2–5 minutes — GDP and GS programs change with little notice.

EndpointWhen to use
GET /delays/faaOperations map — all active GDP, GS, closure, and AFP alerts
GET /delays/faa/{icao}Airport detail — delays affecting one US airport

All current FAA delays

Returns all active FAA NAS delays nationwide.

Request

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →
GEThttps://data.skylinkapi.com/v3/delays/faa

No query parameters. Returns current FAA delay programs; data is refreshed on each request.

Response

{
  "ground_delays": [
    {
      "airport": "KSFO",
      "airport_name": null,
      "reason": "low ceilings",
      "avg_delay": "34 minutes",
      "max_delay": "1 hour and 25 minutes"
    }
  ],
  "ground_stops": [],
  "closures": [
    {
      "airport": "KJFK",
      "airport_name": null,
      "reason": "!JFK 06/158 JFK AD AP CLSD TO TRANSIENT GA ACFT EXC 24HR PPR ...",
      "begin": "Jun 11 at 16:30 UTC.",
      "reopen": "Jul 22 at 03:59 UTC."
    }
  ],
  "airspace_flow_programs": [],
  "total_alerts": 8,
  "message": null
}
FieldTypeRequiredNull?Description
ground_delaysarrayYesNeverActive GDP entries
ground_stopsarrayYesNeverActive ground stops
closuresarrayYesNeverAirport/program closures
airspace_flow_programsarrayYesNeverARTCC airspace flow programs
total_alertsintegerNoNeverSum of all alert rows (defaults to 0)
messagestringNoYesStatus text when no delays are active

Ground delay (ground_delays[])

FieldTypeRequiredNull?Description
airportstringYesNeverAirport ICAO or FAA identifier
airport_namestringNoYesAirport name when provided
reasonstringYesNeverDelay reason (often weather or volume)
avg_delaystringNoYesAverage delay duration (human-readable)
max_delaystringNoYesMaximum delay duration

Ground stop (ground_stops[])

FieldTypeRequiredNull?Description
airportstringYesNeverAffected airport
airport_namestringNoYesAirport name when available
reasonstringYesNeverStop reason
end_timestringNoYesExpected end time (UTC)

Closure (closures[])

FieldTypeRequiredNull?Description
airportstringYesNeverAffected airport
airport_namestringNoYesAirport name when available
reasonstringYesNeverClosure reason (often includes NOTAM text)
beginstringNoYesClosure start (UTC, human-readable)
reopenstringNoYesExpected reopen time

Airspace flow program (airspace_flow_programs[])

FieldTypeRequiredNull?Description
facilitystringYesNeverATC facility (ARTCC — en-route control center) identifier, not an airport code
reasonstringYesNeverProgram reason
fca_startstringNoYesFlow constrained area start
fca_endstringNoYesFlow constrained area end

Important: Airspace flow programs use facility (ARTCC) rather than an airport code — label them clearly in UI copy so users do not confuse AFP rows with airport-specific delays.

GET
/delays/faa
x-api-key<token>

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

In: header

Response Body

application/json

curl -X GET "https://data.skylinkapi.com/v3/delays/faa"
{
  "ground_delays": [
    {
      "airport": "KEWR",
      "reason": "WEATHER / THUNDERSTORMS",
      "avg_delay": "1 hour and 30 minutes",
      "max_delay": "2 hours"
    }
  ],
  "ground_stops": [],
  "closures": [],
  "airspace_flow_programs": [],
  "total_alerts": 1
}

Delays for a specific airport

Returns active FAA delays filtered to a specific US airport by ICAO code. Airspace flow programs (ARTCC-level) are included in full because they may indirectly affect the requested airport.

Request

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →
GEThttps://data.skylinkapi.com/v3/delays/faa/{icao}
ParameterTypeRequiredDescription
icaostringYes4-letter US ICAO code (e.g. KJFK)

Response

Same envelope as All current FAA delays with arrays filtered to the requested airport (plus relevant AFP rows).

{
  "ground_delays": [],
  "ground_stops": [],
  "closures": [
    {
      "airport": "KJFK",
      "airport_name": null,
      "reason": "!JFK 06/158 JFK AD AP CLSD TO TRANSIENT GA ACFT EXC 24HR PPR ...",
      "begin": "Jun 11 at 16:30 UTC.",
      "reopen": "Jul 22 at 03:59 UTC."
    }
  ],
  "airspace_flow_programs": [],
  "total_alerts": 1,
  "message": null
}
GET
/delays/faa/{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)

Length4 <= length <= 4

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3/delays/faa/KJFK"
{
  "ground_delays": [
    {
      "airport": "string",
      "airport_name": "string",
      "reason": "string",
      "avg_delay": "string",
      "max_delay": "string"
    }
  ],
  "ground_stops": [
    {
      "airport": "string",
      "airport_name": "string",
      "reason": "string",
      "end_time": "string"
    }
  ],
  "closures": [
    {
      "airport": "string",
      "airport_name": "string",
      "reason": "string",
      "begin": "string",
      "reopen": "string"
    }
  ],
  "airspace_flow_programs": [
    {
      "facility": "string",
      "reason": "string",
      "fca_start": "string",
      "fca_end": "string"
    }
  ],
  "total_alerts": 0,
  "message": "string"
}
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Client types

"""FAA NAS delay response models for /delays/faa endpoints."""from __future__ import annotationsfrom dataclasses import dataclassfrom typing import Literal@dataclassclass GroundDelay:    airport: str    reason: str    airport_name: str | None = None    avg_delay: str | None = None    max_delay: str | None = None@dataclassclass GroundStop:    airport: str    reason: str    airport_name: str | None = None    end_time: str | None = None@dataclassclass Closure:    airport: str    reason: str    airport_name: str | None = None    begin: str | None = None    reopen: str | None = None@dataclassclass AirspaceFlowProgram:    facility: str    reason: str    fca_start: str | None = None    fca_end: str | None = None@dataclassclass FaaDelayResponse:    ground_delays: list[GroundDelay]    ground_stops: list[GroundStop]    closures: list[Closure]    airspace_flow_programs: list[AirspaceFlowProgram]    total_alerts: int = 0    message: str | None = NoneDelayKind = Literal["GDP", "GS", "Closure", "AFP"]@dataclassclass DelayAlert:    kind: DelayKind    airport: str    reason: str    avg_delay: str | None    max_delay: str | None

Integration

Poll per-airport FAA delays and flatten them into a unified alert list for a departure board.

The example below caches responses for 2 minutes because delay programs change frequently during weather events. Each request uses explicit timeouts (10 s connect / 20 s read). The helper merges GDP, GS, closure, and AFP rows into a single DelayAlert list for badge rendering.

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]] = {}DELAY_TTL = 120  # 2 min - FAA feed is real-time@dataclassclass DelayAlert:    kind: str    airport: str    reason: str    avg_delay: str | None    max_delay: str | Nonedef fetch_faa_delays(icao: str | None = None) -> dict:    key = f"delays:{icao or 'all'}"    cached = CACHE.get(key)    if cached and time.time() < cached[1]:        return cached[0]    path = f"{BASE}/delays/faa/{icao.upper()}" if icao else f"{BASE}/delays/faa"    try:        r = requests.get(path, headers=HEADERS, timeout=(10, 20))    except requests.Timeout as exc:        raise RuntimeError("SkyLink timeout fetching FAA delays") from exc    r.raise_for_status()    data = r.json()    CACHE[key] = (data, time.time() + DELAY_TTL)    return datadef delay_alerts(icao: str | None = None) -> list[DelayAlert]:    data = fetch_faa_delays(icao)    alerts: list[DelayAlert] = []    for item in data.get("ground_delays", []):        alerts.append(            DelayAlert(                kind="GDP",                airport=item["airport"],                reason=item["reason"],                avg_delay=item.get("avg_delay"),                max_delay=item.get("max_delay"),            )        )    for item in data.get("ground_stops", []):        alerts.append(            DelayAlert(kind="GS", airport=item["airport"], reason=item["reason"], avg_delay=None, max_delay=None)        )    for item in data.get("closures", []):        alerts.append(            DelayAlert(kind="Closure", airport=item["airport"], reason=item["reason"], avg_delay=None, max_delay=None)        )    for item in data.get("airspace_flow_programs", []):        alerts.append(            DelayAlert(                kind="AFP",                airport=item["facility"],                reason=item["reason"],                avg_delay=None,                max_delay=None,            )        )    return alertsif __name__ == "__main__":    import json    delays = fetch_faa_delays("KJFK")    print(json.dumps(delays, indent=2, default=str))

Implementation notes

Human-readable durations. avg_delay and max_delay are strings (e.g. "34 minutes") — parse conservatively or display as-is.

Empty responses. total_alerts: 0 with message set may indicate no active programs nationwide — show an empty state, not an error banner.

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

Integration guides

GuideCovers
NOTAMsSummary table, aerodrome filter, preflight check
FAA delaysNationwide scan, hub dashboard
Error handlingEmpty arrays, US-only coverage
Caching & monitoring5 min NOTAM / 2 min FAA TTLs

Related: NOTAMs · Flight Status · Schedules