batterypass
Produit
Comment ça marche Fonctionnalités Comparatif
Solutions
Stockage (BESS) Véhicules légers Batteries industrielles Véhicules électriques Fournisseurs
Conformité
Vue d’ensemble de la conformité Règlement européen sur les batteries Test des obligations Sécurité et confidentialité
Ressources
Tous les articles D'où viennent les données Quelles données il faut au passeport Code QR sur la batterie Qui est responsable ? Glossaire Développeurs et API État du service Évolutions du produit
Batterypass
Tarifs À propos
Connexion Démarrer gratuitement
Développeurs

Connecter les données du passeport à vos systèmes.

API REST, import et export CSV, adresses fixes et tous les champs de données. Avec une clé de test, vous essayez tout sans modifier de données.

50.000passeports par fichier
38champs de données dans l’application
3formats : CSV, SVG, PNG

Vue d’ensemble

Quatre objets et quatre voies d’échange de données. Un fichier CSV suffit pour commencer ; l’API REST sert à l’exploitation courante.

  1. EntrepriseVotre compte avec utilisateurs et formule
  2. ModèleDonnées de base, une fois par modèle
  3. PasseportUne batterie avec numéro de série et adresse propre
  4. ÉvénementRéparation, réaffectation ou déchet
VoiePour quoiÉtat
Import CSVReprendre les numéros de série de l’ERP, du MES ou d’ExcelDisponible
Export CSVRamener les identifiants et adresses dans vos systèmesDisponible
Adresse du passeport et code QRCréer vos étiquettes ou renvoyer vers les passeportsDisponible
API RESTCréer modèles et passeports automatiquement, sans téléversement manuelDisponible

Import CSV

Disponible

La voie habituelle depuis l’ERP : exporter une liste et la téléverser dans un modèle. Chaque nouveau numéro de série reçoit un passeport.

export.csv
Material;Serialnummer;Fertigungsdatum;Charge;Werk;Status
BX-48V;SN-0001;01.03.2027;L2027-03;Essen;frei
BX-48V;SN-0002;01.03.2027;L2027-03;Essen;frei
BX-48V;SN-0003;02.03.2027;L2027-03;Essen;frei
RègleSpécification
EncodageUTF-8 avec ou sans BOM. Windows-1252 est détecté et converti.
SéparateurPoint-virgule, virgule ou tabulation. La première ligne fait foi.
Taille8 Mo et 50 000 lignes maximum par fichier.
StructureUne batterie par ligne, sans saut de ligne dans un champ.
En-têteFacultatif. Avec un en-tête, les colonnes peuvent être dans n’importe quel ordre et les colonnes en plus sont ignorées. Sans en-tête, l’ordre du tableau ci-dessous s’applique.
ColonneChampNoms de colonnes reconnusObligatoireRègle
1Numéro de sérieseriennummer, serialnummer, serial, serial number, serialnumber, serial no, sn, serien-nr, seriennr, sernrOui120 caractères maximum : lettres, chiffres, espaces et - _ . / :
2Date de fabricationherstelldatum, produktionsdatum, fertigungsdatum, manufacturing date, production date, date, datumFacultatif2027-03-01, 01.03.2027, 1.3.2027, 01/03/2027, 1/3/2027 ou 2027/03/01
3Lotcharge, chargennummer, batch, lot, losFacultatif120 caractères maximum
4Lieu de fabricationherstellort, produktionsort, werk, place, plant, manufacturing placeFacultatif190 caractères maximum

Ce qui se passe au téléversement

  • Un aperçu s’affiche d’abord ; rien n’est encore enregistré.
  • Les lignes erronées sont signalées avec leur numéro et ignorées.
  • Les doublons du fichier et les numéros déjà présents dans ce modèle sont ignorés.
  • Les passeports ne sont créés qu’après votre confirmation, en une seule opération. L’import figure dans le journal d’audit.

Vérifier un fichier

Disponible

Vérifiez un export avant de vous connecter. Les règles sont les mêmes que pour l’import dans l’application.

La vérification se fait uniquement dans votre navigateur ; le fichier n’est pas téléversé. Seul l’aperçu de l’application indique si un numéro existe déjà dans le modèle.

Export CSV

Disponible

Pour chaque modèle, la liste de tous les passeports se télécharge en UTF-8 avec BOM, séparée par des points-virgules. Identifiants et adresses reviennent ainsi dans l’ERP, le MES ou l’impression d’étiquettes. Le téléchargement nécessite une connexion.

paesse_BX-48V.csv
Seriennummer;Pass-ID;Pass-URL;Herstelldatum;Charge;Herstellort;Status
SN-0001;7KM2XQ9RTA;https://app.batterypass2027.eu/p/7KM2XQ9RTA;2027-03-01;L2027-03;Essen;Original

Adresse du passeport et code QR

Disponible

Chaque passeport a une adresse fixe. Un code QR, un lien dans un manuel ou une entrée d’ERP n’ont besoin de rien d’autre.

URL
https://app.batterypass2027.eu/p/{PASS-ID}
https://app.batterypass2027.eu/p/{PASS-ID}?lang=en
  • L’identifiant comporte 10 caractères et évite ceux qui prêtent à confusion comme 0, O, 1, I et L.
  • Le code QR ne contient que cette adresse. Si les données changent, il reste valable.
  • Dans l’application, le code est disponible par passeport en SVG et PNG, ainsi que des planches d’étiquettes à imprimer.
  • Sans connexion, la page du passeport n’affiche que les données publiques. Les moteurs de recherche sont priés de ne pas l’indexer.
  • Avec un GTIN, il existe aussi un lien GS1 Digital Link.

Créer vos étiquettes à partir de l’export

etiketten.py
# pip install "qrcode[pil]"
import csv
import qrcode

with open("paesse_BX-48V.csv", encoding="utf-8-sig", newline="") as f:
    for row in csv.DictReader(f, delimiter=";"):
        qrcode.make(row["Pass-URL"]).save(f'{row["Pass-ID"]}.png')

Champs de données

Disponible

Ces 38 champs existent aujourd’hui dans l’application, sous forme simplifiée selon l’annexe XIII. Ils se gèrent dans le formulaire du modèle. Les catégories sont lmt, industrie, ev, sli et geraet.

Données générales6
ChampNom techniqueTypeVisible pourObligatoire
Fabricant (nom)manufacturer_nametextPublicToutes les catégories avec passeport
Fabricant (adresse)manufacturer_addresstextPublicToutes les catégories avec passeport
Contact (e-mail ou site web)manufacturer_contacttextPublicToutes les catégories avec passeport
Lieu de fabrication (par défaut)manufacturing_placetextPublicToutes les catégories avec passeport
Poidsweight_kgnumber · kgPublicToutes les catégories avec passeport
GarantiewarrantytextPublicFacultatif
Matériaux et substances6
ChampNom techniqueTypeVisible pourObligatoire
Chimie de la batteriechemistrytextPublicToutes les catégories avec passeport
Substances dangereuseshazardous_substancestextPublicToutes les catégories avec passeport
Matières premières critiquescritical_raw_materialstextPublicToutes les catégories avec passeport
Composition de la cathodecomposition_cathodetextIntérêt légitimeToutes les catégories avec passeport
Composition de l'anodecomposition_anodetextIntérêt légitimeToutes les catégories avec passeport
Composition de l'électrolytecomposition_electrolytetextIntérêt légitimeToutes les catégories avec passeport
Performance et durabilité11
ChampNom techniqueTypeVisible pourObligatoire
Capacité nominalerated_capacity_ahnumber · AhPublicToutes les catégories avec passeport
Tension nominalenominal_voltage_vnumber · VPublicToutes les catégories avec passeport
Tension minimalemin_voltage_vnumber · VPublicToutes les catégories avec passeport
Tension maximalemax_voltage_vnumber · VPublicToutes les catégories avec passeport
Énergie nominalerated_energy_kwhnumber · kWhPublicToutes les catégories avec passeport
Puissance (d'origine)rated_power_wnumber · WPublicindustrie, ev
Durée de vie prévueexpected_lifetime_cyclesnumber · ZyklenPublicToutes les catégories avec passeport
Plage de température detemp_min_cnumber · °CPublicToutes les catégories avec passeport
Plage de température àtemp_max_cnumber · °CPublicToutes les catégories avec passeport
Rendement énergétique (aller-retour)round_trip_efficiency_pctnumber · %Publicindustrie, ev
Résistance interneinternal_resistance_mohmnumber · mΩPublicFacultatif
Empreinte carbone et contenu recyclé6
ChampNom techniqueTypeVisible pourObligatoire
Empreinte carbonecarbon_footprintnumber · kg CO₂e/kWhPublicObligation ultérieure
Part de cobalt recyclérecycled_cobalt_pctnumber · %PublicObligation ultérieure
Part de lithium recyclérecycled_lithium_pctnumber · %PublicObligation ultérieure
Part de nickel recyclérecycled_nickel_pctnumber · %PublicObligation ultérieure
Part de plomb recyclérecycled_lead_pctnumber · %PublicObligation ultérieure
Part de contenu renouvelablerenewable_content_pctnumber · %PublicFacultatif
Conformité et étiquetage4
ChampNom techniqueTypeVisible pourObligatoire
Déclaration UE de conformité (lien)doc_urlurlPublicToutes les catégories avec passeport
Étiquetage et symboleslabels_symbolstextPublicToutes les catégories avec passeport
Rapport sur le devoir de diligence (lien)due_diligence_urlurlPublicObligation ultérieure
Retour et éliminationend_of_life_infotextPublicToutes les catégories avec passeport
Démontage, réparation et pièces détachées4
ChampNom techniqueTypeVisible pourObligatoire
Instructions de démontagedismantling_infotextIntérêt légitimeToutes les catégories avec passeport
Références des composantspart_numberstextIntérêt légitimeToutes les catégories avec passeport
Source des pièces détachéesspare_parts_contacttextIntérêt légitimeToutes les catégories avec passeport
Mesures de sécuritésafety_measurestextIntérêt légitimeToutes les catégories avec passeport
Rapports d'essai1
ChampNom techniqueTypeVisible pourObligatoire
Rapports d'essai (liens ou références)test_reportstextAutorités et organismes de contrôleToutes les catégories avec passeport

API REST

Disponible

Créez modèles et passeports directement depuis l’ERP, le MES ou le BMS et signalez des événements. JSON sur HTTPS, authentification par clé. Adresse de base : https://app.batterypass2027.eu/api/v1

Démarrer en trois étapes

  1. Connectez-vous en tant qu’administrateur et ouvrez Paramètres, puis Clés API.
  2. Créez une clé de test. Elle ne s’affiche qu’une fois ; conservez-la comme un mot de passe.
  3. Vérifiez la connexion avec GET /me. Si l’API répond, la clé et le chemin réseau sont corrects.
cURL
export BATTERYPASS_KEY="bp_test_..."

curl -s https://app.batterypass2027.eu/api/v1/me \
  -H "Authorization: Bearer $BATTERYPASS_KEY"

Une clé, une entreprise

La clé détermine les données accessibles. Vous la créez dans l’application et elle ne s’affiche qu’une fois.

Les clés de test n’enregistrent rien

Une clé de test vérifie chaque requête comme en production, sans modifier de données ni consommer de quota.

Répétition sans risque

Avec la même clé d’idempotence, aucun second enregistrement n’est créé, même après une interruption. Le numéro de pièce de l’ERP convient bien.

Les passeports ne sont pas supprimés

L’API n’a pas de DELETE pour les passeports. La fin de vie d’une batterie est signalée comme événement.

Les clés de test répondent avec le statut 200 et dry_run: true. Elles lisent les vraies données sans rien modifier.

Points de terminaison

MéthodeCheminPour quoi
GET/meTest de connexion : entreprise, formule, droits et quota restant
GET/fieldsCatalogue des champs avec obligations par catégorie
GET/modelsLister les modèles, aussi par code
POST/modelsCréer un modèle
GET/models/{id}Lire un modèle avec ses données et les champs obligatoires manquants
PATCH/models/{id}Modifier les données de base
GET/passportsLister les passeports, aussi par numéro de série ou date de modification
POST/passports/batchCréer jusqu’à 1 000 passeports en un appel
GET/passports/{id}Lire un passeport avec adresse et statut
GET/passports/{id}/eventsLire les événements d’un passeport
POST/passports/{id}/eventsSignaler un événement, p. ex. réparation ou déchet
POST/models/validateVérifier un brouillon sans rien enregistrer
POST/passportsCréer un passeport
PATCH/passports/{id}Modifier la date, le lot ou le lieu
GET/passports/{id}/componentsLire les composants
POST/passports/{id}/componentsInstaller un composant
PATCH/passports/{id}/components/{cid}Modifier ou retirer un composant
POST/passports/{id}/components/{cid}/replaceRemplacer un composant
GET/passports/{id}/telemetryLire la série de mesures
POST/passports/{id}/telemetrySignaler des mesures
GET/certificatesLister les justificatifs
GET/certificates/{id}Justificatif avec lien de téléchargement
GET/suppliersLister les fournisseurs
GET/supplier-requestsLister les demandes
POST/supplier-requestsEnvoyer une demande
GET/supplier-requests/{id}Lire une demande avec les valeurs
POST/supplier-requests/{id}/acceptReprendre les valeurs dans le modèle
GET/auditLire le journal d’audit

Exemple : créer des passeports depuis l’ERP

curl -X POST https://app.batterypass2027.eu/api/v1/passports/batch \
  -H "Authorization: Bearer $BATTERYPASS_KEY" \
  -H "Idempotency-Key: erp-4711" \
  -H "Content-Type: application/json" \
  -d '{
  "model_code": "BX-48V",
  "on_conflict": "skip",
  "items": [
    { "serial": "SN-0001", "manufactured_at": "2027-03-01", "batch": "L2027-03" },
    { "serial": "SN-0002", "manufactured_at": "2027-03-01", "batch": "L2027-03" }
  ]
}'

Réponse

201 Created
HTTP/1.1 201 Created
X-Request-Id: req_4f7a91c2d03e8b56

{
  "created": 1,
  "skipped": 1,
  "skipped_serials": ["SN-0002"],
  "items": [
    {
      "id": "7KM2XQ9RTA",
      "serial": "SN-0001",
      "status": "original",
      "url": "https://app.batterypass2027.eu/p/7KM2XQ9RTA"
    }
  ]
}

Erreurs

422
HTTP/1.1 422 Unprocessable Entity

{
  "error": {
    "code": "invalid_serial",
    "message": "Serial number is missing or contains invalid characters.",
    "field": "items[3].serial",
    "request_id": "req_a03c5e17b92d4f68"
  }
}
HTTPCodeSignification
400invalid_requestLa requête n’est pas un JSON valide ou contient des champs inconnus
401unauthorizedClé manquante ou non valide
403insufficient_scopeIl manque à la clé le droit requis
403plan_requiredLes clés live nécessitent la formule Pro ou Enterprise
403email_not_verifiedL’adresse e-mail de l’entreprise n’est pas encore confirmée
403quota_exceededLe quota de la formule est épuisé
404not_foundL’objet n’existe pas ou appartient à une autre entreprise
409duplicate_serialLe numéro de série existe déjà dans ce modèle (avec on_conflict: fail)
409duplicate_modelLe code du modèle est déjà pris
409idempotency_conflictLa clé d’idempotence a servi à une autre requête
413payload_too_largeLa requête dépasse 2 Mo
422invalid_serialUn numéro de série n’est pas valide ; la réponse indique le champ. Rien n’est enregistré.
422invalid_dateUne date ne respecte pas le format AAAA-MM-JJ
422out_of_rangeUne mesure est hors de la plage autorisée
422invalid_gtinLe GTIN a une longueur ou un chiffre de contrôle incorrect
422validation_failedUne autre valeur enfreint les règles
429rate_limitedTrop de requêtes ; réessayer après Retry-After
500internal_errorErreur de notre côté. Réessai sûr avec la même clé d’idempotence.

Limites

Requêtes par minute et par cléLive 300, test 60
Passeports par appel1.000
Taille d’une requête2 MB
Entrées par page de liste100, 500 maximum
Clés actives par entreprise10
Clés livePro et Enterprise. Les clés de test existent dans toutes les formules.

Vous prévoyez plus de 100 000 passeports par an ? Parlons-en à l’avance.

Autorisations

Chaque clé ne reçoit que les droits nécessaires. S’il en manque un, l’API répond 403 et insufficient_scope. Dans l’application, vous choisissez un modèle : Tous les droits, ERP, BMS ou Lecture seule.

DroitAutorise
models:readLire les modèles et vérifier des brouillons
models:writeCréer et modifier des modèles
passports:readLire passeports, événements et composants
passports:writeCréer et modifier des passeports, signaler des événements, installer et remplacer des composants
telemetry:read telemetry:writeLire et signaler des mesures
certificates:readLire et télécharger des justificatifs
suppliers:read suppliers:writeLire fournisseurs et demandes, envoyer et accepter des demandes
audit:readLire le journal d’audit

Requêtes et réponses

Les listes arrivent par pages avec data, has_more et next_cursor. Transmettez next_cursor comme cursor. Les champs inconnus sont refusés pour révéler les fautes de frappe. Avec PATCH, un champ absent reste inchangé et null le vide.

En-têteSignification
Idempotency-KeyRépétition sans second enregistrement, valable 7 jours. Le numéro de pièce de l’ERP convient bien.
X-Batterypass-Dry-Run: trueMême une clé live ne fait que vérifier cette requête sans rien enregistrer.
X-Request-IdIdentifiant de l’appel, aussi dans les erreurs et le journal
X-RateLimit-Limit X-RateLimit-RemainingQuota de la minute en cours
Idempotent-Replayedtrue si une réponse enregistrée a été rejouée

SDK et console API

Disponible

Deux clients légers sans dépendances : ils répètent les requêtes en sécurité, parcourent les listes et découpent les gros volumes en appels de 1 000 passeports. Ce sont des fichiers uniques à copier dans votre projet. La console API se trouve dans l’application sous Paramètres, Clés API.

from batterypass import Batterypass

bp = Batterypass("bp_test_...")
print(bp.me()["organization"]["plan"])

items = [{"serial": f"SN-{i:06}"} for i in range(5000)]
print(bp.create_passports_all("BX-48V", items))

for passport in bp.list_all("/passports", model_code="BX-48V"):
    print(passport["serial"], passport["url"])

Composants

Disponible

Consignez les modules, cellules ou BMS installés dans une batterie. Un numéro de série ne peut être installé qu’une fois à la fois par passeport. Lors d’un remplacement, l’ancienne pièce reste enregistrée avec sa date de retrait.

cURL
curl -X POST https://app.batterypass2027.eu/api/v1/passports/7KM2XQ9RTA/components \
  -H "Authorization: Bearer $BATTERYPASS_KEY" -H "Content-Type: application/json" \
  -d '{"kind": "module", "label": "Modul 1", "serial": "M-0001", "supplier": "Zellwerk GmbH"}'

curl -X POST https://app.batterypass2027.eu/api/v1/passports/7KM2XQ9RTA/components/12/replace \
  -H "Authorization: Bearer $BATTERYPASS_KEY" -H "Content-Type: application/json" \
  -d '{"serial": "M-0002", "note": "Modul nach Defekt getauscht"}'

Les types autorisés sont pack, rack, module, cell, bms et other.

Mesures

Disponible

Signalez les données du BMS, une à une ou jusqu’à 1 000 mesures avec items. Lisez la série avec since et until. Les mesures sont disponibles à partir de Pro. Elles apparaissent dans l’application, pas sur la page publique.

cURL
curl -X POST https://app.batterypass2027.eu/api/v1/passports/7KM2XQ9RTA/telemetry \
  -H "Authorization: Bearer $BATTERYPASS_KEY" -H "Content-Type: application/json" \
  -d '{"recorded_at": "2027-03-01T10:00:00Z", "soh_pct": 94.5, "cycle_count": 120}'
ChampPlage
recorded_atISO 8601
soh_pct0–100
soc_pct0–100
capacity_kwh≥ 0
remaining_capacity_ah≥ 0
internal_resistance_mohm≥ 0
cycle_count≥ 0, integer
temp_min_c temp_max_c≥ −273
energy_throughput_kwh≥ 0
negative_eventdeep_discharge, overheat, accident
notemax. 500

Justificatifs

Disponible

Téléversez rapports d’essai, déclarations de conformité et documents similaires dans le modèle : PDF, PNG ou JPG jusqu’à 10 Mo. Via l’API, vous lisez la liste et obtenez un lien de téléchargement valable 15 minutes. Chaque fichier a une somme de contrôle SHA-256.

cURL
curl -s "https://app.batterypass2027.eu/api/v1/certificates?model_code=BX-48V" -H "Authorization: Bearer $BATTERYPASS_KEY"
curl -s https://app.batterypass2027.eu/api/v1/certificates/42 -H "Authorization: Bearer $BATTERYPASS_KEY"

Fournisseurs et demandes de données

Disponible

Demandez des valeurs aux fournisseurs. Ils reçoivent un e-mail avec un lien valable 30 jours et ne saisissent que les champs demandés, sans compte. Les valeurs n’arrivent dans le modèle qu’après votre validation. Disponible à partir de Starter, 20 demandes maximum par heure.

cURL
curl -X POST https://app.batterypass2027.eu/api/v1/supplier-requests \
  -H "Authorization: Bearer $BATTERYPASS_KEY" -H "Content-Type: application/json" \
  -d '{"model_code": "BX-48V", "supplier_name": "Zellwerk GmbH", "supplier_email": "daten@zellwerk.example",
       "fields": ["chemistry", "composition_cathode"], "message": "Bitte bis Monatsende"}'

curl -s "https://app.batterypass2027.eu/api/v1/supplier-requests?status=submitted" -H "Authorization: Bearer $BATTERYPASS_KEY"
curl -X POST https://app.batterypass2027.eu/api/v1/supplier-requests/7/accept -H "Authorization: Bearer $BATTERYPASS_KEY"

GS1 Digital Link

Disponible

Indiquez dans le modèle un GTIN avec un chiffre de contrôle valide. L’adresse GS1 issue du GTIN et du numéro de série mène alors à la page du passeport et figure dans l’API comme gs1_link. Vos codes QR contiennent toujours l’adresse fixe, mais vous pouvez créer vos codes à partir du lien GS1. Le GTIN s’obtient auprès de GS1.

URL
https://app.batterypass2027.eu/01/{GTIN}/21/{SERIENNUMMER}
https://app.batterypass2027.eu/01/04012345678901/21/SN-0001

Journal d'audit

Disponible

GET /audit renvoie toutes les modifications journalisées, par pages et éventuellement depuis une date avec since. Les modifications via l’API portent le nom de la clé. Dans l’application, les administrateurs voient aussi les derniers appels.

Versions

La version majeure figure dans le chemin. Dans v1, seuls des champs et points de terminaison s’ajoutent. Prévus mais pas encore disponibles : webhooks, accès pour autorités et recycleurs et chaîne de modifications vérifiable.

VersionDateModification
1.1.02026-11-06Composants, mesures, justificatifs, fournisseurs, audit, passeport unique, GS1, droits fins, en-tête dry-run, OpenAPI et point de santé
1.0.02026-11-06Modèles, passeports, événements, clés, mode test, idempotence

Questions fréquentes

Réponses courtes pour l’intégration.

Comment tester sans créer de vrais passeports ?

Avec une clé de test. Elle vérifie tout comme en production sans rien enregistrer.

Que faire en cas de timeout ?

Renvoyez la même requête avec la même clé d’idempotence. Aucun second enregistrement n’est créé.

Comment trouver le passeport d’un numéro de série ?

Avec GET /passports?serial=… et si besoin model_code.

Puis-je supprimer des passeports via l’API ?

Non. Signalez la fin de vie comme événement avec le statut waste.

Combien de passeports sont possibles ?

1 000 par appel, 300 appels par minute. Votre formule et notre hébergement fixent aussi des limites. Au-delà de 100 000 passeports par an, parlons-en à l’avance.

Essayez l’import avec votre fichier.

La formule Pilot est gratuite et couvre un modèle et 25 passeports par an.