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/langaand 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_anof 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
}
}
}
GEThttps://oneapi.ro/api/locations/v1/meteo/statii?cu_date=1&per_pagina=5
{
"data": {
"statii": [
{
"wsi": "0-20000-0-15208",
"nume": "Alba Iulia",
"latitudine": 46.063911,
"longitudine": 23.563402,
"fara_catalog": false,
"localitate": {
"cod_siruta": 1017,
"nume": "Alba Iulia"
},
"judet": "Alba",
"judet_cod": "AB",
"primul_an": 1881,
"ultimul_an": 2026,
"zile_cu_date": 43155,
"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": 5,
"total": 160,
"pagini": 32
}
}
}
GEThttps://oneapi.ro/api/locations/v1/meteo/statii?pagina=2
{
"data": {
"statii": [
{
"wsi": "0-20000-0-15109",
"nume": "Piatra Neamt",
"latitudine": 46.933611,
"longitudine": 26.389444,
"fara_catalog": false,
"localitate": {
"cod_siruta": 120726,
"nume": "Piatra-Neamț"
},
"judet": "Neamț",
"judet_cod": "NT",
"primul_an": 1889,
"ultimul_an": 2026,
"zile_cu_date": 46181,
"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": 2,
"per_pagina": 100,
"total": 160,
"pagini": 2
}
}
}
Error codes
| Code | Slug | When it occurs |
|---|---|---|
| 401 | neautentificat | Token missing, invalid, expired or revoked. |
| 403 | feature_indisponibil | The current plan does not include the feature the route depends on. |
| 422 | validare | An undeclared parameter or a value that fails validation (judet, siruta, cu_date). The offending field is in detalii. |
| 429 | cota_depasita | The 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."
]
}
}
}