Sensor.Community Air Quality Sensor Scraper
Pricing
from $4.52 / 1,000 results
Sensor.Community Air Quality Sensor Scraper
Tap into the Sensor.Community citizen network for live open air readings worldwide. Pull sensor ID, model, location with latitude and longitude, country, PM10, PM2.5, temperature, humidity, and pressure. Filter by country or sensor model for air quality studies and mapping.
Pricing
from $4.52 / 1,000 results
Rating
0.0
(0)
Developer
ParseForge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share

🌍 Sensor.Community Air Quality Sensor Scraper
🚀 Export the live Sensor.Community network in seconds. Pull thousands of citizen air sensor readings from a single snapshot covering 70+ countries.
🕒 Last updated: 2026-06-08 · 📊 Up to 25 fields per record · live and hourly windows · global coverage
Turn the Sensor.Community open network into clean, structured measurements you can map, chart, or load into a database. Each run reads a public snapshot of the whole network and returns one record per sensor measurement, with the sensor model, its location, and every reading flattened into named fields like PM10, PM2.5, temperature, humidity, and pressure.
Coverage is the full live network as Sensor.Community publishes it: tens of thousands of measurements in every snapshot, from particulate sensors like the SDS011 to climate sensors like the BME280, spread across more than 70 countries. You can keep the whole world or narrow down to one country or one sensor model.
| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Air quality researchers | Build a worldwide snapshot of PM10 and PM2.5 |
| Civic tech and open data groups | Power a local air map or dashboard |
| Data scientists and students | Source a clean training and analysis set |
| Environmental journalists | Spot pollution spikes across a region |
📋 What the Sensor.Community Air Scraper does
This Actor calls the public Sensor.Community data feed and returns one clean record per measurement:
- Identity — measurement id, sensor id, sensor model, and manufacturer.
- Location — latitude, longitude, altitude, country, and an indoor flag.
- Readings — particulate values P1 (PM10) and P2 (PM2.5), plus temperature, humidity, pressure, noise, CO2, and radiation where the sensor reports them.
Different sensor models report different readings, so fields outside a sensor's scope come back null. A raw values map is also included so no reported value type is ever lost. Every record carries a scrapedAt timestamp.
🎬 Full Demo (🚧 Coming soon)
⚙️ Input
| Field | Type | Description |
|---|---|---|
mode | select | Which snapshot to read. live returns measurements from the last 5 minutes. 1h returns the rolling one hour average per sensor. Defaults to live. |
maxItems | integer | How many records to return. Free plan is capped at 10. |
country | select | Optional. Keep only sensors in one country, for example DE or US. Leave blank for worldwide. |
sensorType | select | Optional. Keep only one sensor model, for example SDS011 or BME280. Leave blank for all models. |
Example 1 — particulate sensors in Germany
{"mode": "live","country": "DE","sensorType": "SDS011","maxItems": 100}
Example 2 — hourly averages worldwide
{"mode": "1h","maxItems": 500}
⚠️ Good to Know: Each snapshot is a single global file with tens of thousands of measurements. Country and sensor model filters are applied after the snapshot is fetched, so a very specific filter may return fewer rows than your
maxItemssetting.
📊 Output
Each measurement record looks like this:
| Field | Description |
|---|---|
🆔 id | Measurement ID for this reading |
🛰 sensorId | Sensor ID in the network |
🔧 sensorType | Sensor model name (SDS011, BME280, etc.) |
🏭 sensorManufacturer | Sensor manufacturer |
📍 locationId | Location ID in the network |
🧭 latitude | Latitude of the sensor |
🧭 longitude | Longitude of the sensor |
⛰ altitude | Altitude in meters |
🌍 country | Two letter country code |
🏠 indoor | Whether the sensor is indoors |
🕒 timestamp | When the measurement was taken |
🌫 P1 | PM10 particulate value |
🌫 P2 | PM2.5 particulate value |
🌫 P0 | PM1 particulate value |
🌫 P4 | PM4 particulate value |
🌡 temperature | Temperature in Celsius |
💧 humidity | Relative humidity percent |
🧭 pressure | Air pressure in Pascals |
🧭 pressureAtSealevel | Pressure adjusted to sea level |
🔊 noiseLAeq | Average noise level |
🔊 noiseLAmax | Peak noise level |
🔊 noiseLAmin | Minimum noise level |
🟢 co2 | CO2 in parts per million |
☢️ radiationMSI | Radiation reading |
🗂 values | Raw map of every reported value type |
🕒 scrapedAt | Collection timestamp |
❌ error | Null on success |
Real sample — SDS011 particulate sensor
{"id": 29598135627,"sensorId": 146,"sensorType": "SDS011","sensorManufacturer": "Nova Fitness","locationId": 45999,"latitude": 48.808,"longitude": 9.182,"altitude": 310.1,"country": "DE","indoor": false,"timestamp": "2026-06-08 17:35:24","P1": 1.1,"P2": 0.84,"P0": null,"P4": null,"temperature": null,"humidity": null,"pressure": null,"pressureAtSealevel": null,"noiseLAeq": null,"noiseLAmax": null,"noiseLAmin": null,"co2": null,"radiationMSI": null,"values": { "P1": 1.1, "P2": 0.84 },"scrapedAt": "2026-06-08T17:36:29.652Z","error": null}
Real sample — BME280 climate sensor
{"id": 29598108762,"sensorId": 141,"sensorType": "BME280","sensorManufacturer": "Bosch","locationId": 65,"latitude": 48.778,"longitude": 9.16,"altitude": 282.5,"country": "DE","indoor": false,"timestamp": "2026-06-08 17:32:11","P1": null,"P2": null,"P0": null,"P4": null,"temperature": 17.76,"humidity": 100,"pressure": 98626.97,"pressureAtSealevel": 101942.66,"noiseLAeq": null,"noiseLAmax": null,"noiseLAmin": null,"co2": null,"radiationMSI": null,"values": {"humidity": 100,"pressure": 98626.97,"temperature": 17.76,"pressure_at_sealevel": 101942.66},"scrapedAt": "2026-06-08T17:34:34.854Z","error": null}
Real sample — first SDS011 in the run
{"id": 29598128374,"sensorId": 140,"sensorType": "SDS011","sensorManufacturer": "Nova Fitness","locationId": 65,"latitude": 48.778,"longitude": 9.16,"altitude": 282.5,"country": "DE","indoor": false,"timestamp": "2026-06-08 17:34:37","P1": 0,"P2": 0,"P0": null,"P4": null,"temperature": null,"humidity": null,"pressure": null,"pressureAtSealevel": null,"noiseLAeq": null,"noiseLAmax": null,"noiseLAmin": null,"co2": null,"radiationMSI": null,"values": { "P1": 0, "P2": 0 },"scrapedAt": "2026-06-08T17:36:29.588Z","error": null}
✨ Why choose this Actor
- One clean record per measurement, with readings flattened into named fields.
- The raw
valuesmap keeps every reported value type, so nothing is dropped. - Whole network in one snapshot, or filter to one country or one sensor model.
- No account, no key, and no login required.
- Stable field names that map cleanly onto a database schema.
📈 How it compares to alternatives
| Approach | Effort | Structured fields | Flattened readings | Maintenance |
|---|---|---|---|---|
| This Actor | One run | Yes | Yes | None on your side |
| Parsing the raw feed yourself | Hours | Manual | Manual | You own the upkeep |
| Copying values by hand | Tedious | Inconsistent | Manual | Constant |
🚀 How to use
- Create a free Apify account using this sign-up link.
- Open the Sensor.Community Air Quality Sensor Scraper.
- Pick a
mode(liveor1h). - Optionally set a
countryand asensorType, then setmaxItems. - Click Start and grab your results when the run finishes.
💼 Business use cases
Air quality monitoring
| Goal | How this helps |
|---|---|
| Track PM10 and PM2.5 across a region | Filter by country and read P1 and P2 |
| Compare indoor and outdoor sensors | Use the indoor flag and location fields |
Open data and civic tech
| Goal | How this helps |
|---|---|
| Power a public air map | Use latitude, longitude, and readings per sensor |
| Refresh a dashboard on a schedule | Re-run the live snapshot at any cadence |
Research and analytics
| Goal | How this helps |
|---|---|
| Build an analysis dataset | Pull a full snapshot with consistent field names |
| Study sensor coverage by country | Group records by country and sensor model |
Climate and weather
| Goal | How this helps |
|---|---|
| Collect temperature and humidity | Filter to BME280 and read climate fields |
| Track local pressure trends | Use pressure and pressureAtSealevel |
🔌 Automating Sensor.Community Air Scraper
Connect runs to the tools you already use:
- Make and Zapier to trigger runs and route records into sheets or databases.
- Slack to post a summary when a run finishes.
- Airbyte to load results into a warehouse.
- GitHub Actions to schedule periodic snapshots.
- Google Drive to archive each run's output.
🌟 Beyond business use cases
- Research: study how air quality varies by location and time.
- Personal: check sensors near your home and build a tracker.
- Non-profit: power a community clean air resource.
- Experimentation: prototype an air data app without writing a scraper.
🤖 Ask an AI assistant
Paste your results into ChatGPT, Claude, Perplexity, or Microsoft Copilot and ask it to rank locations by PM2.5, group sensors by country, or chart pressure across a region.
❓ Frequently Asked Questions
Do I need a Sensor.Community account? No. The Actor reads the public data feed, which needs no login.
Do I need an API key? No key is required.
What is the difference between live and hourly? Live returns measurements from the last 5 minutes. Hourly returns a rolling one hour average per sensor.
Why are some reading fields null?
Each sensor model reports only certain values. A particulate sensor returns P1 and P2 but not temperature, so unrelated fields are null. The raw values map shows exactly what each sensor reported.
What do P1 and P2 mean? P1 is PM10 and P2 is PM2.5, the two common particulate matter readings.
Can I filter to one country?
Yes. Set the country input to a two letter code such as DE or US.
Can I filter to one sensor model?
Yes. Set the sensorType input, for example SDS011 or BME280.
How many measurements are in a snapshot? Each snapshot typically holds tens of thousands of measurements across the whole network.
How fresh is the data? Each run pulls the current public snapshot, so it reflects the network at run time.
Can I schedule this? Yes. Use Apify Schedules to snapshot the network on any cadence.
🔌 Integrate with any app
Results are available through the Apify API, so you can pull them into any app, database, or workflow you already run.
🔗 Recommended Actors
- Have I Been Pwned Breaches Catalog Scraper
- Brawlify Brawl Stars Database Scraper
- More open data and reference Actors in the ParseForge collection
💡 Pro Tip: browse the complete ParseForge collection.
🆘 Need Help? Open our contact form
⚠️ Disclaimer: independent tool, not affiliated with Sensor.Community. Only publicly available data is collected.