FAA Airport Status - Airport Delays, Closures, Ground Stops
Pricing
$10.00 / 1,000 delayed airport returneds
FAA Airport Status - Airport Delays, Closures, Ground Stops
Live FAA airport delays for the whole US National Airspace System: ground stops, ground delay programs, airport closures, arrival and departure delays, airspace flow programs and CTOP. Delay lengths parsed into minutes. Official FAA feed, no API key, no scraping.
Pricing
$10.00 / 1,000 delayed airport returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
Every US airport the FAA currently reports a problem at - ground stops, ground delay programs, airport closures, arrival and departure delays - as clean rows, with delay lengths already turned into minutes.
This reads the FAA's own airport status feed (nasstatus.faa.gov). It is a work of the US government: public domain, no API key, no rate-limit contract. robots.txt on that host is User-agent: * with nothing disallowed. Nothing here parses a web page. No proxies required.
Why not just read the feed yourself
Because it is XML, and it has three traps that make a straightforward reader lose airports without any error appearing.
Trap 1: the same section appears more than once, and the second one is easy to lose
The feed is Delay_type* - a repeating element. The same <Name> can appear in several blocks. Here is a real response from 2026-08-31:
<Delay_type><Name>Ground Stop Programs</Name> ... ORD ...<Delay_type><Name>Airport Closures</Name> ... SNA, LMT, HTS ...<Delay_type><Name>Airport Closures</Name> ... LFT, ASE ... ← a second block
A reader that looks up "the section called Airport Closures" gets 3 of the 5 closed airports. LFT and ASE simply are not in its output, and nothing looks wrong. This Actor walks every block and returned all 6 affected airports from that response.
Trap 2: airspace programs have no airport code, so filtering by airport hides the cause
Airspace_Flow and CTOP have no ARPT element at all - they are national programs. Filter naively by airport and they vanish, taking the reason your airport is delayed with them. Every row carries scope (airport or airspace), and filtering by airport keeps the airspace-wide programs and tells you it did.
Trap 3: one airport can have both an arrival delay and a departure delay
The FAA's own DTD says Delay (ARPT, Reason, Arrival_Departure, Arrival_Departure?) - up to two blocks per airport, distinguished only by a Type attribute. Take the first and you silently drop the other direction. This Actor fills arrival* and departure* on the same row.
And the smaller ones
- Entity references arrive raw. A real closure reason contained

. Left alone it ends up inside your text. - Delay lengths are prose -
"45 minutes","1 hour and 30 minutes". Every one is parsed into...Minutesso you can threshold and sort. A length that cannot be parsed becomesnull, never0- "no delay" and "could not read it" are different answers, and the raw string is always kept next to it. (Across 136 captured responses from 2003 to 2026, every duration the FAA has published takes one of three shapes:N minutes,N hours,N hours and N minutes.) - The FAA can add new sections, or rename the ones it has. Anything not in the published DTD is reported in
RUN_UNKNOWN_LISTS. And if a known section is present but its entries cannot be read - the sign that an element was renamed - that goes inRUN_EMPTY_LISTSand the log says so, because the alternative is answering "no delays anywhere" while airports are shut. - The published DTD does not match the live feed. The DTD declares
FCA_Start_DateTime; the feed actually sendsFCA_StartDateTime. Checked against 136 captured responses spanning 2003-2026. A parser written from the specification alone returnsnullfor every airspace program time. This Actor reads both.
What you get
One row per affected airport, with the same columns every time.
| Field | Example | Notes |
|---|---|---|
rowType | delay | no-delays on the single row returned when nothing is wrong |
delayType | AIRPORT_CLOSURE | GROUND_STOP, GROUND_DELAY, AIRPORT_CLOSURE, ARRIVAL_DEPARTURE_DELAY, AIRSPACE_FLOW, CTOP |
delayTypeName | Airport Closures | The FAA's own heading |
airport | ORD | Validated as a 3-4 character code |
reason | thunderstorms | For closures, the raw NOTAM text |
endTime | 7:45 am CDT | Ground stops |
averageDelay / averageDelayMinutes | 45 minutes / 45 | Ground delay programs, airspace flow, CTOP |
maximumDelay / maximumDelayMinutes | 1 hour and 30 minutes / 90 | |
closureStart / reopen | Aug 31 at 04:30 UTC. | Closures |
arrivalMin/MaxMinutes, arrivalTrend | 16 / 30 / Increasing | The FAA publishes these as 15-minute buckets |
departureMin/MaxMinutes, departureTrend | 31 / 45 / Decreasing | Both directions on one row |
scope | airport | airspace for national programs that have no airport code |
controlElement | FCAJX7 | Airspace flow programs, and the FCA name for CTOP |
programName | CTOP | |
startTime / stopTime | 20220513150000 | Airspace flow and CTOP |
afpStartTime / afpEndTime | 1800 / 2359 | Airspace flow. A different clock from startTime - kept separate, not merged |
altitudeFloor / altitudeCeiling | 200 / 500 | Airspace flow |
updateTime | Mon Aug 31 11:30:45 2026 GMT | When the FAA last updated the feed |
source | FAA nasstatus.faa.gov airport status (official, public domain) |
A real row
{"rowType": "delay","delayType": "GROUND_STOP","delayTypeName": "Ground Stop Programs","airport": "ORD","reason": "thunderstorms","endTime": "7:45 am CDT","updateTime": "Mon Aug 31 11:30:45 2026 GMT","source": "FAA nasstatus.faa.gov airport status (official, public domain)"}
When nothing is wrong
The National Airspace System is often completely clear. That is a real answer, not a failure, so you get one row saying so - and you are not charged for it:
{"rowType": "no-delays","ok": true,"delayCount": 0,"updateTime": "Mon Aug 31 12:00:00 2026 GMT","note": "No delays anywhere in the US National Airspace System right now. This is a valid result, not an error."}
Input
{"airports": [],"delayTypes": [],"maxRetries": 4}
airports- codes to keep, such asORDorKORD. Empty means every airport the FAA is reporting.delayTypes- keep onlyGROUND_STOP,GROUND_DELAY,AIRPORT_CLOSURE,ARRIVAL_DEPARTURE_DELAY,AIRSPACE_FLOW,CTOP. Empty means all.maxRetries- retries when the FAA feed does not respond.
Typical uses
- Airline and charter operations - poll on a schedule and alert when a ground stop starts at an airport you fly to.
- Travel and booking products - show the traveller why a flight is late, from the primary source rather than a mirror.
- Freight and ground logistics - a ground stop at ORD or a closure at a spoke airport changes your dispatch plan.
- Delay analytics -
...Minutesfields are ready for thresholds and time series.
What it does when something is wrong
- If you name airports and none of them are usable, the run fails. It does not quietly return the whole country and charge you for it.
- A
4xxfrom the FAA is reported as a rejected request, not an outage, and is not retried. - If the feed does not answer, or answers with something that is not the airport status document, the run is retried and then fails with the reason in
RUN_ISSUES- never an empty dataset that reads as "no delays". - Malformed XML - a tag that never closes, or a mismatched nesting - throws rather than being half-read.
- A response that arrives truncated is retried, not reported as a permanent failure. On a live operational feed that is the most common transient fault.
- If you set a maximum total charge and the run hits it, the run stops and says the result is incomplete.
Pricing
Pay per result: one charge per delayed airport row. The "no delays" row and failed runs are not charged.
Source and licence
All data comes from the US Federal Aviation Administration (nasstatus.faa.gov), a work of the US federal government and therefore in the public domain. The structure follows the FAA's published AirportStatus.dtd. This Actor adds the XML handling, the repeated-section fix, the minute parsing and the unknown-section reporting described above.