climatememory programadores

Referência da API

API Meteorologia

Previsões globais até 15 dias a partir do ECMWF e dos modelos nacionais de alta resolução, corrigidas para a altitude real do seu terreno. Um único scope — meteo — cobre toda esta página.

Previsão#

GEThttps://api.climatememory.com/v1/forecastscope: meteo1 crédito

Previsão horária e diária para uma coordenada arbitrária.

Parâmetros

ParâmetroTipoPor omissãoDescrição
latfloatLatitude, −90 a 90. Obrigatório.
lonfloatLongitude, −180 a 180. Obrigatório.
daysint7Aceita-se 1–16, mas o horizonte servido é de 15 dias, pelo que um 16 devolve 15. Os dias 11–15 são uma tendência, não uma previsão — veja abaixo.
elevationfloat (m)A altitude real do seu ponto. Forneça-a e a temperatura é corrigida pela diferença face ao relevo suavizado do modelo. Costuma valer 1–3 °C em zonas de colinas.
timezoneIANA zoneUTCA zona em que os agregados diários são cortados, e o desfasamento que cada data-hora traz de volta.
hourlycsvallSubconjunto dos campos horários, para encolher a carga útil. Os nomes são os da referência dos campos.
include_dailybooltrueIncluir o bloco diário.

Resposta

{
  "latitude": 48.85,
  "longitude": 2.35,
  "timezone": "Europe/Paris",
  "grid": {
    "latitude": 48.85, "longitude": 2.35,
    "distance_km": 0.42, "resolution_km": 1.3
  },
  "elevation": {
    "applied": true,
    "model_elevation_m": 91.0,
    "location_elevation_m": 113,
    "temperature_offset_c": -0.14
  },
  "source": {
    "model": "mf_arome",
    "model_run": "20260801T00Z",
    "reference_time": "2026-08-01T00:00:00+00:00",
    "data_age_hours": 3.95,
    "stale": false,
    "attribution": "Data: Météo-France (etalab-2.0)"
  },
  "hourly": {
    "time": ["2026-08-01T00:00:00+02:00", "..."],
    "temperature_2m": [18.1, 17.9, 17.6, "..."],
    "apparent_temperature": [17.4, "..."],
    "weather_code": [0, 1, 2, "..."]
  },
  "daily": {
    "date": ["2026-08-01", "..."],
    "temperature_2m_max": [26.6, "..."],
    "temperature_2m_min": [16.2, "..."],
    "precipitation_sum": [0.0, "..."],
    "uv_index_max": [7.6, "..."],
    "sunrise": ["2026-08-01T06:24:00+02:00", "..."],
    "sunset": ["2026-08-01T21:24:00+02:00", "..."],
    "daylight_hours": [15.0, "..."]
  }
}

Vale a pena ler o bloco grid. distance_km diz-lhe a que distância está o centro da célula do modelo do ponto que pediu, e resolution_km quão grosseira é essa célula. Juntos, dizem-lhe quão literalmente deve tomar os números: 0,4 km de uma célula de 1,3 km é a sua rua; 12 km de uma célula de 28 km é a sua região.

O bloco elevation diz o que foi feito, não o que foi pedido. applied: false quer dizer que não houve correção — ou não passou elevation, ou o relevo do modelo já coincidia. Nunca assuma que a correção correu só porque a pediu.

Encolher a carga útil

O bloco horário completo para 15 dias são cerca de 32 campos × 360 horas. Se traça três deles, peça três:

GET /v1/forecast?lat=48.85&lon=2.35&days=3
    &hourly=temperature_2m,precipitation,weather_code
    &include_daily=false

O mesmo preço — o custo está em ler o arquivo, não em serializá-lo — mas um décimo dos bytes e visivelmente mais rápido de processar num telemóvel.

Previsão por cidade#

GEThttps://api.climatememory.com/v1/forecast/city/{country}/{slug}scope: meteo1 crédito

A mesma resposta, resolvida através do catálogo de cidades.

Prefira isto a coordenadas em cru sempre que puder. O catálogo fornece duas coisas que uma coordenada não pode: a altitude verdadeira da cidade, para que a correção de relevo se aplique sem que a forneça, e o seu fuso horário, para que os agregados diários sejam cortados no dia local certo.

GET /v1/forecast/city/dz/alger      # slug francês
GET /v1/forecast/city/dz/algiers    # slug inglês — a mesma cidade
GET /v1/forecast/city/fr/paris

country é um código ISO-3166-1 alfa-2, em minúsculas. O slug ignora acentos: bejaia encontra Béjaïa. Um slug desconhecido devolve 404 city_not_found com um vetor suggestions — mostre-o em vez de um beco sem saída.

Todos os parâmetros de consulta de /v1/forecast continuam a valer, exceto lat, lon e elevation, que o catálogo fornece. Passar timezone substitui o da cidade, o que quase nunca é o que quer.

Não fixe no código slugs que adivinhou. Resolva o nome uma vez por /v1/geocode, guarde o país e o slug que ele devolve, e use esses. A geocodificação não custa créditos, por isso fazer isto como deve ser é grátis.

Condições atuais#

GEThttps://api.climatememory.com/v1/currentscope: meteo1 crédito

As condições neste momento para uma coordenada, interpoladas entre passos do modelo.

GEThttps://api.climatememory.com/v1/current/city/{country}/{slug}scope: meteo1 crédito

O mesmo, através do catálogo de cidades.

A temperatura, a humidade, o vento e a pressão são interpolados linearmente para o instante presente, entre os dois passos do modelo que o enquadram.

A precipitação não é interpolada, e isso é deliberado. Um valor horário de precipitação é um total ao longo de um intervalo, não uma leitura num instante. Interpolá-lo inventaria chuva num minuto em que o modelo a colocou noutra hora. Em vez disso recebe o valor do passo que o contém — um número real sobre um intervalo real.

Use isto para mostrar o «agora mesmo». Para qualquer coisa que vá comparar ao longo do tempo, use /v1/forecast e leia a hora que quer: a série é estável, ao passo que o agora mexe-se debaixo dos seus pés entre duas chamadas.

Referência dos campos#

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

A mesma tabela em JSON, com as unidades e quais os campos por omissão. Sem chave.

Campos horários

21 destes voltam por omissão. Os restantes são seus por um pedido — nomeie-os em hourly=, separados por vírgulas — e ficam retidos por custo, não por dúvida: cada campo armazenado é uma leitura comprimida separada, por isso uma resposta por omissão a trazer os 45 faria todos pagar pelos poucos que querem a espessura da neve.

GET /v1/forecast?lat=45.19&lon=5.72&hourly=temperature_2m,snow_line_altitude,soil_temperature_8cm

Um campo que um modelo não publica volta como null no troço da previsão desse modelo, em vez de desaparecer da resposta — por isso uma cadeia que começa no AROME e continua no ICON-EU devolve visibility do princípio ao fim, nulo nas primeiras 51 horas. Um nome de campo desconhecido é um 400 unknown_field, com a correspondência mais próxima sugerida; antes era ignorado em silêncio.

CampoUnidadeNotas
temperature_2m°CCorrigido para o relevo quando a altitude é conhecida
apparent_temperature°CFormulação de Steadman; válida em toda a gama
relative_humidity_2m%
dewpoint_2m°C
precipitationmmTotal do passo, descumulado
precipitation_probability_proxy%Heurística, não uma probabilidade de ensemble. Veja abaixo.
weather_codeOMMCódigo de ícone, com limiares em mm/h e não no total do passo
cloud_cover%
wind_speed_10mm/s
wind_direction_10m°Direção de onde o vento sopra
wind_gust_10mm/sMáximo do passo
pressure_mslhPaReduzida ao nível do mar
surface_pressurehPaÀ altitude do local
shortwave_radiationW/m²Média do passo
uv_index0–11+Estimado. Veja abaixo.
capeJ/kgPotencial de trovoada
is_day0/1
visibilitymSó ICON-EU e ICON-D2
cloud_cover_low%Só modelos ICON
cloud_cover_mid%Só modelos ICON
cloud_cover_high%Só modelos ICON
precipitation_typeOMMSó ECMWF Peça-o em hourly=
snow_depthmO que está no chão, não o que cai. Só ICON Peça-o em hourly=
snow_water_equivalentmmO que o manto de neve dá ao derreter. Só ICON Peça-o em hourly=
snow_line_altitudemVeja neve. ICON-EU e ICON-D2 Peça-o em hourly=
freezing_level_altitudemIsotérmica de 0 °C. Só ICON Peça-o em hourly=
soil_temperature_0cm°CSuperfície. Só ICON global e ICON-EU Peça-o em hourly=
soil_temperature_8cm°CZona radicular, camada de 7–28 cm. Só ICON global e ICON-EU Peça-o em hourly=
shortwave_radiation_directW/m²Componente direta. Só ICON Peça-o em hourly=
shortwave_radiation_diffuseW/m²Componente difusa. Só ICON Peça-o em hourly=
solar_elevation°Calculado a partir da data-hora e da coordenada Peça-o em hourly=
solar_azimuth°Calculado a partir da data-hora e da coordenada Peça-o em hourly=
temperature_2m_max°CDo passo, onde o modelo o publica Peça-o em hourly=
temperature_2m_min°CDo passo, onde o modelo o publica Peça-o em hourly=
skin_temperature°CSuperfície do solo, não o ar Peça-o em hourly=
heat_index°CNWS dos EUA. Devolve a temperatura simples abaixo de 27 °C Peça-o em hourly=
wind_chill°CEnvironment Canada. Devolve a temperatura simples acima de 10 °C Peça-o em hourly=
wind_speed_100mm/sAplicações de energia eólica Peça-o em hourly=
wind_direction_100m°Peça-o em hourly=
wind_beaufort0–12Peça-o em hourly=
cloud_cover_octas0–8Peça-o em hourly=
snowfallmmEquivalente em água, não espessura de neve fresca Peça-o em hourly=
total_column_water_vapourkg/m²Peça-o em hourly=
pressure_tendencyhPaPeça-o em hourly=
weather_descriptiontextoPeça-o em hourly=

Campos diários

date, temperature_2m_max, temperature_2m_min, temperature_2m_mean, precipitation_sum, wind_speed_max, wind_gust_max, shortwave_radiation_sum (MJ/m²), uv_index_max, sunrise, sunset, daylight_hours, weather_code.

Agregados em dias de calendário locais, não em UTC. Um dia parcial em qualquer dos extremos do intervalo é omitido em vez de ser reportado com um máximo enganador — por isso um pedido de 7 dias pode legitimamente devolver 6 linhas diárias.

Dois campos são estimativas, e preferimos dizê-lo a que venha a descobri-lo.

O uv_index é derivado da elevação solar e da radiação de banda larga, não de uma coluna de ozono. Exato até cerca de ±1 unidade — que chega para «leve chapéu», não para uma afirmação médica.

O precipitation_probability_proxy é uma estimativa, não uma probabilidade. Um modelo determinístico não tem dispersão de onde a derivar. Chama-se _proxy para que ninguém o confunda com o produto de ensemble servido por /v1/probability, que é uma frequência verdadeira sobre 51 membros.

Combina dois termos. O primeiro pergunta se a chuva da célula chega ao seu ponto: a taxa armazenada é uma média sobre toda a célula da grelha, por isso a 28 km — 780 km² — uma média fraca pode ser um aguaceiro real sobre uma pequena parte dela. Tomando a distribuição sub-grelha das taxas como Weibull, com uma forma dada pelo tamanho da célula e pela própria média do modelo, obtém-se em forma fechada a probabilidade de um ponto da célula exceder 0,1 mm/h. O segundo termo limita o que um céu encoberto e quase saturado pode reclamar onde o modelo não põe chuva nenhuma na célula. Ambos são depois escalados pelo crédito que um run merece nesse prazo, e é por isso que a mesma precipitação se lê mais baixa ao nono dia do que ao primeiro.

Por consequência, o mesmo lugar pode ler-se de forma diferente em dois modelos, e deve: uma célula de 2,2 km e uma de 28 km discordam genuinamente sobre o que significa uma média fraca. As aplicações de consumo que citam um único número escondem isto.

Modelos e resolução#

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

Que modelos estão em serviço, o que cada um cobre e quão fresco é. Sem chave.

Servimos o modelo mais fino que cobre o seu ponto e o seu prazo. Nunca escolhe um; a escolha é reportada em source.model para que saiba sempre qual respondeu.

Os modelos de alta resolução são todos de curto prazo — a 1 km a atmosfera torna-se caótica ao fim de dois dias, pelo que prever mais longe não teria sentido — e a resolução vai portanto descendo à medida que a previsão avança:

dia 0 ─────── dia 2 ─────── dia 5 ───────────────── dia 15
  AROME 1,3 km (França)
  ICON-D2 2,2 km (Alemanha, Alpes, Benelux)
  HRRR 3 km (EUA e sul do Canadá)
              ICON-EU 6,5 km (Europa)
                          ICON 13 km · ECMWF 28 km (global)
                                              AIFS (só tendência)
source.modelModeloResoluçãoRunsHorizonte
mf_aromeMétéo-France AROME1.3 km8/dia51 h
dwd_icon_d2DWD ICON-D22.2 km4/dia48 h
noaa_hrrrNOAA HRRR3 km4/dia48 h
dwd_icon_euDWD ICON-EU6.5 km2/dia120 h
dwd_iconDWD ICON13 km2/dia180 h
ecmwf_ifsECMWF IFS28 km2/dia240 h
ecmwf_aifsECMWF AIFS28 km2/dia360 h
ecmwf_waveECMWF wave28 km2/dia240 h

As transições no limite do domínio de um modelo são fundidas, para que duas localidades de um lado e do outro de uma fronteira nunca discordem por um degrau.

Os dias 11–15 são uma tendência, não uma previsão. A essa distância a perícia aproxima-se da climatologia. Publicamo-la porque é pedida; tome-a como sentido de evolução, e se a mostrar, diga-o.

/v1/models não precisa de chave, o que faz dele a coisa certa para consultar a partir de uma página de estado ou para verificar antes de comprar: reporta o run mais recente de cada modelo e a sua idade, pelo que «os dados estão frescos?» tem resposta sem gastar um crédito.

Probabilidades de ensemble#

GEThttps://api.climatememory.com/v1/probabilityscope: meteo1 crédito

Percentis e probabilidades de chuva a partir do ensemble de 51 membros do ECMWF.

Uma previsão única diz 22 °C na quinta-feira. Isso é um palpite apresentado como um facto. Este endpoint responde à pergunta sobre a qual decide de facto: qual é a confiança, e qual é a probabilidade de chuva que vale a pena considerar.

É calculado a partir do ensemble do ECMWF — o mesmo modelo corrido 50 vezes a partir de condições iniciais ligeiramente diferentes. Onde as corridas concordam, a previsão é confiante. Onde se dispersam, a própria atmosfera é incerta, e nenhum modelo, por melhor que seja, lhe pode dizer mais.

{
  "members": 50,
  "hourly": {
    "time": ["2026-08-01T00:00:00+00:00"],
    "temperature_2m_p10": [26.4],
    "temperature_2m_p50": [26.78],
    "temperature_2m_p90": [27.3],
    "temperature_2m_spread": [0.4],
    "precipitation_probability_0_1mm": [10.0],
    "precipitation_probability_1_0mm": [0.0],
    "precipitation_probability_5_0mm": [0.0],
    "precipitation_probability_10_0mm": [0.0],
    "precipitation_p90": [0.1]
  }
}

Como se lê

p10 e p90 enquadram os 80 % centrais dos membros: um em cada dez espera mais frio do que p10, um em cada dez mais quente do que p90. Um spread de 0,4 °C é uma situação assente em que pode confiar; 3 °C quer dizer que os modelos discordam e que deve dizê-lo aos seus utilizadores em vez de escolher um.

Os limiares de chuva são decisões e não números redondos — 0,1 mm é molha de todo, 1 mm é leve casaco, 5 e 10 mm são isto é um problema. precipitation_p90 é o mau cenário: só um membro em cada dez é mais chuvoso.

Apenas duas variáveis, temperatura e precipitação. Acrescentar nuvens, vento e pressão duplicaria a largura de banda de toda a plataforma por números sobre os quais ninguém decide nada.

Qualidade do ar#

GEThttps://api.climatememory.com/v1/air-qualityscope: meteo1 crédito

Partículas, ozono, NO₂, SO₂, CO e poeiras do Sara, do Copernicus CAMS.

Este é o endpoint que mais importa no Norte de África e no Mediterrâneo. Um episódio de poeiras leva as PM10 acima de mil microgramas por metro cúbico durante dias seguidos, o que é uma decisão de saúde e não um número, e está mal coberto pelos serviços gratuitos de consumo.

{
  "current": {
    "pm2_5": 38.7,
    "band": "poor",
    "who_guidelines_ug_m3": {"pm2_5": 15.0, "pm10": 45.0,
                             "nitrogen_dioxide": 25.0, "ozone": 100.0}
  },
  "hourly": {
    "time": ["2026-08-01T00:00:00+00:00"],
    "pm2_5": [38.7], "pm10": [85.8], "ozone": [43.4],
    "nitrogen_dioxide": [19.0], "dust_aod_550nm": [0.24]
  },
  "units": {"pm2_5": "ug/m3", "pm10": "ug/m3", "dust_aod_550nm": "1"}
}

Todas as concentrações estão em µg/m³, a unidade em que a qualidade do ar é citada em todo o lado. dust_aod_550nm é uma espessura ótica e não tem unidade: acima de cerca de 0,5 o céu está visivelmente enevoado, acima de 1,0 o sol fica apagado.

Os valores-guia de curto prazo da OMS viajam em cada resposta para que um número possa ser situado sem ir procurar. band segue o índice europeu de qualidade do ar para as PM2,5: bom, razoável, moderado, mau, muito mau, extremamente mau.

Neve e cota de neve#

Quatro campos, e respondem a perguntas diferentes. snowfall é quanta cai; os restantes descrevem o que está no chão e onde.

Peça-os pelo nome — não estão na resposta por omissão:

GET /v1/forecast?lat=45.19&lon=5.72&hourly=snowfall,snow_depth,snow_water_equivalent,snow_line_altitude,freezing_level_altitude
CampoUnidadeO que lhe diz
snow_depthmO que está no chão. Vinte centímetros podem cair e derreter, ou assentar sobre oitenta que já lá estavam.
snow_water_equivalentmmO que dá ao derreter. Meio metro de neve fofa e meio metro de neve compactada são coisas muito diferentes.
snow_line_altitudemA altitude acima da qual a precipitação cai como neve.
freezing_level_altitudemAltura da isotérmica de 0 °C, tipicamente algumas centenas de metros acima da cota de neve.

A cota de neve é a que vale a pena ler. «Chove aos 800 m e neva aos 1200» é uma decisão sobre a qual uma estação de esqui, uma autoridade rodoviária ou um condutor podem agir; «3 mm de precipitação» não é. Também importa no Norte de África — o Atlas tem áreas de esqui em Chréa e Tikjda, e os planaltos de Sétif, Batna e Djelfa ficam acima dos 1000 m.

Os glaciares reportam dezenas de metros de espessura de neve, porque é assim que o modelo representa o gelo permanente e não por erro de medição. A neve sazonal mais funda da Terra anda pelos 11 m — tome tudo o que passe disso como gelo, não como meteorologia.

Estes vêm do ICON do DWD, que cobre o mundo a 13 km. Os dados abertos do ECMWF publicam a espessura de neve mas não a cota de neve, pelo que este é um dos casos em que o modelo mais grosseiro é o mais útil. snow_line_altitude é um produto regional: o ICON-EU e o ICON-D2 publicam-no, o ICON global não, por isso fora da Europa recebe o nível de congelação e a espessura, mas não a cota.

Mar — estado do mar#

GEThttps://api.climatememory.com/v1/marinescope: meteo1 crédito

Altura, direção e período das ondas a partir do modelo de ondas do ECMWF, em todo o mundo, até 10 dias.

{
  "hourly": {
    "time": ["2026-08-01T00:00:00+00:00"],
    "wave_height": [0.32],
    "wave_direction": [264.3],
    "wave_period": [3.79],
    "wave_peak_period": [4.21]
  }
}

A altura das ondas é a altura significativa — a média do terço mais alto das ondas, que é aproximadamente o que um observador no mar reporta. As ondas individuais chegam ao dobro disso, e é esse o número que importa se está a decidir se sai. A direção é de onde as ondas vêm, como a direção do vento.

Um ponto em terra devolve 404 not_at_sea em vez de uma lista de nulos. O modelo de ondas não tem valor sobre terra por construção, e dizê-lo é mais útil do que uma resposta que se lê como uma falha de serviço. Se deixa os utilizadores largar um pino, trate este código explicitamente.

Rios#

GEThttps://api.climatememory.com/v1/hydrologyscope: meteo1 crédito

Caudal dos rios a partir do Copernicus GloFAS numa rede hidrográfica de 0,05°, até 10 dias.

Responde ao que nenhum modelo meteorológico consegue: não quanta chuva cai a montante, mas quanta água chega aqui — um número diferente, separado da chuva por uma bacia, por um estado de humidade do solo e por um dia ou dois de percurso.

{
  "disclaimer": "Information only. Only national and regional authorities
                 are authorised to issue flood warnings.",
  "daily": {
    "time": ["2026-08-01T00:00:00+00:00"],
    "river_discharge": [4.953],
    "soil_wetness_index": [0.448]
  }
}
CampoSignificado
river_dischargeCaudal médio em m³/s nas 24 horas terminadas nesse instante. Zero quer dizer que o modelo não tem rio nessa célula, e não que um rio secou.
soil_wetness_indexSaturação da bacia, de 0 seco a 1 saturado. Valores altos significam que mais chuva escorre em vez de infiltrar.

Isto não é um aviso de cheia e não pode ser apresentado como tal. A licença Copernicus reserva os avisos de cheias às autoridades nacionais e regionais dentro da sua área de responsabilidade, e é esse o arranjo certo — quem está autorizado a avisar é também quem pode cortar uma estrada e evacuar uma aldeia.

Caudal em m³/s, sim. Um alerta, uma cor de gravidade ou uma instrução para agir, não, tenham os números o aspeto que tiverem nesse dia. A isenção de responsabilidade viaja no corpo de cada resposta, e não só aqui, e está lá para chegar aos seus utilizadores mesmo que esta página não tenha chegado.