oneapi
Sign in
Mediu v1 / Mediu

Hourly series for a pollutant

The valid hourly values, most recent first — the 8 a.m. peak the daily mean smooths out.

GET
https://oneapi.ro/api/mediu/v1/aer/orar

Query parameters

NameTypeDescriptionAccepted values
limitaoptional integer | null How many hours to return, maximum 2000. Defaults to 168. 1 – 2000
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, on the station's standard time. e.g. 2026-09-01
pana_laoptional string | null Last day included, YYYY-MM-DD. e.g. 2026-09-03

How it behaves

  • The daily mean smooths out exactly what matters in a city: a 180 µg/m³ peak at 8 a.m. vanishes into a mean of 45. The hourly series shows it.
  • The hour is on the station's standard time (+02:00, no daylight saving — the EEA convention). In summer, 08:00+02:00 is 9 o'clock on the wall. The absolute moment is correct: the offset is written into the value.
  • de_la and pana_la are whole days on the same standard time; limita counts hours (168 by default, one week; 2,000 at most). Ordering is descending, most recent hour first.
  • Only values the operator marked VALID are kept, and data in the current window is unverified. A missing hour means there was no valid value, not zero.
  • Gravimetric PM10/PM2.5 samples are one value per day, not per hour: they do not appear here but in /aer/zilnic, with masurare: zilnica. A station with no automatic analyser for a pollutant therefore has a daily series but no hourly one.
  • An hourly threshold exists only for NO2 and SO2. For PM10 the legal test is on the daily mean, for O3 and CO on the 8-hour running mean — there peste_limita_orara is null, and the correct test is in /aer/zilnic.

What it is for

  • See the morning rush-hour NO2 peak at the station next to the school.
  • Pick the hour to run or cycle on the day with the cleanest morning.
  • Check the hours that exceeded the NO2 or SO2 hourly threshold — the legal test is per hour, not per day.

Response structure

All fields below live inside data.

FieldTypeDescription
statie object Stația, cu aceleași câmpuri ca la /aer/statii.
poluant object Poluantul, ca la /aer/zilnic.
limita_orara object Pragul orar {valoare, depasiri_tolerate_pe_an, temei}, ori null.
inregistrari integer Câte ore conține răspunsul.
serie[].ora string Începutul orei, ISO 8601 cu decalaj.
serie[].valoare number Valoarea orară.
serie[].peste_limita_orara boolean Depășirea pragului orar; null fără prag.
observatie string Avertismentul despre oră și date neverificate.
sursa object Sursa și licența.

Response examples

GEThttps://oneapi.ro/api/mediu/v1/aer/orar?statie=RO0008R&poluant=PM10&limita=5
{
    "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"
                }
            ]
        },
        "limita_orara": null,
        "inregistrari": 0,
        "serie": [],
        "observatie": "Valori orare valide, cea mai recentă prima. `ora` e începutul orei, pe ora standard a staţiei (+02: 00, fără ora de vară — convenţia EEA); vara, ora 08: 00 de aici e 09: 00 pe ceas. Datele sunt NEVERIFICATE — operatorul le poate corecta ori invalida. Probele gravimetrice de PM10/PM2,5 sunt o valoare pe zi şi apar doar în seria zilnică, cu `masurare: zilnica`.",
        "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, the pollutant is unknown or limita exceeds 2000.
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, the pollutant is unknown or limita exceeds 2000.",
        "detalii": {
            "limita": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}