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:
| Code | Name | Description |
|---|---|---|
| GDP | Ground Delay Program | Arrival metering into a facility — includes average and max delay strings |
| GS | Ground Stop | Holding departures to a specific facility |
| Closure | Airport/program closure | Facility closed or restricted |
| AFP | Airspace Flow Program | ARTCC-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.
| Endpoint | When to use |
|---|---|
GET /delays/faa | Operations 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
x-api-key on every request (direct subscription). Learn more →https://data.skylinkapi.com/v3/delays/faaNo 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
}| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
ground_delays | array | Yes | Never | Active GDP entries |
ground_stops | array | Yes | Never | Active ground stops |
closures | array | Yes | Never | Airport/program closures |
airspace_flow_programs | array | Yes | Never | ARTCC airspace flow programs |
total_alerts | integer | No | Never | Sum of all alert rows (defaults to 0) |
message | string | No | Yes | Status text when no delays are active |
Ground delay (ground_delays[])
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
airport | string | Yes | Never | Airport ICAO or FAA identifier |
airport_name | string | No | Yes | Airport name when provided |
reason | string | Yes | Never | Delay reason (often weather or volume) |
avg_delay | string | No | Yes | Average delay duration (human-readable) |
max_delay | string | No | Yes | Maximum delay duration |
Ground stop (ground_stops[])
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
airport | string | Yes | Never | Affected airport |
airport_name | string | No | Yes | Airport name when available |
reason | string | Yes | Never | Stop reason |
end_time | string | No | Yes | Expected end time (UTC) |
Closure (closures[])
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
airport | string | Yes | Never | Affected airport |
airport_name | string | No | Yes | Airport name when available |
reason | string | Yes | Never | Closure reason (often includes NOTAM text) |
begin | string | No | Yes | Closure start (UTC, human-readable) |
reopen | string | No | Yes | Expected reopen time |
Airspace flow program (airspace_flow_programs[])
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
facility | string | Yes | Never | ATC facility (ARTCC — en-route control center) identifier, not an airport code |
reason | string | Yes | Never | Program reason |
fca_start | string | No | Yes | Flow constrained area start |
fca_end | string | No | Yes | Flow 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.
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
x-api-key on every request (direct subscription). Learn more →https://data.skylinkapi.com/v3/delays/faa/{icao}| Parameter | Type | Required | Description |
|---|---|---|---|
icao | string | Yes | 4-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
}Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
4-letter ICAO airport code (e.g. KJFK)
4 <= length <= 4Response 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 | NoneIntegration
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
| Guide | Covers |
|---|---|
| NOTAMs | Summary table, aerodrome filter, preflight check |
| FAA delays | Nationwide scan, hub dashboard |
| Error handling | Empty arrays, US-only coverage |
| Caching & monitoring | 5 min NOTAM / 2 min FAA TTLs |
Related: NOTAMs · Flight Status · Schedules