oneapi
Sign in
Mediu v1 / Mediu

Pollutants and limit values

The code list, with the legal basis of each limit and the current data coverage.

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

Query parameters

This route accepts no query parameters.

How it behaves

  • Pollutants are not measured at the same stations. PM10 has 171 stations, NO2 149, SO2 116, CO 99, O3 83, and PM2.5 only 78. A ranking or a comparison between two pollutants is in fact comparing two different networks, not just two substances. When comparing counties on PM2.5, remember that some have no station measuring it at all.
  • Fetch it once and map locally.
  • The list is restricted to the six pollutants that are regulated and consistently measured in Romania. The source also reports heavy metals and benzene, but with sparse coverage — we would have exposed them as "available" with missing data on most stations.
  • Every limit declares the averaging period it applies to and how many exceedances the law tolerates per year. Comparing an hourly value with an annual limit is meaningless, and this structure exists to prevent exactly that.
  • acoperire states which range of days is imported and how many stations have data — read it before requesting a series that would come back empty.

What it is for

  • Populate a pollutant selector with exactly the values the other routes accept.
  • Find the legal threshold and its basis before interpreting a measurement.
  • Check data coverage before building an analysis.

Response structure

All fields below live inside data.

FieldTypeDescription
poluanti[].cod integer Codul EEA al poluantului.
poluanti[].poluant string Valoarea de folosit în parametrul poluant.
poluanti[].denumire string Denumirea completă.
poluanti[].unitate string Unitatea de măsură.
poluanti[].limite[] array The applicable legal limits: type, value, how many exceedances are tolerated per year, and the legal basis.
poluanti[].limite[].tip string Perioada de mediere: orar, zilnic, maxim_8h sau anual.
poluanti[].limite[].valoare number Pragul.
poluanti[].limite[].depasiri_tolerate_pe_an integer Câte depășiri tolerează legea pe an calendaristic.
poluanti[].limite[].temei string Actul normativ și anexa.
poluanti[].test_depasire_zilnica object Testul aplicat de /aer/depasiri, sau null la poluanții fără limită zilnică.
acoperire.zile_agregate integer Câte rânduri zilnice sunt importate în total.
acoperire.prima_zi string Prima zi cu date.
acoperire.ultima_zi string Ultima zi cu date.
acoperire.statii_cu_date integer Câte stații au măsurători importate.
acoperire.poluanti_cu_date integer Câți poluanți au măsurători importate.
acoperire.ultima_valoare_orara string Cea mai recentă oră măsurată din toată rețeaua.
observatie string Avertismentul despre reprezentativitate și date neverificate.
sursa object Sursa și licența.
poluanti[].test_depasire_zilnica.camp string Which daily statistic the test uses: the mean, the maximum, or the maximum 8-hour mean. It differs by pollutant.
poluanti[].test_depasire_zilnica.prag integer The value above which the day counts as an exceedance.
poluanti[].test_depasire_zilnica.tolerate integer How many exceedances a year the law allows before it becomes a breach.
poluanti[].test_depasire_zilnica.descriere string The test written out in words.

Response examples

GEThttps://oneapi.ro/api/mediu/v1/aer/poluanti
{
    "data": {
        "poluanti": [
            {
                "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_zilnica": {
                    "camp": "media",
                    "prag": 50,
                    "tolerate": 35,
                    "descriere": "Media zilnică peste 50 µg/m³. Legea tolerează 35 de zile pe an calendaristic."
                }
            }
        ],
        "acoperire": {
            "zile_agregate": 363783,
            "prima_zi": "2024-12-31",
            "ultima_zi": "2026-09-22",
            "statii_cu_date": 177,
            "poluanti_cu_date": 6,
            "ultima_valoare_orara": "2026-09-22 09: 00: 00+03"
        },
        "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.
422validareThe route takes no parameters apart from lang: any other parameter returns 422 instead of being ignored.
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": "The route takes no parameters apart from lang: any other parameter returns 422 instead of being ignored."
    }
}