BreatheCheck LIVE Get alerts

How We Measure, and Why This Can Disagree With Your Senses

Readings collected automatically every hour; text written and checked by BreatheCheck Editorial. How this page is made →

Thirty on the app. Sky the color of a blood orange, smoke thick enough to taste. A Seattle resident asked exactly that, in a thread that pulled 734 upvotes: how is this 30 AQI? By the end of the thread, residents had worked out every real answer between them. None of those answers was “the number is fake.”

This page collects the answers in one place. It explains where our number comes from, and names the five reasons a reading can split from what you’re seeing and smelling. The reverse case gets equal time — clear sky, bad number. And it states plainly what we do when our own pipeline goes down. Every city page on this site links here under the line “how we measure, and why this can disagree with your senses.” This is that answer, not a disclaimer bolted onto one.

Where the number on this page actually comes from

Three sources feed this site. Each is good at a different part of the job.

EPA AirNow supplies the official US AQI. It’s calculated from certified government monitors and published per station, not per city — a distinction the next section explains.

Open-Meteo supplies pollutant concentrations, the UV index, and pollen. But only European pollen. It doesn’t cover US pollen at all, so until a paid US pollen provider is under contract, a pollen module on this site will say so instead of faking a number.

PurpleAir runs the opposite model: thousands of privately owned, low-cost sensors. They’re dense enough to fill the gaps between government stations that sit miles apart. That density is real. It’s also where PurpleAir’s own weaknesses live — the next section covers them.

None of the three is the single correct source on its own. Reconciling what each is good at, and where each is known to go wrong, is most of what this page actually is.

The five reasons our number can disagree with what you’re sensing

Five separate mechanisms can put a different number on your screen than the sky is showing. One Seattle thread caught all five, without setting out to.

AirNow’s 24-hour average dilutes a bad hour. One commenter, explaining a similar mismatch in Texas, put it plainly: the standard for PM2.5 is a 24-hour average — “not helpful for short duration spikes or sudden increases.” A genuinely bad hour gets stretched across 23 calmer ones. By the time it becomes today’s headline figure, it’s already diluted.

IQAir can lag, and it can borrow a neighboring station’s reading. A resident traced this directly during the Seattle smoke event: “IQAir sensor seems to be sourcing from Auburn that was green, while eastside was already 100+. There are some delays in the data coming through.” The nearest station an app pulls from may not be near you at all.

PurpleAir’s default map counts indoor sensors as outdoor air. Another commenter on the same thread caught it: “One problem with PurpleAir’s default map is it includes indoor sensors, such as the one northeast of Auburn. If you select the settings option, you can deselect indoor.” Fold one indoor reading into a neighborhood average, and that average drifts toward whatever that one room happens to be doing.

Ozone and particles get read on two different screens. A Texas resident asked “who is lying” between a weather app and airnow.gov. Two replies gave two separate mechanisms, not one: “each screenshot is looking at different parameters, one is looking at particulate and the other is ozone.” One monitor “could be a calibrated and certified EPA monitor”; the other “could be a citizen scientist monitor, like a Purple Air monitor.” Same place, same moment. Two pollutants, two instrument classes.

Smoke aloft is the fifth, and it’s the community’s own addition. In the Seattle thread, the top reply was two words: “Smoke aloft mostly.” Another resident named the exact sensory trap: “Usually when it stays aloft I don’t notice an aroma. I guess the odor molecules must be diffusing downward, but the particulate is not.” Smoke a few thousand feet up can smell strong and look worse than a ground-level monitor will ever register — that monitor sits well below it.

None of these five make either number fake. One reply on that same Texas thread put the wrong lesson into words, so we can push back on it directly: “whichever one makes you more fearful is the one that’s lying.” It usually isn’t. It’s usually one of these five.

It also runs the other way: clear sky, bad number

Every mechanism above runs one direction — the instrument looks worse than your senses do. The reverse happens just as often, and it gets almost no attention.

Ground-level ozone is invisible and odorless. One Denver commenter put it bluntly on a thread about their own city’s ozone: spreading awareness is hard “because it’s mostly invisible and odorless.” Telling people they’re breathing a toxic invisible gas, they added, “is a sure way to kill the vibe. But it must be done.” A clear sky and a clean-smelling morning tell you nothing about ozone specifically.

Pollen isn’t in the AQI at all, in either direction. Across roughly a hundred community posts about pollen in our research, AQI didn’t come up once. Not because people don’t know the acronym — because pollen genuinely runs on a separate index, built from separate data. A good AQI reading says nothing about tree or grass pollen that day.

Valley Fever spores are the same story, and the stakes are higher. The fungus lives in topsoil across the Southwest. Wind and dust loft it into the air, independent of PM2.5 or ozone levels. AQI doesn’t measure it at any level. A calm, moderate AQI day during a dusty windstorm can still be a Valley Fever exposure day. A good number is not clearance to breathe deep if the wind is kicking up dust where you are.

The station-distance problem

A monitoring station miles from where a reader is standing under-reports whichever side of the metro sits farthest from it. Government reference monitors are sparse by design: expensive to run, certified, and placed to represent a region, not a neighborhood. One Texas resident found their town in what a commenter called “a dead zone between Dallas and Marshall.”

Real distance, real consequence: a working reading a few dozen miles away has no way of knowing what’s happening in the gap.

That’s why every city page on this site names the AirNow reporting area behind its number and how far that area’s reference point sits from the metro centre. The table below carries the same two facts for every metro we track, and says where the number is modelled instead. That’s enough to reconcile our number against AirNow’s or IQAir’s, instead of guessing that one of us is wrong.

The station behind each of the 121 metros
MetroAirNow reporting areaDistanceToday’s number
Anchorage, AKAnchorage0.2 miMonitor
Fairbanks, AKFairbanks0.3 miMonitor
Birmingham, ALBirmingham6 miMonitor
Huntsville, ALHuntsville8.4 miMonitor
Fayetteville, ARSpringdale (Springdale-Fayetteville-Bentonville)8.6 miMonitor
Little Rock, ARLittle Rock-North Little Rock4.1 miMonitor
Phoenix, AZPhoenix6.4 miMonitor
Scottsdale, AZSalt River Pima-Maricopa Indian Community8.1 miMonitor
Tucson, AZTucson4.3 miMonitor
Anaheim, CANorth Orange CO2.3 miMonitor
Bakersfield, CABakersfield1.2 miMonitor
Fresno, CAFresno2.8 miMonitor
Irvine, CA——Modelled
Long Beach, CASouth Coastal LA3.7 miMonitor
Los Angeles, CACentral LA CO1.4 miMonitor
Oakland, CAOakland0 miMonitor
Riverside, CAMetro Riverside CO3.6 miMonitor
Sacramento, CASacramento1.5 miMonitor
San Diego, CASan Diego Coast7.5 miMonitor
San Jose, CASan Jose0.9 miMonitor
Stockton, CAStockton1.1 miMonitor
Boulder, CODenver-Boulder14.3 miMonitor
Colorado Springs, COColorado Springs9.5 miMonitor
Denver, CODenver-Boulder11.4 miMonitor
Fort Collins, COFort Collins6.7 miMonitor
Bridgeport, CTBridgeport0.3 miMonitor
Hartford, CTHartford3.5 miMonitor
Washington, DCNorthern Virginia and DC2 miMonitor
Dover, DEKent County7.3 miMonitor
Wilmington, DEWilmington Area0.9 miMonitor
Jacksonville, FLJacksonville0.4 miMonitor
Miami, FLMiami7.8 miMonitor
Orlando, FLOrlando2.4 miMonitor
Tampa, FLTampa9.3 miMonitor
Atlanta, GAAtlanta7.3 miMonitor
Savannah, GASavannah3.1 miMonitor
Hilo, HIHilo1.6 miMonitor
Honolulu, HIHonolulu0.4 miMonitor
Cedar Rapids, IAIowa City24.5 miMonitor
Des Moines, IADes Moines5.2 miMonitor
Boise, IDBoise1.1 miMonitor
Idaho Falls, IDIdaho Falls4.2 miMonitor
Chicago, ILChicago3.5 miMonitor
Peoria, ILPeoria7.9 miMonitor
Fort Wayne, INFort Wayne3.5 miMonitor
Indianapolis, INIndianapolis2 miMonitor
Overland Park, KSKansas City11.7 miMonitor
Wichita, KSWichita1.6 miMonitor
Lexington, KYLexington4.2 miMonitor
Louisville, KYLouisville7 miMonitor
Baton Rouge, LABaton Rouge Area3.9 miMonitor
New Orleans, LANew Orleans12 miMonitor
Boston, MABoston Metro4.2 miMonitor
Worcester, MAWorcester8.4 miMonitor
Baltimore, MDMetro Baltimore7.2 miMonitor
Frederick, MDMaryland Piedmont6.7 miMonitor
Bangor, MEEastern Interior14.8 miMonitor
Portland, MESouthwest Coast2.1 miMonitor
Detroit, MISoutheast19.8 miMonitor
Grand Rapids, MI——Modelled
Minneapolis, MNTwin Cities4.5 miMonitor
Rochester, MNRochester Area1.9 miMonitor
St. Paul, MNTwin Cities4.8 miMonitor
Kansas City, MOKansas City2.1 miMonitor
St. Louis, MOSt. Louis (Metro-east)12.8 miMonitor
Gulfport, MSMississippi Gulf Coast0.6 miMonitor
Jackson, MSJackson2.2 miMonitor
Billings, MTBillings0.6 miMonitor
Missoula, MTMissoula2.4 miMonitor
Charlotte, NCMecklenburg County0.3 miMonitor
Raleigh, NCWake County11.1 miMonitor
Bismarck, NDBismarck1.2 miMonitor
Fargo, NDFargo4.8 miMonitor
Lincoln, NELincoln0.9 miMonitor
Omaha, NEOmaha2.3 miMonitor
Manchester, NHInterior Rockingham County11.7 miMonitor
Nashua, NHHillsborough County16 miMonitor
Jersey City, NJNortheast Urban6.2 miMonitor
Newark, NJNortheast Urban3.4 miMonitor
Albuquerque, NMAlbuquerque0.2 miMonitor
Las Cruces, NMLas Cruces0.2 miMonitor
Las Vegas, NVLas Vegas5.3 miMonitor
Reno, NVReno-Sparks2.5 miMonitor
Buffalo, NYWestern New York Region18.4 miMonitor
New York, NYNortheast Urban9.4 miMonitor
Cincinnati, OHCincinnati1.9 miMonitor
Cleveland, OHCleveland-Akron-Lorain16.7 miMonitor
Columbus, OHColumbus2.1 miMonitor
Oklahoma City, OKOklahoma City4.1 miMonitor
Tulsa, OKTulsa1.2 miMonitor
Eugene, OREugene and Springfield1.7 miMonitor
Portland, ORPortland1.7 miMonitor
Philadelphia, PAPhiladelphia0.5 miMonitor
Pittsburgh, PAPittsburgh8.7 miMonitor
Providence, RIProvidence2.2 miMonitor
Warwick, RIProvidence8.8 miMonitor
Charleston, SCCharleston1.8 miMonitor
Columbia, SCColumbia8.7 miMonitor
Rapid City, SDRapid City2.2 miMonitor
Sioux Falls, SDSioux Falls1.6 miMonitor
Memphis, TNMemphis4.1 miMonitor
Nashville, TNNashville6.4 miMonitor
Austin, TXAustin0.4 miMonitor
Dallas, TXDallas-Fort Worth1.8 miMonitor
Fort Worth, TXDallas-Fort Worth31.3 miMonitor
Houston, TXHouston-Galveston-Brazoria1.3 miMonitor
San Antonio, TXSan Antonio0.4 miMonitor
Provo, UTProvo0.3 miMonitor
Salt Lake City, UTSalt Lake City2.4 miMonitor
Richmond, VARichmond6 miMonitor
Virginia Beach, VAHampton Roads28.1 miMonitor
Burlington, VTBurlington1 miMonitor
Montpelier, VT——Modelled
Seattle, WASeattle-Bellevue-Kent Valley3.4 miMonitor
Spokane, WASpokane0.9 miMonitor
Madison, WIMadison Area0.9 miMonitor
Milwaukee, WIMilwaukee-Ozaukee10.9 miMonitor
Charleston, WVCharleston0.3 miMonitor
Huntington, WVHuntington1.4 miMonitor
Casper, WY——Modelled
Cheyenne, WYCheyenne3.5 miMonitor

As of . A dash in Distance means AirNow returned no coordinates for that area.

Each distance is computed from the coordinates AirNow returns with the reading, not typed in by hand; until September 2026 thirteen of them were, and the rest were blank. A nearby-sensor count belongs in this table too, and is left out while the sensor feed is down rather than printed as zero. If a station turns out to be too far out to trust, that’s exactly what the corrections log below exists for.

Why we can show a history at all — and how short it still is

BreatheCheck stores its own measurements from the day a city’s page goes live. That’s why a multi-week chart and a “days above AQI 100” counter can exist on the site at all — once enough weeks have passed. IQAir, AccuWeather and aqicn all keep history somewhere else — aqicn in a separate database, IQAir behind its app, AccuWeather only the past hour. None puts a city’s own multi-week series on the city page itself.

The honest version of that advantage: history only runs as far back as our own collection does. Collection started on 16 August 2026, so every city chart is exactly as long as the time since then and not one day longer — the page states its own count rather than promising a span, because a written figure goes stale the day after it is written and the count does not. Its “days above 100” counter starts at whatever we’ve actually measured — not a backfilled estimate standing in for months we didn’t collect. We won’t render a partial month as a full year. A short chart on a newly added city is what real collection looks like in its first weeks. It isn’t a bug, and we won’t pad it to look complete before it is.

How we write the verdict

Two different scales sit behind every verdict on this site, labeled every time. The EPA writes the AQI color bands. It classifies 101–150 as Unhealthy for Sensitive Groups, 201–300 as Very Unhealthy, and so on, quoted directly from airnow.gov. That wording never gets upgraded into a verdict about a specific reader’s lungs. “EPA classifies X as Y” and “X is dangerous for you” are different claims.

Only the first one is ours to make.

The second scale isn’t the EPA’s at all. It’s community-observed, and we say so every time we use it. Runners discussing their own thresholds online converge loosely around 110. Parents converge around 100 — roughly the point a park trip actually gets cancelled. One asthmatic runner logged 156 of their own runs against AQI and found their personal cutoff at 60. That’s close to a 1.8x spread across three ordinary people, breathing the exact same air, because no single number was ever built to describe three different bodies. During active wildfire smoke, several of the same posters independently drop their own threshold about one EPA band lower than usual. We fold both scales into the three-state verdict on a city page: go, short and unloaded, don’t go. We never present the community numbers as an official standard. They’re the closest thing to real-world calibration this vertical has, and they’re not ours to claim as medical fact.

A third layer sits below both, and it isn’t ours to set either: the thresholds institutions actually run on. We have three, and every one of them came from a person describing their own school or centre — not from a statute. A Washington teacher keeps all kids inside above 75, with 80 as “the absolute limit.” A Minnesota parent puts their child’s centre at 100. A Wisconsin parent went and read the state licensing regulations and found nothing about air quality in them at all. That’s three reports, not three state policies, and we label them that way rather than promoting them into law because they’d read better as law. Where we later confirm a published state rule we’ll name it and date it. Where we haven’t found one, we say so instead of guessing at a number a daycare might actually be using.

What happens when the pipeline goes down

weather.com’s own air-quality pages have a known failure mode: several render the literal words “No Data” where a reading should be. We built the opposite rule on purpose. When our pipeline can’t reach AirNow, Open-Meteo or PurpleAir, or when a reading is too old to trust, the page says “we don’t know right now.” Never a number from six hours ago, dressed up as current.

A visible “Updated” tag, with its month and year, only appears on the page when something behind it actually changed. Refreshing the date without refreshing the substance is a separate problem, and we’re deliberately not creating it. If you land on a page and the verdict is missing, that’s the pipeline telling you the truth instead of guessing on your behalf. Check back later, or set an alert instead of refreshing manually.

Reusing these readings

Yes, with attribution. The series this site records itself — the hourly readings, the daily maxima behind every history chart, the running count of days above AQI 100 — may be quoted, charted or redistributed by anyone, provided BreatheCheck is named as the source and linked.

That grant covers our own recording, not the feeds underneath it. EPA AirNow, PurpleAir and Open-Meteo each publish their own terms, and those govern their raw data however you reach it. Every page names which source produced which number, so you always know whose terms apply to what.

If you need something the pages don’t expose — a longer span, a metro we measure but don’t publish, a machine-readable dump — ask on the contact page. It costs us nothing to send and the answer is usually yes.

Corrections

We will get a station wrong, a distance wrong, or a threshold mislabeled at some point. A real audience of instrument-owning readers checks numbers like these against their own gear, and they should. Every dated correction goes on the public corrections log, permanently, never edited away quietly. A corrected page carries a dated link back to that log, so you see the history rather than a clean surface pretending nothing changed.

Read the corrections policy, or see what this project is and isn’t — including what we don’t claim. No lab. No sensors we operate ourselves. No medical staff. We measure continuously over time, from sources we credit by name. We don’t test anything, and we won’t tell you we do.

Where the numbers come from

EPA AirNowthe official US AQI by stationWeak at: smoothed across recent hours, so a sharp plume shows up late
PurpleAira dense private sensor network — real hyperlocal coverageWeak at: indoor sensors pollute the default map if unfiltered
Open-Meteopollutants, UV, and European pollen, no key requiredWeak at: does not cover US pollen

We write every reading into our own database from day one, so a city page shows the record we actually hold for it — a few days on a metro added this week, longer on one we have carried since the start. We do not backfill the gap with an estimate.

This page was corrected on — the station section promised a table that did not exist, while thirteen city pages printed distances typed in by hand. See the correction log.