Research
How Canairy Reads the Air
By Jason Curtis · 8 min read · Updated 2026-08-12

Every air quality app shows you a number. Far fewer will tell you where it came from, what was done to it on the way, or what it cannot tell you. This page is Canairy's answer to all three, in more detail than a marketing page would carry, because a health-adjacent number you cannot audit is not worth much.
Where the readings come from
Four outside sources, each doing one job.
| Source | What we use it for |
|---|---|
| PurpleAir | The headline PM2.5 reading, from community sensors near the place you saved |
| EPA AirNow | The fallback reading when no nearby sensor is reporting, and the daily forecast |
| Google Pollen | Tree, grass and weed pollen forecasts |
| Open-Meteo | Temperature and conditions, and a modelled air estimate of last resort |
We do not run our own monitors. Everything Canairy shows is somebody else's measurement, named, with the arithmetic in between described below.
How a city page number is built
For each city with a public page, we keep a short list of curated reference sensors — typically three to five PurpleAir sensors in and around the city, chosen once and stored, rather than resolved by drawing a box on a map at request time.
That choice is deliberate and has two effects. It keeps the reading stable, because the same sensors report day to day rather than a rotating cast. And it is the cost control: a bounding-box query bills for every sensor in the box, so pages that get crawled heavily could otherwise run up a real bill for no added accuracy.
From those sensors:
- Read each one's ten-minute corrected average (PurpleAir's own correction, not EPA's — see the note below).
- Discard any sensor that has not reported recently, or that returns a negative or missing value.
- Take the median, with outlier rejection, rather than the mean. A median means one sensor brought indoors for the winter, or sitting beside a barbecue, cannot drag a whole city's number with it. A mean cannot make that promise.
- Convert PM2.5 to AQI using EPA's current breakpoint table.
- Look up the band — Good, Moderate, and so on — and the plain-English verdict attached to it.
Every sensor that contributed is listed on the page, with its distance and compass direction from the city centre and its own individual reading. When those disagree, you can see that they disagree, which is usually the most useful thing on the page.
Readings are cached for about thirty minutes. A page loaded by a search engine crawler reads only the cache and never triggers a new sensor query.
How a saved place in the app is built
The app resolves a place you save through three rungs, in order, and tells you which one it landed on:
- PurpleAir sensors near your address. The normal case.
- The nearest EPA AirNow monitor, when no neighbourhood sensor is reporting. Shown as an EPA monitor, with how far away it is.
- A modelled regional estimate, when neither exists. Labelled Regional estimate, and never used to fire an alert.
That third rung matters more than it sounds. A model is a reasonable guess, not a measurement, and firing a text message at somebody at 6am on the strength of a guess is not a thing we are willing to do. Estimates inform; they do not alert.
Which PurpleAir correction, and why
Raw output from a low-cost laser sensor over-reports PM2.5, more so in humid air. There is more than one published way to fix that, and which one an app uses is a real difference between apps showing "the same" sensor.
- The consumer app and the public city pages use PurpleAir's own corrected average.
- Canairy Watch, the version for schools and worksites, applies the EPA/Barkjohn correction — the one EPA itself uses on its Fire and Smoke Map — because an institution acting on a number wants the number the agency would recognise.
The trade-off is disclosed rather than hidden: the consumer number is PurpleAir's arithmetic, and it can differ from what EPA's map shows for the same sensor. PurpleAir vs AirNow goes through why in detail.
The AQI scale, and a correction we had to make
AQI is not a measurement. It is a piecewise conversion from concentration, defined by EPA in a published table, and that table gets revised.
EPA revised it effective May 2024, moving the top of "Good" from 12.0 µg/m³ to 9.0 and the top of "Unhealthy" from 150.4 to 125.4. Canairy did not pick that change up until August 2026. For 27 months our AQI ran lower than AirNow's for identical PM2.5 — air at 10 µg/m³ read 42 and "Good" where the current table gives 53 and "Moderate", and a heavy smoke day at 150 µg/m³ read 200 where it should have read 225. That was our error, in the direction that matters least well: understating. It is fixed, the current table is in place, and there is now a test that fails if the two halves of our own code ever disagree about where a band starts again.
Separately, you can tighten the bands in Settings if you are more sensitive than the EPA default assumes. That shifts when Canairy calls air bad for you; it does not change the underlying AQI number, and the scale you are on is always shown.
How alerts decide to fire
You set a threshold per place. Canairy re-reads your places on a schedule set by your plan — every two hours on the free plan, hourly on Plus, every thirty minutes on Pro — and:
- fires a worsening alert the first time a reading crosses your threshold, then stays quiet rather than repeating;
- fires an improvement alert once when the air comes back down through your improvement threshold, so you know it is over without having to check;
- respects quiet hours on both push and text, so the window you chose is not interrupted;
- never fires on a modelled estimate.
The "stays quiet" part is the design. An app that alerts on every reading above a line trains you to ignore it, at which point it has stopped being useful.
Two things worth being straight about here. The alerting path is keyed to PurpleAir sensors: a saved place with no neighbourhood sensor will still show you a reading, from the nearest EPA monitor, but it is the sensor-backed places that drive alerts. And on the free plan's two-hour cadence, a fast-moving event like an arriving smoke plume can be up to two hours old before it reaches you — which is a deliberate trade-off between plans, not an accident, and it is the reason the paid tiers exist at all.
What this cannot tell you
The honest limits, since a methodology page that lists only strengths is marketing:
- Air quality data is US-only. PurpleAir has sensors elsewhere and AirNow does not cover them; the app is built around US coverage.
- Sensor siting is unverified. We pick sensors that behave consistently, but nobody has inspected where a given PurpleAir is mounted. A porch roof and an open yard are different microclimates.
- The correction undershoots in extreme smoke. Published evaluation puts corrected sensors close to reference data up to roughly 600 µg/m³, and about 20 percent low above that. In a genuinely severe event, assume conditions are at least as bad as shown.
- PM2.5 is not all of air quality. Our headline number is fine particles. Ozone, which peaks on hot sunny afternoons and matters a great deal for asthma, is not in it — the EPA forecast on city pages will name it when it is the day's driving pollutant, but the live number will not reflect it.
- Not all cities have a forecast. The EPA issues forecasts by reporting area, and some places we cover have none. Where that is true the section is absent rather than filled with a guess.
- Guide articles, emails and the website are English-only, while the app itself is available in Spanish.
What we will not do
- No composite "air score" of our own invention. AQI is a published standard with a published table; a proprietary index would be unauditable by design.
- No fabricated readings. When a source fails, the app says it has nothing rather than showing a plausible number — there is a test suite whose entire purpose is to keep that true, because an earlier version of the sensor client did generate placeholder data on failure, and a dead upstream producing believable numbers is the worst failure mode available to a product like this.
- No hidden sources. If a number is on the screen, the source is named next to it.
Sources
- PurpleAir API documentation
- EPA AirNow API
- EPA AQS AQI breakpoints code table
- Reconsideration of the NAAQS for Particulate Matter (Federal Register, March 6 2024)
- Development and application of a United States-wide correction for PM2.5 data collected with the PurpleAir sensor (Barkjohn et al., 2021)
- An evaluation of the U.S. EPA's correction equation for PurpleAir sensor data (Jaffe et al., 2023)
- Google Pollen API
This article is for educational purposes only. Canairy does not provide medical advice, diagnosis, or treatment. Talk to a qualified health professional about your specific situation.