EPA Air Quality System (AQS) Scraper
Pricing
from $19.00 / 1,000 results
EPA Air Quality System (AQS) Scraper
Export U.S. ambient air-quality measurements from EPA's Air Quality System: daily summaries by county, hourly sample readings by monitor site, and active monitor inventory by state. Covers PM2.5, PM10, NO2, O3, CO, SO2, lead, VOCs and meteorological data from 10,000+ monitoring stations.
Pricing
from $19.00 / 1,000 results
Rating
0.0
(0)
Developer
ParseForge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share

π¬οΈ EPA Air Quality System (AQS) Scraper
π Export U.S. air quality measurements in seconds. Pull PM2.5, PM10, NO2, O3, CO, SO2, lead, and meteorological readings from 10,000+ EPA monitoring stations nationwide. No signup required for demo data.
π Last updated: 2026-05-21 Β· π 24 fields per record Β· π 10,000+ monitoring stations Β· πΊπΈ All 50 states + DC Β· π§ͺ 11 pollutant parameters
The EPA AQS Scraper connects directly to the U.S. Environmental Protection Agency's Air Quality System (AQS) API and delivers real ambient air-quality data in three collection modes: daily county summaries, hourly site-level samples, and an active monitor inventory. The underlying AQS database is the authoritative federal reference for U.S. ambient air monitoring and has been maintained by the EPA and state/local agencies since the 1970s.
The data covers all 50 states, the District of Columbia, and U.S. territories. It spans criteria pollutants regulated under the Clean Air Act - PM2.5, PM10, carbon monoxide, sulfur dioxide, nitrogen dioxide, ozone, and lead - plus meteorological parameters and volatile organic compounds from over 10,000 monitoring stations. This Actor makes that data downloadable as CSV, Excel, JSON, or XML in seconds. No parsing engineering required.
| π― Target Audience | π‘ Primary Use Cases |
|---|---|
| Environmental engineers, public health researchers, climate scientists, city planners, journalists, compliance teams, GIS analysts | AQI dashboards, health impact studies, regulatory compliance reporting, air-quality mapping, trend analysis, research datasets |
π What the EPA AQS Scraper does
Three dataset modes in a single Actor:
- π Daily Summary by County. Statistical daily summaries (arithmetic mean, first max value, AQI, observation count) for any county, pollutant, and date range up to one year.
- β±οΈ Hourly Samples by Site. Individual sample measurements with local and GMT timestamps for any specific monitoring site.
- πΊοΈ Active Monitor Inventory. Directory of all active or historical monitoring stations in a state, including coordinates, agency, monitor type, and operational dates.
Each record includes geographic identifiers (state, county, city, site address, CBSA), measurement metadata (units, sample duration, method, AQI), and precise coordinates (latitude/longitude).
π‘ Why it matters: the EPA AQS is the gold standard for U.S. air quality data, but navigating its raw API requires knowing parameter codes, FIPS codes, date formats, and credential setup. This Actor handles all of that so researchers, engineers, and analysts can access the data immediately without writing a single line of code.
π¬ Full Demo
π§ Coming soon: a 3-minute walkthrough showing how to go from sign-up to a downloaded dataset.
βοΈ Input
| Input | Type | Default | Behavior |
|---|---|---|---|
maxItems | integer | 10 | Records to return. Free plan caps at 10, paid plan at 1,000,000. |
endpoint | select | dailyDataByCounty | Which EPA dataset to export: Daily Summary, Hourly Samples, or Monitor Inventory. |
parameter | select | 88101 | Pollutant parameter code (e.g. PM2.5, NO2, O3, CO). |
stateCode | select | 06 | Two-digit state FIPS code. Required for all endpoints. |
countyCode | textfield | 037 | Three-digit county FIPS code. Required for dailyDataByCounty and sampleDataBySite. |
siteNumber | textfield | 0080 | Four-digit site number. Required for sampleDataBySite. |
startDate | textfield | 20240101 | Start date in YYYYMMDD format. Required for all endpoints. |
endDate | textfield | 20240131 | End date in YYYYMMDD format. Max one year per query. |
email | textfield | (demo account) | Optional. Your registered EPA AQS email. Defaults to shared demo account. |
accessKey | textfield | (demo key) | Optional. Your EPA AQS access key. Personal keys get higher quotas. |
Example 1 - Daily PM2.5 summary for Los Angeles County:
{"endpoint": "dailyDataByCounty","parameter": "88101","stateCode": "06","countyCode": "037","startDate": "20240101","endDate": "20240131","maxItems": 100}
Example 2 - Active PM2.5 monitors in California:
{"endpoint": "monitorsByState","parameter": "88101","stateCode": "06","startDate": "20240101","endDate": "20240131","maxItems": 500}
β οΈ Good to Know: The Actor uses a shared demo EPA account by default. Demo credentials have low rate limits and may return limited results. For production use, register a free account at https://aqs.epa.gov/data/api/signup and supply your own email + access key. The EPA AQS API accepts a maximum date range of one year per query.
π Output
| Field | Type | Description |
|---|---|---|
stateCode | string | Two-digit state FIPS code |
countyCode | string | Three-digit county FIPS code |
siteNumber | string | Four-digit monitoring site number |
stateName | string | Full state name |
countyName | string | Full county name |
cityName | string | City where the monitor is located |
localSiteName | string | EPA-assigned local site name |
siteAddress | string | Street address of the monitor |
parameterCode | string | EPA parameter code (e.g. 88101) |
parameterName | string | Full pollutant name |
poc | number | Parameter occurrence code (distinguishes co-located monitors) |
datum | string | Coordinate datum (NAD83, WGS84) |
pollutantStandard | string | NAAQS standard the measurement applies to (daily only) |
sampleDuration | string | Averaging period (e.g. 24 HOUR, 1 HOUR) |
units | string | Unit of measure |
value | number | Measured concentration or reading |
date | string | Measurement date (YYYY-MM-DD) |
time | string | Measurement time in local timezone (hourly only) |
datetimeLocal | string | Combined local date-time (hourly only) |
datetimeGmt | string | Combined GMT date-time (hourly only) |
aqi | number | Air Quality Index (daily only) |
observationCount | number | Number of valid observations (daily only) |
eventType | string | Exceptional event type (daily only) |
method | string | Sampling method description |
latitude | number | Monitor latitude |
longitude | number | Monitor longitude |
cbsaCode | string | Core Based Statistical Area code |
cbsaName | string | CBSA name |
openDate | string | Monitor open date (monitors endpoint only) |
closeDate | string | Monitor close date if inactive (monitors endpoint only) |
monitoringAgency | string | Agency operating the monitor (monitors endpoint only) |
monitorType | string | Monitor classification (e.g. SLAMS, monitors endpoint only) |
measurementScale | string | Geographic measurement scale (monitors endpoint only) |
sampleFrequency | string | Sample collection frequency (hourly only) |
qualifier | string | Data qualifier flags (hourly only) |
methodType | string | FRM/FEM classification (hourly only) |
scrapedAt | string | ISO timestamp when the record was collected |
error | string | Error message if extraction failed |
Sample records (dailyDataByCounty, PM2.5, Los Angeles 2024-01-01):
[{"stateCode": "06","countyCode": "037","siteNumber": "4008","stateName": "California","countyName": "Los Angeles","cityName": "Long Beach","localSiteName": "Long Beach-Route 710 Near Road","siteAddress": "5895 Long Beach Blvd.","parameterCode": "88101","parameterName": "PM2.5 - Local Conditions","poc": 1,"datum": "NAD83","pollutantStandard": "PM25 24-hour 2006","sampleDuration": "24 HOUR","units": "Micrograms/cubic meter (LC)","value": 30.7,"date": "2024-01-01","aqi": 91,"observationCount": 1,"eventType": "No Events","method": "R & P Model 2025 PM-2.5 Sequential Air Sampler w/VSCC - Gravimetric","latitude": 33.859662,"longitude": -118.200707,"cbsaCode": "31080","cbsaName": "Los Angeles-Long Beach-Anaheim, CA","scrapedAt": "2026-05-21T10:00:00.000Z","error": null},{"stateCode": "06","countyCode": "037","siteNumber": "4008","stateName": "California","countyName": "Los Angeles","cityName": "Long Beach","localSiteName": "Long Beach-Route 710 Near Road","siteAddress": "5895 Long Beach Blvd.","parameterCode": "88101","parameterName": "PM2.5 - Local Conditions","poc": 1,"datum": "NAD83","pollutantStandard": "PM25 24-hour 2006","sampleDuration": "24 HOUR","units": "Micrograms/cubic meter (LC)","value": 16.7,"date": "2024-01-02","aqi": 65,"observationCount": 1,"eventType": "No Events","method": "R & P Model 2025 PM-2.5 Sequential Air Sampler w/VSCC - Gravimetric","latitude": 33.859662,"longitude": -118.200707,"cbsaCode": "31080","cbsaName": "Los Angeles-Long Beach-Anaheim, CA","scrapedAt": "2026-05-21T10:00:01.000Z","error": null},{"stateCode": "06","countyCode": "013","siteNumber": "0002","stateName": "California","countyName": "Contra Costa","cityName": "Concord","localSiteName": "Concord","siteAddress": "2956-A TREAT BOULEVARD","parameterCode": "88101","parameterName": "PM2.5 - Local Conditions","poc": 1,"datum": "WGS84","openDate": "1999-01-08","closeDate": null,"monitoringAgency": "Bay Area Air Quality Management District","monitorType": "SLAMS","measurementScale": "NEIGHBORHOOD","method": "R & P Model 2025 PM-2.5 Sequential Air Sampler w/VSCC - Gravimetric","latitude": 37.936013,"longitude": -122.026154,"cbsaCode": "41860","cbsaName": "San Francisco-Oakland-Hayward, CA","scrapedAt": "2026-05-21T10:00:02.000Z","error": null}]
β¨ Why choose this Actor
| Feature | Detail |
|---|---|
| ποΈ Authoritative source | Connects directly to the EPA's official AQS API - the federal gold standard for U.S. ambient air quality data |
| π§ͺ 11 pollutant parameters | PM2.5, PM10, NO2, O3, CO, SO2, lead, VOCs, reactive nitrogen oxides, wind, and temperature |
| πΊοΈ 3 collection modes | Daily county summaries, hourly site samples, and active monitor inventory in one Actor |
| π 10,000+ stations | Full coverage of all state, local, and federal air monitoring networks |
| πΊπΈ 50 states + DC | Every U.S. jurisdiction with FIPS-coded filters |
| π¦ Instant export | CSV, Excel, JSON, and XML via Apify dataset download with no extra steps |
| π No key required | Demo credentials built-in for immediate use; personal keys unlock higher quotas |
| π° Pay only for results | Pay-per-event pricing - you are billed only for records actually delivered |
π How it compares to alternatives
| Method | Setup time | EPA access | Structured output | Filters |
|---|---|---|---|---|
| This Actor | ~2 min | Direct API | Yes | State, county, site, parameter, date |
| Manual API calls | 30-60 min | Direct | Manual | Requires knowing all FIPS and param codes |
| Data.gov downloads | 10-20 min | Bulk CSV | Partial | Limited, no per-county/site filter |
| Third-party AQI APIs | 5-10 min | Aggregated only | Yes | Limited historical depth |
| Python/R scripts | 1-4 hours | Direct | Custom | Full, but requires coding |
π How to use
- Create a free account - Create a free account w/ $5 credit
- Open the Actor - Search "EPA AQS" in the Apify Store or use the direct link.
- Select your dataset - Choose Daily Summary, Hourly Samples, or Monitor Inventory.
- Set your filters - Pick state, county, pollutant parameter, and date range.
- Run - Click Start. Results appear in the dataset within seconds.
- Export - Download as CSV, Excel, JSON, or XML from the dataset page.
πΌ Business use cases
Environmental compliance monitoring
Regulatory teams and legal departments use daily PM2.5 and NO2 summaries to verify compliance with NAAQS standards, prepare air quality reports, and support permit applications. The daily county endpoint returns observation counts and validity flags that document data completeness.
Public health and epidemiology research
Researchers correlating air pollution exposure with health outcomes need clean, date-aligned measurement series. This Actor produces ready-to-join datasets keyed by FIPS codes that merge directly with census health data, hospital admissions records, and mortality tables.
Real estate and urban planning
Developers and planners assessing site suitability often need historical AQI profiles for neighborhoods. Daily summaries by county with AQI fields let analysts build multi-year exposure profiles and support environmental impact statements.
Journalism and advocacy
Reporters covering environmental justice stories need current and historical pollution data tied to specific communities. The monitor inventory endpoint identifies which neighborhoods have - and which lack - monitoring infrastructure, a key data point in coverage of monitoring gaps.
π Automating EPA AQS Scraper
Connect this Actor to your existing stack without writing code:
- Make (Integromat) - schedule a weekly run and push results to Google Sheets or Airtable automatically.
- Zapier - trigger on Actor completion and forward new records to Slack, Notion, or a database.
- Apify Scheduler - run daily on a cron schedule to maintain a rolling air quality dataset.
- Apify API - call the Actor programmatically from Python, Node.js, or any HTTP client and retrieve results as JSON.
- Webhooks - send a POST notification to your server the moment each run completes.
π Beyond business use cases
Academic research
Climate scientists and atmospheric chemists use AQS data to validate dispersion models, analyze long-term concentration trends, and calibrate low-cost sensor networks against federal reference monitors.
Citizen science and advocacy
Community air quality groups use monitor inventory data to identify monitoring deserts - areas with no nearby EPA stations - and build cases for new monitors in underserved neighborhoods.
Educational projects
Data journalism students and GIS courses use this Actor to build choropleth maps, time-series charts, and exposure analyses without navigating the raw EPA API or decoding FIPS schemas.
Open data and journalism tools
Open-data journalists and data aggregators use the Actor to keep local environmental dashboards current, pairing it with census data to show per-capita exposure by income bracket or demographic group.
π€ Ask an AI assistant about this scraper
You can ask your AI assistant questions like:
- "What fields does the EPA AQS daily summary endpoint return?"
- "How do I get hourly ozone readings for a specific monitoring site?"
- "What is the difference between dailyDataByCounty and sampleDataBySite?"
- "Show me how to use the Apify API to run the EPA AQS scraper and retrieve results."
- "What FIPS code does Los Angeles County use?"
This Actor is designed for straightforward integration. The output schema is consistent and well-documented above.
β Frequently Asked Questions
β Do I need an EPA account to use this Actor?
No. The Actor ships with shared demo credentials that work immediately. For production use or higher data volumes, register a free account at aqs.epa.gov/data/api/signup.
β What is the maximum date range per query?
The EPA AQS API accepts a maximum of one calendar year per query. For multi-year datasets, run the Actor once per year and combine the outputs.
β Why are some fields null in certain records?
Some fields are endpoint-specific. time, datetimeLocal, and datetimeGmt are only populated for hourly sample data. openDate, closeDate, monitoringAgency, and monitorType are only populated for the monitor inventory endpoint. aqi, observationCount, and pollutantStandard are only populated for daily summaries.
β What pollutant codes are supported?
The Actor supports 11 parameter codes: PM2.5 FRM (88101), PM2.5 non-FRM (88502), PM10 (81102), CO (42101), SO2 (42401), NO2 (42602), O3 (44201), Lead (14129), Reactive NOx (42600), Wind (WIND), and Temperature (TEMP).
β How do I find the FIPS code for my county?
FIPS codes are standardized federal identifiers. The state FIPS is the two-digit code (06 = California, 48 = Texas). County FIPS is three digits (037 = Los Angeles County). You can look them up at the U.S. Census Bureau or use the stateCode dropdown which lists all 51 jurisdictions.
β How do I find a specific site number?
Use the monitorsByState endpoint first to get a list of all monitoring sites in your target state. The siteNumber field in those records can then be used as input for the sampleDataBySite endpoint.
β What is the AQI field?
The Air Quality Index is the EPA's standardized 0-500 scale for communicating pollution levels to the public. It is calculated from the concentration and varies by pollutant. It is only available in the daily summary endpoint.
β What does POC mean?
Parameter Occurrence Code distinguishes multiple monitors measuring the same pollutant at the same site. POC 1 is usually the primary monitor. Most use cases can filter to POC 1.
β Can I get data for all counties in a state at once?
The EPA AQS API requires county-level filtering for daily summaries. To collect all counties in a state, run the Actor once per county or use the monitorsByState endpoint to first identify which counties have monitoring stations for your parameter.
β How current is the data?
The EPA AQS database is updated continuously as state and local agencies submit data. Recent data (last 60-90 days) may be preliminary. Finalized data is typically available within 90 days of the measurement date.
β Is the data free?
Yes. The EPA AQS is a public federal database. Access is free with registration. This Actor charges only for the compute and data transfer on Apify's platform.
β What does CBSA mean?
Core Based Statistical Area - the U.S. Census Bureau's classification for metropolitan and micropolitan statistical areas. The cbsaCode and cbsaName fields identify the broader urban region a monitoring site belongs to.
π Integrate with any app
Export your dataset and connect it to the tools you already use:
- Google Sheets - paste the JSON/CSV link into the IMPORTDATA formula
- Power BI / Tableau - connect via the Apify dataset REST endpoint
- Python pandas -
pd.read_json("https://api.apify.com/v2/datasets/{id}/items") - R / tidyverse -
jsonlite::fromJSON(url)or usehttr - PostgreSQL / MySQL - load the CSV export with COPY or LOAD DATA
- Zapier - trigger on Actor finish, push rows to Google Sheets, Airtable, or Slack
- Make (Integromat) - schedule runs and route records to any connected app
- Apify API -
/v2/acts/parseforge~epa-aqs-air-quality-scraper/runswith POST
π Recommended Actors
| Actor | Description |
|---|---|
| OurAirports Global Airport Database Scraper | Export 85,000+ airports, heliports, and airfields worldwide with ICAO, IATA, GPS coordinates, and service status |
| FAA Aircraft Registry Scraper | Full FAA N-number aircraft registry with ownership, type, status, and airworthiness data |
| FINRA BrokerCheck Scraper | Export FINRA-registered broker and firm records including disclosures, licenses, and employment history |
π‘ Pro Tip: browse the complete ParseForge collection to find scrapers for government databases, financial data, and public records that pair well with environmental datasets.
Need help or found a bug? Open an issue on the Apify Community Forum.
Disclaimer: This Actor retrieves publicly available data from the U.S. EPA Air Quality System API. All data is sourced directly from the EPA and is subject to the EPA's terms of use. ParseForge is not affiliated with the U.S. Environmental Protection Agency. Measurement values, especially recent data, may be preliminary and subject to revision by the EPA.