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

  • 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.
  • The station type changes the interpretation entirely. traffic sits next to a busy road and measures exposure in traffic; background measures the urban or rural background; industrial sits 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 poluant filter 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
        }
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareUnknown pollutant, type or setting.
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": "Unknown pollutant, type or setting.",
        "detalii": {
            "judet": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}