Air quality
IN (India). Latest pollutant concentrations from every reporting CPCB monitoring station, by city and state.
What this is
Near-real-time pollutant readings from the Central Pollution Control Board, mirrored via data.gov.in. Around 3,570 readings across 268 cities and 31 states.
curl -s https://snapdata.dev/api/v1/aqi/in/city/delhi.jsonThese are concentrations, not an AQI number. CPCB publishes what each station measured, per pollutant. Collapsing that into a single AQI figure requires CPCB's sub-index breakpoints plus a rule about how many pollutants must be reporting before the index is meaningful — a derivation with real judgement in it. We publish the measurement and leave the index to whoever wants to compute it.
Endpoints
| Path | What it returns |
|---|---|
/api/v1/aqi/in/latest.json | Every reporting station, every pollutant |
/api/v1/aqi/in/index.json | Every city and state, with its slug |
/api/v1/aqi/in/city/{slug}.json | One city, all its stations |
/api/v1/aqi/in/state/{slug}.json | One state |
Slugs are lower-cased and hyphenated. Read them from index.json rather than
guessing: Navi Mumbai (MIDC) becomes navi-mumbai-midc, which is not obvious.
Units and nulls
Values are µg/m³, except CO which is mg/m³. Showing one unit for all of
them would misstate CO by three orders of magnitude.
min, max and avg are null when the station reported NA. That is never a
zero — a station that did not report is not a station reading clean air, and the
difference matters for anyone averaging across a city.
Time
updated_at is RFC 3339 UTC. The upstream publishes DD-MM-YYYY HH:MM:SS
in IST with no offset in the string, so it is converted rather than relabelled;
emitting it unchanged would place every reading five and a half hours into the
future.
The date is read day-first. 13-08-2026 settles the ambiguity, since there is no
thirteenth month.
Not a price series
Reference-shaped, like tickers. A station reading has
no trading day and no settling window, so there are no series/30d windows, no
is_trading_day and no dated snapshots. It takes no selector and no format
negotiation: JSON only.
Cadence
Refreshed on the normal three-hourly run. Unlike the ticker universe this is only a few hundred files and the readings genuinely change through the day.
Licence
Government Open Data Licence — India (GODL). Free to republish with attribution to the Central Pollution Control Board.