Public REST API version 1: reads without keys, JSON by default; station data intake — POST with a station key. The OpenAPI 3.1 specification is generated from the same schemas that validate server requests and responses.
Base URL
https://havo.tj
Authentication
Not required for reads (limit 120 requests per minute per IP). Station data intake: Authorization: Bearer <station key> header, separate limit of 60 requests per minute per station.
CORS
Requests from any website are allowed (Access-Control-Allow-Origin: *).
Air quality
GET/api/v1/stationscache 60 s
List of monitoring stations
Public stations (except decommissioned) as a GeoJSON FeatureCollection with the current index level; 0 means no data or stale.
name objectrequired — Localized text: Tajik (tg), Russian (ru), English (en)
tg string
ru string
en string
kind "air" | "meteo" | "combined"required
status "active" | "suspended" | "decommissioned"required
region object | nullrequired
tg string
ru string
en string
level integerrequired — Air quality level 1–5 (1–6 for six-category scales such as US AQI); 0 — no data
indexValue number | nullrequired — Continuous index value (level + fraction)
indexTime string (date-time) | nullrequired — Time of the index value
GET/api/v1/stations/{slug}/measurementscache 60 s
Station measurement series
Hourly (24h, 7d) or daily local-time (30d, 1y) means of valid measurements with min/max and count. CSV with format=csv. Values and the unit field use the display unit chosen by the Agency (µg/m³ or mg/m³).
Parameters
Parameter
In
Type
Description
slugrequired
path
string
Station address (the slug field from the station list)
range
query
24h | 7d | 30d | 1y = 24h
Period: 24h, 7d, 30d or 1y
pollutant
query
string
Pollutant code (PM25, PM10, NO2, SO2, CO, O3, NO, CH2O, C6H5OH, HF, TSP, CO2, TVOC); all pollutants when omitted
name objectrequired — Localized text: Tajik (tg), Russian (ru), English (en)
tg string
ru string
en string
range "24h" | "7d" | "30d" | "1y"required
from string (date-time)required — ISO 8601 timestamp (UTC)
to string (date-time)required — ISO 8601 timestamp (UTC)
aggregation "hour" | "day"required — hour for 24h/7d, day (local time) for 30d/1y
timezone "Asia/Dushanbe"required
series object[]required
pollutant objectrequired
id integerrequired
code stringrequired
shortName stringrequired
unit stringrequired — Display unit configured by the Agency: µg/m³ or mg/m³ (CO always mg/m³; CO2 ppm, TVOC ppb). Values are converted to it
decimals integerrequired
points object[]required
t string (date-time)required — Start of the hour/day
v number | nullrequired — Mean of valid measurements, in `unit`
min number | nullrequired
max number | nullrequired
n integerrequired — Number of measurements in the bin
200text/csvCSV (UTF-8 with BOM): time_utc, time_local, pollutant, value, min, max, n
400application/jsonInvalid parameters
error stringrequired
404application/jsonObject not found
error stringrequired
GET/api/v1/index/currentcache 60 s
Current index by station
The latest computed index of every public station: level, value, dominant pollutant, sub-indices and a stale flag (older than 6 hours). For the RATIO_TO_LIMIT scale the response includes the Agency method indicators: NO₂+SO₂ summation, maximum single concentrations with the ratio to the single MPC, high/extremely high pollution flags; units — display units per pollutant.
Parameters
Parameter
In
Type
Description
scale
query
string
Scale code: NATIONAL_OPERATIONAL (default), WHO_24H or IZA
Regions, Dushanbe and the RRP with simplified polygons, centroids, station counts and the worst current index level (0 — no data). Cached for 10 minutes, ETag.
name objectrequired — Localized text: Tajik (tg), Russian (ru), English (en)
tg string
ru string
en string
stationsCount integerrequired — Public stations located inside the unit
level integerrequired — Worst current index level among the unit's stations; 0 — no data or stale
sortOrder integerrequired
centroid [number, number] | nullrequired
GET/api/v1/districtscache 600 s
Administrative boundaries: districts
Districts and cities of regional subordination with simplified polygons, region code, station counts and the worst current index level. Units without loaded geometry are omitted.
name objectrequired — Localized text: Tajik (tg), Russian (ru), English (en)
tg string
ru string
en string
stationsCount integerrequired — Public stations located inside the unit
level integerrequired — Worst current index level among the unit's stations; 0 — no data or stale
regionId integerrequired — Parent region id
regionCode stringrequired — Parent region code (DU, RRP, SU, KT, GB)
Station data intake
POST/api/v1/ingest/{code}
Measurement intake from a station
A logger, the station agent or vendor software sends a JSON array of measurements (up to 1000 per request). Time — ISO 8601 with offset or local (Asia/Dushanbe); pollutants — codes PM25, PM10, NO2, SO2, CO, O3 or synonyms; the default unit is the station's input unit. Values are converted to the pollutant unit, pass the QC range rule and are stored by the time/pollutant/averaging key — re-sending is idempotent and operator decisions are kept. The response lists accepted and rejected counts with per-record reasons. After storing, the index and alert rules are recomputed.
Parameters
Parameter
In
Type
Description
coderequired
path
string
Station code from the registry (e.g. DU-01)
Authentication: Station API key from the station card in the admin panel; sent as Authorization: Bearer <key>. Only the key hash is stored in the database.