Open Data
US Airport Security & Immigration Wait Times
Airports publish their current wait time and then overwrite it. Nobody keeps the history. This is that history — every reading from 30 US airports, collected about once a minute since 2026-04-01 and published in full.
Free to use for anything, including commercially, under CC BY 4.0. All I ask is attribution.
What's in it
46,564,071 observations across 157 lanes (airport × terminal × standard/PreCheck), last updated 2026-11-11. The archive grows by roughly 120,000 rows a day.
| Airport | Terminals | Observations | Since |
|---|---|---|---|
| EWR Newark | 3 | 5,284,615 | 2026-04-01 |
| JFK JFK | 5 | 4,756,059 | 2026-04-01 |
| PHL Philadelphia | 6 | 4,219,939 | 2026-04-01 |
| MCO Orlando | 3 | 3,160,482 | 2026-04-01 |
| MIA Miami | 3 | 2,971,544 | 2026-04-01 |
| BOS BOS | 7 | 2,654,232 | 2026-08-14 |
| DFW DFW | 5 | 2,284,410 | 2026-08-14 |
| LGA LaGuardia | 3 | 2,209,240 | 2026-04-01 |
| SFO SFO | 7 | 2,175,380 | 2026-08-14 |
| IAH IAH | 7 | 2,042,118 | 2026-08-14 |
| LAS LAS | 4 | 1,787,664 | 2026-08-14 |
| BWI BWI | 4 | 1,728,816 | 2026-08-14 |
| PHX PHX | 5 | 1,156,515 | 2026-08-14 |
| DCA DCA | 3 | 1,080,266 | 2026-08-17 |
| SEA SEA | 6 | 1,074,101 | 2026-08-14 |
| DEN DEN | 3 | 927,484 | 2026-08-14 |
| SAN SAN | 3 | 927,436 | 2026-08-14 |
| MSP MSP | 4 | 927,376 | 2026-08-14 |
| CLT CLT | 3 | 923,276 | 2026-08-14 |
| PDX PDX | 2 | 892,988 | 2026-08-17 |
| CLE CLE | 3 | 490,100 | 2026-08-17 |
| DTW DTW | 2 | 463,478 | 2026-08-14 |
| PIT PIT | 1 | 447,518 | 2026-08-17 |
| CVG CVG | 1 | 445,688 | 2026-08-17 |
| HOU HOU | 1 | 432,668 | 2026-08-14 |
| JAX JAX | 1 | 339,491 | 2026-08-17 |
| CMH CMH | 1 | 223,715 | 2026-08-17 |
| STL STL | 1 | 223,528 | 2026-08-17 |
| SLC SLC | 1 | 222,019 | 2026-08-17 |
| IAD IAD | 1 | 91,925 | 2026-08-17 |
It ships as four subsets, all Parquet:
waits· 6.2M ·One row per distinct reading, with the window it stood for. Start here.waits_raw· 12.7M ·Every individual poll, unfiltered.hourly· 116k ·Per lane per hour: mean, median, p75, p95 and max. Open lanes only.cbp· 24k ·CBP immigration halls, with passenger counts, booths open and flights landed.
Using it
Load a subset straight from the Hub:
from datasets import load_dataset
ds = load_dataset("digitalhen/us-airport-wait-times", "waits", split="train")Or query the Parquet in place, without downloading the whole archive — here, the busiest morning hours at EWR:
-- DuckDB
SELECT terminal, queue_type, round(avg(avg_wait), 1) AS avg_wait
FROM 'https://huggingface.co/datasets/digitalhen/us-airport-wait-times/resolve/main/data/hourly/hourly.parquet'
WHERE airport = 'EWR' AND hour_of_day BETWEEN 5 AND 8
GROUP BY 1, 2
ORDER BY 3 DESC;Full column-by-column schema for every subset is in the dataset card.
Before you draw conclusions
These are posted wait times, not measured transit times. Every value is what the airport chose to display. It is an operator's estimate, produced by methods that differ per airport and are not published. This is a dataset about what airports told passengers, which may or may not match what passengers experienced.
The effective resolution varies by airport. Collection runs about once a minute, but the underlying feeds refresh at very different rates — the Port Authority feeds behind JFK, EWR and LGA update far less often than those behind MIA, MCO and PHL. The n_scrapes column tells you how long a reading stood unchanged. Be careful comparing volatility between airports; you may be measuring how often they publish rather than how the queues moved.
Gaps are real gaps. Upstream outages and deploys leave holes. Nothing is backfilled or interpolated — a missing interval is simply absent, never invented.
Where it comes from
Security wait times come from each airport operator's own public feed. Immigration data comes from U.S. Customs and Border Protection's public airport wait-time service. No personal data is collected: every value is an aggregate the operator already publishes to the travelling public.
The same pipeline powers the live boards on this site, so the archive is a byproduct of running the service rather than a separate effort — which is also why it should keep growing.
Built something with this? I'd like to hear about it.