quick-start · première requête

Votre première requête à l'API, en moins de 5 minutes.

Un seul appel à connaître pour commencer : GET /v1/score. Copiez la ligne ci-dessous, elle répond tout de suite et sans compte. Les profils, la prévision et l'historique viennent après, une fois votre premier 200 obtenu.

// à copier — aucun compte requis

3/min · 10/mois par IP
$ curl -H "X-Api-Key: wm_demo" https://api.wattmind.fr/v1/score

Même réponse JSON qu'un appel B2B réel — de quoi vérifier que tout répond avant de créer un compte. Au-delà de 10 appels/mois, créez votre compte Découverte (gratuit, req/min · /mois, sans carte bancaire).

// bon à savoir — sur le plan Découverte, la prévision est bornée à h (au lieu de 48) et l'historique à jours. La réponse est alors tronquée au plafond du plan, sans erreur — autant le savoir maintenant. Voir les paliers.

01

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
important · à copier tout de suite UNE SEULE FOIS

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.

02

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");
03

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.

85 OPTIMAL
price
75
carbon
92
grid
100
adequacy
74
{
  "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 +
globalScoreint 0-100Score composite. Plus il est haut, plus le moment est favorable pour consommer.
levelenumOptimal · Acceptable · Unfavorable.
recommendationstringTexte français prêt à afficher dans votre interface.
subScores[]arrayQuatre entrées { dimension, value, detail } — dimensions price, carbon, grid, adequacy.
confidenceint 0-100Fiabilité du score ; baisse si une source RTE est indisponible. Voir l'étape 04.
statusstringok (confiance ≥ 70) · degraded (50-69) · insufficient (< 50, renvoyé en HTTP 503).
sourceAvailabilityobjectDisponibilité de chaque source au moment du calcul. C'est ce qui explique le confidence ci-dessus, plutôt que de le laisser deviner.
weightsAppliedobjectPondérations effectivement appliquées. Surchargeables via ?profile= ou ?wCarbon=… — à partir du plan supérieur (§ aller plus loin).
profileAppliedstring | nullnull 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.
spotPriceEurPerMWhnumber | nullPrix spot EPEX ayant servi au sous-score prix. null si la source était indisponible au calcul.
ecowattStatusstring | nullOptimal · Favorable · Tendu · TresTendu, ou null si le signal Ecowatt manquait.
methodologyVersionsobjectVersion de chaque formule appliquée. Deux points de la série ne sont comparables sur une grandeur que si la version correspondante est identique. Objet extensible : ignorez les clés inconnues plutôt que de rejeter la réponse.
computedAtdatetimeHorodatage du calcul, ISO 8601 avec décalage explicite (+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.

04

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.

ok Confiance ≥ 70 — données fraîches, exploitables telles quelles. HTTP 200
degraded Confiance 50-69 — fallback sur cache, valeur indicative selon votre tolérance. HTTP 200
insufficient Confiance < 50 — pas assez de fraîcheur pour décider. HTTP 503

corps de la réponse · 503

HTTP/1.1 503 Service Unavailable
X-WattMind-Confidence: insufficient

{
  "error":          "insufficient_data",
  "confidence":     41,
  "missingSources": ["spotPrice", "actualGenerations"]
}
important · le délai de reprise vous appartient PAS DE RETRY-AFTER

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);
05

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..."
}
info · plan-gating HTTP 403

/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.

06

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.

pondérer le score les 7 profils et leurs poids déplier +
info · à lire avant d'essayer HTTP 403

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.

profileprice · carbon · grid · adequacycas d'usage
balanced30 · 30 · 20 · 20Usage général (pondération nationale)
cost-optimizer50 · 15 · 20 · 15PME qui optimise la facture
green-first15 · 50 · 15 · 20Engagement carbone / RSE
industrial-heavy30 · 10 · 35 · 25Industriel électro-intensif
data-center20 · 15 · 30 · 35Hébergeur — éviter la coupure
ev-charging0 · 45 · 25 · 30Flotte VE / IRVE — sans contrat fourniture, prix ignoré (alias irve)
renewable-operator15 · 40 · 20 · 25Producteur 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.

Demander un accès