authentification
Récupérez votre clé API.
Toutes les requêtes B2B s'authentifient avec le header
X-Api-Key,
qui porte votre clé personnelle préfixée
wm_.
Créez un compte
(plan Découverte gratuit, sans carte bancaire) — vous retrouverez vos clés dans votre
dashboard.
X-Api-Key: wm_abcdef0123456789abcdef0123456789
Une clé n'est affichée en entier qu'à sa création.
Stockez-la immédiatement dans votre gestionnaire de secrets. Si vous la perdez, révoquez-la et générez-en une nouvelle depuis le dashboard.
premier appel
GET /v1/score
Le score composite national 0-100. Remplacez
YOUR_API_KEY
par votre vraie clé, puis choisissez votre langage — c'est le même appel dans les quatre.
$ curl -H "X-Api-Key: YOUR_API_KEY" \ https://api.wattmind.fr/v1/score
const res = await fetch("https://api.wattmind.fr/v1/score", { headers: { "X-Api-Key": "YOUR_API_KEY" } }); const score = await res.json(); console.log(`Score : ${score.globalScore}/100 — ${score.level}`);
import requests res = requests.get( "https://api.wattmind.fr/v1/score", headers={"X-Api-Key": "YOUR_API_KEY"} ) score = res.json() print(f"Score : {score['globalScore']}/100 — {score['level']}")
using var client = new HttpClient(); client.DefaultRequestHeaders.Add("X-Api-Key", "YOUR_API_KEY"); var score = await client.GetFromJsonAsync<JsonElement>( "https://api.wattmind.fr/v1/score"); Console.WriteLine($"Score : {score.GetProperty(\"globalScore\")}/100");
lire la réponse
Un score global, quatre sous-scores.
Le score global est une moyenne pondérée sur quatre dimensions —
prix · carbone · réseau · adéquation. Chaque sous-score (0-100) porte un
detail explicatif prêt à afficher.
Comment chaque dimension est notée : Méthodologie.
{
"computedAt": "2026-08-09T15:33:29.0855135+00:00",
"globalScore": 85,
"level": "Optimal",
"recommendation": "Créneau favorable pour vos process flexibles : recharge VE, HVAC, batteries, data center. […]",
"subScores": [
{ "dimension": "price", "value": 75, "detail": "Prix spot 50.6 €/MWh | Heures creuses" },
{ "dimension": "carbon", "value": 92, "detail": "Mix domestique 92% décarboné" },
{ "dimension": "grid", "value": 100, "detail": "Ecowatt Optimal | équilibrage 100/100" },
{ "dimension": "adequacy", "value": 74, "detail": "headroom import 100/100 | tendance indispos 35/100" }
],
"confidence": 100,
"status": "ok",
// quelle source a répondu — c'est ce qui explique le confidence ci-dessus
"sourceAvailability": { "spotPrice": true, "ecowatt": true, "actualGenerations": true, … },
"weightsApplied": { "price": 0.3, "carbon": 0.3, "grid": 0.2, "adequacy": 0.2 },
// null = pondération nationale. "balanced" n'est PAS servi par défaut.
"profileApplied": null,
"spotPriceEurPerMWh": 50.64,
"ecowattStatus": "Optimal",
// version de chaque formule : deux points ne sont comparables qu'à version égale
"methodologyVersions": { "score": 1, "carbon": 1, "confidence": 1, "consumption": 1 }
}
// réponse réelle capturée le 09/08/2026 · schéma complet et à jour dans Scalar
référence des champs 13 champs · types et nullabilité déplier +
Optimal · Acceptable · Unfavorable.{ dimension, value, detail } — dimensions price, carbon, grid, adequacy.ok (confiance ≥ 70) · degraded (50-69) · insufficient (< 50, renvoyé en HTTP 503).confidence ci-dessus, plutôt que de le laisser deviner.?profile= ou ?wCarbon=… — à partir du plan supérieur (§ aller plus loin).null par défaut — la pondération nationale ne porte pas de nom de profil. Vaut le nom du preset si vous passez ?profile=, ou custom si vous fixez les poids un à un. Ne testez pas l'égalité à "balanced" : elle n'est jamais vraie sur un appel sans paramètre.null si la source était indisponible au calcul.Optimal · Favorable · Tendu · TresTendu, ou null si le signal Ecowatt manquait.+00:00).
Les champs marqués | null le sont réellement :
prévoyez le cas plutôt que de le découvrir en production. La liste exhaustive, types compris,
vit dans Scalar — générée
depuis le code, donc toujours à jour.
fiabilité · status · 503
Vérifiez l'état avant d'agir.
Quand une source RTE est en timeout, l'API ne vous renvoie pas un faux zéro : elle expose un
status
explicite et le header
X-WattMind-Confidence.
Lisez-les avant de déclencher une action coûteuse (effacement industriel, pricing d'un certificat).
Comment l'indice de fiabilité est calculé : Méthodologie.
corps de la réponse · 503
HTTP/1.1 503 Service Unavailable
X-WattMind-Confidence: insufficient
{
"error": "insufficient_data",
"confidence": 41,
"missingSources": ["spotPrice", "actualGenerations"]
}
L'en-tête Retry-After n'accompagne que les 429, jamais un 503.
Sur un 503, c'est à vous de fixer le délai. Une source RTE manquante se
rétablit au cycle de collecte suivant, soit de l'ordre de 10 minutes — c'est le repli
raisonnable. Attention au réflexe inverse : Number(res.headers.get("Retry-After"))
vaut 0 quand l'en-tête est absent, et relancerait en boucle l'API que vous venez
justement de trouver dégradée.
exemple · garde avant action
const res = await fetch("/v1/score", { headers }); if (res.status === 503) { // insufficient_data : missingSources nomme la ou les sources en cause, // de quoi tracer l'incident sans ouvrir un ticket. const { missingSources } = await res.json(); console.warn("score indisponible — sources manquantes :", missingSources); return scheduleRetry(10 * 60 * 1000); // prochain cycle de collecte } const { globalScore, confidence, status } = await res.json(); if (status === "degraded" && confidence < 60) { // décision à fort enjeu : on attend une lecture "ok" return; } triggerLoadShedding(globalScore);
quotas · headers · codes
Quotas et codes d'erreur.
Chaque réponse porte vos compteurs minute. Le débit par minute est la seule limite appliquée sur les plans payants : le volume mensuel y est un repère de dimensionnement, pas un plafond. Les compteurs mensuels ne sont donc exposés que sur le plan Découverte, où le quota est réellement appliqué.
headers (réponse 2xx, exemple plan payant)
X-RateLimit-Limit-Minute: 60 X-RateLimit-Remaining-Minute: 58 X-WattMind-Confidence: ok
dépassement minute · 429
HTTP/1.1 429 Too Many Requests
Retry-After: 38
{
"status": 429,
"error": "rate_limit_exceeded",
"traceId": "0HN5..."
}
authentification refusée · 401
{
"status": 401,
"error": "Unauthorized",
"traceId": "0HN5..."
}
/v1/score/history et /v1/score/analytics sont réservés aux plans payants.
Un appel sur le plan Découverte renvoie 403 avec { code: "upgrade_required", requiredPlan: "…" } — le champ requiredPlan nomme le premier palier qui inclut la capacité, exploitez-le pour proposer un upgrade propre côté client plutôt que de coder le nom du plan en dur.
aller plus loin
Une fois votre premier appel passé.
Le reste de l'API, dans l'ordre où on l'adopte en général. Ce qui dépend d'un palier le dit.
Intensité carbone
Reporting scope 2 horaire : mix par filière, % bas-carbone, % renouvelable et facteur d'émission ADEME Base Carbone® (licence Etalab). Le bloc de traçabilité emissionFactorsSource est réservé aux plans qui l'incluent ; la valeur d'intensité, elle, est servie à tous.
/v1/carbon/intensity
Profils métier
Sept pondérations prêtes à l'emploi via ?profile=, ou vos propres poids. Inclus à partir du plan supérieur — voir le tableau ci-dessous.
/v1/score?profile=…
Prévision horaire
Score heure par heure avec bestHour / worstHour — pour planifier recharge VE, précooling HVAC, effacement. Horizon complet de 48 h sur les plans payants, — h sur le plan Découverte.
/v1/score/forecast
Preuve & ROI
Historique national raw 10 min et agrégats analytics pour prouver les économies. Réservé aux plans payants ; profondeur selon le plan, voir la grille tarifaire.
/v1/score/history
/v1/score/analytics
Référence interactive
Tous les endpoints, schémas et un « try-it » directement dans le navigateur. La spec OpenAPI 3.1 est aussi disponible en JSON.
/scalar/v1
/swagger/v1/swagger.json
Dashboard
Vos clés API, votre consommation en direct et votre abonnement Stripe, au même endroit.
/dashboard.html
pondérer le score les 7 profils et leurs poids déplier +
La pondération personnalisée est incluse à partir du plan supérieur.
Sur le plan Découverte, tout appel portant
?profile= ou ?wPrice=… reçoit un
403 { code: "upgrade_required", capability: "custom_weighting", requiredPlan: "…" }.
La requête n'est pas servie en pondération nationale à la place : un score
recalculé autrement que demandé ne serait pas détectable de votre côté. Exploitez
requiredPlan plutôt que de coder le nom du palier en dur.
| profile | price · carbon · grid · adequacy | cas d'usage |
|---|---|---|
| balanced | 30 · 30 · 20 · 20 | Usage général (pondération nationale) |
| cost-optimizer | 50 · 15 · 20 · 15 | PME qui optimise la facture |
| green-first | 15 · 50 · 15 · 20 | Engagement carbone / RSE |
| industrial-heavy | 30 · 10 · 35 · 25 | Industriel électro-intensif |
| data-center | 20 · 15 · 30 · 35 | Hébergeur — éviter la coupure |
| ev-charging | 0 · 45 · 25 · 30 | Flotte VE / IRVE — sans contrat fourniture, prix ignoré (alias irve) |
| renewable-operator | 15 · 40 · 20 · 25 | Producteur PV / éolien |
$ curl -H "X-Api-Key: YOUR_API_KEY" \ "https://api.wattmind.fr/v1/score?profile=green-first"
Besoin d'un contrôle fin ? Surchargez chaque poids individuellement :
?wPrice=0.5&wCarbon=0.2&wGrid=0.15&wAdequacy=0.15
— la somme doit valoir 1.0, et la réponse renvoie alors
profileApplied: "custom".
Comparez les 7 profils et le détail du calcul sur la page Méthodologie.
founding partners · 10 places · candidature ouverte
Candidat Founding Partner ? -50 % pendant 12 mois.
Les 10 premiers clients payants rejoignent le programme Founder, en échange d'un feedback produit régulier. Candidature manuelle.