Locations v1 / Meteo
Nearby weather stations
The weather stations around a point, each with its distance — for picking the station that represents an address, rather than an arbitrary one.
GET
https://oneapi.ro/api/locations/v1/meteo/langa
Query parameters
NameTypeDescriptionAccepted values
sirutaoptional
integer | null
The SIRUTA code of the place (administrative unit or locality). Mutually exclusive with
lat+lng.
1
latoptional
number | null
The latitude of the point. Given together with
lng.
43 – 49
lngoptional
number | null
The longitude of the point. Given together with
lat.
20 – 30
statieoptional
string | null
The code of a particular station. With it, the route returns that station directly, without searching by radius.
max 32 car.
raza_kmoptional
number | null
The search radius in km (50 by default, 500 at most).
1 – 500
limitaoptional
integer | null
How many stations are returned (5 by default, 50 at most).
1 – 50
How it behaves
- The place is given in exactly one of two forms:
siruta, ORlat+lng. Both at once are rejected, so that we never silently pick one. - Stations come back ordered by great-circle distance. Distance is not everything, and we cannot give you altitude (ANM does not publish it in the open dataset): in varied terrain, check on a map where the station falls before taking its climate as your place's.
What it is for
- Choosing a reference station for a place deliberately, instead of implicitly accepting the nearest one.
- Checking whether a customer in an area has at least one station reasonably close by.
- Comparing two or three stations around a point, when the terrain makes them differ.
Response structure
FieldTypeDescription
data.punct
object
The point searched around (lat/lng, plus the place it was derived from if you gave
siruta).
data.punct.lat
number
Latitude, in decimal degrees (WGS 84).
data.punct.lng
number
Longitude, in decimal degrees (WGS 84).
data.punct.sursa
string
data.punct.cod_siruta
integer
SIRUTA code of the territorial unit.
data.punct.nume
string
The name, exactly as the source publishes it.
data.punct.nivel
string
Level in the classification hierarchy — the deeper, the more detailed.
data.raza_km
integer
The radius actually used.
data.inregistrari
integer
How many records the response holds.
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.statii[].distanta_km
number
The distance from the point to the station, in km, rounded to 0.1.
data.observatie
string
A note on how to read the response: a computation convention or a limit of the data.
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.distanta.metoda
string
Always
linie_dreapta (straight line): the geodesic distance over the Earth's surface, not by road.
meta.distanta.detaliu
string
The same information, in words.
Response examples
GEThttps://oneapi.ro/api/locations/v1/meteo/langa?siruta=54984
{
"data": {
"punct": {
"lat": 46.78,
"lng": 23.559444444444,
"sursa": "siruta",
"cod_siruta": 54984,
"nume": "Cluj-Napoca",
"nivel": "localitate"
},
"raza_km": 50,
"inregistrari": 5,
"statii": [
{
"wsi": "0-20000-0-15120",
"nume": "Cluj-Napoca",
"latitudine": 46.777778,
"longitudine": 23.571389,
"fara_catalog": false,
"localitate": {
"cod_siruta": 54975,
"nume": "Cluj-Napoca"
},
"judet": "Cluj",
"judet_cod": "CJ",
"primul_an": 1921,
"ultimul_an": 2026,
"zile_cu_date": 38525,
"parametri": [
"ff",
"p",
"r",
"ta",
"tn",
"tx"
],
"distanta_km": 0.9
}
],
"observatie": "Măsurătorile vin de la STAȚIE, nu din localitate. În relief variat — și România are mult — o vale și un vârf la 15 km distanță pot avea climă complet diferită. Folosește `distanta_km` ca să judeci cât de reprezentativă e. ANM nu publică altitudinea stațiilor în setul deschis, deci nu o putem da nici noi — la un loc de munte, verifică manual ce stație s-a ales.",
"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": {
"distanta": {
"metoda": "linie_dreapta",
"detaliu": "Distanţele sunt geodezice, în linie dreaptă pe suprafaţa Pământului (WGS84) — nu pe drum."
}
}
}
GEThttps://oneapi.ro/api/locations/v1/meteo/langa?lat=46.77&lng=23.59&raza_km=50
{
"data": {
"punct": {
"lat": 46.77,
"lng": 23.59,
"sursa": "coordonate"
},
"raza_km": 50,
"inregistrari": 5,
"statii": [
{
"wsi": "0-20000-0-15120",
"nume": "Cluj-Napoca",
"latitudine": 46.777778,
"longitudine": 23.571389,
"fara_catalog": false,
"localitate": {
"cod_siruta": 54975,
"nume": "Cluj-Napoca"
},
"judet": "Cluj",
"judet_cod": "CJ",
"primul_an": 1921,
"ultimul_an": 2026,
"zile_cu_date": 38525,
"parametri": [
"ff",
"p",
"r",
"ta",
"tn",
"tx"
],
"distanta_km": 1.7
}
],
"observatie": "Măsurătorile vin de la STAȚIE, nu din localitate. În relief variat — și România are mult — o vale și un vârf la 15 km distanță pot avea climă complet diferită. Folosește `distanta_km` ca să judeci cât de reprezentativă e. ANM nu publică altitudinea stațiilor în setul deschis, deci nu o putem da nici noi — la un loc de munte, verifică manual ce stație s-a ales.",
"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": {
"distanta": {
"metoda": "linie_dreapta",
"detaliu": "Distanţele sunt geodezice, în linie dreaptă pe suprafaţa Pământului (WGS84) — nu pe drum."
}
}
}
GEThttps://oneapi.ro/api/locations/v1/meteo/langa?lat=44.43&lng=26.10&raza_km=30
{
"data": {
"punct": {
"lat": 44.43,
"lng": 26.1,
"sursa": "coordonate"
},
"raza_km": 30,
"inregistrari": 3,
"statii": [
{
"wsi": "0-20000-0-15422",
"nume": "Bucuresti-Filaret",
"latitudine": 44.411944,
"longitudine": 26.093889,
"fara_catalog": false,
"localitate": {
"cod_siruta": 179132,
"nume": "București"
},
"judet": "București",
"judet_cod": "B",
"primul_an": 1895,
"ultimul_an": 2026,
"zile_cu_date": 48080,
"parametri": [
"ff",
"p",
"r",
"ta",
"tn",
"tx"
],
"distanta_km": 2.1
}
],
"observatie": "Măsurătorile vin de la STAȚIE, nu din localitate. În relief variat — și România are mult — o vale și un vârf la 15 km distanță pot avea climă complet diferită. Folosește `distanta_km` ca să judeci cât de reprezentativă e. ANM nu publică altitudinea stațiilor în setul deschis, deci nu o putem da nici noi — la un loc de munte, verifică manual ce stație s-a ales.",
"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": {
"distanta": {
"metoda": "linie_dreapta",
"detaliu": "Distanţele sunt geodezice, în linie dreaptă pe suprafaţa Pământului (WGS84) — nu pe drum."
}
}
}
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. |
| 404 | negasit | The requested place has no coordinates (check siruta). |
| 422 | validare | You gave no place, gave both forms at once, or gave statie (this route searches around a PLACE). |
| 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": "You gave no place, gave both forms at once, or gave statie (this route searches around a PLACE).",
"detalii": {
"siruta": [
"The value sent does not satisfy the parameter rule."
]
}
}
}