Skip to content
← All datasets

Air Quality Days (EPA AQI)

Days by Air Quality Index category in Georgia's monitored counties, and the share unhealthy for sensitive groups or worse.

Year coverage
2000–2025
Updated
annual
Version
1.0.0
Schema hash
a9ef0d9b2984

Detail levels available

County · default

Overview

How many days each year the air in a Georgia county was good, moderate or unhealthy by the U.S. EPA's daily Air Quality Index (AQI), for every county with an AQI-reporting monitor (26 to 35 counties a year), 2000-2025. The headline is the share of monitored days with an AQI above 100 (unhealthy for sensitive groups or worse). Also served: the days in each of EPA's six AQI categories, the year's maximum, 90th-percentile and median daily AQI, and the days each pollutant (ozone, fine particles PM2.5, coarse particles PM10, nitrogen dioxide, carbon monoxide) set the day's AQI. A county's daily AQI is the highest AQI among its monitors and pollutants that day.

Row grain: One row per year, county_fips, tract_geoid.

Key metric

pct_days_unhealthy_for_sensitive_groups_or_above — Share of Days Unhealthy for Sensitive Groups or Worse (proportion)

The single headline value most answers want.

Variables

Every column in the fact table. The code is the exact field name the API returns.

ColumnTypeUnitRangeNull?Description
yearYearinteger——noCalendar year (January 1 - December 31) of the daily AQI values.
Full description
Calendar year (January 1 - December 31) of the daily AQI values.
county_fipsCounty FIPSstring——no5-digit county FIPS code, matched from EPA's county name through the counties dimension. Only counties with an AQI-reporting monitor that year have a row.
Full description
5-digit county FIPS code, matched from EPA's county name through the counties dimension. Only counties with an AQI-reporting monitor that year have a row.

Joins counties; adds its label columns.

tract_geoidTract GEOIDstring——yesAlways NULL: EPA's AQI summary is by county. Kept for the health domain's standard key shape.
Full description
Always NULL: EPA's AQI summary is by county. Kept for the health domain's standard key shape.

Joins tracts; adds its label columns.

pct_days_unhealthy_for_sensitive_groups_or_aboveShare of Days Unhealthy for Sensitive Groups or Worsenumberproportion—yesShare of the county's monitored days with an AQI above 100 (unhealthy for sensitive groups or worse).
Full description
Share of the county's monitored days (num_days_with_aqi) whose daily AQI was above 100: unhealthy for sensitive groups (101-150), unhealthy (151-200), very unhealthy (201-300) or hazardous (301 and up). Our calculation, num_days_unhealthy_for_sensitive_groups_or_above / num_days_with_aqi, on the 0-1 scale (0.0137 = 1.37%). A share of the days the county had an AQI, not of the calendar year, so it is comparable where raw day counts are not; with few monitored days (as low as 11) it is noisy. For several counties or years, pool as SUM(num_days_unhealthy_for_sensitive_groups_or_above) / SUM(num_days_with_aqi).
num_days_unhealthy_for_sensitive_groups_or_aboveDays Unhealthy for Sensitive Groups or Worseintegercount—yesDays with a daily AQI above 100: our sum of the published unhealthy for sensitive groups, unhealthy, very unhealthy and hazardous day counts. The numerator of pct_days_unhealthy_for_sensitive_groups_or_above; a count of monitored days, so not comparable across counties or years on its own.
Full description
Days with a daily AQI above 100: our sum of the published unhealthy for sensitive groups, unhealthy, very unhealthy and hazardous day counts. The numerator of pct_days_unhealthy_for_sensitive_groups_or_above; a count of monitored days, so not comparable across counties or years on its own.
num_days_with_aqiDays with an AQIintegercount—yesDays in the year the county had a daily AQI value (11 to 366 in Georgia), as published (Days with AQI): the days monitored, not the calendar year. Below 365 when monitors run only in the March-October ozone season, sample every third or sixth day, or start or stop mid-year. The denominator of pct_days_unhealthy_for_sensitive_groups_or_above.
Full description
Days in the year the county had a daily AQI value (11 to 366 in Georgia), as published (Days with AQI): the days monitored, not the calendar year. Below 365 when monitors run only in the March-October ozone season, sample every third or sixth day, or start or stop mid-year. The denominator of pct_days_unhealthy_for_sensitive_groups_or_above.
num_days_goodGood Daysintegercount—yesDays in the year whose daily AQI was 0-50 (good), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
Full description
Days in the year whose daily AQI was 0-50 (good), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
num_days_moderateModerate Daysintegercount—yesDays in the year whose daily AQI was 51-100 (moderate), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
Full description
Days in the year whose daily AQI was 51-100 (moderate), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
num_days_unhealthy_for_sensitive_groupsDays Unhealthy for Sensitive Groupsintegercount—yesDays in the year whose daily AQI was 101-150 (unhealthy for sensitive groups), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
Full description
Days in the year whose daily AQI was 101-150 (unhealthy for sensitive groups), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
num_days_unhealthyUnhealthy Daysintegercount—yesDays in the year whose daily AQI was 151-200 (unhealthy), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
Full description
Days in the year whose daily AQI was 151-200 (unhealthy), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
num_days_very_unhealthyVery Unhealthy Daysintegercount—yesDays in the year whose daily AQI was 201-300 (very unhealthy), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
Full description
Days in the year whose daily AQI was 201-300 (very unhealthy), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
num_days_hazardousHazardous Daysintegercount—yesDays in the year whose daily AQI was 301 or higher (hazardous), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
Full description
Days in the year whose daily AQI was 301 or higher (hazardous), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.
max_aqiMaximum AQInumberscore≥ 0yesHighest of the county's daily AQI values over its monitored days, in AQI index points as published (whole numbers). The AQI runs 0-500 for reporting, but EPA publishes higher values as measured (above 500 elsewhere in the U.S.), so there is no upper bound. Georgia's highest is 357 (Richmond County, 2017), the series' only hazardous day, preserved as published. A statistic of one county's year: never sum or average it across counties or years.
Full description
Highest of the county's daily AQI values over its monitored days, in AQI index points as published (whole numbers). The AQI runs 0-500 for reporting, but EPA publishes higher values as measured (above 500 elsewhere in the U.S.), so there is no upper bound. Georgia's highest is 357 (Richmond County, 2017), the series' only hazardous day, preserved as published. A statistic of one county's year: never sum or average it across counties or years.
aqi_90th_percentile90th Percentile AQInumberscore≥ 0yes90th percentile of the county's daily AQI values over its monitored days, in AQI index points as published (whole numbers). The AQI runs 0-500 for reporting, but EPA publishes higher values as measured (above 500 elsewhere in the U.S.), so there is no upper bound. A statistic of one county's year: never sum or average it across counties or years.
Full description
90th percentile of the county's daily AQI values over its monitored days, in AQI index points as published (whole numbers). The AQI runs 0-500 for reporting, but EPA publishes higher values as measured (above 500 elsewhere in the U.S.), so there is no upper bound. A statistic of one county's year: never sum or average it across counties or years.
median_aqiMedian AQInumberscore≥ 0yesMedian of the county's daily AQI values over its monitored days, in AQI index points as published (whole numbers). The AQI runs 0-500 for reporting, but EPA publishes higher values as measured (above 500 elsewhere in the U.S.), so there is no upper bound. A statistic of one county's year: never sum or average it across counties or years.
Full description
Median of the county's daily AQI values over its monitored days, in AQI index points as published (whole numbers). The AQI runs 0-500 for reporting, but EPA publishes higher values as measured (above 500 elsewhere in the U.S.), so there is no upper bound. A statistic of one county's year: never sum or average it across counties or years.
num_days_main_pollutant_coDays Carbon Monoxide Was Main Pollutantintegercount—yesDays carbon monoxide (CO) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.
Full description
Days carbon monoxide (CO) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.
num_days_main_pollutant_no2Days Nitrogen Dioxide Was Main Pollutantintegercount—yesDays nitrogen dioxide (NO2) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.
Full description
Days nitrogen dioxide (NO2) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.
num_days_main_pollutant_ozoneDays Ozone Was Main Pollutantintegercount—yesDays ground-level ozone was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.
Full description
Days ground-level ozone was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.
num_days_main_pollutant_pm25Days PM2.5 Was Main Pollutantintegercount—yesDays fine particulate matter (PM2.5) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.
Full description
Days fine particulate matter (PM2.5) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.
num_days_main_pollutant_pm10Days PM10 Was Main Pollutantintegercount—yesDays coarse particulate matter (PM10) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.
Full description
Days coarse particulate matter (PM10) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.

Filters

Query parameters the fact endpoint accepts. Comma-separated values are OR within a parameter; multiple parameters AND together.

ParameterKindAllowed valuesNotes
yearyear_exactany value—
year_minyear_rangeany value—
year_maxyear_rangeany value—
detaildetailcountiesenum-enforced, default: counties
county_fipsforeign_keyany valuemulti-value
tract_geoidforeign_keyany valuemulti-value

Example requests

Run these against the base URL — they return live data.

All rows (first page), counties level

curl "https://georgiacivicdata.org/api/v1/health/air_quality_days"

counties data for 2025

curl "https://georgiacivicdata.org/api/v1/health/air_quality_days?year=2025"

One county (FIPS 13121), 2025

curl "https://georgiacivicdata.org/api/v1/health/air_quality_days?county_fips=13121&year=2025&detail=counties"

Download 2025 as CSV

curl "https://georgiacivicdata.org/api/v1/health/air_quality_days?year=2025&format=csv"

Notes & limitations

NULL handling

  • Zero is a real, reported value.

Limitations

Monitored counties only: a county has a row only in years it had an air monitor reporting a daily Air Quality Index (26 to 35 of Georgia's 159 counties a year, 36 over 2000-2025). No row is not clean air; it means no measurement. Shares are of the days the county had an AQI (num_days_with_aqi, 11 to 366), not of the calendar year: ozone-only monitors mostly run in the March-October ozone season, when most unhealthy days occur, and particle samplers may run every third or sixth day, so raw day counts are not comparable across counties or years and even shares are not strictly so. A county's daily AQI is the highest AQI among its monitors and pollutants that day, so it depends on which monitors the county had; monitors open and close (counties join in 2002 and 2005 and drop out in 2003, 2009, 2017-2018 and 2025), so a sum or pooled share across counties covers a changing set and there is no statewide row. EPA computes every year with the current AQI breakpoints (ozone revised 2015, fine particles 2024), so years are on one scale, but counts can differ from AQI reports published at the time. EPA regenerates the whole series in place; these files are as of 2026-06-25. The share of days unhealthy for sensitive groups or above and its day count are our calculation from EPA's published category counts. Unhealthy days come in episodes of consecutive days that often reach several counties at once, so they are not independent events: a test that treats each day separately overstates its certainty. EPA suppresses nothing: there are no NULLs, and a 0 is a real count of monitored days. tract_geoid is always NULL.