API de Grados-día
Grados-día de calefacción y de refrigeración a partir del reanálisis horario ERA5-Land, hasta 1950, en toda la superficie terrestre — incluidos los lugares sin estación meteorológica en 60 km a la redonda. Un único scope — dju — cubre toda esta página.
Grados-día#
dju2 créditos, +1 por cada periodo completo de 365,25 días del intervaloGrados-día de calefacción y de refrigeración para una coordenada.
Parámetros
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
lat | float | — | Obligatorio. |
lon | float | — | Obligatorio. |
base | number | preset | csv | 18 | Cualquier temperatura base en °C, o un preajuste: uk (15,5), ashrae (18,333), iso, france, eurostat. Hasta 60 separadas por comas, sin coste adicional — véase más abajo. |
method | string | hourly | hourly, costic, mean o eurostat. Lo decide su contrato, no nosotros. |
start | ISO date | 1 de enero del año final | Máximo 10 años por solicitud. |
end | ISO date | hoy | |
type | string | both | HDD, CDD o both. |
breakdown | string | monthly | daily, weekly, monthly o yearly. |
elevation | float (m) | — | Altitud real del terreno en su emplazamiento. Desplaza la serie desde la altitud de la celda a la suya — véase más abajo. |
format | string | json | json o csv. El CSV es exclusivo de los planes de pago. |
{
"location": {
"latitude": 36.75, "longitude": 3.06,
"grid_cell": { "latitude": 36.7, "longitude": 3.1,
"distance_km": 6.61, "resolution_km": 9 }
},
"parameters": {
"base_temperature_c": 18.0, "method": "hourly",
"start": "2025-07-01", "end": "2026-06-30"
},
"totals": { "hdd": 781.86, "cdd": 1331.61 },
"quality": {
"days": 365, "coverage": 1.0,
"missing_hours": 0, "provisional_days": 0
},
"breakdown": [ { "year": 2025, "month": 7, "hdd": 0.0, "cdd": 289.4, "days": 31 } ]
}
El bloque quality no es decorativo. Un
coverage inferior a 1.0 significa que faltaban horas en el archivo.
provisional_days cuenta los días rellenados a partir de la
predicción en lugar del reanálisis definitivo, porque ERA5-Land publica con unos
cinco días de latencia.
Si va a liquidar un contrato con estas cifras, revise ambas. Un total
calculado sobre una cobertura de 0,98 no es erróneo, pero no es la misma
afirmación que uno sobre 1,0 — y la diferencia es invisible en
totals.
Qué es un grado-día, en un párrafo
Un grado-día de calefacción mide cuánto por debajo de una temperatura base
estuvo el aire exterior, y durante cuánto tiempo. Con base 18 °C, una hora a
16 °C aporta (18 − 16) / 24 = 0.083 GDC. Sume las horas y tendrá una
cifra proporcional a la energía que un edificio necesitó. Los grados-día de
refrigeración son el espejo: cuánto por encima de la base. Es la forma
normalizada de comparar una temporada de calefacción con otra una vez retirada
la meteorología de la comparación.
Varias bases, una solicitud, un solo precio#
djusame as one baseHasta 60 temperaturas base en una sola llamada, al precio de una.
Leer y descodificar la serie horaria constituye todo el coste de una respuesta de grados-día. Una vez ese array está en memoria, una base más es solo una resta sobre él: pedir sesenta cuesta lo que cuesta pedir una.
La respuesta gana un array by_base con cada base en el orden en
que usted las enumeró. totals y breakdown siguen
describiendo la primera, de modo que el código escrito antes de que
esto existiera sigue funcionando sin cambios.
"by_base": [
{"base": 15.0, "hdd": 402.11, "cdd": 1731.4},
{"base": 15.5, "hdd": 431.02, "cdd": 1706.3},
{"base": 18.0, "hdd": 781.86, "cdd": 1331.6}
]
Útil cuando aún no sabe qué base reproduce las cifras de un contrato, o cuando el mismo edificio se liquida con bases distintas por partes distintas — un arrendador con 15,5 y una comercializadora con 18 tienen ambos razón, y esto devuelve ambas en una sola llamada.
Métodos de cálculo#
dju2 créditos, +1 por cada periodo completo de 365,25 días del intervaloLos cuatro métodos sobre el mismo periodo, uno al lado del otro.
Las definiciones de los métodos y sus preajustes. No requiere clave.
El método es un parámetro porque lo decide su contrato, no nosotros. Los mismos datos, la misma base, el mismo año, en Argel:
| Método | HDD 18 °C | CDD 18 °C | Cuándo usarlo |
|---|---|---|---|
hourly | 781.9 | 1331.6 | Por defecto. Integra el déficit horario — el más fiel físicamente. |
costic | 741.7 | 1349.5 | DJU unifiés franceses. Exigido por los contratos franceses de rendimiento energético. |
mean | 659.9 | 1267.8 | Media diaria frente a la base. La convención internacional más extendida. |
eurostat | 587.7 | 656.6 | Estadística europea. Los umbrales los fija la definición e ignoran base. |
El método horario y el de media diaria difieren un 18 % sobre los
mismos datos. Eso no es una diferencia de redondeo — es la diferencia
entre ganar y perder una discusión sobre una factura de energía. Elija el método
que reproduce las cifras de su contrato antes de comprometerse con un
plan; para eso está compare-methods, y cuesta una solicitud.
eurostat ignora base por completo: la definición
fija sus propios umbrales, y respetar su parámetro produciría una cifra que no
es un grado-día de Eurostat mientras dice serlo.
/v1/methods no necesita clave. Úselo para poblar un selector de
método en su interfaz sin gastar nada y sin incrustar una lista que quedará
obsoleta.
Grados-día por ciudad#
dju2 créditos, +1 por cada periodo completo de 365,25 días del intervaloLo mismo, con el huso horario de la ciudad y su corrección por isla de calor urbana.
Aplica dos correcciones que una coordenada pelada no permite: el huso horario de la ciudad, para que los días se corten localmente, y su desplazamiento por isla de calor urbana calibrado.
El reanálisis subestima las zonas edificadas en 1 a 3 °C. Eso sesga a la baja los grados-día de refrigeración — relevante si está dimensionando un aire acondicionado, e invisible si no sabe que hay que buscarlo.
elevation no se aplica en esta ruta, y la
omisión es deliberada. El desplazamiento urbano ya está calculado frente a
estaciones normalizadas a la altitud propia de la ciudad, de modo que una
segunda corrección por gradiente contaría dos veces la misma altitud — en el
mismo sentido, y de forma lo bastante plausible como para que nadie lo advierta.
Si necesita la altitud de un edificio concreto, use el endpoint por coordenada
con elevation y renuncie a la corrección por isla de calor.
Grados-día para su edificio, no para la celda de la malla#
djusameCorrección por gradiente térmico desde la altitud de la celda hasta la suya.
Una estación meteorológica está a la altitud a la que está, y nadie puede subirla 600 m por la ladera del valle por usted. Nuestra fuente es un modelo: la altitud del terreno de la celda es, pues, una cifra del archivo, y la diferencia es aritmética — 0,65 °C por cada 100 m. A lo largo de una temporada de calefacción eso no es un error de redondeo.
Es opcional, y la respuesta dice exactamente qué hizo:
"elevation": {
"applied": true,
"model_elevation_m": 42.0,
"location_elevation_m": 1200,
"temperature_offset_c": -7.53,
"caveat": "Lapse-rate correction. It assumes temperature falls smoothly with
height, which a valley floor under a winter inversion does not."
}
La advertencia viaja en la respuesta y no solo en esta página, porque quien lea ese JSON dentro de seis meses no es quien leyó la documentación.
Fijar una celda para que una línea de base siga siendo comparable#
dju1 créditoQué celda respondería por un punto, y a qué distancia está.
dju2 créditos, +1 por cada periodo completo de 365,25 días del intervaloGrados-día para una celda nombrada — nunca una búsqueda de la celda más próxima.
Cualquier otra forma de indicar un lugar vuelve a lanzar la búsqueda de la celda más próxima en cada solicitud: la respuesta depende, pues, de lo que el archivo contenga hoy. Es el comportamiento adecuado por defecto para una consulta puntual, y el equivocado para una línea de base — una comparación a varios años solo es una comparación si cada año procede del mismo sitio.
A medida que el archivo se amplía, la celda más próxima a un emplazamiento dado cambia — una mejora de la cobertura que, de otro modo, llegaría a sus datos como un escalón inexplicado.
# una vez, en la instalación
GET /v1/cells/resolve?lat=45.19&lon=5.72
→ { "id": "era5l_45.20_5.70", "distance_km": 1.4, "resolution_km": 9 }
# cada vez a partir de entonces
GET /v1/degree-days/cell/era5l_45.20_5.70?base=18&start=2015-01-01&end=2025-12-31
distance_km vale 0 en una solicitud fijada por
construcción: usted nombró la celda, así que no se sustituyó nada. Una celda que
ya no existe devuelve 404 cell_not_found en lugar de recurrir en
silencio a una vecina — lo que reintroduciría exactamente la sustitución que
usted fijó para evitar.
/v1/cells/resolve es además la forma barata de descubrir
antes de pagar por los datos que la celda más próxima está a 60 km. No
descodifica nada ni lee ninguna serie temporal, y por eso está tarificado en un
crédito.
Periodos de desglose#
djusameAgregar la misma solicitud al periodo sobre el que se liquida su contrato.
Cada respuesta de grados-día lleva un array breakdown agregado al
periodo que usted pida. Los contratos se liquidan sobre periodos distintos, así
que los cuatro están disponibles en la misma solicitud al mismo precio.
| Periodo | Cada fila lleva |
|---|---|
daily | fecha, GDC, GDR, temperatura mín./máx./media |
weekly | año y semana ISO, la fecha en que empieza, los totales |
monthly | año, mes, totales — el valor por defecto |
yearly | año, totales |
Las semanas son semanas ISO, de modo que una semana pertenece al año que contiene su jueves. El 1 de enero de 2023 cae en la semana 52 de 2022, y ahí lo informamos — que es lo que hará también su hoja de cálculo, y discrepar de la hoja de cálculo es como empieza una reunión de conciliación.
Cada intervalo lleva además days, de modo que un mes parcial en
el borde de su rango es visible en lugar de quedarse corto en silencio. Un
febrero con "days": 12 es un febrero que no debería comparar con
uno completo.
Totales mensuales de un año#
dju2 créditosDoce totales mensuales de un año natural, sin serie diaria.
Qué contiene el archivo: primer y último día con datos, y el eje hacia el que crecerá. No requiere clave.
Un atajo para el caso habitual:
?lat=&lon=&year=2025 y vuelven doce filas. Los mismos datos
que /v1/degree-days?breakdown=monthly sobre el mismo intervalo;
menos parámetros que equivocar.
/v1/coverage informa del primer y el último día del archivo y de
su resolución, no necesita clave, y es lo que conviene comprobar antes de pedir
un periodo cercano al borde presente — ERA5-Land va unos cinco días por detrás, y
provisional_days en su respuesta es la consecuencia.
{
"start": "1950-01-01",
"end": "2026-07-29", // último día que CONTIENE datos
"axis_end": "2026-12-31", // hasta dónde dejará de crecer esta pasada
"hours": 671256, "axis_hours": 674976,
"cells": 86274, "resolution_km": 9.0,
"run": "world-1950-2026-p1000"
}
end y axis_end son preguntas distintas, y
solo la primera trata de datos. Una pasada se escribe contra todo el
calendario que acabará llenando — el archivo 1950-2026 reserva cada hora hasta el
31 de diciembre de 2026 — y el relleno lo va ocupando conforme Copernicus
publica.
Hasta el 03/08/2026 este endpoint informaba del eje como end, de
modo que acreditaba al archivo unos cinco meses de horas que estaban vacías.
end es lo que usted puede pedir hoy; una solicitud enteramente más
allá es un 404 outside_archive en lugar de una respuesta bien
formada que sume cero.
Exportación CSV#
dju4× the JSON callLas filas del desglose como archivo CSV. Solo planes de pago.
Añada format=csv a cualquier solicitud de grados-día. Obtendrá
las filas de breakdown como archivo CSV, con un nombre basado en el
lugar y las fechas, de modo que siga siendo identificable seis meses después en
una carpeta de descargas.
year,month,hdd,cdd,days,t_mean,coverage,provisional
2024,1,205.03,2.88,31,11.48,1.0,false
2024,2,168.44,4.10,29,12.31,1.0,false
Solo planes de pago, y acotado: el mismo intervalo máximo
que una solicitud JSON, solo filas agregadas — nunca la serie horaria — y cuesta
cuatro créditos por cada uno que cuesta la llamada JSON equivalente. Una clave
gratuita recibe 402 export_not_in_plan.
Es deliberado, y no una concesión a regañadientes. Lo que usted paga es el archivo, y una exportación sin límites es la forma en que un competidor lo adquiere en una tarde. Son esos límites los que permiten que el formato exista siquiera.
Histórico horario#
dju(years + 1) × (variables ÷ 2), rounded down, min 1El archivo de reanálisis servido en bruto: meteorología horaria hasta 1950.
Parámetros
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
lat | float | — | Obligatorio. |
lon | float | — | Obligatorio. |
start | ISO date | — | El intervalo de una solicitud está acotado — véase Planes. |
end | ISO date | — | |
variables | csv | un subconjunto razonable | Pregunte a /v1/historical/variables qué contiene este archivo. |
hourly | bool | true | Incluir la serie hora a hora. |
daily | bool | false — true para ciudades | Incluir agregados diarios, cortados sobre días naturales locales. |
El mismo archivo con el que se construyen los grados-día, servido
directamente: horario, hasta 1950, sobre una malla de 9 km, en toda la
superficie terrestre. Mismo host y mismo scope dju — si puede
llamar a los grados-día, puede llamar a esto.
Hoy este archivo contiene la temperatura y nada más. Se ingirió para los grados-día, y los grados-día necesitan una variable. Esta página prometió «humedad, viento, precipitación y radiación solar» hasta el 03/08/2026, y el archivo no ha contenido nunca ninguna de ellas.
/v1/historical/variables es la respuesta siempre vigente — lee la
pasada promovida y no esta frase, no necesita clave y no cuesta nada. Llámelo
antes de construir sobre un campo.
Lo que hace que merezca pagarse es la coherencia. El registro de una estación meteorológica arrastra cada traslado, cada cambio de instrumento y cada laguna de su historia: una tendencia de treinta años calculada a partir de una es, en parte, una tendencia de la instrumentación. Un reanálisis no tiene nada de eso — el modelo es el mismo modelo para cada año del registro.
Para valores diarios sobre un periodo largo, o para normales y tendencias, use en su lugar la API de Clima — tiene los campos diarios ya derivados, no tiene frontera de 9 km ni de 1950, y responde a toda una climatología en una sola llamada.
Histórico por ciudad#
dju(years + 1) × (variables ÷ 2), rounded down, min 1Idéntico, con el huso horario de la ciudad y su corrección por isla de calor.
Dos cosas que una coordenada no puede llevar: el huso horario de la ciudad,
para que los días se corten donde la ciudad los vive realmente, y su corrección
calibrada por isla de calor urbana. daily vale true por defecto
aquí, porque una solicitud por ciudad es casi siempre una solicitud sobre
días.
Variables disponibles#
Qué contiene actualmente el archivo, con unidades, y qué campos son derivados. No requiere clave.
Enumera lo que el archivo contiene en este momento, con unidades, y
qué campos son derivados en lugar de almacenados. Un archivo ingerido solo para
grados-día contiene únicamente la temperatura, y este endpoint lo dice sin
rodeos en lugar de devolver columnas de null.
Algunos campos se calculan en lugar de almacenarse: la humedad a partir del
punto de rocío, la velocidad y la dirección del viento a partir de las
componentes u y v. Almacenar lo que se calcula en microsegundos añadiría un
tercio al archivo para nada — pero un campo derivado solo aparece cuando sus
fuentes están en la pasada, y por eso este endpoint, y no una lista
escrita en una página, es la verdad sobre lo que usted puede pedir. En el
archivo promovido hoy las fuentes están ausentes, así que la respuesta es
temperature_2m y nada más.