Mediu v1 / Mediu
Air monitoring stations
The national network, filterable by county, locality, pollutant measured, station type and setting.
GET
https://oneapi.ro/api/mediu/v1/aer/statii
Query parameters
NameTypeDescriptionAccepted values
judetoptional
string | null
County vehicle-registration code.
max 4 car.
sirutaoptional
integer | null
SIRUTA code of the UAT.
1
poluantoptional
string | null
Only stations actively measuring this pollutant:
PM10, PM2.5, NO2, O3, SO2, CO.
PM10PM2.5NO2O3SO2CO
tipoptional
string | null
background, traffic or industrial.
backgroundtrafficindustrial
zonaoptional
string | null
urban, suburban or rural.
urbansuburbanrural
activaoptional
boolean | null
true for stations in operation.
e.g. true
per_paginaoptional
text
Stations per page, maximum 250. Defaults to 100.
e.g. 50
paginaoptional
text
The page, counted from 1.
e.g. 1
How it behaves
datetells you what WE hold, not what the catalogue says. Theactiva,prima_observatieandultima_observatiefields describe the station as published by the EEA — and they do not match our coverage. 10 of the 187 stations have no imported measurement at all, even though they showactiva: truewith a first observation back in 2008; andultima_observatieisnullfor 186 of 187, because the source leaves the end open for operating stations. Thedatebranch —are,zile,prima_zi,ultima_zi,poluanti— is computed from our own measurements. Check it before requesting series for a station.- The station type changes the interpretation entirely.
trafficsits next to a busy road and measures exposure in traffic;backgroundmeasures the urban or rural background;industrialsits next to an industrial source. Comparing a traffic station with a background one says nothing about "the city air". - Every station is linked to the UAT it falls in, by spatial intersection with the boundaries in the Locations module — we compute that link; the European source has no notion of Romanian administrative units. All 187 stations link.
- The data comes from the European Environment Agency, where it arrives through Romania mandatory reporting. Not from calitateaer.ro, which is a portal with no programmatic access.
- The
poluantfilter returns stations with an ACTIVE instrument for that pollutant, not those that measured it at some point.
What it is for
- Find out which stations measure in your county or locality, and which pollutants they track.
- Put the monitoring network on a map, with each station type.
- Pick the relevant station before requesting the daily series — a traffic station and a background station in the same city measure different realities.
Response structure
FieldTypeDescription
data.statii[].cod
string
Codul EoI al stației (
RO0073A) — cheia publică, folosită și în rapoartele naționale.
data.statii[].cod_national
string
Codul intern al operatorului român.
data.statii[].latitudine
number
Latitudinea stației (WGS84).
data.statii[].longitudine
number
Longitudinea stației (WGS84).
data.statii[].altitudine
integer
Altitudinea, în metri.
data.statii[].tip
string
background, traffic sau industrial.
data.statii[].zona
string
urban, suburban sau rural.
data.statii[].localitate
object
The locality the station falls in, linked to the Locations nomenclature.
data.statii[].localitate.cod_siruta
integer
UAT-ul în care cade stația — chainable spre modulul Locations.
data.statii[].localitate.nume
string
Denumirea UAT-ului.
data.statii[].judet
string
Județul.
data.statii[].judet_cod
string
Indicativul auto al județului.
data.statii[].prima_observatie
string
De când raportează stația.
data.statii[].ultima_observatie
string
Până când a raportat.
null înseamnă că e încă în funcțiune.
data.statii[].activa
boolean
Are cel puțin un instrument fără dată de încheiere.
data.statii[].poluanti[]
string
The pollutants the station measures.
data.sursa
object
Sursa și licența.
data.statii[].date.are
boolean
Whether we hold imported measurements for the station.
false does not mean the station does not exist, only that we have no data from it.
data.statii[].date.zile
integer
How many station-day-pollutant rows we hold.
data.statii[].date.prima_zi
string
First day with data on OUR side (may be far more recent than the catalogue
prima_observatie).
data.statii[].date.ultima_zi
string
Last day with data on our side.
data.statii[].date.poluanti[]
array
Pollutants we actually hold measurements for — a subset of
poluanti, which comes from the catalogue.
meta.paginare.pagina
integer
Current page, counted from 1.
meta.paginare.per_pagina
integer
How many records a page holds.
meta.paginare.total
integer
Total matching records, beyond the current page.
meta.paginare.pagini
integer
How many pages the list has.
Response examples
GEThttps://oneapi.ro/api/mediu/v1/aer/statii?judet=CJ
{
"data": {
"statii": [
{
"cod": "RO0073A",
"cod_national": "RO-CJ-1",
"latitudine": 46.778253,
"longitudine": 23.615619,
"altitudine": 336,
"tip": "traffic",
"zona": "urban",
"localitate": {
"cod_siruta": 54975,
"nume": "Cluj-Napoca"
},
"judet": "Cluj",
"judet_cod": "CJ",
"prima_observatie": "2006-01-01",
"ultima_observatie": null,
"activa": true,
"date": {
"are": true,
"zile": 1512,
"prima_zi": "2024-12-31",
"ultima_zi": "2026-09-22",
"poluanti": [
"CO",
"NO2",
"PM10"
]
},
"poluanti": [
"CO",
"NO2",
"PM10",
"SO2"
]
}
],
"sursa": {
"nume": "European Environment Agency — Air Quality Download Service (date raportate de România prin RNMCA/ANPM)",
"url": "https://eeadmz1-downloads-webapp.azurewebsites.net/",
"licenta": "Politica de reutilizare a EEA — reutilizare permisă cu indicarea sursei."
}
},
"meta": {
"paginare": {
"pagina": 1,
"per_pagina": 100,
"total": 6,
"pagini": 1
}
}
}
GEThttps://oneapi.ro/api/mediu/v1/aer/statii?tip=traffic&activa=true
{
"data": {
"statii": [
{
"cod": "RO0095A",
"cod_national": "RO-AR-1",
"latitudine": 46.181136,
"longitudine": 21.335019,
"altitudine": 107,
"tip": "traffic",
"zona": "urban",
"localitate": {
"cod_siruta": 9262,
"nume": "Arad"
},
"judet": "Arad",
"judet_cod": "AR",
"prima_observatie": "2009-01-01",
"ultima_observatie": null,
"activa": true,
"date": {
"are": true,
"zile": 1339,
"prima_zi": "2024-12-31",
"ultima_zi": "2026-09-22",
"poluanti": [
"CO",
"NO2",
"PM10"
]
},
"poluanti": [
"CO",
"NO2",
"O3",
"PM10",
"SO2"
]
}
],
"sursa": {
"nume": "European Environment Agency — Air Quality Download Service (date raportate de România prin RNMCA/ANPM)",
"url": "https://eeadmz1-downloads-webapp.azurewebsites.net/",
"licenta": "Politica de reutilizare a EEA — reutilizare permisă cu indicarea sursei."
}
},
"meta": {
"paginare": {
"pagina": 1,
"per_pagina": 100,
"total": 43,
"pagini": 1
}
}
}
GEThttps://oneapi.ro/api/mediu/v1/aer/statii?poluant=PM2.5
{
"data": {
"statii": [
{
"cod": "RO0092A",
"cod_national": "RO-AB-1",
"latitudine": 46.064275,
"longitudine": 23.563517,
"altitudine": 242,
"tip": "background",
"zona": "urban",
"localitate": {
"cod_siruta": 1017,
"nume": "Alba Iulia"
},
"judet": "Alba",
"judet_cod": "AB",
"prima_observatie": "2009-01-01",
"ultima_observatie": null,
"activa": true,
"date": {
"are": true,
"zile": 3411,
"prima_zi": "2024-12-31",
"ultima_zi": "2026-09-22",
"poluanti": [
"CO",
"NO2",
"O3",
"PM10",
"PM2.5",
"SO2"
]
},
"poluanti": [
"NO2",
"O3",
"PM10",
"PM2.5",
"SO2"
]
}
],
"sursa": {
"nume": "European Environment Agency — Air Quality Download Service (date raportate de România prin RNMCA/ANPM)",
"url": "https://eeadmz1-downloads-webapp.azurewebsites.net/",
"licenta": "Politica de reutilizare a EEA — reutilizare permisă cu indicarea sursei."
}
},
"meta": {
"paginare": {
"pagina": 1,
"per_pagina": 100,
"total": 79,
"pagini": 1
}
}
}
Error codes
| Code | Slug | When it occurs |
|---|---|---|
| 401 | neautentificat | Token missing, invalid, expired or revoked. |
| 403 | feature_indisponibil | The current plan does not include the feature the route depends on. |
| 422 | validare | Unknown pollutant, type or setting. |
| 429 | cota_depasita | The plan's monthly quota has been exceeded (see Retry-After). |
All errors share the same shape. eroare.cod is stable and is the value you should branch on in code — not the text in mesaj, which may change.
{
"eroare": {
"cod": "validare",
"mesaj": "Unknown pollutant, type or setting.",
"detalii": {
"judet": [
"The value sent does not satisfy the parameter rule."
]
}
}
}