oneapi
Sign in
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

  • date tells you what WE hold, not what the catalogue says. The activa, prima_observatie and ultima_observatie fields 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 show activa: true with a first observation back in 2008; and ultima_observatie is null for 186 of 187, because the source leaves the end open for operating stations. The date branch — are, zile, prima_zi, ultima_zi, poluanti — is computed from our own measurements. Check it before requesting series for a station.
  • ore_valide is not a detail. A day has 24 possible hours; the mean is published only if the day has at least 18 valid ones, otherwise media is null while 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_8h exists only for ozone and carbon monoxide, where the legal indicator is the maximum 8-hour running mean. For the rest it is null, not zero.
  • peste_limita applies the correct test per pollutant (see test_depasire), not a uniform comparison against the mean. When the value the test needs is missing, the field is null, not false: "we do not know" and "it was not exceeded" are different things.
  • Two kinds of day. masurare: orara is the aggregate of hourly values (mean, minimum, maximum, valid hours). masurare: zilnica is a 24-hour laboratory sample — gravimetric PM10 and PM2.5, at stations with no automatic analyser: the mean is the sample itself, and minim, maxim and ore_valide do not exist (null and 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."
        }
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
404negasitNo station with this code exists.
422validarestatie or poluant missing, or the pollutant is unknown.
429cota_depasitaThe 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."
            ]
        }
    }
}