oneapi
Sign in
Locations v1 / Meteo

Weather stations

The weather station network, with each station's position, locality, years covered and measured parameters. Not all of them measure everything.

GET
https://oneapi.ro/api/locations/v1/meteo/statii

Query parameters

NameTypeDescriptionAccepted values
judetoptional string | null The county's registration prefix (e.g. CJ). Filters stations by the county they fall in. max 4 car.
sirutaoptional integer | null The SIRUTA code of an administrative unit — only the stations falling inside it. 1
cu_dateoptional boolean | null 1 keeps only the stations that actually have a daily series imported. e.g. 1
per_paginaoptional text How many stations per page (100 by default, 200 at most). e.g. 5
paginaoptional text The page, counted from 1. e.g. 2

How it behaves

  • The station→unit link is computed SPATIALLY by us (the station's point intersected with the unit boundary), it does not come from the source. A station can fall outside every unit — the real case is the one on the breakwater of Constanța harbour, which is out at sea.
  • The portal publishes a daily series for more stations than its coordinate catalogue holds. The difference is stations with history that no longer appear in the current catalogue. We do not throw their series away: they get a row flagged fara_catalog, with no name and no position. You can query them with ?statie=<wsi>, but they do not show up in /meteo/langa and cannot be picked automatically as a reference station — we have nowhere to put them on a map.
  • The network is not uniform. Before taking a normal as given for a place, look at the primul_an of the station it rests on and at the distance to it. ANM does not publish station altitude in the open dataset, so we do not expose it — in mountain areas, check manually which station was chosen, because terrain matters more than straight-line distance.

What it is for

  • Choosing the reference station for a study by looking at altitude and series length, not just at distance.
  • Checking which stations a county has before promising weather coverage to a customer there.
  • Building a station picker in an interface, paginated.

Response structure

FieldTypeDescription
data.statii[].wsi string The station's WMO identifier (WSI). It is the public key: you pass it on to /meteo/zilnic?statie=.
data.statii[].nume string The station name, as ANM publishes it. null for stations with no catalogue record.
data.statii[].latitudine number The station's latitude (WGS 84). null for stations with no catalogue record.
data.statii[].longitudine number The station's longitude (WGS 84). null for stations with no catalogue record.
data.statii[].fara_catalog boolean true for stations the portal publishes a daily series for but no catalogue record: they have no name, no coordinates and do not appear in geographic searches. Their series is fetched with ?statie=<wsi>.
data.statii[].localitate object The administrative unit the station falls in ({cod_siruta, nume}) — a link we compute spatially, not one the source declares. null for stations outside every unit (e.g. the one on the Constanța harbour breakwater, which is at sea).
data.statii[].localitate.cod_siruta integer SIRUTA code of the territorial unit.
data.statii[].localitate.nume string The name, exactly as the source publishes it.
data.statii[].judet string The name of the county the station falls in.
data.statii[].judet_cod string The county's registration prefix (e.g. CJ).
data.statii[].primul_an integer The first year with measurements in the daily series. It varies enormously: some stations start in the 19th century, others in the 1960s.
data.statii[].ultimul_an integer The last year with measurements.
data.statii[].zile_cu_date integer How many measured days the station has in total — the raw robustness indicator for the series.
data.statii[].parametri array The codes of the parameters the station publishes, exactly as ANM names them: ta mean temperature, tn minimum, tx maximum (all at 2 m), r precipitation, ff mean wind speed (at 10 m), p sea-level pressure. A station can be missing whole years of a parameter it publishes today.
data.sursa object The data source: the National Meteorological Administration, official daily series, CC-BY-4.0 licence. It also carries the date of the last import.
data.sursa.nume string Name of the official source.
data.sursa.url string Public address of the source.
data.sursa.licenta string The licence under which the source allows reuse.
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/locations/v1/meteo/statii?judet=CJ
{
    "data": {
        "statii": [
            {
                "wsi": "0-20000-0-15163",
                "nume": "Baisoara",
                "latitudine": 46.535556,
                "longitudine": 23.310278,
                "fara_catalog": false,
                "localitate": {
                    "cod_siruta": 55918,
                    "nume": "Băișoara"
                },
                "judet": "Cluj",
                "judet_cod": "CJ",
                "primul_an": 1941,
                "ultimul_an": 2026,
                "zile_cu_date": 30110,
                "parametri": [
                    "ff",
                    "p",
                    "r",
                    "ta",
                    "tn",
                    "tx"
                ]
            }
        ],
        "sursa": {
            "nume": "Administrația Națională de Meteorologie (ANM) — date climatologice zilnice, controlate calitativ",
            "url": "https://odp.meteoromania.ro/",
            "licenta": "CC BY 4.0, 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.
422validareAn undeclared parameter or a value that fails validation (judet, siruta, cu_date). The offending field is in detalii.
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": "An undeclared parameter or a value that fails validation (judet, siruta, cu_date). The offending field is in detalii.",
        "detalii": {
            "judet": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}