climatememory programadores

Referência da API

API Graus-dia

Graus-dia de aquecimento e de arrefecimento a partir da reanálise horária ERA5-Land, desde 1950, em qualquer ponto de terra firme — incluindo os sítios sem estação meteorológica num raio de 60 km. Um único scope — dju — cobre toda esta página.

Graus-dia#

GEThttps://api.climatememory.com/v1/degree-daysscope: dju2 créditos, +1 por cada período completo de 365,25 dias do intervalo

Graus-dia de aquecimento e de arrefecimento para uma coordenada.

Parâmetros

ParâmetroTipoPor omissãoDescrição
latfloatObrigatório.
lonfloatObrigatório.
basenumber | preset | csv18Qualquer temperatura de base em °C, ou uma predefinição: uk (15,5), ashrae (18,333), iso, france, eurostat. Até 60 separadas por vírgulas, sem custo adicional — veja abaixo.
methodstringhourlyhourly, costic, mean ou eurostat. Quem decide isto é o seu contrato, não nós.
startISO date1 de janeiro do ano de fimMáximo de 10 anos por pedido.
endISO datehoje
typestringbothHDD, CDD ou both.
breakdownstringmonthlydaily, weekly, monthly ou yearly.
elevationfloat (m)A altitude real do seu local. Desloca a série da altitude da célula para a sua — veja abaixo.
formatstringjsonjson ou csv. O CSV é uma funcionalidade dos planos pagos.
{
  "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 } ]
}

O bloco quality não é decoração. Um coverage abaixo de 1,0 quer dizer que faltavam horas no arquivo. provisional_days conta os dias preenchidos a partir de previsão em vez de reanálise final, porque o ERA5-Land publica com cerca de cinco dias de atraso.

Se está a liquidar um contrato com estes números, verifique os dois. Um total calculado sobre 0,98 de cobertura não está errado, mas não é a mesma afirmação que um sobre 1,0 — e a diferença é invisível em totals.

O que é um grau-dia, num parágrafo

Um grau-dia de aquecimento mede quanto o ar exterior esteve abaixo de uma temperatura de base, e durante quanto tempo. Na base 18 °C, uma hora a 16 °C contribui (18 − 16) / 24 = 0.083 HDD. Some as horas e tem um número proporcional à energia de que um edifício precisou. Os graus-dia de arrefecimento são o espelho: quanto acima da base. É a maneira habitual de comparar uma época de aquecimento com outra depois de se ter retirado a meteorologia da comparação.

Muitas bases, um pedido, um preço#

GEThttps://api.climatememory.com/v1/degree-days?base=15,15.5,18,18.5,20scope: djusame as one base

Até 60 temperaturas de base numa só chamada, ao preço de uma.

Ler e descodificar a série horária é o custo inteiro de uma resposta de graus-dia. Uma vez esse vetor em memória, outra base é uma subtração sobre ele, por isso pedir sessenta custa o que custa pedir uma.

A resposta ganha um vetor by_base com todas as bases pela ordem em que as listou. totals e breakdown continuam a descrever a primeira, para que o código escrito antes disto existir continue a funcionar sem alterações.

"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 quando ainda não sabe que base reproduz os valores de um contrato, ou quando o mesmo edifício é liquidado em bases diferentes por partes diferentes — um senhorio na 15,5 e um comercializador de energia na 18 têm ambos razão, e isto devolve as duas numa só chamada.

Métodos de cálculo#

GEThttps://api.climatememory.com/v1/degree-days/compare-methodsscope: dju2 créditos, +1 por cada período completo de 365,25 dias do intervalo

Os quatro métodos sobre o mesmo período, lado a lado.

GEThttps://api.climatememory.com/v1/methodssem chave0 créditos

As definições dos métodos e as suas predefinições. Sem chave.

O método é um parâmetro porque quem o decide é o seu contrato, não nós. Os mesmos dados, a mesma base, o mesmo ano, em Argel:

MétodoHDD 18 °CCDD 18 °CQuando usá-lo
hourly781.91331.6Por omissão. Integra o défice horário — o mais fiel fisicamente.
costic741.71349.5DJU unifiés franceses. Exigido pelos contratos franceses de desempenho energético.
mean659.91267.8Média diária contra a base. A convenção internacional mais comum.
eurostat587.7656.6Estatísticas europeias. As bases estão fixadas pela definição e ignoram base.

O horário e a média diária diferem em 18 % sobre os mesmos dados. Não é uma diferença de arredondamento — é a diferença entre ganhar e perder uma discussão sobre uma fatura de energia. Escolha o método que reproduz os valores do seu contrato antes de se comprometer com um plano; é para isso que serve o compare-methods, e custa um pedido.

O eurostat ignora base por completo: a definição fixa os seus próprios limiares, e honrar o seu parâmetro produziria um número que não é um grau-dia Eurostat enquanto afirmava sê-lo.

/v1/methods não precisa de chave. Use-o para preencher um seletor de métodos na sua interface sem gastar nada, e sem fixar no código uma lista que vai envelhecer.

Graus-dia por cidade#

GEThttps://api.climatememory.com/v1/degree-days/city/{country}/{slug}scope: dju2 créditos, +1 por cada período completo de 365,25 dias do intervalo

O mesmo, com o fuso horário da cidade e a sua correção de ilha de calor urbana.

Aplica duas correções que uma coordenada nua não pode: o fuso horário da cidade, para que os dias sejam cortados localmente, e o seu desvio calibrado de ilha de calor urbana.

A reanálise subestima as zonas edificadas em 1–3 °C. Isso enviesa os graus-dia de arrefecimento por defeito — o que é material se está a dimensionar ar condicionado, e invisível se não souber que deve procurá-lo.

A elevation não se aplica neste caminho, e a omissão é deliberada. O desvio da cidade já é calculado contra estações normalizadas à altitude da própria cidade, por isso uma segunda correção de gradiente contaria a mesma altitude duas vezes — no mesmo sentido, e de forma suficientemente plausível para que ninguém desse por isso. Se precisa da altitude de um edifício concreto, use o endpoint por coordenada com elevation e abdique da correção de ilha de calor.

Graus-dia para o seu edifício, não para a célula da grelha#

GEThttps://api.climatememory.com/v1/degree-days?elevation={metres}scope: djusame

Correção de gradiente térmico da altitude da célula para a sua.

Uma estação meteorológica está à altitude a que está, e ninguém a pode subir 600 m pela encosta acima por si. A nossa fonte é um modelo, por isso a altitude do terreno da célula é um número no arquivo e a diferença é aritmética: 0,65 °C por cada 100 m. Ao longo de uma época de aquecimento, isso não é um erro de arredondamento.

É opcional, e a resposta diz exatamente o que fez:

"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."
}

A ressalva viaja na resposta e não apenas nesta página, porque quem ler o JSON daqui a seis meses não é quem leu a documentação.

Fixar uma célula, para que uma referência continue comparável#

GEThttps://api.climatememory.com/v1/cells/resolvescope: dju1 crédito

Que célula responderia por um ponto, e a que distância está.

GEThttps://api.climatememory.com/v1/degree-days/cell/{cell_id}scope: dju2 créditos, +1 por cada período completo de 365,25 dias do intervalo

Graus-dia para uma célula nomeada — sem procura da célula mais próxima, nunca.

Todas as outras formas de localização voltam a correr a procura da célula mais próxima em cada pedido, pelo que a resposta depende do que o arquivo tem hoje. É o comportamento certo para uma consulta pontual, e o errado para uma referência: uma comparação plurianual só é uma comparação se cada ano vier do mesmo sítio.

À medida que o arquivo se alarga, a célula mais próxima de um dado local muda — uma melhoria de cobertura que de outro modo chegaria aos seus dados como um degrau inexplicado.

# uma vez, na configuração
GET /v1/cells/resolve?lat=45.19&lon=5.72
  → { "id": "era5l_45.20_5.70", "distance_km": 1.4, "resolution_km": 9 }

# todas as vezes depois disso
GET /v1/degree-days/cell/era5l_45.20_5.70?base=18&start=2015-01-01&end=2025-12-31

distance_km é 0 num pedido fixado por construção: nomeou a célula, por isso nada foi substituído. Uma célula que já não existe devolve 404 cell_not_found em vez de cair em silêncio para uma vizinha — o que reintroduziria exatamente a substituição que a fixação evita.

/v1/cells/resolve é também a maneira barata de descobrir antes de pagar por dados que a célula mais próxima está a 60 km. Não descodifica nada e não lê série temporal nenhuma, e o preço reflete-o: um crédito.

Períodos de detalhe#

GEThttps://api.climatememory.com/v1/degree-days?breakdown={daily|weekly|monthly|yearly}scope: djusame

Agregar o mesmo pedido ao período em que o seu contrato se liquida.

Todas as respostas de graus-dia trazem um vetor breakdown agregado ao período que pedir. Os contratos liquidam-se em períodos diferentes, por isso os quatro estão disponíveis no mesmo pedido e ao mesmo preço.

PeríodoCada linha traz
dailydata, HDD, CDD, temperatura mínima/máxima/média
weeklyano e semana ISO, a data em que começa, totais
monthlyano, mês, totais — o valor por omissão
yearlyano, totais

As semanas são semanas ISO, por isso uma semana pertence ao ano que contém a sua quinta-feira. 1 de janeiro de 2023 cai na semana 52 de 2022, e é aí que a reportamos — que é o que a sua folha de cálculo também vai fazer, e discordar da folha de cálculo é como começa uma reunião de reconciliação.

Cada balde traz também days, para que um mês parcial no limite do seu intervalo seja visível em vez de silenciosamente curto. Um fevereiro com "days": 12 é um fevereiro que não deve comparar com um completo.

Totais mensais de um ano#

GEThttps://api.climatememory.com/v1/degree-days/monthlyscope: dju2 créditos

Doze totais mensais de um ano de calendário, sem série diária.

GEThttps://api.climatememory.com/v1/coveragesem chave0 créditos

O que o arquivo tem: primeiro e último dia com dados, e o eixo em que vai crescer. Sem chave.

Um atalho para o caso comum: ?lat=&lon=&year=2025 e voltam doze linhas. Os mesmos dados que /v1/degree-days?breakdown=monthly sobre o mesmo intervalo; menos parâmetros para errar.

/v1/coverage reporta o primeiro e o último dia do arquivo e a sua resolução, não precisa de chave, e é o que deve verificar antes de pedir um período junto ao limite presente — o ERA5-Land anda cerca de cinco dias atrasado, e os provisional_days na sua resposta são a consequência.

{
  "start": "1950-01-01",
  "end": "2026-07-29",        // último dia que TEM dados
  "axis_end": "2026-12-31",   // até onde este run vai deixar de crescer
  "hours": 671256, "axis_hours": 674976,
  "cells": 86274, "resolution_km": 9.0,
  "run": "world-1950-2026-p1000"
}

end e axis_end são perguntas diferentes, e só a primeira é sobre dados. Um run é escrito contra todo o calendário que virá a preencher — o arquivo 1950-2026 aloca todas as horas até 31 de dezembro de 2026 — e a atualização vai-o enchendo à medida que o Copernicus publica.

Até 2026-08-03 este endpoint reportava o eixo como end, pelo que creditava o arquivo com cerca de cinco meses de horas que estavam vazias. O end é o que pode pedir hoje; um pedido inteiramente para lá dele é um 404 outside_archive e não uma resposta bem formada com total zero.

Exportação CSV#

GEThttps://api.climatememory.com/v1/degree-days?format=csvscope: dju4× the JSON call

As linhas do detalhe como ficheiro CSV. Só planos pagos.

Acrescente format=csv a qualquer pedido de graus-dia. Recebe as linhas do breakdown como ficheiro CSV, com um nome que refere o local e as datas para que continue identificável seis meses depois numa pasta de transferências.

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

Só planos pagos, e com limites: o mesmo intervalo máximo de um pedido JSON, apenas linhas agregadas — nunca a série horária — e custa quatro créditos por cada um que a chamada JSON equivalente custa. Uma chave gratuita recebe 402 export_not_in_plan.

Isso é deliberado e não mesquinho. O arquivo é aquilo por que está a pagar, e uma exportação sem limites é como um concorrente o adquire numa tarde. São os limites que permitem que o formato exista de todo.

Histórico horário#

GEThttps://api.climatememory.com/v1/historicalscope: dju(years + 1) × (variables ÷ 2), rounded down, min 1

O arquivo de reanálise servido em cru: meteorologia horária desde 1950.

Parâmetros

ParâmetroTipoPor omissãoDescrição
latfloatObrigatório.
lonfloatObrigatório.
startISO dateO intervalo de um pedido tem teto — veja Planos.
endISO date
variablescsvum subconjunto razoávelPergunte a /v1/historical/variables o que este arquivo tem.
hourlybooltrueIncluir a série hora a hora.
dailyboolfalsetrue para cidadesIncluir agregados diários, cortados em dias de calendário locais.

O mesmo arquivo a partir do qual os graus-dia são construídos, servido diretamente: horário, desde 1950, numa grelha de 9 km, em toda a terra firme. O mesmo anfitrião e o mesmo scope dju — se pode chamar os graus-dia, pode chamar isto.

Hoje este arquivo tem temperatura e mais nada. Foi ingerido para os graus-dia, e os graus-dia precisam de uma variável. Esta página prometeu «humidade, vento, precipitação e radiação solar» até 2026-08-03 e o arquivo nunca teve nada disso.

/v1/historical/variables é a resposta que está sempre atual — lê o run promovido em vez desta frase, não precisa de chave, e não custa nada. Chame-o antes de construir contra um campo.

O que o torna digno de se pagar é a consistência. O registo de uma estação meteorológica carrega todas as mudanças de sítio, todas as mudanças de instrumento e todas as falhas da sua história, por isso uma tendência a trinta anos calculada a partir dele é em parte uma tendência da instrumentação. Uma reanálise não tem nada disso: o modelo é o mesmo modelo em todos os anos do registo.

Para valores diários ao longo de um período longo, ou para normais e tendências, use antes a API Clima — tem os campos diários já derivados, não tem a fronteira dos 9 km/1950, e responde a uma climatologia inteira numa só chamada.

Histórico por cidade#

GEThttps://api.climatememory.com/v1/historical/city/{country}/{slug}scope: dju(years + 1) × (variables ÷ 2), rounded down, min 1

Idêntico, com o fuso horário da cidade e a correção de ilha de calor.

Duas coisas que uma coordenada não pode trazer: o fuso horário da cidade, para que os dias sejam cortados onde a cidade realmente os vive, e a sua correção calibrada de ilha de calor urbana. Aqui o daily vale true por omissão, porque um pedido por cidade é quase sempre um pedido sobre dias.

Variáveis disponíveis#

GEThttps://api.climatememory.com/v1/historical/variablessem chave0 créditos

O que o arquivo tem neste momento, com unidades, e quais os campos derivados. Sem chave.

Lista o que o arquivo tem neste momento, com unidades, e quais os campos derivados em vez de armazenados. Um arquivo ingerido só para graus-dia tem apenas temperatura, e este endpoint di-lo com clareza em vez de devolver colunas de null.

Alguns campos são calculados em vez de armazenados: a humidade a partir do ponto de orvalho, a velocidade e a direção do vento a partir das componentes u e v. Guardar o que leva microssegundos a calcular acrescentaria um terço ao arquivo por nada — mas um campo derivado só aparece quando as suas fontes estão no run, e é por isso que a verdade sobre o que pode pedir é este endpoint, e não uma lista escrita numa página. No arquivo promovido hoje as fontes estão ausentes, pelo que a resposta é temperature_2m e mais nada.