Mediu v1 / Mediu
Daily series for a pollutant
The mean, the minimum, the maximum and — for ozone and carbon monoxide — the maximum of the 8-hour means.
GET
https://oneapi.ro/api/mediu/v1/aer/zilnic
Query parameters
NameTypeDescriptionAccepted values
statierequired
string
EoI code of the station. Required.
max 32 car.
poluantrequired
string
The pollutant. Required.
PM10PM2.5NO2O3SO2CO
de_laoptional
string | null
First day included,
YYYY-MM-DD.
e.g. 2026-01-01
pana_laoptional
string | null
Last day included,
YYYY-MM-DD.
e.g. 2026-06-30
limitaoptional
integer | null
How many days to return, maximum 1000. Defaults to 90.
1 – 1000
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.ore_valideis not a detail. A day has 24 possible hours; the mean is published only if the day has at least 18 valid ones, otherwisemediaisnullwhile the minimum, maximum and count remain. A "daily mean" from three hours is not comparable with the limit value.- Only values the operator marked VALID are kept. Invalidated measurements (fault, calibration, out of range) are excluded — including them would corrupt exactly the means on which exceedances are computed.
maxim_8hexists only for ozone and carbon monoxide, where the legal indicator is the maximum 8-hour running mean. For the rest it isnull, not zero.peste_limitaapplies the correct test per pollutant (seetest_depasire), not a uniform comparison against the mean. When the value the test needs is missing, the field isnull, notfalse: "we do not know" and "it was not exceeded" are different things.- Two kinds of day.
masurare: orarais the aggregate of hourly values (mean, minimum, maximum, valid hours).masurare: zilnicais a 24-hour laboratory sample — gravimetric PM10 and PM2.5, at stations with no automatic analyser: the mean is the sample itself, andminim,maximandore_validedo not exist (nulland 0). When a station has both kinds for the same day, the hourly day with a mean is kept. - The hourly series, with the peaks the daily mean smooths out, is at
/aer/orar. - Ordering is descending by day.
What it is for
- Chart the evolution of PM10 at a station over recent months.
- Check which days exceeded the legal threshold at a given station, with the value that caused it.
- Feed a chart or report with official data rather than screenshots from a website.
Response structure
All fields below live inside data.
FieldTypeDescription
statie
object
Stația, cu aceleași câmpuri ca la
/aer/statii.
poluant.cod
integer
Codul EEA al poluantului.
poluant.poluant
string
Notația.
poluant.denumire
string
Denumirea completă.
poluant.unitate
string
Unitatea de măsură.
poluant.limite[]
object
Valorile-limită aplicabile, cu tipul, pragul, depășirile tolerate și temeiul legal.
test_depasire.camp
string
Ce câmp din serie se compară cu pragul:
media, maxim sau maxim_8h.
test_depasire.prag
number
Pragul zilnic.
test_depasire.tolerate
integer
Câte depășiri pe an tolerează legea.
test_depasire.descriere
string
Formularea testului, în clar.
inregistrari
integer
Câte zile conține răspunsul.
serie[]
array
The day, with mean, minimum, maximum, maximum 8-hour mean, how many hours have data, and whether the day is an exceedance.
serie[].zi
string
Ziua.
serie[].media
number
Media zilnică.
null sub 18 ore valide.
serie[].minim
number
Cea mai mică valoare orară din zi.
serie[].maxim
number
Cea mai mare valoare orară din zi.
serie[].maxim_8h
number
Maximul mediilor glisante pe 8 ore. Doar la O3 și CO.
serie[].ore_valide
integer
Câte ore valide stau în spatele cifrelor zilei. 0 la o probă zilnică.
serie[].masurare
string
orara (agregat din ore) ori zilnica (o probă pe 24 de ore).
serie[].unitate
string
Unitatea.
serie[].peste_limita
boolean
Dacă ziua depășește pragul legal.
null când valoarea de test lipsește.
observatie
string
Avertismentul despre reprezentativitate și date neverificate.
sursa
object
Sursa și licența.
statie.cod
string
The European station code.
statie.cod_national
string
The code used by the national network.
statie.latitudine
number
Station latitude.
statie.longitudine
number
Station longitude.
statie.altitudine
integer
Elevation, in metres.
statie.tip
string
Station type: traffic, industrial, background. It matters for comparisons: a traffic station does not compare with a background one.
statie.zona
string
The area: urban, suburban, rural.
statie.localitate
object
The locality the station falls in, linked to the Locations nomenclature.
statie.judet
string
The county.
statie.judet_cod
string
The county vehicle code.
statie.prima_observatie
string
When data for the station begins.
statie.ultima_observatie
null
The last day with data.
null means the station has no aggregated daily series.
statie.activa
boolean
Whether the station still reports.
Response examples
GEThttps://oneapi.ro/api/mediu/v1/aer/zilnic?statie=RO0008R&poluant=PM10
{
"data": {
"statie": {
"cod": "RO0008R",
"cod_national": "RO-EM-3",
"latitudine": 47.324686,
"longitudine": 25.134839,
"altitudine": 912,
"tip": "background",
"zona": "rural",
"localitate": {
"cod_siruta": 149851,
"nume": "Poiana Stampei"
},
"judet": "Suceava",
"judet_cod": "SV",
"prima_observatie": "2010-01-01",
"ultima_observatie": null,
"activa": true,
"date": {
"are": true,
"zile": 326,
"prima_zi": "2026-07-01",
"ultima_zi": "2026-09-22",
"poluanti": [
"CO",
"NO2",
"O3",
"SO2"
]
}
},
"poluant": {
"cod": 5,
"poluant": "PM10",
"denumire": "Pulberi în suspensie PM10",
"unitate": "µg/m³",
"limite": [
{
"tip": "zilnic",
"valoare": 50,
"depasiri_tolerate_pe_an": 35,
"temei": "Directiva 2008/50/CE, anexa XI"
}
]
},
"test_depasire": {
"camp": "media",
"prag": 50,
"tolerate": 35,
"descriere": "Media zilnică peste 50 µg/m³. Legea tolerează 35 de zile pe an calendaristic."
},
"inregistrari": 0,
"serie": [],
"observatie": "Valorile sunt măsurate la STAȚIE, nu în localitate: la câțiva kilometri, sau lângă o arteră aglomerată, pot fi complet diferite. Datele din fereastra curentă sunt NEVERIFICATE — operatorul le poate corecta sau invalida ulterior. Mediile zilnice se publică doar când ziua are cel puțin 18 ore valide; `ore_valide` spune întotdeauna pe ce se sprijină cifra. O zi cu `masurare: zilnica` e o probă de laborator pe 24 de ore (PM10/PM2,5 gravimetric): media e chiar proba, fără minim, maxim ori ore.",
"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."
}
}
}
GEThttps://oneapi.ro/api/mediu/v1/aer/zilnic?statie=RO0065A&poluant=PM2.5
{
"data": {
"statie": {
"cod": "RO0065A",
"cod_national": "RO-B1",
"latitudine": 44.447275,
"longitudine": 26.036694,
"altitudine": 91,
"tip": "background",
"zona": "urban",
"localitate": {
"cod_siruta": 179132,
"nume": "București"
},
"judet": "București",
"judet_cod": "B",
"prima_observatie": "2004-01-01",
"ultima_observatie": null,
"activa": true,
"date": {
"are": true,
"zile": 3773,
"prima_zi": "2024-12-31",
"ultima_zi": "2026-09-22",
"poluanti": [
"CO",
"NO2",
"O3",
"PM10",
"PM2.5",
"SO2"
]
}
},
"poluant": {
"cod": 6001,
"poluant": "PM2.5",
"denumire": "Pulberi în suspensie PM2,5",
"unitate": "µg/m³",
"limite": [
{
"tip": "anual",
"valoare": 25,
"depasiri_tolerate_pe_an": 0,
"temei": "Directiva 2008/50/CE, anexa XIV"
}
]
},
"test_depasire": null,
"inregistrari": 90,
"serie": [
{
"zi": "2026-09-22",
"media": null,
"minim": 0,
"maxim": 29.88,
"maxim_8h": null,
"ore_valide": 9,
"unitate": "µg/m³",
"masurare": "orara",
"peste_limita": null
}
],
"observatie": "Valorile sunt măsurate la STAȚIE, nu în localitate: la câțiva kilometri, sau lângă o arteră aglomerată, pot fi complet diferite. Datele din fereastra curentă sunt NEVERIFICATE — operatorul le poate corecta sau invalida ulterior. Mediile zilnice se publică doar când ziua are cel puțin 18 ore valide; `ore_valide` spune întotdeauna pe ce se sprijină cifra. O zi cu `masurare: zilnica` e o probă de laborator pe 24 de ore (PM10/PM2,5 gravimetric): media e chiar proba, fără minim, maxim ori ore.",
"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."
}
}
}
GEThttps://oneapi.ro/api/mediu/v1/aer/zilnic?statie=RO0008R&poluant=NO2
{
"data": {
"statie": {
"cod": "RO0008R",
"cod_national": "RO-EM-3",
"latitudine": 47.324686,
"longitudine": 25.134839,
"altitudine": 912,
"tip": "background",
"zona": "rural",
"localitate": {
"cod_siruta": 149851,
"nume": "Poiana Stampei"
},
"judet": "Suceava",
"judet_cod": "SV",
"prima_observatie": "2010-01-01",
"ultima_observatie": null,
"activa": true,
"date": {
"are": true,
"zile": 326,
"prima_zi": "2026-07-01",
"ultima_zi": "2026-09-22",
"poluanti": [
"CO",
"NO2",
"O3",
"SO2"
]
}
},
"poluant": {
"cod": 8,
"poluant": "NO2",
"denumire": "Dioxid de azot",
"unitate": "µg/m³",
"limite": [
{
"tip": "orar",
"valoare": 200,
"depasiri_tolerate_pe_an": 18,
"temei": "Directiva 2008/50/CE, anexa XI"
}
]
},
"test_depasire": {
"camp": "maxim",
"prag": 200,
"tolerate": 18,
"descriere": "O valoare orară peste 200 µg/m³ în ziua respectivă. Legea tolerează 18 ore pe an — aici numărăm ZILE cu cel puțin o depășire, deci cifra e mai mică sau egală cu numărul de ore."
},
"inregistrari": 84,
"serie": [
{
"zi": "2026-09-22",
"media": null,
"minim": 5.526,
"maxim": 6.067,
"maxim_8h": null,
"ore_valide": 9,
"unitate": "µg/m³",
"masurare": "orara",
"peste_limita": false
}
],
"observatie": "Valorile sunt măsurate la STAȚIE, nu în localitate: la câțiva kilometri, sau lângă o arteră aglomerată, pot fi complet diferite. Datele din fereastra curentă sunt NEVERIFICATE — operatorul le poate corecta sau invalida ulterior. Mediile zilnice se publică doar când ziua are cel puțin 18 ore valide; `ore_valide` spune întotdeauna pe ce se sprijină cifra. O zi cu `masurare: zilnica` e o probă de laborator pe 24 de ore (PM10/PM2,5 gravimetric): media e chiar proba, fără minim, maxim ori ore.",
"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."
}
}
}
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. |
| 404 | negasit | No station with this code exists. |
| 422 | validare | statie or poluant missing, or the pollutant is unknown. |
| 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": "statie or poluant missing, or the pollutant is unknown.",
"detalii": {
"statie": [
"The value sent does not satisfy the parameter rule."
]
}
}
}