Référence de l'API

URL de base

https://api.vbatpower.com

Tous les points de terminaison sont préfixés par /api/v1. L'authentification se fait par cookies de session (pour les clients navigateur) ou par clés d'API (pour les clients MCU/serveur). L'API est gratuite, sans limites d'utilisation au-delà des limites de débit anti-abus décrites ci-dessous.

Authentification

POST /api/v1/auth/register

Créez un nouveau compte avec une adresse e-mail et un mot de passe (minimum 8 caractères, maximum 72).

{"email": "user@example.com", "password": "securePassword123"}

Renvoie 201 avec l'objet utilisateur et définit le cookie de session. Renvoie 409 si l'e-mail existe déjà. Limité à 5 requêtes / 15 min par IP en production.

POST /api/v1/auth/login

Connectez-vous avec une adresse e-mail et un mot de passe.

{"email": "user@example.com", "password": "securePassword123"}

Renvoie 200 avec l'objet utilisateur et définit le cookie de session. Renvoie 401 en cas d'identifiants incorrects. Limité à 10 requêtes / 15 min par IP en production.

GET /api/v1/auth/me

Obtenez l'utilisateur actuellement authentifié. Nécessite un cookie de session.

Renvoie 200 avec un objet utilisateur contenant les champs id, email, name, role, ou 401 si non authentifié.

POST /api/v1/auth/logout

Mettez fin à la session en cours. Efface le cookie de session et supprime la ligne de session.

POST /api/v1/auth/logout-all

Révoquez toutes les sessions de l'utilisateur actuel (déconnexion sur tous les appareils). Nécessite un cookie de session. Renvoie 200 avec {"status": "ok"}, ou 401 si non authentifié.

GET /api/v1/auth/providers

Listez les fournisseurs OAuth actuellement activés sur le serveur. Public — aucune authentification requise. Renvoie {"providers": ["google", "github"]} (le tableau ne contient que les fournisseurs configurés au moment du déploiement).

GET /api/v1/auth/oauth/:provider

Redirige vers la connexion du fournisseur OAuth. Fournisseurs pris en charge : google, microsoft, github. Après le consentement, le fournisseur revient vers /api/v1/auth/oauth/:provider/callback, qui définit le cookie de session et redirige vers l'application.

Projets

Tous les points de terminaison de projet nécessitent une authentification (cookie de session). Les corps de projet peuvent atteindre 2 MB.

GET /api/v1/projects

Listez tous les projets de l'utilisateur authentifié, classés par dernière mise à jour. Renvoie id, name, description, tags et horodatages (pas le blob data complet).

POST /api/v1/projects

Créez un nouveau projet. name est requis (max 255 caractères) ; description (max 4096 caractères), tags (tableau d'au maximum 50 chaînes, chacune d'au maximum 64 caractères) et data sont optionnels. Renvoie 201.

{"name": "Sensor Node", "data": {"batteries": [...]}}
GET /api/v1/projects/:id

Obtenez un projet par ID (renvoie les données complètes, y compris les batteries). Renvoie 404 s'il est introuvable ou n'appartient pas à l'utilisateur.

PUT /api/v1/projects/:id

Mettez à jour un projet. Seuls les champs fournis sont mis à jour (sémantique PATCH — les champs omis conservent leur valeur actuelle). Renvoie 404 si le projet n'appartient pas à l'utilisateur.

DELETE /api/v1/projects/:id

Supprimez un projet et toutes les données associées. Renvoie 204 en cas de succès.

Schéma data du projet

Le champ data contient le modèle du projet : un objet avec un tableau batteries. Chaque batterie possède un id numérique (son index hiérarchique de profondeur 1) et un tableau components ; chaque composant possède un id et un tableau states ; chaque état possède un id ainsi que ses champs de mode de fonctionnement. Les valeurs d'id correspondent directement aux ID de télémétrie en notation par points (batterie 0 → composant 0.0 → état 0.0.0).

{
  "name": "Sensor Node",
  "description": "ESP32 + INA219",
  "tags": ["esp32", "lipo"],
  "data": {
    "batteries": [
      {
        "id": 0,
        "name": "18650 cell",
        "voltageMin": 3.0,
        "voltageMax": 4.2,
        "current": 2.5,
        "currentUnit": "Ah",
        "components": [
          {
            "id": 0,
            "name": "ESP32",
            "states": [
              {"id": 0, "name": "Deep Sleep", "alwaysOn": true, "current": 10, "currentUnit": "u"},
              {"id": 1, "name": "Active", "current": 80, "currentUnit": "m", "interval": 60, "intervalUnit": "s", "execTime": 5, "execTimeUnit": "s"}
            ]
          }
        ]
      }
    ]
  }
}

Champs d'état courants : name, alwaysOn (booléen), current + currentUnit, interval + intervalUnit, execTime + execTimeUnit, et runOnce (booléen). L'objet data est stocké tel quel, de sorte que tout champ produit par l'application fait l'aller-retour intégralement.

Télémétrie

POST /api/v1/telemetry

Téléversez des enregistrements de télémétrie. Nécessite une clé d'API dans l'en-tête Authorization: Bearer <key>. Jusqu'à 10 000 enregistrements par requête ; la clé détermine le projet cible. Limité à 60 requêtes / minute par projet (renvoie 429 en cas de dépassement). Renvoie 201 avec {"status": "ok", "inserted": N}.

{"records": [
  {"id": "0", "type": "v", "value": 3.28, "unit": "V", "nonce": 1, "runid": 1},
  {"id": "0.0.0", "type": "t", "value": 1523, "unit": "ms", "nonce": 1, "runid": 1},
  {"id": "0.0.0", "type": "v", "value": 12.5, "unit": "mA", "nonce": 1, "runid": 1}
]}
GET /api/v1/telemetry/:projectId

Récupérez les enregistrements de télémétrie d'un projet. Nécessite une clé d'API dans Authorization: Bearer <key> ; la clé doit être limitée au projet demandé (sinon 403).

Les résultats sont paginés par curseur id. Paramètres de requête : limit (1–1000, par défaut 1000) et cursor (renvoie les lignes dont l'id est supérieur à cette valeur, par défaut 0). La réponse inclut next_cursor — repassez-le comme cursor pour récupérer la page suivante ; il vaut null lorsqu'aucune ligne n'a été renvoyée.

{
  "project_id": 1,
  "records": [
    {"id": 42, "record_id": "0", "record_type": "v", "value": 3.28, "unit": "V", "nonce": 1, "runid": 1, "received_at": "2026-01-01T12:00:00.000Z"}
  ],
  "next_cursor": 42
}

Historique de formules

Tous les points de terminaison d'historique de formules nécessitent une authentification (cookie de session).

POST /api/v1/formulas/history

Enregistrez un calcul de formule dans l'historique. formula_id et solve_for sont requis. Renvoie 201.

{"formula_id": "ohms-law", "solve_for": "V", "inputs": {"I": 0.5, "R": 100}, "result": 50}
GET /api/v1/formulas/history?limit=50

Obtenez les calculs de formules récents, les plus récents d'abord. limit est borné à 1–500 (par défaut 50).

DELETE /api/v1/formulas/history/:id

Supprimez une seule entrée d'historique par ID. Renvoie 200 avec {"status": "ok"}, ou 404 si l'entrée est introuvable ou n'appartient pas à l'utilisateur.

DELETE /api/v1/formulas/history

Effacez tout l'historique de formules de l'utilisateur actuel. Renvoie 200 avec {"status": "ok"}.

Clés d'API

Tous les points de terminaison de gestion des clés d'API nécessitent une authentification (cookie de session). Les clés sont utilisées par les MCU et les scripts pour téléverser de la télémétrie sans session de navigateur.

POST /api/v1/keys

Créez une clé d'API limitée à un projet. project_id est requis ; name est optionnel (max 128 caractères). Jusqu'à 50 clés actives par utilisateur.

{"project_id": 1, "name": "ESP32 Sensor"}

Renvoie 201 avec la chaîne de la clé (préfixée par vbat_). Stockez-la en lieu sûr — elle ne peut pas être récupérée à nouveau.

GET /api/v1/keys

Listez les clés d'API de l'utilisateur, les plus récentes d'abord. Renvoie id, project_id, le préfixe de la clé, name, l'horodatage de création et l'indicateur de révocation — jamais la clé complète.

DELETE /api/v1/keys/:id

Révoquez une clé d'API par ID. La clé cesse de fonctionner immédiatement. Renvoie 200 avec {"status": "ok"}, ou 404 si la clé est introuvable ou déjà révoquée.

Limites de débit

VBatPower est gratuit, sans quotas d'utilisation. Les seules limites sont des limites de débit anti-abus, appliquées par IP (authentification) ou par projet (télémétrie) en production :

  • POST /api/v1/auth/register — 5 requêtes par 15 minutes par IP
  • POST /api/v1/auth/login — 10 requêtes par 15 minutes par IP
  • POST /api/v1/telemetry — 60 requêtes par minute par projet

Le dépassement d'une limite renvoie 429 avec le corps {"error": "Too many requests"}. Les corps de requête sont également plafonnés : 64 KB pour les routes d'authentification, de clés et d'historique de formules ; 2 MB pour les projets et la télémétrie. Les corps surdimensionnés renvoient 413 avec {"error": "Payload too large"}.

Réponses d'erreur

Toutes les erreurs renvoient du JSON avec un champ error décrivant le problème :

{"error": "Not authenticated"}

Codes de statut HTTP utilisés par l'API :

  • 400 — requête incorrecte (JSON invalide, champ manquant ou mal formé)
  • 401 — non authentifié (session manquante/expirée ou clé d'API invalide)
  • 403 — interdit (clé d'API non limitée au projet demandé)
  • 404 — introuvable (ou n'appartenant pas à l'utilisateur authentifié)
  • 409 — conflit (e-mail déjà enregistré)
  • 413 — charge utile trop volumineuse
  • 429 — trop de requêtes (limite de débit dépassée)
  • 500 — erreur interne

Procédure MCU de bout en bout

Ceci relie les points de terminaison entre eux pour le flux matériel typique : générer une clé, créer un projet, pousser de la télémétrie, et la relire. Toutes les requêtes utilisent l'URL de base https://api.vbatpower.com.

1. Créer un projet (session de navigateur)

Connectez-vous à l'application, ou appelez l'API avec votre cookie de session :

curl -X POST https://api.vbatpower.com/api/v1/projects \
  -H "Content-Type: application/json" \
  --cookie "session=YOUR_SESSION" \
  -d '{"name":"Sensor Node","data":{"batteries":[{"id":0,"components":[{"id":0,"states":[{"id":0}]}]}]}}'
# -> 201 {"project": {"id": 1, ...}}

2. Générer une clé d'API pour ce projet

curl -X POST https://api.vbatpower.com/api/v1/keys \
  -H "Content-Type: application/json" \
  --cookie "session=YOUR_SESSION" \
  -d '{"project_id":1,"name":"ESP32 Sensor"}'
# -> 201 {"key": "vbat_xxxxxxxx...", "project_id": 1}
# Copy the key now — it is shown only once.

3. POSTer la télémétrie depuis l'appareil (clé Bearer)

Aucune session ni cookie nécessaire — la clé authentifie l'appareil et sélectionne le projet. Voir Intégration MCU pour du code Arduino/ESP32/STM32 qui produit cette requête.

curl -X POST https://api.vbatpower.com/api/v1/telemetry \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer vbat_xxxxxxxx..." \
  -d '{"records":[
    {"id":"0","type":"v","value":3.28,"unit":"V","nonce":1,"runid":1},
    {"id":"0.0.0","type":"t","value":1523,"unit":"ms","nonce":1,"runid":1},
    {"id":"0.0.0","type":"v","value":12.5,"unit":"mA","nonce":1,"runid":1},
    {"id":"0.0.0","type":"n","value":0,"unit":"ms","nonce":1,"runid":1}
  ]}'
# -> 201 {"status": "ok", "inserted": 4}

4. Vérifier que les données sont bien arrivées

Relisez-les avec la même clé, ou ouvrez la page Graphiques du projet dans l'application :

curl https://api.vbatpower.com/api/v1/telemetry/1?limit=1000 \
  -H "Authorization: Bearer vbat_xxxxxxxx..."
# -> 200 {"project_id": 1, "records": [...], "next_cursor": 42}
# Page through more rows by passing ?cursor=42 on the next call.