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#
meteo1 créditoPrevisão horária e diária para uma coordenada arbitrária.
Parâmetros
| Parâmetro | Tipo | Por omissão | Descrição |
|---|---|---|---|
lat | float | — | Latitude, −90 a 90. Obrigatório. |
lon | float | — | Longitude, −180 a 180. Obrigatório. |
days | int | 7 | Aceita-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. |
elevation | float (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. |
timezone | IANA zone | UTC | A zona em que os agregados diários são cortados, e o desfasamento que cada data-hora traz de volta. |
hourly | csv | all | Subconjunto dos campos horários, para encolher a carga útil. Os nomes são os da referência dos campos. |
include_daily | bool | true | Incluir 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#
meteo1 créditoA 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#
meteo1 créditoAs condições neste momento para uma coordenada, interpoladas entre passos do modelo.
meteo1 créditoO 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#
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.
| Campo | Unidade | Notas |
|---|---|---|
temperature_2m | °C | Corrigido para o relevo quando a altitude é conhecida |
apparent_temperature | °C | Formulação de Steadman; válida em toda a gama |
relative_humidity_2m | % | |
dewpoint_2m | °C | |
precipitation | mm | Total do passo, descumulado |
precipitation_probability_proxy | % | Heurística, não uma probabilidade de ensemble. Veja abaixo. |
weather_code | OMM | Código de ícone, com limiares em mm/h e não no total do passo |
cloud_cover | % | |
wind_speed_10m | m/s | |
wind_direction_10m | ° | Direção de onde o vento sopra |
wind_gust_10m | m/s | Máximo do passo |
pressure_msl | hPa | Reduzida ao nível do mar |
surface_pressure | hPa | À altitude do local |
shortwave_radiation | W/m² | Média do passo |
uv_index | 0–11+ | Estimado. Veja abaixo. |
cape | J/kg | Potencial de trovoada |
is_day | 0/1 | |
visibility | m | Só ICON-EU e ICON-D2 |
cloud_cover_low | % | Só modelos ICON |
cloud_cover_mid | % | Só modelos ICON |
cloud_cover_high | % | Só modelos ICON |
precipitation_type | OMM | Só ECMWF Peça-o em hourly= |
snow_depth | m | O que está no chão, não o que cai. Só ICON Peça-o em hourly= |
snow_water_equivalent | mm | O que o manto de neve dá ao derreter. Só ICON Peça-o em hourly= |
snow_line_altitude | m | Veja neve. ICON-EU e ICON-D2 Peça-o em hourly= |
freezing_level_altitude | m | Isotérmica de 0 °C. Só ICON Peça-o em hourly= |
soil_temperature_0cm | °C | Superfície. Só ICON global e ICON-EU Peça-o em hourly= |
soil_temperature_8cm | °C | Zona radicular, camada de 7–28 cm. Só ICON global e ICON-EU Peça-o em hourly= |
shortwave_radiation_direct | W/m² | Componente direta. Só ICON Peça-o em hourly= |
shortwave_radiation_diffuse | W/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 | °C | Do passo, onde o modelo o publica Peça-o em hourly= |
temperature_2m_min | °C | Do passo, onde o modelo o publica Peça-o em hourly= |
skin_temperature | °C | Superfície do solo, não o ar Peça-o em hourly= |
heat_index | °C | NWS dos EUA. Devolve a temperatura simples abaixo de 27 °C Peça-o em hourly= |
wind_chill | °C | Environment Canada. Devolve a temperatura simples acima de 10 °C Peça-o em hourly= |
wind_speed_100m | m/s | Aplicações de energia eólica Peça-o em hourly= |
wind_direction_100m | ° | Peça-o em hourly= |
wind_beaufort | 0–12 | Peça-o em hourly= |
cloud_cover_octas | 0–8 | Peça-o em hourly= |
snowfall | mm | Equivalente em água, não espessura de neve fresca Peça-o em hourly= |
total_column_water_vapour | kg/m² | Peça-o em hourly= |
pressure_tendency | hPa | Peça-o em hourly= |
weather_description | texto | Peç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#
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.model | Modelo | Resolução | Runs | Horizonte |
|---|---|---|---|---|
mf_arome | Météo-France AROME | 1.3 km | 8/dia | 51 h |
dwd_icon_d2 | DWD ICON-D2 | 2.2 km | 4/dia | 48 h |
noaa_hrrr | NOAA HRRR | 3 km | 4/dia | 48 h |
dwd_icon_eu | DWD ICON-EU | 6.5 km | 2/dia | 120 h |
dwd_icon | DWD ICON | 13 km | 2/dia | 180 h |
ecmwf_ifs | ECMWF IFS | 28 km | 2/dia | 240 h |
ecmwf_aifs | ECMWF AIFS | 28 km | 2/dia | 360 h |
ecmwf_wave | ECMWF wave | 28 km | 2/dia | 240 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#
meteo1 créditoPercentis 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#
meteo1 créditoPartí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
| Campo | Unidade | O que lhe diz |
|---|---|---|
snow_depth | m | O que está no chão. Vinte centímetros podem cair e derreter, ou assentar sobre oitenta que já lá estavam. |
snow_water_equivalent | mm | O que dá ao derreter. Meio metro de neve fofa e meio metro de neve compactada são coisas muito diferentes. |
snow_line_altitude | m | A altitude acima da qual a precipitação cai como neve. |
freezing_level_altitude | m | Altura 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#
meteo1 créditoAltura, 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#
meteo1 créditoCaudal 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]
}
}
| Campo | Significado |
|---|---|
river_discharge | Caudal 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_index | Saturaçã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.