Public read-only JSON API. Base path:
https://airquality.am/{locale}/air-quality-app/v1/ where {locale} is en, ru, or hy.
Use GET only. Responses are application/json; charset=utf-8.
Please send a meaningful User-Agent (your app or project name). Examples on this page use docs-example.
You may use the API for personal widgets, integrations, and other products. If you publish something publicly, cite airquality.am as the data source.
Bulk file exports and licensing are described on the open data page (see also readme.txt and DbCL for files).
Object inside providers[] in stations.json.
| Field | Type | Description |
|---|---|---|
id | string | Provider slug used in API (e.g. in Station.provider) |
title | string | Human-readable provider name |
url | string | Link to the provider page on this site, or empty string |
image | string | URL of icon for light UI |
image_dark | string | URL of icon for dark UI |
Object in stations[] or the sole object from station/{id}.json.
| Field | Type | Description |
|---|---|---|
id | integer | Station id |
status | string | Status string (e.g. online, offline) |
title | string | Address or place name in the requested locale |
city | string|null | City name, or null |
city_slug | string|null | City slug for URLs, or null |
district | string|null | District name, or null |
district_slug | string|null | District slug, or null |
latitude | number | Latitude, decimal degrees (WGS-84) |
longitude | number | Longitude, decimal degrees (WGS-84) |
is_bad_thp | boolean | Whether temperature/humidity/pressure look unreliable |
measurement_time | string|null | Time of latest measurement, ISO 8601, or null if offline |
temperature | number|null | °C (hourly average) |
humidity | number|null | Relative humidity % |
pressure | number|null | Atmospheric pressure in pascals (Pa) as an integer; divide by 100 for hectopascals (hPa) |
aqi | integer|null | US EPA AQI from latest hourly average |
pm2.5 | number|null | PM2.5 µg/m³ (corrected where applicable) |
pm2.5_raw | number|null | Raw PM2.5 µg/m³ if available |
pm10 | number|null | PM10 µg/m³ |
pm1 | number|null | PM1 µg/m³ |
wind_speed | number|null | Wind speed (m/s) |
wind_direction | string|null | Compass direction label (e.g. N, NE) |
uv | number|null | UV index |
rain | number|null | Precipitation (mm) |
no2 | number|null | NO₂ (ppb) |
so2 | number|null | SO₂ µg/m³ |
o3 | number|null | O₃ µg/m³ |
dust | number|null | Dust (PM) µg/m³ |
usvh | number|null | Radiation dose rate (µSv/h) |
lux | null | Reserved; currently always null |
provider | string | Provider slug (see Provider.id) |
url | string | Canonical page URL for this station on airquality.am |
Objects in regions[] that represent a city, or the response of region/{slug}.json when slug is a city.
| Field | Type | Description |
|---|---|---|
slug | string | City slug |
title | string | City name in the requested locale |
measurement_time | string|null | Time for the digest used (ISO 8601), or null |
temperature | number|null | °C (aggregated) |
humidity | number|null | Relative humidity % |
pressure | number|null | Same as station: pascals (Pa); divide by 100 for hPa |
aqi | integer|null | US EPA AQI |
pm2.5 | number|null | PM2.5 µg/m³ |
pm10 | number|null | PM10 µg/m³ |
no2 | number|null | NO₂ ppb |
url | string | City page on airquality.am |
map_latitude | number | Map center latitude (decimal degrees) |
map_longitude | number | Map center longitude (decimal degrees) |
map_delta | number | Map zoom/span parameter |
is_hidden | boolean | Whether the city is hidden from some listings |
Same fields as Region (city) for measurements and map, with these differences: slug is the district slug; title is the district name; extra fields city and city_slug identify the parent city. There is no is_hidden field on districts.
One element of the arrays under 24h, 7d, 30d, 1y, 2y in history endpoints. An array may be empty [] if there is no data for that window (e.g. offline station). Keys may be null when there is no value for that bucket.
Station history includes avg_pm25_raw. Region history includes station_count instead (no avg_pm25_raw).
Hourly series (24h, 7d) typically omit min_* / max_* fields; daily buckets in 30d include both range_* arrays and separate min_* / max_* fields for the same quantities.
| Field | Type | Description |
|---|---|---|
timestamp | string | Bucket start time (ISO 8601) |
avg_temperature | number|null | °C |
avg_humidity | number|null | Relative humidity % |
avg_pressure | number|null | Same as current readings: pascals (Pa); divide by 100 for hPa |
avg_pm25 | number|null | PM2.5 µg/m³ |
avg_pm10 | number|null | PM10 µg/m³ |
avg_pm25_raw | number|null | Raw PM2.5 µg/m³ (station history only) |
avg_no2 | number|null | NO₂ ppb |
avg_usvh | number|null | Radiation µSv/h |
avg_dust | number|null | Dust (PM) µg/m³ |
avg_so2 | number|null | SO₂ µg/m³ |
avg_o3 | number|null | O₃ µg/m³ |
avg_wind_direction | number|null | Wind direction (degrees clockwise from north) |
avg_wind_speed | number|null | Wind speed (m/s) |
total_rain | number|null | Precipitation total for the bucket (mm) when applicable |
station_count | number|null | Approximate number of stations in the average (region history only) |
range_temperature | [number, number]|null | [min, max] °C for daily-or-coarser buckets when present |
range_pm25 | [number, number]|null | [min, max] PM2.5 µg/m³ |
range_pm10 | [number, number]|null | [min, max] PM10 µg/m³ |
range_dust | [number, number]|null | [min, max] dust (PM) µg/m³ |
range_wind_speed | [number, number]|null | [min, max] wind speed (m/s) |
range_aqi | [integer, integer]|null | [min, max] US EPA AQI for the bucket |
aqi | integer|null | US EPA AQI |
min_temperature, max_temperature | number|null | Daily (and similar) buckets: extrema °C for the interval; often present in 30d, absent in hourly 24h/7d |
min_pm25, max_pm25, min_pm10, max_pm10 | number|null | Same bucket rules as temperature; values in µg/m³ |
min_no2, max_no2 | number|null | Same bucket rules; values in ppb |
min_dust, max_dust | number|null | Same bucket rules; dust (PM) µg/m³ |
min_wind_speed, max_wind_speed | number|null | Same bucket rules; values in m/s |
min_* / max_* duplicate the endpoints of the corresponding range_* array where both are present.
Replace https://airquality.am/en/... with ru or hy as needed. All examples:
curl -sS -H 'User-Agent: docs-example' 'URL'
GET /v1/stations.jsonReturns { "providers": [...], "stations": [...], "regions": [...] }. Stations list only visible, non-forced-hidden stations.
curl -sS -H 'User-Agent: docs-example' 'https://airquality.am/en/air-quality-app/v1/stations.json'
GET /v1/station/{id}.jsonOne Station object. 404 if the id does not exist.
curl -sS -H 'User-Agent: docs-example' 'https://airquality.am/en/air-quality-app/v1/station/1.json'
GET /v1/station/{id}-history.jsonObject with five arrays of HistoryPoint: 24h (hourly), 7d (hourly), 30d (daily), 1y (monthly), 2y (monthly). Example uses station 126 (non-empty hourly data at time of writing); an offline station may return empty arrays.
curl -sS -H 'User-Agent: docs-example' 'https://airquality.am/en/air-quality-app/v1/station/126-history.json'
GET /v1/region/{slug}.jsonOne Region object (city or district). slug is lowercase Latin letters and hyphens (e.g. yerevan). 404 if not found.
curl -sS -H 'User-Agent: docs-example' 'https://airquality.am/en/air-quality-app/v1/region/yerevan.json'
GET /v1/region/{slug}-history.jsonSame five keys as station history; each point is a HistoryPoint for the region (includes station_count).
curl -sS -H 'User-Agent: docs-example' 'https://airquality.am/en/air-quality-app/v1/region/yerevan-history.json'