Locations v1 / Meteo
Annual climate indicators
A station's annual climate indicators: tropical days, frost days, icy nights, days with precipitation above a threshold — year by year, on the thresholds you ask for.
GET
https://oneapi.ro/api/locations/v1/meteo/indicatori
Query parameters
NameTypeDescriptionAccepted values
sirutaoptional
integer | null
The SIRUTA code of the place. Mutually exclusive with
lat+lng and with statie.
1
latoptional
number | null
The latitude of the point (with
lng).
43 – 49
lngoptional
number | null
The longitude of the point (with
lat).
20 – 30
statieoptional
string | null
The WSI code, if you want a particular station.
max 32 car.
de_la_anuloptional
integer | null
The first year of the range.
1850 – 2100
la_anuloptional
integer | null
The last year of the range.
1850 – 2100
baza_incalzireoptional
number | null
The base temperature for heating, °C (18 by default).
0 – 30
baza_racireoptional
number | null
The base temperature for cooling, °C (22 by default).
0 – 40
How it behaves
- The thresholds are neither invented by us nor hidden:
praguriwrites them out in every response (frost = minimum below 0 °C, tropical day = maximum at least 30 °C, extreme heat day = maximum at least 35 °C, tropical night = minimum at least 20 °C). - Day counts are affected by gaps exactly as degree days are: a year with 200 measured days has fewer frost days without having been milder.
an_completis the flag every comparison depends on. - If you only need degree days,
/locations/v1/meteo/grade-zilereturns the same figures, without the rest.
What it is for
- Assessing the frost risk of an agricultural site, over decades of observations.
- Documenting the trend in extreme heat days for a town, for a climate adaptation plan.
- Estimating the stress infrastructure is under from tropical nights and frost days.
Response structure
FieldTypeDescription
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.statie.wsi
string
The station's WMO identifier.
data.statie.nume
string
The name, exactly as the source publishes it.
data.statie.latitudine
number
Latitude, in decimal degrees (WGS 84).
data.statie.longitudine
number
Longitude, in decimal degrees (WGS 84).
data.statie.fara_catalog
boolean
true if the station has a series but no catalogue record (no name, no coordinates, invisible in geographic searches).
data.statie.localitate.cod_siruta
integer
SIRUTA code of the territorial unit.
data.statie.localitate.nume
string
The name, exactly as the source publishes it.
data.statie.judet
string
The county the value refers to.
data.statie.judet_cod
string
County code, two letters.
data.statie.primul_an
integer
The first year with measurements.
data.statie.ultimul_an
integer
The last year with measurements.
data.statie.zile_cu_date
integer
How many measured days the station has in total.
data.statie.parametri
array
The codes of the parameters published:
ta/tn/tx temperatures, r precipitation, ff wind, p sea-level pressure.
data.statie.distanta_km
number
Distance in kilometres, as the crow flies.
data.praguri
object
The definitions used for each indicator, plus the degree-day bases.
data.praguri.baza_incalzire
integer
The base used for heating, °C.
data.praguri.baza_racire
integer
The base used for cooling, °C.
data.praguri.inghet
string
data.praguri.zi_tropicala
string
data.praguri.zi_caniculara
string
data.praguri.noapte_tropicala
string
data.praguri.zi_cu_precipitatii
string
data.inregistrari
integer
How many years are in the response.
data.ani[].an
integer
The calendar year.
data.ani[].zile
integer
How many days of the year have a measurement of any kind.
data.ani[].zile_cu_temperatura
integer
How many days of the year have a measured temperature.
data.ani[].an_complet
boolean
true at 350 or more days with a temperature. Compare only years with true.
data.ani[].temp_medie_anuala
number
The annual mean temperature, °C.
data.ani[].grade_zile_incalzire
number
Heating degree days, summed over the year.
data.ani[].grade_zile_racire
number
Cooling degree days, summed over the year.
data.ani[].zile_cu_inghet
integer
Days with a minimum temperature below 0 °C.
data.ani[].zile_tropicale
integer
Days with a maximum of at least 30 °C.
data.ani[].zile_caniculare
integer
Days with a maximum of at least 35 °C.
data.ani[].nopti_tropicale
integer
Days with a minimum of at least 20 °C — the nights that do not cool down.
data.ani[].precipitatii_totale_mm
integer
The year's total precipitation, mm.
data.ani[].zile_cu_precipitatii
integer
How many days of the year had MEASURABLE precipitation (above 0 mm). Days with traces are not counted here — the climatological convention keeps them separate.
data.ani[].zile_cu_urme
integer
How many days of the year had only traces of precipitation (0–0.05 mm): it rained, but below the measurement threshold. Add them to
zile_cu_precipitatii if you want „days on which something fell".
data.observatie
string
A note on how to read the response: a computation convention or a limit of the data.
data.reprezentativitate
object
How well the station describes the requested place.
data.reprezentativitate.sursa
string
data.reprezentativitate.distanta_km
number
Distance in kilometres, as the crow flies.
data.reprezentativitate.buna
boolean
data.reprezentativitate.observatie
string
A note on how to read the value next to it.
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/indicatori?siruta=54975&de_la_anul=2010
{
"data": {
"punct": {
"lat": 46.775869737866465,
"lng": 23.60115997499754,
"sursa": "siruta",
"cod_siruta": 54975,
"nume": "Cluj-Napoca",
"nivel": "uat_centroid"
},
"statie": {
"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": 2.3
},
"praguri": {
"baza_incalzire": 18,
"baza_racire": 22,
"inghet": "temperatura minimă sub 0 °C",
"zi_tropicala": "temperatura maximă ≥ 30 °C",
"zi_caniculara": "temperatura maximă ≥ 35 °C",
"noapte_tropicala": "temperatura minimă ≥ 20 °C",
"zi_cu_precipitatii": "cantitate măsurabilă, peste 0 mm — zilele cu urme se numără separat, în `zile_cu_urme`"
},
"inregistrari": 17,
"ani": [
{
"an": 2026,
"zile": 233,
"zile_cu_temperatura": 233,
"an_complet": false,
"temp_medie_anuala": 12.3,
"grade_zile_incalzire": 1687.9,
"grade_zile_racire": 97.6,
"zile_cu_inghet": 58,
"zile_tropicale": 40,
"zile_caniculare": 8,
"nopti_tropicale": 2,
"precipitatii_totale_mm": 300,
"zile_cu_precipitatii": 76,
"zile_cu_urme": 25
}
],
"observatie": "Gradele-zile sunt SUME pe an: un an cu date incomplete dă o sumă mai mică fără să fie mai cald. Filtrează pe `an_complet` înainte de a compara ani între ei sau de a calcula tendințe.",
"reprezentativitate": {
"sursa": "cea_mai_apropiata_statie",
"distanta_km": 2.3,
"buna": true,
"observatie": "Stația e suficient de aproape pentru o estimare rezonabilă a climei locului."
},
"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/indicatori?statie=0-20000-0-15120
{
"data": {
"punct": null,
"statie": {
"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"
]
},
"praguri": {
"baza_incalzire": 18,
"baza_racire": 22,
"inghet": "temperatura minimă sub 0 °C",
"zi_tropicala": "temperatura maximă ≥ 30 °C",
"zi_caniculara": "temperatura maximă ≥ 35 °C",
"noapte_tropicala": "temperatura minimă ≥ 20 °C",
"zi_cu_precipitatii": "cantitate măsurabilă, peste 0 mm — zilele cu urme se numără separat, în `zile_cu_urme`"
},
"inregistrari": 106,
"ani": [
{
"an": 2026,
"zile": 233,
"zile_cu_temperatura": 233,
"an_complet": false,
"temp_medie_anuala": 12.3,
"grade_zile_incalzire": 1687.9,
"grade_zile_racire": 97.6,
"zile_cu_inghet": 58,
"zile_tropicale": 40,
"zile_caniculare": 8,
"nopti_tropicale": 2,
"precipitatii_totale_mm": 300,
"zile_cu_precipitatii": 76,
"zile_cu_urme": 25
}
],
"observatie": "Gradele-zile sunt SUME pe an: un an cu date incomplete dă o sumă mai mică fără să fie mai cald. Filtrează pe `an_complet` înainte de a compara ani între ei sau de a calcula tendințe.",
"reprezentativitate": {
"sursa": "statie_ceruta",
"observatie": "Ai cerut stația explicit; nu se aplică nicio aproximare geografică."
},
"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."
}
}
}
GEThttps://oneapi.ro/api/locations/v1/meteo/indicatori?statie=0-20000-0-15208
{
"data": {
"punct": null,
"statie": {
"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"
]
},
"praguri": {
"baza_incalzire": 18,
"baza_racire": 22,
"inghet": "temperatura minimă sub 0 °C",
"zi_tropicala": "temperatura maximă ≥ 30 °C",
"zi_caniculara": "temperatura maximă ≥ 35 °C",
"noapte_tropicala": "temperatura minimă ≥ 20 °C",
"zi_cu_precipitatii": "cantitate măsurabilă, peste 0 mm — zilele cu urme se numără separat, în `zile_cu_urme`"
},
"inregistrari": 125,
"ani": [
{
"an": 2026,
"zile": 233,
"zile_cu_temperatura": 233,
"an_complet": false,
"temp_medie_anuala": 13.3,
"grade_zile_incalzire": 1552,
"grade_zile_racire": 145.2,
"zile_cu_inghet": 52,
"zile_tropicale": 57,
"zile_caniculare": 16,
"nopti_tropicale": 0,
"precipitatii_totale_mm": 364.5,
"zile_cu_precipitatii": 75,
"zile_cu_urme": 6
}
],
"observatie": "Gradele-zile sunt SUME pe an: un an cu date incomplete dă o sumă mai mică fără să fie mai cald. Filtrează pe `an_complet` înainte de a compara ani între ei sau de a calcula tendințe.",
"reprezentativitate": {
"sursa": "statie_ceruta",
"observatie": "Ai cerut stația explicit; nu se aplică nicio aproximare geografică."
},
"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."
}
}
}
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 | Three distinct causes, which the message keeps apart: the station does not exist, the place has no coordinates in the nomenclature, or no station has a daily series imported. |
| 422 | validare | No place given, or two forms at once. |
| 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": "No place given, or two forms at once.",
"detalii": {
"siruta": [
"The value sent does not satisfy the parameter rule."
]
}
}
}