FAA Airport Status - Airport Delays, Closures, Ground Stops avatar

FAA Airport Status - Airport Delays, Closures, Ground Stops

Pricing

$10.00 / 1,000 delayed airport returneds

Go to Apify Store
FAA Airport Status - Airport Delays, Closures, Ground Stops

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

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

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 &#xd;. Left alone it ends up inside your text.
  • Delay lengths are prose - "45 minutes", "1 hour and 30 minutes". Every one is parsed into ...Minutes so you can threshold and sort. A length that cannot be parsed becomes null, never 0 - "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 in RUN_EMPTY_LISTS and 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 sends FCA_StartDateTime. Checked against 136 captured responses spanning 2003-2026. A parser written from the specification alone returns null for every airspace program time. This Actor reads both.

What you get

One row per affected airport, with the same columns every time.

FieldExampleNotes
rowTypedelayno-delays on the single row returned when nothing is wrong
delayTypeAIRPORT_CLOSUREGROUND_STOP, GROUND_DELAY, AIRPORT_CLOSURE, ARRIVAL_DEPARTURE_DELAY, AIRSPACE_FLOW, CTOP
delayTypeNameAirport ClosuresThe FAA's own heading
airportORDValidated as a 3-4 character code
reasonthunderstormsFor closures, the raw NOTAM text
endTime7:45 am CDTGround stops
averageDelay / averageDelayMinutes45 minutes / 45Ground delay programs, airspace flow, CTOP
maximumDelay / maximumDelayMinutes1 hour and 30 minutes / 90
closureStart / reopenAug 31 at 04:30 UTC.Closures
arrivalMin/MaxMinutes, arrivalTrend16 / 30 / IncreasingThe FAA publishes these as 15-minute buckets
departureMin/MaxMinutes, departureTrend31 / 45 / DecreasingBoth directions on one row
scopeairportairspace for national programs that have no airport code
controlElementFCAJX7Airspace flow programs, and the FCA name for CTOP
programNameCTOP
startTime / stopTime20220513150000Airspace flow and CTOP
afpStartTime / afpEndTime1800 / 2359Airspace flow. A different clock from startTime - kept separate, not merged
altitudeFloor / altitudeCeiling200 / 500Airspace flow
updateTimeMon Aug 31 11:30:45 2026 GMTWhen the FAA last updated the feed
sourceFAA 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 as ORD or KORD. Empty means every airport the FAA is reporting.
  • delayTypes - keep only GROUND_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 - ...Minutes fields 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 4xx from 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.