Aller au contenu
Le Vent
API REST en lecture seule · JSON

Vent, houle et marées
pour développeurs

Mesures en temps réel de 13 000+ stations vent dans le monde (≈ 35 sources : services météo nationaux, aéroports, balises de spots, réseaux communautaires), de ~470 bouées houlographes (15 réseaux), marées de ~2 000 ports avec coefficients, prévisions et vent animé mondial. Données agrégées et normalisées dans un schéma unique.

URL de basehttps://api.levent.live/api
AuthentificationEn-tête X-API-Key (ou ?apikey=)
FormatJSON UTF-8, compressé br / gzip
UnitésVent en nœuds · directions en degrés · heures ISO 8601 UTC
Limite120 requêtes / minute par clé (par défaut)
RafraîchissementStations : liste reconstruite toutes les 2 min · Bouées : 5 min
HistoriqueStations : 168 h max · Bouées : ~7 jours
SpécificationOpenAPI 3.1 — levent.live/openapi.json

Authentification & CORS

Chaque requête porte votre clé dans l’en-tête X-API-Key. Le paramètre ?apikey= est accepté aussi, mais il apparaît dans les journaux et l’historique : préférez l’en-tête.

bash
curl --compressed -H "X-API-Key: votre_cle_ici" \
  "https://api.levent.live/api/all-buoys"
RéponseCause
401 API key requiredAucune clé fournie
403 Invalid API keyClé inconnue ou désactivée
403 Origin not allowedAppel depuis un navigateur sur une origine non autorisée pour cette clé
429 Rate limit exceededLimite par minute de la clé dépassée (voir Limites)
Appels depuis un navigateur (CORS)

Un appel fetch depuis une page web envoie un en-tête Origin. Il n’est accepté que si cette origine (ex. https://www.monclub.fr) est enregistrée sur votre clé (allowedOrigins) : indiquez-nous vos domaines lors de la demande de clé. Les appels sans Origin (serveur, script, application mobile) ne sont pas concernés.

Une clé placée dans du code exécuté par le navigateur est visible de tous. Pour un site public, appelez l’API depuis votre serveur (ou un proxy) et mettez la réponse en cache ; sinon, limitez la clé à vos origines.

Les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After et ETag sont lisibles depuis JavaScript (Access-Control-Expose-Headers).

Demander une clé gratuite : contact@levent.live (usage prévu, volume estimé, domaines web éventuels).

Quickstart

Votre premier appel en 2 minutes. Les bibliothèques HTTP courantes (fetch, requests, URLSession) gèrent la compression automatiquement ; avec curl, ajoutez --compressed.

1Les stations autour d’un point
curl
curl --compressed -H "X-API-Key: VOTRE_CLE" \
  "https://api.levent.live/api/stations-lite?near=48.38,-4.49&radius=20&online=1&fields=name,wind,gust,direction,ts,distanceKm"
2Une zone géographique
curl
# Bretagne : lat 47.2 → 48.9, lon -5 → -1, stations en ligne de Météo-France
curl --compressed -H "X-API-Key: VOTRE_CLE" \
  "https://api.levent.live/api/all-stations?source=meteofrance&bbox=47.2,-5,48.9,-1&online=true"
3L’historique d’une station
curl
curl --compressed -H "X-API-Key: VOTRE_CLE" \
  "https://api.levent.live/api/all-stations?history=meteofrance_29075001&hours=24"
4Toutes les stations, sans retélécharger si rien n’a changé
bash
# Liste complète (~13 000 stations, ~0,5 Mo compressé) + ETag
curl --compressed -sD headers.txt -o stations.json -H "X-API-Key: VOTRE_CLE" \
  "https://api.levent.live/api/all-stations"
ETAG=$(grep -i '^etag:' headers.txt | cut -d' ' -f2- | tr -d '\r')

# 2 minutes plus tard : 304 Not Modified (corps vide) si la liste n’a pas changé
curl --compressed -s -o /dev/null -w "%{http_code}\n" -H "X-API-Key: VOTRE_CLE" \
  -H "If-None-Match: $ETAG" "https://api.levent.live/api/all-stations"

Conventions

GrandeurUnité / format
Vent moyen, rafales (stations)nœuds (kn), 1 décimale
Direction du ventdegrés 0–359, direction d’où vient le vent (0 = nord, 90 = est)
Température, humidité, pression°C · % · hPa, 1 décimale
Hauteurs de houle · période · directionm · s · degrés, d’où vient la houle
Hauteurs de maréem au-dessus du zéro des cartes du port
HeuresISO 8601 en UTC (ex. 2026-10-15T12:36:00.000Z)
Coordonnéesdegrés décimaux WGS84 (lat, lon)
Prévisions (/forecast)km/h par défaut (format Open-Meteo) : demandez wind_speed_unit=kn
  • Identifiants : utilisez stableId (<source>_<id>, ex. meteofrance_29075001), unique dans toute l’API. Le champ id brut peut exister dans plusieurs sources (ex. 1475 chez Holfuy et chez Pioupiou).
  • ts est l’heure de la mesure (UTC), pas l’heure de collecte ; il peut être null pour une station hors ligne. cachedAt est l’heure à laquelle Le Vent a reconstruit la liste.
  • isOnline est évalué par chaque source (de 30 min à plusieurs heures pour les réseaux horaires ou tri-horaires) : pour un affichage « temps réel », vérifiez aussi l’âge de ts.
  • Valeurs absentes : null pour les grandeurs facultatives (température, humidité, pression, altitude). Quand une source ne mesure pas les rafales (BoM, une partie des METAR / SYNOP), gust vaut wind ou 0.
  • Nouvelles sources : la liste des valeurs de source s’allonge régulièrement. Traitez une valeur inconnue comme une source générique, sans erreur.
  • Champs additionnels : de nouveaux champs facultatifs peuvent apparaître ; ignorez ceux que vous ne connaissez pas. Un champ existant ne change ni de nom ni d’unité dans la v1.

Stations vent

GET/api/all-stations

Toutes les stations vent avec leur dernière mesure, normalisées dans le schéma Station. La liste est reconstruite toutes les 2 minutes à partir de toutes les sources.

Paramètres query
source
string
Une ou plusieurs sources, séparées par des virgules. Ex. meteofrance,pioupiou
bbox
string
Rectangle latMin,lonMin,latMax,lonMax. Ex. 47.2,-5,48.9,-1
online
string
1 ou true : stations en ligne uniquement
Réponse
json
{
  "stations": [
    {
      "id": "29075001",
      "stableId": "meteofrance_29075001",
      "name": "Brest",
      "lat": 48.453833,
      "lon": -4.391167,
      "wind": 8.4,
      "gust": 11.9,
      "direction": 240,
      "source": "meteofrance",
      "ts": "2026-10-15T12:42:00.000Z",
      "isOnline": true,
      "temperature": 18.6,
      "humidity": 81,
      "pressure": 1021.9,
      "altitude": null
    },
    {
      "id": "10045",
      "stableId": "meteogalicia_10045",
      "name": "Mabegondo",
      "…": "…",
      "attribution": "Fonte: MeteoGalicia – Xunta de Galicia"
    }
  ],
  "count": 13189,
  "sources": { "meteofrance": 179, "holfuy": 1162, "netatmo": 2665, "kv-stations": 5582, "…": 0 },
  "cachedAt": "2026-10-15T12:51:07.636Z",
  "refreshInterval": 120
}
Poids : la liste complète fait ~3,8 Mo de JSON, transmis compressé (~0,46 Mo en brotli, ~0,54 Mo en gzip) avec un ETag. Renvoyez-le dans If-None-Match : tant que la liste n’a pas été reconstruite, la réponse est un 304 sans corps. Pour quelques stations ou une zone, préférez /api/stations-lite.

L’objet sources compte les stations par flux amont : kv-stations regroupe les services météo nationaux (MET Norway, AEMET, DWD, SYNOP…) et windguru / gowind-native restent à 0 (flux arrêtés). Pour un décompte par source, comptez le champ source des stations.

Sélection légère de stationsnouveau

GET/api/stations-literecommandé

Les mêmes stations que /api/all-stations, mais seulement celles qui vous intéressent, avec seulement les champs utiles. Idéal pour un tableau de bord, un écran TV, un widget ou un site de club. Les filtres se combinent ; au moins un des filtres ids, bbox, near, source ou since est requis.

Paramètres query
ids
string
Jusqu’à 200 stableId séparés par des virgules. Réponse dans l’ordre demandé ; les identifiants introuvables sont listés dans missing. Un id brut (ex. 29075001) est accepté mais peut correspondre à plusieurs sources.
bbox
string
latMin,lonMin,latMax,lonMax. Si lonMin > lonMax, le rectangle traverse l’antiméridien (Pacifique).
near
string
lat,lon : stations les plus proches d’abord, avec distanceKm.
radius
number
Rayon autour de near, en km (défaut 25, max 300).
source
string
Une ou plusieurs sources, séparées par des virgules.
since
string (ISO 8601)
Stations mesurées à cette heure ou après (ts ≥ since). Pour ne récupérer que les nouveautés.
online
string
1 ou true : stations en ligne uniquement.
fields
string
Champs à renvoyer, ex. name,wind,gust,direction,ts. stableId est toujours inclus, ainsi que attribution quand la source l’exige.
limit
number
Nombre maximal de stations (1–5000) ; truncated: true si la réponse est coupée.
curl
curl --compressed -H "X-API-Key: VOTRE_CLE" \
  "https://api.levent.live/api/stations-lite?ids=meteofrance_29075001,holfuy_1062,pioupiou_110&fields=name,wind,gust,direction,ts,isOnline"
Réponse
json
{
  "stations": [
    { "stableId": "meteofrance_29075001", "name": "Brest", "wind": 8.4, "gust": 11.9,
      "direction": 240, "ts": "2026-10-15T12:42:00.000Z", "isOnline": true },
    { "stableId": "holfuy_1062", "name": "Pilotage BREST", "wind": 7.6, "gust": 9.1,
      "direction": 235, "ts": "2026-10-15T12:45:00.000Z", "isOnline": true }
  ],
  "count": 2,
  "cachedAt": "2026-10-15T13:04:30.112Z",
  "refreshInterval": 120,
  "missing": ["pioupiou_110"]
}
L’ETag ne dépend que de la version de la liste et de votre requête : en interrogeant toutes les 1–2 minutes avec If-None-Match, vous recevez un 304 immédiat tant que rien n’a changé. Erreurs de paramètres : 400 avec error et hint.

Historique station

GET/api/all-stations?history={stableId}

Les mesures récentes d’une station. La source est déduite du préfixe de l’identifiant. Le pas de temps dépend de la source (1 à 10 min pour la plupart des balises et services nationaux, 30 min à 3 h pour METAR / SYNOP).

Paramètres query
historyrequis
string
stableId de la station. Ex. meteofrance_29075001, holfuy_1062
hours
number
Profondeur en heures (1–168). Défaut : 6
Réponse
json
{
  "stationId": "meteofrance_29075001",
  "name": "Brest",
  "source": "meteofrance",
  "hours": 24,
  "count": 240,
  "observations": [
    { "ts": "2026-10-15T10:54:00.000Z", "wind": 10.5, "gust": 14.8, "direction": 200, "temperature": null }
  ],
  "attribution": "…"
}

attribution n’est présent que pour les sources qui l’exigent. observations peut être vide (station sans historique, ou station ajoutée sans mesure, source custom). 502 si la source ne répond pas : réessayez plus tard.

Bouées houlographes

GET/api/all-buoys

~470 bouées de 15 réseaux : CANDHIS (France), NOAA NDBC, Cefas, Rijkswaterstaat, Irish Lights, Marine Institute, ISPRA, Arpae, SMHI, FMI, Vegagerðin, MET Norway, IMOS / AODN, Queensland, South Island Waves. Rafraîchi toutes les 5 minutes.

Paramètres query
source
string
Réseau(x) : candhis, ndbc, cefas, rws, irishlights, imi, ispra, arpae, smhi, fmi, vegagerdin, metno, aodn, queensland, siw
region
string
Région, insensible à la casse. Ex. mediterranee, bretagne (CANDHIS), Pays-Bas, Norvège
bbox
string
latMin,lonMin,latMax,lonMax
Réponse
json
{
  "buoys": [
    {
      "id": "01101",
      "name": "Leucate",
      "lat": 42.9167,
      "lon": 3.125,
      "region": "mediterranee",
      "depth": 40,
      "hm0": 0.2,
      "hmax": 0.3,
      "tp": 3.1,
      "direction": 18,
      "spread": 26,
      "seaTemp": 21.4,
      "status": "TOTALE",
      "lastUpdate": "2026-10-15T12:30:00.000Z",
      "source": "candhis",
      "attribution": null
    }
  ],
  "count": 470,
  "sources": { "candhis": 22, "ndbc": 190, "aodn": 61, "rws": 48, "…": 0 },
  "cachedAt": "2026-10-15T12:50:49.443Z",
  "refreshInterval": 300
}

Historique bouée

GET/api/all-buoys?history={id}

Environ 7 jours de mesures brutes (pas de 10 à 60 min selon le réseau). Les identifiants CANDHIS sont numériques (02911), les autres réseaux sont préfixés (ndbc_41002, rws_a12…).

historyrequis
string
Identifiant de la bouée (champ id de la liste).
json
{
  "buoyId": "rws_a12",
  "name": "A12",
  "source": "rws",
  "region": "Pays-Bas",
  "count": 1005,
  "observations": [
    { "timestamp": "2026-10-15T12:40:00.000Z", "hm0": 2.5, "hmax": null, "tp": 7.7, "direction": null, "seaTemp": null }
  ],
  "attribution": "Rijkswaterstaat — Waterinfo / WaterWebservices (CC0)"
}

Attention : l’horodatage des observations de bouées s’appelle timestamp (et non ts). Les grandeurs non mesurées par un réseau valent null.

Marées

GET/api/tide?lat={lat}&lon={lon}
GET/api/tide?port={code}
GET/api/tide?list=true&scope=world

Pleines et basses mers avec coefficients. Hors des ports français du SHOM, Le Vent calcule les marées de ~2 000 ports à partir de constantes harmoniques publiées (TICON-4, NOAA, Kartverket, modèle EOT20), ainsi qu’un coefficient « équivalent SHOM ».

Paramètres query
lat, lon
number
Position : renvoie le port le plus proche, avec distanceKm.
maxKm
number
Distance maximale au port (défaut 100, max 1000) ; 404 au-delà.
scope
string
world (ports calculés par Le Vent), fr (ports SHOM) ou all. Avec lat/lon, défaut all.
port
string
Code (cst) ou nom d’un port de la liste.
list
string
true : liste des ports (cst, name, lat, lon, region, country) selon scope (défaut fr).
date
string
Premier jour, YYYY-MM-DD (heure locale du port). Défaut : aujourd’hui.
duration
number
Nombre de jours (défaut 7, max 35).
curl
# Port le plus proche de Plymouth (Royaume-Uni), 2 jours
curl --compressed -H "X-API-Key: VOTRE_CLE" \
  "https://api.levent.live/api/tide?lat=50.36&lon=-4.14&maxKm=50&scope=world&duration=2"
Réponse
json
{
  "port": { "cst": "TC_DEVONPORT_DEV_GBR_BODC", "name": "Devonport", "lat": 50.3684, "lon": -4.1852,
            "region": "royaume-uni", "country": "GB", "countryName": "Royaume-Uni", "source": "TICON-4" },
  "distanceKm": 3.3,
  "tides": [
    { "type": "high", "date": "2026-10-15", "time": "08:48", "datetime": "2026-10-15T07:48:00.000Z",
      "height": 5.1, "coefficient": 73 },
    { "type": "low", "date": "2026-10-15", "time": "15:09", "datetime": "2026-10-15T14:09:00.000Z",
      "height": 1.44, "coefficient": null }
  ],
  "nextHighTide": { "time": "2026-10-15T20:03:00.000Z", "height": 4.85, "coefficient": 68 },
  "nextLowTide": { "time": "2026-10-15T14:09:00.000Z", "height": 1.44 },
  "todayCoefficient": 73,
  "coefficientSource": "computed",
  "coefficientReason": null,
  "coefficientNote": "Coefficient calculé par Le Vent (équivalent SHOM), non officiel",
  "source": "TICON-4",
  "sourceLabel": "Marées : TICON-4 (DGFI-TUM, CC BY 4.0) via Neaps — calcul Le Vent, ne pas utiliser pour la navigation",
  "model": false,
  "fallback": false,
  "datum": "LAT",
  "timezone": "Europe/London",
  "attribution": "Neaps tide database (…). Source: Hart-Davis, M., Dettmering, D., Seitz, F. (2025), TICON-4 (…). Licensed CC BY 4.0 (…)",
  "fetchedAt": "2026-10-15T12:53:34.846Z"
}
date, timestringJour et heure locale du port (fuseau timezone).
datetimestringMême instant en UTC (ISO 8601) : à utiliser pour les calculs.
heightnumberHauteur en m au-dessus du zéro des cartes (datum : LAT dans la plupart des pays, MLLW aux États-Unis).
coefficientnumber | nullSur les pleines mers uniquement (20–120).
coefficientSource'shom' | 'computed' | nullshom : coefficient officiel ; computed : calculé par Le Vent (équivalent SHOM, non officiel) ; null : pas de coefficient.
coefficientReason'diurnal' | 'small-tide' | nullPourquoi il n’y a pas de coefficient : marée à dominante diurne, ou marnage trop faible (Méditerranée…).
coefficientNotestring | nullPhrase prête à afficher à côté du coefficient.
model, fallbackbooleanEstimation de modèle (EOT20) loin de tout marégraphe ; prédiction de secours quand le SHOM est indisponible.
attribution, sourceLabelstringCrédit complet (licence CC BY) et version courte : à afficher avec les marées.
Prédictions astronomiques indicatives : elles ne tiennent pas compte de la météo (surcotes, vent, pression). Ne pas utiliser pour la navigation. Les marées changent peu : interrogez un port au plus une fois par jour et gardez la réponse en cache. Les prédictions des ports français proviennent du SHOM : leur réutilisation est soumise aux conditions du SHOM ; pour un usage hors de Le Vent, utilisez scope=world ou contactez-nous. Une indisponibilité de la source peut être signalée par une réponse 200 contenant un champ error : testez-le.

Prévisions

GET/api/forecast

Prévisions horaires et quotidiennes (vent, météo, vagues) au format Open-Meteo, servies depuis le cache partagé de Le Vent. Les coordonnées sont arrondies à 0,01° (~1 km).

Paramètres query
model
string
arome (défaut — Météo-France AROME/ARPEGE, 4 j, France et alentours), ecmwf (ECMWF IFS 0,25°, 10 j, monde), gfs (NOAA GFS, 16 j), icon (DWD ICON-EU / ICON, 7 j), marine (vagues et houle, 7 j). Indiquez toujours le modèle.
latitude, longituderequis
number
Position (alias lat, lon).
hourly
string
temperature_2m, precipitation, weather_code, wind_speed_10m, wind_direction_10m, wind_gusts_10m, cloud_cover(_low|_mid|_high), relative_humidity_2m, visibility, pressure_msl, surface_pressure, uv_index — marine : wave_height, wave_period, wave_direction, swell_wave_height, swell_wave_period, swell_wave_direction, wind_wave_height, wind_wave_period, wind_wave_direction
daily
string
weather_code, temperature_2m_max, temperature_2m_min, precipitation_sum, wind_speed_10m_max, wind_gusts_10m_max, wind_direction_10m_dominant (pas pour marine)
wind_speed_unit
string
kmh (défaut), kn, ms, mph.
timezone
string
GMT (défaut, = UTC), Europe/Paris ou auto. Les heures renvoyées sont locales à ce fuseau, sans décalage (ex. 2026-10-15T14:00).
forecast_days
number
0–16 (borné par la portée du modèle). past_days : 0 ou 1.
curl
# Vent prévu à Brest (ECMWF), en nœuds, heures UTC, 2 jours
curl --compressed -H "X-API-Key: VOTRE_CLE" \
  "https://api.levent.live/api/forecast?model=ecmwf&latitude=48.38&longitude=-4.49&hourly=wind_speed_10m,wind_gusts_10m,wind_direction_10m&wind_speed_unit=kn&timezone=GMT&forecast_days=2"
Quota partagé : 429 au-delà de 300 requêtes/min par IP, 503 + Retry-After quand le quota journalier est atteint. Les modèles ne changent que toutes les 1 à 6 h : gardez une prévision au moins 30 min en cache. En-tête X-Cache : HIT / MISS / STALE. Crédit à afficher : « Prévisions : Open-Meteo.com (CC BY 4.0) » et le modèle (Météo-France, ECMWF, NOAA, DWD).

Vent animé mondial (grilles)

GET/api/wind-world?model=ecmwfsans clé

Vent à 10 m prévu sur une grille mondiale, toutes les 3 h jusqu’à +120 h, pour animer une carte. Modèles : ecmwf (défaut, 0,25°), gfs (0,5°), icon_eu (0,125°, Europe). Endpoint public : pas de clé nécessaire.

RequêteRéponse
?model=ecmwfIndex JSON : run, runTime, grid, overview, tileCells, tilesX, tilesY, frames [{ step, validTime }], attribution
?model=ecmwf&run=R&step=S&tile=X_YTuile binaire WWND (64×64 cellules, pleine résolution), immuable
?model=ecmwf&run=R&step=S&overview=1Grille binaire globale grossière (1°)
?model=ecmwf&format=web&t=HJSON prêt pour WindGL, échéance la plus proche de « heure courante + H » ; repli GFS si ECMWF manque (en-têtes X-Wind-Model, X-Wind-Run, X-Wind-Valid-Time)

Format binaire WWND v1 (little-endian, servi en gzip) : en-tête de 40 octets — "WWND", u16 version, u16 flags (bit 0 : 360°, bit 1 : canal vitesse), u16 nx, u16 ny, f32 lon0, f32 lat0, f32 dLon, f32 dLat, f32 scale (m/s par unité), u32 validTime, u32 runTime — puis Int16 u[nx·ny], Int16 v[nx·ny] (lignes du sud au nord, colonnes d’ouest en est, −32768 = manquant).

Les tuiles d’un run ne changent jamais (cache 7 jours) ; relisez l’index toutes les 10–30 min. Crédits : ECMWF (CC BY 4.0), NOAA GFS (domaine public), DWD ICON-EU.

Webcams

GET/api/webcams

~700 webcams de spots (côtes et lacs) en ligne : tableau JSON d’objets id, name, location, region, latitude, longitude (attention : pas lat/lon), imageUrl, streamUrl (HLS ou lecteur YouTube, sinon null), source (exploitant), refreshInterval (s), lastCapture, et pour certaines provider, country, linkUrl, attribution.

Les images et flux appartiennent à leurs exploitants (Skaping, Viewsurf, Vision-Environnement, WindsUp, YouTube…). L’API fournit les métadonnées ; afficher ces images dans un autre service nécessite l’accord de l’exploitant. Ne les archivez pas, ne les recadrez pas et renvoyez vers la page de l’exploitant (linkUrl quand il existe).

Sources & fréquences

Valeur du champ source, nombre de stations (production, 15 octobre 2026) et fréquence à laquelle Le Vent relit la source. Le pas des mesures elles-mêmes va de 1 min (balises) à 3 h (SYNOP).

Services météo nationaux et données publiques
SourcesourceStationsZoneRelueCrédit
Météo-Francemeteofrance~180France, Corse, Réunion, Mayotte6 minMétéo-France — Licence Ouverte Etalab 2.0
MET Norwaymetnorway~730Norvège, Svalbard10 minMET Norway — NLOD 2.0 / CC BY 4.0
AEMETaemet~710Espagne30 min (relevés horaires)Fuente: AEMET
MeteoGaliciameteogalicia~140Galice10 minFonte: MeteoGalicia – Xunta de Galicia
Meteocatmeteocat~160Catalogne15 min (créneaux de 30 min)Font: Servei Meteorològic de Catalunya
IPMAipma~115Portugal, Madère, Açores5 min (relevés horaires)IPMA
MeteoSwissmeteoswiss~155Suisse15 minMeteoSwiss
DWDdwd~190Allemagne1 hDeutscher Wetterdienst
SMHIsmhi~180Suède30 minSMHI — CC BY 4.0
FMIfmi~150Finlande15 minFMI — CC BY 4.0
DMIdmi~90Danemark15 minDMI
GeoSphere Austriageosphere~145Autriche10 minGeoSphere Austria
HungaroMet (OMSZ)omsz~140Hongrie15 minHungaroMet
IMGW-PIBimgw~315Pologne30 minIMGW-PIB
DHMZdhmz~75Croatie30 minDHMZ
ARSOarso~16Slovénie30 minARSO
IRM / KMIrmi~27Belgique30 minIRM / KMI
Met Éireannmeteirann~18Irlande1 hMet Éireann
Bureau of Meteorologybom~600Australie (sans rafales)15 minBoM via DWD open data — CC BY 4.0
SYNOP OMMsynop~430Afrique, Asie, Pacifique, Amérique latine30 min (relevés 1–3 h)Services météo nationaux (GTS) via DWD / WIS2 / IEM
METARmetar~690Aéroports du monde20 minaviationweather.gov (NOAA)
IEM ASOSiem~1 140États-Unis, Brésil, Afrique, Australie30 minIowa Environmental Mesonet
NOAA NDBC / CO-OPSndbc~12Bouées et ports NOAA (Amériques, Manche)5–10 minNOAA — domaine public
Réseaux privés et communautaires
SourcesourceStationsZoneRelue
Netatmonetatmo~2 660Stations personnelles près des côtes et plans d’eau7 min
Weathercloudweathercloud~2 120Stations personnelles (côtes, lacs, îles)7 min
Holfuyholfuy~1 160Balises spots (Europe)10 min
Pioupiou (OpenWindMap)pioupiou~650Balises communautaires5 min
kwindkwind~100Balises spots (Europe)3 min
Infoclimatinfoclimat~45Réseau StatIC + SYNOP (France)5 min
Wind Francewindfrance~19Bretagne, Atlantique2 min
APRSaprs~19Stations radioamateurs (APRS-IS)temps réel
Diaboxdiabox~5Capteurs de clubs / ports5 min
Weameterweameter~4Lacanau, Pauillac, Montamer, Leucate2 min
Fildairfildair1Mèze (étang de Thau)3 min
Autres valeurs
  • windguru, gowind-native : sources désactivées (flux gowind.fr supprimé le 23 juin 2026), plus aucune station.
  • custom : station ajoutée par Le Vent sans mesure (nom et position seulement, toujours hors ligne).
  • En cours d’intégration, peuvent apparaître : metoffice (Royaume-Uni), italia (réseaux publics italiens), asia (Japon, Hong Kong, Singapour, Taïwan), eccc (Canada), ccomet (côtes anglaises), inmet (Brésil).

Licences & crédits

Les mesures appartiennent à leurs producteurs. Le Vent les collecte, convertit (unités, arrondis, UTC) et regroupe ; ce ne sont pas des produits officiels de ces organismes. En utilisant l’API, vous vous engagez à :

  • Afficher le champ attribution quand il est présent (stations, historiques, bouées, marées) : c’est la mention exigée par la licence de la source (CC BY 4.0, NLOD, etc.).
  • Citer la source et Le Vent partout où les données sont affichées, par ex. « Données : MET Norway via Le Vent (levent.live) ».
  • Respecter les réseaux privés et communautaires (Netatmo, Weathercloud, Holfuy, Pioupiou / OpenWindMap, kwind, Wind France, Diabox, Weameter, Fildair, Infoclimat, APRS) : sauf licence ouverte publiée par le réseau lui-même (vérifiez ses conditions), leurs données ne sont pas en libre réutilisation. Usage personnel, associatif ou d’affichage uniquement ; pas de revente, d’archivage massif ni de redistribution en flux sans accord du réseau.
  • Ne pas présenter ces mesures, marées ou prévisions comme des données de sécurité ou de navigation.
Bouées
rws — Rijkswaterstaat (Pays-Bas) · CC0
irishlights — Commissioners of Irish Lights (Irlande) · CC BY 4.0
ispra — ISPRA — Rete Ondametrica Nazionale (Italie) · CC BY 4.0
arpae — Arpae Emilia-Romagna (Italie) · CC BY 4.0
smhi — SMHI (Suède) · CC BY 4.0
fmi — FMI — Ilmatieteen laitos (Finlande) · CC BY 4.0
vegagerdin — Vegagerðin (Islande) · CC BY 4.0
aodn — IMOS / AODN (Australie) · CC BY 4.0
siw — University of Canterbury — South Island Waves (Nouvelle-Zélande) · CC BY 4.0
Autres réseaux : CANDHIS — Cerema · NOAA National Data Buoy Center · Cefas WaveNet · Queensland Government — Department of Environment, Science and Innovation · Marine Institute (Irlande).

Crédits complets des bouées et des marées (TICON-4, NOAA, Kartverket, EOT20, Neaps) : page Sources.

Schéma des objets

Station/api/all-stations, /api/stations-lite
idstringIdentifiant brut chez la source (ex. 29075001)
stableIdstringIdentifiant unique : <source>_<id> (ex. meteofrance_29075001)
namestringNom de la station
lat, lonnumberPosition (degrés décimaux, WGS84)
windnumberVent moyen, nœuds (1 décimale)
gustnumberRafale max, nœuds (1 décimale) ; = wind ou 0 si non mesurée
directionnumberDirection d’où vient le vent, 0–359°
sourcestringSource (voir Sources)
tsstring | nullHeure de la mesure, ISO 8601 UTC
isOnlinebooleanMesure récente selon la source
temperaturenumber | nullTempérature de l’air, °C
humiditynumber | nullHumidité relative, %
pressurenumber | nullPression, hPa
altitudenumber | nullAltitude, m
attributionstring (facultatif)Mention exigée par la licence de la source, à afficher
distanceKmnumber (stations-lite)Distance au point near, km
Observationhistorique station
tsstringHeure de la mesure, ISO 8601 UTC
wind, gustnumberNœuds
directionnumberDegrés
temperaturenumber | null°C
Bouée/api/all-buoys
idstringIdentifiant (CANDHIS : 02911 ; autres : <réseau>_<id>)
name, lat, lonstring, numberNom et position
regionstring | nullRégion (CANDHIS : bretagne, mediterranee… ; autres : pays ou État)
depthnumber | nullProfondeur, m
hm0number | nullHauteur significative, m
hmaxnumber | nullHauteur maximale, m
tpnumber | nullPériode pic, s
directionnumber | nullDirection d’où vient la houle, °
spreadnumber | nullÉtalement directionnel, °
seaTempnumber | nullTempérature de l’eau, °C
statusstring | nullonline / offline (CANDHIS : état de diffusion, ex. TOTALE)
lastUpdatestring | nullHeure de la dernière mesure, ISO 8601 UTC
sourcestringRéseau
attributionstring | nullMention exigée par la licence du réseau

Codes de réponse

Les erreurs sont du JSON : { "error": "…" }, parfois avec hint.

CodeSignificationCause
200OKRequête réussie
304Not ModifiedIf-None-Match identique à l’ETag courant : rien de nouveau
400Bad RequestParamètre invalide (stations-lite, tide, forecast)
401UnauthorizedClé API absente
403ForbiddenClé invalide, origine navigateur non autorisée pour la clé, ou domaine bloqué
404Not FoundStation, bouée, port ou fichier introuvable
429Too Many RequestsLimite de la clé dépassée (attendre Retry-After secondes)
500Internal Server ErrorErreur interne
502Bad GatewayLa source amont ne répond pas (historiques, prévisions)
503Service UnavailableListe pas encore prête après un redémarrage, ou quota de prévisions atteint

Limites, cache & bonnes pratiques

Limite de requêtes

Chaque clé a une limite par minute (120 par défaut), comptée sur des fenêtres fixes d’une minute. Chaque réponse indique X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset (secondes avant la remise à zéro). Au-delà : 429 avec Retry-After. Les réponses 304 comptent comme des requêtes, mais ne coûtent presque rien.

À quelle fréquence interroger ?
DonnéeChangeInterroger au plus
Stations (liste, stations-lite)toutes les 2 min (cachedAt)1 fois / 1–2 min, avec If-None-Match
Historique d’une stationau rythme de la source1 fois / 5–10 min par station
Bouéestoutes les 5 min1 fois / 5 min
Historique d’une bouée10–60 min1 fois / 30 min
Maréesjamais (prédictions)1 fois / jour par port
Prévisionsnouveau run toutes les 1–6 h1 fois / 30–60 min par point
Vent animé (index)nouveau run toutes les 6–12 h1 fois / 10–30 min ; tuiles immuables
Webcams (liste)rarement1 fois / heure
Bonnes pratiques
  • Acceptez la compression (Accept-Encoding: br, gzip, automatique sauf avec curl sans --compressed) : 8 fois moins de données.
  • Ne téléchargez pas les 13 000 stations pour en afficher quelques-unes : /api/stations-lite avec ids, near ou bbox, et fields.
  • Pour un site public, interrogez l’API depuis votre serveur et servez vos visiteurs depuis votre cache : une requête toutes les 2 minutes suffit, quel que soit votre trafic.
  • Gérez 429 (attendre Retry-After) et 5xx (réessayer avec un délai croissant) ; gardez la dernière réponse valide en cas d’erreur.

Exemples complets

Tableau de bord de quelques stations (JavaScript, Node 18+ ou navigateur)
js
// Tableau de bord : quelques stations rafraîchies toutes les 2 minutes, avec ETag
const API = "https://api.levent.live/api";
const KEY = "VOTRE_CLE"; // côté serveur, ou clé limitée à vos origines
const ids = ["meteofrance_29075001", "holfuy_1062", "pioupiou_1475"];
let etag = null;
let stations = [];

async function refresh() {
  const res = await fetch(`${API}/stations-lite?ids=${ids.join(",")}&fields=name,wind,gust,direction,ts,isOnline`, {
    headers: { "X-API-Key": KEY, ...(etag ? { "If-None-Match": etag } : {}) },
  });
  if (res.status === 304) return;                 // rien de nouveau
  if (res.status === 429) {                       // limite atteinte : attendre
    const wait = Number(res.headers.get("Retry-After") || 60);
    return new Promise(r => setTimeout(r, wait * 1000));
  }
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  etag = res.headers.get("ETag");
  const data = await res.json();
  stations = data.stations;
  if (data.missing?.length) console.warn("Stations introuvables :", data.missing);
  for (const s of stations) {
    const age = Math.round((Date.now() - Date.parse(s.ts)) / 60000);
    console.log(`${s.name} : ${s.wind} nds (${s.gust}) ${s.direction}° — il y a ${age} min`);
  }
}

await refresh();
setInterval(() => refresh().catch(console.error), 120_000);
Historique 24 h vers un fichier CSV (Python)
python
import csv
import requests

API = "https://api.levent.live/api"
r = requests.get(
    f"{API}/all-stations",
    headers={"X-API-Key": "VOTRE_CLE"},
    params={"history": "meteofrance_29075001", "hours": 24},
    timeout=30,
)
r.raise_for_status()
data = r.json()

with open("historique.csv", "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["ts_utc", "vent_nds", "rafales_nds", "direction_deg", "temperature_c"])
    for o in data["observations"]:
        w.writerow([o["ts"], o["wind"], o["gust"], o["direction"], o["temperature"]])

print(f"{data['name']} : {data['count']} relevés sur {data['hours']} h → historique.csv")
État de la houle en Méditerranée
curl
curl --compressed -H "X-API-Key: VOTRE_CLE" \
  "https://api.levent.live/api/all-buoys?region=mediterranee"

Changelog

15 octobre 2026
  • Nouvel endpoint /api/stations-lite : sélection par ids, bbox (antiméridien compris), near + radius, source, since, online, fields, limit ; ETag dépendant de la requête.
  • /api/all-stations : liste complète pré-compressée (brotli ~0,46 Mo au lieu de ~0,57 Mo gzip), ETag et 304 sans calcul ; online=1 accepté.
  • Historique station par stableId : name et attribution renvoyés (le nom valait l’identifiant). hours borné à 1–168.
  • Historique bouée : champ attribution.
  • En-têtes X-RateLimit-Reset et Retry-After (429), lisibles en CORS avec X-RateLimit-* et ETag.
  • GET /api (description JSON) accessible sans clé ; spécification OpenAPI 3.1 ; documentation mise à jour (marées, prévisions, vent animé, webcams, licences).
14 octobre 2026
  • Nouvelles sources : bom (Australie), synop (Afrique, Asie, Pacifique, Amérique latine).
  • METAR : champ ts = heure d’observation.
13 octobre 2026
  • Nouvelles sources : metnorway, aemet, meteogalicia, meteocat ; champ facultatif attribution sur les stations.
  • Marées de ~2 000 ports dans le monde (?lat=&lon=, scope=world) avec coefficient calculé et champs coefficientSource / coefficientReason / coefficientNote.
  • Sources windguru et gowind-native désactivées (flux amont supprimé le 23 juin 2026).

Prêt à construire ?

Clé gratuite pour les projets personnels, associatifs et les clubs.

Demander une clé API