oneapi
Sign in
Locations v1 / Meteo

Degree days

Heating and cooling degree days, computed against the thresholds you choose. The quantity used in energy work and in sizing building systems.

GET
https://oneapi.ro/api/locations/v1/meteo/grade-zile

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

  • Degree days are SUMS over a year. A year with incomplete data gives a smaller sum without having been warmer — which is why every year carries an_complet and zile_cu_temperatura. Filter on an_complet before comparing years or computing a trend.
  • The base temperatures are adjustable because there is no universal one: 18 °C and 22 °C are the usual European conventions, but an industrial process may need others.
  • This route is a projection of /meteo/indicatori — the same computation, only the degree-day fields. The two cannot arrive at different figures.

What it is for

  • Sizing a building's heating demand from the degree days of its location.
  • Normalising energy bills year on year: a colder year explains a larger bill.
  • Comparing two sites for an investment with heavy climate-control costs.

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.baza_incalzire integer The base used for heating, °C.
data.praguri.baza_racire integer The base used for cooling, °C.
data.praguri.definitie string The formula, written out, so you can reproduce the figures from the daily series.
data.inregistrari integer How many records the response holds.
data.ani[].an integer The calendar year.
data.ani[].zile_cu_temperatura integer How many days of the year have a measured temperature.
data.ani[].an_complet boolean true if the year has at least 350 days with a measured temperature. Compare only years with true.
data.ani[].temp_medie_anuala number The annual mean temperature, °C.
data.ani[].grade_zile_incalzire number The yearly sum of the differences below the heating base.
data.ani[].grade_zile_racire number The yearly sum of the differences above the cooling base.
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/grade-zile?siruta=54975&de_la_anul=2015
{
    "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,
            "definitie": "Grade-zile de încălzire = suma pe an a diferențelor (baza_incalzire − temperatura medie a zilei), doar pentru zilele mai reci decât baza. Răcirea, simetric, peste `baza_racire`."
        },
        "inregistrari": 12,
        "ani": [
            {
                "an": 2026,
                "zile_cu_temperatura": 233,
                "an_complet": false,
                "temp_medie_anuala": 12.3,
                "grade_zile_incalzire": 1687.9,
                "grade_zile_racire": 97.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": "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."
        }
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
404negasitThree 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.
422validareNo place given, or two forms at once.
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": "No place given, or two forms at once.",
        "detalii": {
            "siruta": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}