Open-Meteo Air Quality API
Free air quality API with no key: PM2.5, PM10, ozone, nitrogen dioxide, European and US AQI plus pollen forecasts worldwide. Tested curl example included.
Endpoint tested and returned HTTP 200 on 2026-08-19
What is the Open-Meteo Air Quality API?
The Open-Meteo Air Quality API is a free, key-free API returning current and forecast air pollution data — PM2.5, PM10, ozone, nitrogen dioxide, carbon monoxide, European and US AQI, and pollen counts — for any coordinates worldwide.
Air quality data is normally locked behind paid environmental data providers, which makes this endpoint unusually valuable. It exposes the Copernicus Atmosphere Monitoring Service (CAMS) model output through the same clean, key-free interface as Open-Meteo's weather forecast API.
Two AQI scales are available and they are not interchangeable: `european_aqi` and `us_aqi` use different breakpoints and different pollutant weightings, so the same air can score very differently on each. Pick the one your audience recognises and label it explicitly in your UI.
Quick facts
- Base URL
https://air-quality-api.open-meteo.com/v1- Authentication
- No API key required. Same fair-use policy as the main Open-Meteo forecast API.
- Rate limit
- Approximately 10,000 requests per day per IP on the free tier.
- Pricing
- Free including commercial use below the daily limit.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the Open-Meteo Air Quality API
Every request below was executed against the live API on 2026-08-19, and the response shown is the real body it returned — not an illustration.
1. Current PM10 and PM2.5 for Berlin
GET https://air-quality-api.open-meteo.com/v1/air-quality?latitude=52.52&longitude=13.41¤t=pm10,pm2_5
curl 'https://air-quality-api.open-meteo.com/v1/air-quality?latitude=52.52&longitude=13.41¤t=pm10,pm2_5'const res = await fetch("https://air-quality-api.open-meteo.com/v1/air-quality?latitude=52.52&longitude=13.41¤t=pm10,pm2_5");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://air-quality-api.open-meteo.com/v1/air-quality?latitude=52.52&longitude=13.41¤t=pm10,pm2_5", timeout=20)
res.raise_for_status()
print(res.json()){
"latitude": 52.5,
"longitude": 13.400002,
"generationtime_ms": 0.10263919830322266,
"utc_offset_seconds": 0,
"timezone": "GMT",
"timezone_abbreviation": "GMT",
"elevation": 38.0,
"current_units": {
"time": "iso8601",
"interval": "seconds",
"pm10": "μg/m³",
"pm2_5": "μg/m³"
},
"current": {
"time": "2026-08-19T13:00",
"interval": 3600,
"pm10": 8.1,
"pm2_5": 5.7
}
}Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
latitude | float | Required | Latitude in decimal degrees. 52.52 |
longitude | float | Required | Longitude in decimal degrees. 13.41 |
current | string | Optional | Pollutants to return for the current hour. pm10,pm2_5,us_aqi |
hourly | string | Optional | Hourly pollutant series, up to 7 days ahead. pm2_5,ozone,nitrogen_dioxide |
timezone | string | Optional | IANA timezone or `auto`. auto |
Response fields
current.pm2_5float- Fine particulate matter under 2.5 microns, in micrograms per cubic metre — the pollutant most associated with health impact.
current.pm10float- Coarse particulate matter under 10 microns, in micrograms per cubic metre.
current.european_aqiinteger- European Air Quality Index, 0-100+ where under 20 is good. Only returned if requested.
current.us_aqiinteger- United States AQI, 0-500 where under 50 is good. Uses different breakpoints to the European index.
current_unitsobject- Unit strings for every returned variable.
What you can build with the Open-Meteo Air Quality API
- Display a live air quality badge for a city on a health or travel site
- Warn users with asthma or allergies when PM2.5 crosses a threshold
- Add pollen forecasts to a gardening or allergy-tracking app
- Correlate air quality with fitness or outdoor-activity recommendations
- Build environmental dashboards without paying for a commercial data feed
Common errors and how to fix them
400
Missing coordinates or an unknown pollutant name.
Fix: Pollutant names are snake_case, e.g. `pm2_5` not `pm25` — the underscore placement is the usual mistake.
429
Daily allowance exhausted for your IP.
Fix: Air quality changes hourly at most; cache aggressively.
Open-Meteo Air Quality API — frequently asked questions
Is there a free air quality API with no API key?
Yes — the Open-Meteo Air Quality API needs no key or signup and returns PM2.5, PM10, ozone, nitrogen dioxide and both European and US AQI values for any coordinates.
What is the difference between European AQI and US AQI?
They use different pollutant breakpoints and averaging periods. The US AQI runs 0-500 and is driven largely by PM2.5 and ozone; the European AQI runs on a different band scheme. The same air will produce different numbers, so never present them interchangeably.
Does this API provide pollen data?
Yes, for Europe. Alder, birch, grass, mugwort, olive and ragweed pollen are available as hourly variables, sourced from the CAMS European air quality forecast.
How far back does the air quality data go?
The API serves current conditions and forecasts, with a limited historical window. For long historical air quality series you need the CAMS reanalysis datasets directly.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
Unit Converter
Convert between units of length, weight, temperature, area, volume, speed, time and data storage instantly, with a swap button and common conversion tables.
Open-Meteo Air Quality is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-19; always check the official documentation before relying on this API in production, as terms and limits can change.