climatememory développeurs

Référence de l'API

API Météo

Prévisions mondiales jusqu'à 15 jours depuis l'ECMWF et les modèles nationaux à haute résolution, corrigées du relief à votre altitude réelle. Un seul scope — meteo — couvre toute cette page.

Prévision#

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

Prévision horaire et quotidienne pour une coordonnée quelconque.

Paramètres

ParamètreTypeDéfautDescription
latfloatLatitude, de −90 à 90. Obligatoire.
lonfloatLongitude, de −180 à 180. Obligatoire.
daysint71 à 16 sont acceptés, mais l'horizon servi est de 15 jours : un 16 renvoie donc 15. Les jours 11 à 15 sont une tendance, pas une prévision — voir plus bas.
elevationfloat (m)Altitude réelle de votre point. Fournissez-la et la température est corrigée de l'écart avec le relief lissé du modèle. Vaut typiquement 1 à 3 °C en zone de relief.
timezoneIANA zoneUTCLe fuseau sur lequel les agrégats quotidiens sont découpés, et le décalage que porte chaque horodatage renvoyé.
hourlycsvallSous-ensemble des champs horaires, pour alléger la charge utile. Les noms sont ceux de la référence des champs.
include_dailybooltrueInclure le bloc quotidien.

Réponse

{
  "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, "..."]
  }
}

Le bloc grid mérite d'être lu. distance_km vous dit à quelle distance le centre de la maille du modèle se trouve du point demandé, et resolution_km à quel point cette maille est grossière. Ensemble, ils indiquent au pied de quelle lettre prendre les chiffres : 0,4 km depuis une maille de 1,3 km, c'est votre rue ; 12 km depuis une maille de 28 km, c'est votre région.

Le bloc elevation dit ce qui a été fait, pas ce qui a été demandé. applied: false signifie qu'aucune correction n'a eu lieu — soit vous n'avez pas passé d'elevation, soit le relief du modèle correspondait déjà. Ne supposez jamais que la correction a tourné du seul fait que vous l'avez demandée.

Alléger la charge utile

Le bloc horaire complet sur 15 jours fait environ 32 champs × 360 heures. Si vous en tracez trois, demandez-en trois :

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

Même prix — le coût est la lecture de l'archive, pas sa sérialisation — mais un dixième des octets, et un décodage nettement plus rapide sur un téléphone.

Prévision par ville#

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

La même réponse, résolue via le catalogue de villes.

Préférez ceci aux coordonnées brutes quand vous le pouvez. Le catalogue fournit deux choses qu'une coordonnée ne peut pas donner : l'altitude réelle de la ville, si bien que la correction de relief s'applique sans que vous la fournissiez, et son fuseau horaire, si bien que les agrégats quotidiens sont découpés sur la bonne journée locale.

GET /v1/forecast/city/dz/alger      # slug français
GET /v1/forecast/city/dz/algiers    # slug anglais — même ville
GET /v1/forecast/city/fr/paris

country est un code ISO-3166-1 alpha-2, en minuscules. slug est insensible aux accents : bejaia trouve Béjaïa. Un slug inconnu renvoie 404 city_not_found avec un tableau suggestions — affichez-le plutôt qu'une impasse.

Tous les paramètres de requête de /v1/forecast s'appliquent encore, sauf lat, lon et elevation, que le catalogue fournit. Passer timezone écrase celui de la ville, ce qui n'est presque jamais ce que vous voulez.

N'inscrivez pas en dur des slugs devinés. Résolvez le nom une fois via /v1/geocode, stockez le pays et le slug qu'il renvoie, et servez-vous de ceux-là. Le géocodage ne coûte aucun crédit : le faire proprement est donc gratuit.

Conditions actuelles#

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

Les conditions à l'instant présent pour une coordonnée, interpolées entre deux pas de modèle.

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

Les mêmes, via le catalogue de villes.

Température, humidité, vent et pression sont interpolés linéairement à l'instant présent, entre les deux pas de modèle qui l'encadrent.

Les précipitations ne sont pas interpolées, et c'est délibéré. Une valeur horaire de précipitation est un cumul sur un intervalle, pas une lecture à un instant. L'interpoler inventerait de la pluie dans une minute que le modèle avait placée dans une autre heure. Vous obtenez à la place la valeur du pas qui contient l'instant — un nombre réel portant sur un intervalle réel.

Servez-vous-en pour un affichage « en ce moment ». Pour tout ce que vous comparerez dans le temps, utilisez /v1/forecast et lisez l'heure voulue : la série est stable, alors que maintenant bouge sous vos pieds entre deux appels.

Référence des champs#

GEThttps://api.climatememory.com/v1/fieldsaucune clé nécessaire0 crédits

Le même tableau en JSON, avec les unités et les champs renvoyés par défaut. Aucune clé nécessaire.

Champs horaires

21 d'entre eux reviennent par défaut. Les autres sont à vous pour peu que vous les demandiez — nommez-les dans hourly=, séparés par des virgules — et ils sont retenus pour une question de coût, non de fiabilité : chaque champ stocké est une lecture compressée distincte, si bien qu'une réponse par défaut qui porterait les 45 ferait payer tous les appelants pour les quelques-uns qui veulent la hauteur de neige.

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

Un champ qu'un modèle ne publie pas revient à null sur la portion de prévision de ce modèle, plutôt que de disparaître de la réponse — de sorte qu'un enchaînement qui commence sur AROME et continue sur ICON-EU renvoie visibility d'un bout à l'autre, à null pendant les 51 premières heures. Un nom de champ inconnu donne un 400 unknown_field, avec la correspondance la plus proche suggérée ; il était auparavant ignoré en silence.

ChampUnitéRemarques
temperature_2m°CCorrigée du relief quand l'altitude est connue
apparent_temperature°CFormulation de Steadman ; valable sur toute la plage
relative_humidity_2m%
dewpoint_2m°C
precipitationmmCumul sur le pas, décumulé
precipitation_probability_proxy%Heuristique, pas une probabilité d'ensemble. Voir plus bas.
weather_codeOMMCode d'icône, seuillé sur des mm/h et non sur le cumul du pas
cloud_cover%
wind_speed_10mm/s
wind_direction_10m°Direction d'où vient le vent
wind_gust_10mm/sMaximum sur le pas
pressure_mslhPaRamenée au niveau de la mer
surface_pressurehPaÀ l'altitude du lieu
shortwave_radiationW/m²Moyenne sur le pas
uv_index0–11+Estimé. Voir plus bas.
capeJ/kgPotentiel orageux
is_day0/1
visibilitymICON-EU et ICON-D2 uniquement
cloud_cover_low%Modèles ICON uniquement
cloud_cover_mid%Modèles ICON uniquement
cloud_cover_high%Modèles ICON uniquement
precipitation_typeOMMECMWF uniquement À demander dans hourly=
snow_depthmCe qui est au sol, pas ce qui tombe. ICON uniquement À demander dans hourly=
snow_water_equivalentmmCe que le manteau neigeux rend en fondant. ICON uniquement À demander dans hourly=
snow_line_altitudemVoir neige. ICON-EU et ICON-D2 À demander dans hourly=
freezing_level_altitudemIsotherme 0 °C. ICON uniquement À demander dans hourly=
soil_temperature_0cm°CSurface. ICON global et ICON-EU uniquement À demander dans hourly=
soil_temperature_8cm°CZone racinaire, couche 7–28 cm. ICON global et ICON-EU uniquement À demander dans hourly=
shortwave_radiation_directW/m²Composante directe. ICON uniquement À demander dans hourly=
shortwave_radiation_diffuseW/m²Composante diffuse. ICON uniquement À demander dans hourly=
solar_elevation°Calculée depuis l'horodatage et la coordonnée À demander dans hourly=
solar_azimuth°Calculé depuis l'horodatage et la coordonnée À demander dans hourly=
temperature_2m_max°CSur le pas, là où le modèle le publie À demander dans hourly=
temperature_2m_min°CSur le pas, là où le modèle le publie À demander dans hourly=
skin_temperature°CSurface du sol, pas l'air À demander dans hourly=
heat_index°CUS NWS. Renvoie la température brute en dessous de 27 °C À demander dans hourly=
wind_chill°CEnvironnement Canada. Renvoie la température brute au-dessus de 10 °C À demander dans hourly=
wind_speed_100mm/sApplications éoliennes À demander dans hourly=
wind_direction_100m°À demander dans hourly=
wind_beaufort0–12À demander dans hourly=
cloud_cover_octas0–8À demander dans hourly=
snowfallmmÉquivalent en eau, pas la hauteur de neige fraîche À demander dans hourly=
total_column_water_vapourkg/m²À demander dans hourly=
pressure_tendencyhPaÀ demander dans hourly=
weather_descriptiontexteÀ demander dans hourly=

Champs quotidiens

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.

Agrégés sur des journées civiles locales, pas UTC. Une journée partielle à l'une ou l'autre extrémité de la plage est omise plutôt que rapportée avec un maximum trompeur — une demande de 7 jours peut donc légitimement renvoyer 6 lignes quotidiennes.

Deux champs sont des estimations, et nous préférons le dire plutôt que vous le laisser découvrir.

uv_index est dérivé de l'élévation solaire et du rayonnement large bande, pas d'une colonne d'ozone. Précis à environ ±1 unité — assez pour « mettez un chapeau », pas pour une affirmation médicale.

precipitation_probability_proxy est une estimation, pas une probabilité. Un modèle déterministe n'a aucune dispersion d'où en tirer une. Il porte le suffixe _proxy pour que personne ne le confonde avec le produit d'ensemble servi par /v1/probability, qui est une véritable fréquence sur 51 membres.

Il combine deux termes. Le premier se demande si la pluie de la maille atteint votre point : le taux stocké est une moyenne sur toute la maille, donc à 28 km — 780 km² — une moyenne faible peut être une vraie averse sur une petite partie de celle-ci. En prenant la distribution sous-maille des taux pour une loi de Weibull, de forme fixée par la taille de la maille et par la moyenne du modèle lui-même, on obtient sous forme close la probabilité qu'un point de la maille dépasse 0,1 mm/h. Le second terme borne ce qu'un ciel couvert et proche de la saturation peut prétendre là où le modèle ne met aucune pluie dans la maille. Les deux sont ensuite pondérés par le crédit qu'un run mérite à cette échéance, ce qui explique que la même pluie se lise plus bas au jour 9 qu'au jour 1.

Par conséquent un même lieu peut se lire différemment selon deux modèles, et c'est normal : une maille de 2,2 km et une maille de 28 km sont réellement en désaccord sur ce que signifie une moyenne faible. Les applications grand public qui n'affichent qu'un chiffre masquent cela.

Modèles et résolution#

GEThttps://api.climatememory.com/v1/modelsaucune clé nécessaire0 crédits

Quels modèles sont en service, ce que chacun couvre, la fraîcheur de chacun. Aucune clé nécessaire.

Nous servons le modèle le plus fin qui couvre à la fois votre point et votre échéance. Vous n'en choisissez jamais un ; le choix est rapporté dans source.model, si bien que vous pouvez toujours savoir lequel a répondu.

Les modèles à haute résolution sont tous à courte échéance — à 1 km l'atmosphère devient chaotique en moins de deux jours, prévoir plus loin n'aurait donc aucun sens — et la résolution baisse par paliers à mesure que la prévision avance :

jour 0 ────── jour 2 ────── jour 5 ───────────────── jour 15
  AROME 1,3 km (France)
  ICON-D2 2,2 km (Allemagne, Alpes, Benelux)
  HRRR 3 km (États-Unis et sud du Canada)
              ICON-EU 6,5 km (Europe)
                          ICON 13 km · ECMWF 28 km (mondial)
                                              AIFS (tendance seule)
source.modelModèleRésolutionRunsHorizon
mf_aromeMétéo-France AROME1.3 km8/jour51 h
dwd_icon_d2DWD ICON-D22.2 km4/jour48 h
noaa_hrrrNOAA HRRR3 km4/jour48 h
dwd_icon_euDWD ICON-EU6.5 km2/jour120 h
dwd_iconDWD ICON13 km2/jour180 h
ecmwf_ifsECMWF IFS28 km2/jour240 h
ecmwf_aifsECMWF AIFS28 km2/jour360 h
ecmwf_waveECMWF wave28 km2/jour240 h

Les transitions au bord du domaine d'un modèle sont fondues, de sorte que deux villes de part et d'autre d'une frontière ne divergent jamais par un saut brutal.

Les jours 11 à 15 sont une tendance, pas une prévision. À cette échéance, la performance s'approche de la climatologie. Nous la publions parce qu'elle est demandée ; traitez-la comme un sens d'évolution, et si vous l'affichez, dites-le.

/v1/models ne demande aucune clé, ce qui en fait l'endpoint à interroger depuis une page d'état ou avant d'acheter : il rapporte le dernier run de chaque modèle et son âge, si bien que « la donnée est-elle fraîche » se répond sans dépenser un crédit.

Probabilités d'ensemble#

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

Percentiles et probabilités de pluie depuis l'ensemble ECMWF à 51 membres.

Une prévision unique dit 22 °C jeudi. C'est une supposition présentée comme un fait. Cet endpoint répond à la question sur laquelle vous décidez réellement : à quel point est-ce sûr, et quelle est la probabilité de pluie qui mérite qu'on s'organise autour.

Il est calculé depuis l'ensemble de l'ECMWF — le même modèle lancé 50 fois depuis des conditions initiales légèrement différentes. Là où les runs s'accordent, la prévision est sûre. Là où ils se dispersent, c'est l'atmosphère elle-même qui est incertaine, et aucun modèle si bon soit-il ne peut vous en dire davantage.

{
  "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]
  }
}

Comment le lire

p10 et p90 encadrent les 80 % centraux des membres : un sur dix s'attend à plus froid que p10, un sur dix à plus chaud que p90. Un spread de 0,4 °C est une situation établie à laquelle vous pouvez vous fier ; 3 °C signifie que les modèles divergent, et il vaut mieux le dire à vos utilisateurs que d'en choisir un.

Les seuils de pluie sont des décisions plutôt que des chiffres ronds — 0,1 mm c'est mouillé, tout court, 1 mm c'est prenez un manteau, 5 et 10 mm c'est ça devient un problème. precipitation_p90 est le mauvais cas : un membre sur dix seulement est plus arrosé.

Deux variables seulement, température et précipitations. Ajouter les nuages, le vent et la pression doublerait la bande passante de toute la plateforme pour des chiffres sur lesquels personne ne décide.

Qualité de l'air#

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

Particules, ozone, NO₂, SO₂, CO et poussière saharienne, depuis Copernicus CAMS.

C'est l'endpoint qui compte le plus en Afrique du Nord et sur le pourtour méditerranéen. Un épisode de poussière pousse les PM10 au-delà de mille microgrammes par mètre cube plusieurs jours d'affilée, ce qui relève d'une décision de santé plutôt que d'un chiffre, et c'est mal couvert par les services grand public gratuits.

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

Toutes les concentrations sont en µg/m³, l'unité dans laquelle la qualité de l'air se cite partout. dust_aod_550nm est une épaisseur optique et n'a pas d'unité : au-delà de 0,5 environ le ciel est visiblement voilé, au-delà de 1,0 le soleil est atténué.

Les valeurs guides court terme de l'OMS voyagent dans chaque réponse, de sorte qu'un chiffre peut être situé sans aller le chercher ailleurs. band suit l'indice européen de qualité de l'air pour les PM2,5 : bon, correct, moyen, mauvais, très mauvais, extrêmement mauvais.

La neige et la limite pluie-neige#

Quatre champs, et ils répondent à des questions différentes. snowfall, c'est ce qui tombe ; les autres décrivent ce qui est au sol, et où.

Demandez-les nommément — ils ne sont pas dans la réponse par défaut :

GET /v1/forecast?lat=45.19&lon=5.72&hourly=snowfall,snow_depth,snow_water_equivalent,snow_line_altitude,freezing_level_altitude
ChampUnitéCe qu'il vous dit
snow_depthmCe qui est au sol. Vingt centimètres peuvent tomber et fondre, ou se poser sur quatre-vingts déjà présents.
snow_water_equivalentmmCe que cela rend en fondant. Un demi-mètre de poudreuse et un demi-mètre de neige tassée sont deux choses très différentes.
snow_line_altitudemL'altitude au-dessus de laquelle les précipitations tombent en neige.
freezing_level_altitudemHauteur de l'isotherme 0 °C, typiquement quelques centaines de mètres au-dessus de la limite pluie-neige.

C'est la limite pluie-neige qui mérite d'être lue. « Il pleut à 800 m et il neige à 1 200 » est une information sur laquelle une station de ski, un gestionnaire de route ou un conducteur peut agir ; « 3 mm de précipitations » ne l'est pas. Cela compte aussi en Afrique du Nord — l'Atlas a des domaines skiables à Chréa et Tikjda, et les hauts plateaux de Sétif, Batna et Djelfa dépassent 1 000 m.

Les glaciers rapportent des dizaines de mètres de hauteur de neige, parce que c'est ainsi que le modèle représente la glace permanente et non par erreur de mesure. La neige saisonnière la plus profonde sur terre avoisine 11 m — au-delà, considérez qu'il s'agit de glace, pas de météo.

Ces champs viennent d'ICON, de la DWD, qui couvre le monde à 13 km. Les données ouvertes de l'ECMWF publient la hauteur de neige mais pas la limite pluie-neige : c'est donc un cas où le modèle le plus grossier est le plus utile. snow_line_altitude est un produit régional — ICON-EU et ICON-D2 le publient, ICON global non, si bien qu'en dehors de l'Europe vous obtenez l'isotherme et la hauteur, mais pas la limite elle-même.

Mer — état de la mer#

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

Hauteur, direction et période des vagues depuis le modèle de vagues de l'ECMWF, dans le monde entier, jusqu'à 10 jours.

{
  "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]
  }
}

La hauteur de vague est la hauteur significative — la moyenne du tiers des vagues les plus hautes, ce qui correspond à peu près à ce que rapporte un observateur en mer. Les vagues individuelles atteignent environ le double, et c'est ce chiffre-là qui compte si vous décidez de sortir ou non. La direction est celle d'où viennent les vagues, comme pour le vent.

Un point à terre renvoie 404 not_at_sea plutôt qu'une liste de null. Le modèle de vagues n'a aucune valeur au-dessus des terres par construction, et le dire est plus utile qu'une réponse qui ressemble à une panne de service. Si vous laissez vos utilisateurs placer un point, traitez ce code explicitement.

Rivières#

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

Débit des rivières depuis Copernicus GloFAS sur un réseau hydrographique à 0,05°, jusqu'à 10 jours.

Cet endpoint répond à ce qu'aucun modèle météo ne peut donner : non pas combien de pluie tombe en amont, mais combien d'eau arrive ici — un tout autre chiffre, séparé de la pluie par un bassin versant, un état d'humidité du sol et un jour ou deux de temps de trajet.

{
  "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]
  }
}
ChampSignification
river_dischargeDébit moyen en m³/s sur les 24 heures s'achevant à cet instant. Zéro signifie que le modèle n'a aucune rivière dans cette maille, pas qu'une rivière s'est asséchée.
soil_wetness_indexSaturation du bassin versant, de 0 sec à 1 saturé. Des valeurs élevées signifient que la pluie supplémentaire ruisselle au lieu de s'infiltrer.

Ceci n'est pas une alerte de crue et ne doit pas être présenté comme telle. La licence Copernicus réserve les alertes de crue aux autorités nationales et régionales dans leur zone de responsabilité, et c'est la bonne organisation — ceux qui sont habilités à alerter sont aussi ceux qui peuvent fermer une route et évacuer un village.

Un débit en m³/s, oui. Une alerte, une couleur de gravité ou une consigne d'agir, non, quelle que soit l'allure des chiffres ce jour-là. La clause de non-responsabilité voyage dans chaque corps de réponse, pas seulement ici, et elle y est pour atteindre vos utilisateurs même si cette page ne les a pas atteints.