Batteriepass-Daten an Ihre Systeme anbinden.
REST-API, CSV-Import und -Export, feste Pass-Adressen und alle Datenfelder. Mit einem Testschlüssel probieren Sie alles aus, ohne Daten zu ändern.
Überblick
Vier Objekte und vier Wege für den Datenaustausch. Für den Einstieg reicht eine CSV-Datei, für den Dauerbetrieb gibt es die REST-API.
- FirmaIhr Konto mit Nutzern und Paket
- ModellStammdaten, einmal je Batteriemodell
- PassEine Batterie mit Seriennummer und eigener Adresse
- EreignisReparatur, Umnutzung oder Abfall
| Weg | Wofür | Stand |
|---|---|---|
| CSV-Import | Seriennummern aus ERP, MES oder Excel übernehmen | Verfügbar |
| CSV-Export | Pass-IDs und Adressen zurück in Ihre Systeme holen | Verfügbar |
| Pass-Adresse und QR-Code | Eigene Etiketten erzeugen oder Pässe verlinken | Verfügbar |
| REST-API | Modelle und Pässe automatisch anlegen, ohne Upload von Hand | Verfügbar |
CSV-Import
VerfügbarDer übliche Weg aus dem ERP: Liste exportieren und bei einem Modell hochladen. Für jede neue Seriennummer entsteht ein Pass.
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
| Regel | Vorgabe |
|---|---|
| Zeichensatz | UTF-8 mit oder ohne BOM. Windows-1252 wird erkannt und umgewandelt. |
| Trennzeichen | Semikolon, Komma oder Tabulator. Maßgeblich ist die erste Zeile. |
| Größe | Höchstens 8 MB und 50.000 Zeilen je Datei. |
| Aufbau | Eine Batterie je Zeile, keine Zeilenumbrüche innerhalb eines Feldes. |
| Kopfzeile | Freiwillig. Mit Kopfzeile dürfen die Spalten beliebig stehen, weitere Spalten werden ignoriert. Ohne Kopfzeile gilt die Reihenfolge der Tabelle unten. |
| Spalte | Feld | Erkannte Spaltennamen | Pflicht | Regel |
|---|---|---|---|---|
| 1 | Seriennummer | seriennummer, serialnummer, serial, serial number, serialnumber, serial no, sn, serien-nr, seriennr, sernr | Ja | Höchstens 120 Zeichen: Buchstaben, Ziffern, Leerzeichen und - _ . / : |
| 2 | Herstelldatum | herstelldatum, produktionsdatum, fertigungsdatum, manufacturing date, production date, date, datum | Freiwillig | 2027-03-01, 01.03.2027, 1.3.2027, 01/03/2027, 1/3/2027 oder 2027/03/01 |
| 3 | Charge | charge, chargennummer, batch, lot, los | Freiwillig | Höchstens 120 Zeichen |
| 4 | Herstellort | herstellort, produktionsort, werk, place, plant, manufacturing place | Freiwillig | Höchstens 190 Zeichen |
Was beim Hochladen passiert
- Zuerst erscheint eine Vorschau, gespeichert wird noch nichts.
- Fehlerhafte Zeilen werden mit Zeilennummer gemeldet und übersprungen.
- Doppelte Seriennummern in der Datei und bereits vorhandene Nummern dieses Modells werden übersprungen.
- Erst nach Ihrer Bestätigung entstehen die Pässe, in einem einzigen Vorgang. Der Import steht im Audit-Trail.
Datei prüfen
VerfügbarPrüfen Sie einen Export, bevor Sie sich anmelden. Es gelten dieselben Regeln wie beim Import in der App.
Die Prüfung läuft nur in Ihrem Browser, die Datei wird nicht hochgeladen. Ob eine Nummer im Modell schon existiert, sieht erst die Vorschau in der App.
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;freiCSV-Export
VerfügbarBei jedem Modell lässt sich die Liste aller Pässe herunterladen, im Format UTF-8 mit BOM und mit Semikolon getrennt. So kommen Pass-IDs und Adressen zurück in ERP, MES oder Etikettendruck. Der Download setzt eine Anmeldung voraus.
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
Pass-Adresse und QR-Code
VerfügbarJeder Pass hat eine feste Adresse. Mehr braucht ein QR-Code, ein Link aus dem Handbuch oder ein Eintrag im ERP nicht.
https://app.batterypass2027.eu/p/{PASS-ID}
https://app.batterypass2027.eu/p/{PASS-ID}?lang=en- Die Pass-ID hat 10 Zeichen und meidet verwechselbare Zeichen wie 0, O, 1, I und L.
- Der QR-Code enthält nur diese Adresse. Ändern sich die Daten, bleibt er gültig.
- In der App gibt es den Code je Pass als SVG und PNG sowie Etikettenbögen zum Drucken.
- Die Pass-Seite zeigt ohne Anmeldung nur die öffentlichen Angaben. Suchmaschinen sollen sie nicht aufnehmen.
- Mit hinterlegter GTIN gibt es zusätzlich einen GS1 Digital Link.
Eigene Etiketten aus dem Export erzeugen
# 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')
Datenfelder
VerfügbarDiese 38 Felder gibt es heute in der App, in vereinfachter Form nach Anhang XIII. Sie werden im Formular des Modells gepflegt. Die Kategorien sind lmt, industrie, ev, sli und geraet.
Allgemeine Angaben6
| Feld | Technischer Name | Typ | Sichtbar für | Pflicht |
|---|---|---|---|---|
| Hersteller (Name) | manufacturer_name | text | Öffentlich | Alle Pass-Kategorien |
| Hersteller (Anschrift) | manufacturer_address | text | Öffentlich | Alle Pass-Kategorien |
| Kontakt (E-Mail oder Website) | manufacturer_contact | text | Öffentlich | Alle Pass-Kategorien |
| Herstellungsort (Standard) | manufacturing_place | text | Öffentlich | Alle Pass-Kategorien |
| Gewicht | weight_kg | number · kg | Öffentlich | Alle Pass-Kategorien |
| Gewährleistung / Garantie | warranty | text | Öffentlich | Freiwillig |
Materialien & Stoffe6
| Feld | Technischer Name | Typ | Sichtbar für | Pflicht |
|---|---|---|---|---|
| Batteriechemie | chemistry | text | Öffentlich | Alle Pass-Kategorien |
| Gefährliche Stoffe | hazardous_substances | text | Öffentlich | Alle Pass-Kategorien |
| Kritische Rohstoffe | critical_raw_materials | text | Öffentlich | Alle Pass-Kategorien |
| Zusammensetzung Kathode | composition_cathode | text | Berechtigtes Interesse | Alle Pass-Kategorien |
| Zusammensetzung Anode | composition_anode | text | Berechtigtes Interesse | Alle Pass-Kategorien |
| Zusammensetzung Elektrolyt | composition_electrolyte | text | Berechtigtes Interesse | Alle Pass-Kategorien |
Leistung & Haltbarkeit11
| Feld | Technischer Name | Typ | Sichtbar für | Pflicht |
|---|---|---|---|---|
| Nennkapazität | rated_capacity_ah | number · Ah | Öffentlich | Alle Pass-Kategorien |
| Nennspannung | nominal_voltage_v | number · V | Öffentlich | Alle Pass-Kategorien |
| Minimale Spannung | min_voltage_v | number · V | Öffentlich | Alle Pass-Kategorien |
| Maximale Spannung | max_voltage_v | number · V | Öffentlich | Alle Pass-Kategorien |
| Nennenergie | rated_energy_kwh | number · kWh | Öffentlich | Alle Pass-Kategorien |
| Leistung (ursprünglich) | rated_power_w | number · W | Öffentlich | industrie, ev |
| Erwartete Lebensdauer | expected_lifetime_cycles | number · Zyklen | Öffentlich | Alle Pass-Kategorien |
| Temperaturbereich von | temp_min_c | number · °C | Öffentlich | Alle Pass-Kategorien |
| Temperaturbereich bis | temp_max_c | number · °C | Öffentlich | Alle Pass-Kategorien |
| Energieeffizienz (Round Trip) | round_trip_efficiency_pct | number · % | Öffentlich | industrie, ev |
| Innenwiderstand | internal_resistance_mohm | number · mΩ | Öffentlich | Freiwillig |
CO₂ & Rezyklat6
| Feld | Technischer Name | Typ | Sichtbar für | Pflicht |
|---|---|---|---|---|
| CO₂-Fußabdruck | carbon_footprint | number · kg CO₂e/kWh | Öffentlich | Pflicht greift später |
| Rezyklatanteil Kobalt | recycled_cobalt_pct | number · % | Öffentlich | Pflicht greift später |
| Rezyklatanteil Lithium | recycled_lithium_pct | number · % | Öffentlich | Pflicht greift später |
| Rezyklatanteil Nickel | recycled_nickel_pct | number · % | Öffentlich | Pflicht greift später |
| Rezyklatanteil Blei | recycled_lead_pct | number · % | Öffentlich | Pflicht greift später |
| Anteil erneuerbarer Inhalte | renewable_content_pct | number · % | Öffentlich | Freiwillig |
Konformität & Kennzeichnung4
| Feld | Technischer Name | Typ | Sichtbar für | Pflicht |
|---|---|---|---|---|
| EU-Konformitätserklärung (Link) | doc_url | url | Öffentlich | Alle Pass-Kategorien |
| Kennzeichnung & Symbole | labels_symbols | text | Öffentlich | Alle Pass-Kategorien |
| Bericht Sorgfaltspflichten (Link) | due_diligence_url | url | Öffentlich | Pflicht greift später |
| Rückgabe & Entsorgung | end_of_life_info | text | Öffentlich | Alle Pass-Kategorien |
Demontage, Reparatur & Ersatzteile4
| Feld | Technischer Name | Typ | Sichtbar für | Pflicht |
|---|---|---|---|---|
| Demontage-Anleitung | dismantling_info | text | Berechtigtes Interesse | Alle Pass-Kategorien |
| Teilenummern der Komponenten | part_numbers | text | Berechtigtes Interesse | Alle Pass-Kategorien |
| Bezugsquelle Ersatzteile | spare_parts_contact | text | Berechtigtes Interesse | Alle Pass-Kategorien |
| Sicherheitsmaßnahmen | safety_measures | text | Berechtigtes Interesse | Alle Pass-Kategorien |
Prüfberichte1
| Feld | Technischer Name | Typ | Sichtbar für | Pflicht |
|---|---|---|---|---|
| Prüfberichte (Links oder Referenzen) | test_reports | text | Behörden und Prüfstellen | Alle Pass-Kategorien |
REST-API
VerfügbarLegen Sie Modelle und Pässe direkt aus ERP, MES oder BMS an und melden Sie Ereignisse. JSON über HTTPS, Anmeldung per Schlüssel. Basisadresse: https://app.batterypass2027.eu/api/v1
In drei Schritten starten
- Melden Sie sich als Administrator an und öffnen Sie Einstellungen, dann API-Schlüssel.
- Erstellen Sie einen Testschlüssel. Er wird nur einmal angezeigt, bewahren Sie ihn wie ein Passwort auf.
- Prüfen Sie die Verbindung mit GET /me. Antwortet die API, stimmen Schlüssel und Netzwerkweg.
export BATTERYPASS_KEY="bp_test_..." curl -s https://app.batterypass2027.eu/api/v1/me \ -H "Authorization: Bearer $BATTERYPASS_KEY"
Ein Schlüssel, eine Firma
Der Schlüssel legt fest, welche Daten erreichbar sind. Sie erzeugen ihn in der App, er wird nur einmal angezeigt.
Testschlüssel speichern nichts
Ein Testschlüssel prüft jede Anfrage wie im Echtbetrieb, ändert aber keine Daten und verbraucht kein Kontingent.
Sicher wiederholen
Mit demselben Idempotency-Key entsteht auch nach einem Abbruch kein zweiter Datensatz. Die Belegnummer aus dem ERP eignet sich dafür gut.
Pässe werden nicht gelöscht
Die API kennt kein DELETE für Pässe. Das Lebensende einer Batterie wird als Ereignis gemeldet.
Testschlüssel antworten mit Status 200 und dry_run: true. Sie lesen echte Daten, ändern aber nichts.
Endpunkte
| Methode | Pfad | Wofür |
|---|---|---|
| GET | /me | Verbindungstest: Firma, Paket, Rechte und freies Kontingent |
| GET | /fields | Feldkatalog mit Pflicht je Kategorie |
| GET | /models | Modelle auflisten, auch nach Modellkennung |
| POST | /models | Modell anlegen |
| GET | /models/{id} | Ein Modell mit Daten und fehlenden Pflichtfeldern lesen |
| PATCH | /models/{id} | Stammdaten ändern |
| GET | /passports | Pässe auflisten, auch nach Seriennummer oder Änderungsdatum |
| POST | /passports/batch | Bis zu 1.000 Pässe in einem Aufruf anlegen |
| GET | /passports/{id} | Einen Pass mit Adresse und Status lesen |
| GET | /passports/{id}/events | Ereignisse eines Passes lesen |
| POST | /passports/{id}/events | Ereignis melden, zum Beispiel Reparatur oder Abfall |
| POST | /models/validate | Entwurf prüfen, nichts speichern |
| POST | /passports | Einen Pass anlegen |
| PATCH | /passports/{id} | Datum, Charge oder Ort ändern |
| GET | /passports/{id}/components | Komponenten lesen |
| POST | /passports/{id}/components | Komponente einbauen |
| PATCH | /passports/{id}/components/{cid} | Komponente ändern oder ausbauen |
| POST | /passports/{id}/components/{cid}/replace | Komponente tauschen |
| GET | /passports/{id}/telemetry | Messreihe lesen |
| POST | /passports/{id}/telemetry | Messungen melden |
| GET | /certificates | Nachweise auflisten |
| GET | /certificates/{id} | Nachweis mit Download-Link |
| GET | /suppliers | Lieferanten auflisten |
| GET | /supplier-requests | Datenanfragen auflisten |
| POST | /supplier-requests | Lieferanten anfragen |
| GET | /supplier-requests/{id} | Anfrage mit gelieferten Werten lesen |
| POST | /supplier-requests/{id}/accept | Gelieferte Werte ins Modell übernehmen |
| GET | /audit | Audit-Trail lesen |
Beispiel: Pässe aus dem ERP anlegen
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" }
]
}'
import os
import requests
res = requests.post(
"https://app.batterypass2027.eu/api/v1/passports/batch",
headers={
"Authorization": f"Bearer {os.environ['BATTERYPASS_KEY']}",
"Idempotency-Key": "erp-4711",
},
json={
"model_code": "BX-48V",
"on_conflict": "skip",
"items": [{"serial": "SN-0001", "manufactured_at": "2027-03-01"}],
},
timeout=30,
)
res.raise_for_status()
print(res.json()["created"])
const res = await fetch("https://app.batterypass2027.eu/api/v1/passports/batch", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BATTERYPASS_KEY}`,
"Idempotency-Key": "erp-4711",
"Content-Type": "application/json",
},
body: JSON.stringify({
model_code: "BX-48V",
on_conflict: "skip",
items: [{ serial: "SN-0001", manufactured_at: "2027-03-01" }],
}),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
console.log((await res.json()).created);
<?php
$ch = curl_init("https://app.batterypass2027.eu/api/v1/passports/batch");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BATTERYPASS_KEY"),
"Idempotency-Key: erp-4711",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"model_code" => "BX-48V",
"on_conflict" => "skip",
"items" => [["serial" => "SN-0001", "manufactured_at" => "2027-03-01"]],
]),
]);
echo curl_exec($ch);
Antwort
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"
}
]
}
Fehler
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"
}
}
| HTTP | Code | Bedeutung |
|---|---|---|
400 | invalid_request | Anfrage ist kein gültiges JSON oder enthält unbekannte Felder |
401 | unauthorized | Schlüssel fehlt oder ist ungültig |
403 | insufficient_scope | Dem Schlüssel fehlt das nötige Recht |
403 | plan_required | Live-Schlüssel brauchen das Paket Pro oder Enterprise |
403 | email_not_verified | Die E-Mail-Adresse der Firma ist noch nicht bestätigt |
403 | quota_exceeded | Das Kontingent des Pakets ist ausgeschöpft |
404 | not_found | Objekt gibt es nicht oder es gehört einer anderen Firma |
409 | duplicate_serial | Seriennummer existiert bereits in diesem Modell (bei on_conflict: fail) |
409 | duplicate_model | Die Modellkennung ist schon vergeben |
409 | idempotency_conflict | Der Idempotency-Key wurde für eine andere Anfrage benutzt |
413 | payload_too_large | Die Anfrage ist größer als 2 MB |
422 | invalid_serial | Eine Seriennummer ist ungültig, das Feld steht in der Antwort. Es wird nichts gespeichert. |
422 | invalid_date | Ein Datum entspricht nicht dem Format JJJJ-MM-TT |
422 | out_of_range | Ein Messwert liegt außerhalb des erlaubten Bereichs |
422 | invalid_gtin | Die GTIN hat eine falsche Länge oder Prüfziffer |
422 | validation_failed | Ein anderer Wert verletzt die Regeln |
429 | rate_limited | Zu viele Anfragen, nach Retry-After erneut senden |
500 | internal_error | Fehler bei uns. Mit demselben Idempotency-Key sicher wiederholbar. |
Grenzen
| Anfragen je Minute und Schlüssel | Live 300, Test 60 |
| Pässe je Aufruf | 1.000 |
| Größe einer Anfrage | 2 MB |
| Einträge je Listenseite | 100, höchstens 500 |
| Aktive Schlüssel je Firma | 10 |
| Live-Schlüssel | Pro und Enterprise. Testschlüssel gibt es in jedem Paket. |
Planen Sie mehr als 100.000 Pässe im Jahr? Stimmen Sie das bitte vorab mit uns ab.
Berechtigungen
Jeder Schlüssel bekommt nur die Rechte, die das System braucht. Fehlt eines, antwortet die API mit 403 und insufficient_scope. In der App wählen Sie eine Vorlage: Alle Rechte, ERP, BMS oder Nur lesen.
| Recht | Erlaubt |
|---|---|
models:read | Modelle lesen und Entwürfe prüfen |
models:write | Modelle anlegen und ändern |
passports:read | Pässe, Ereignisse und Komponenten lesen |
passports:write | Pässe anlegen und ändern, Ereignisse melden, Komponenten einbauen und tauschen |
telemetry:read telemetry:write | Messwerte lesen und melden |
certificates:read | Nachweise lesen und herunterladen |
suppliers:read suppliers:write | Lieferanten und Datenanfragen lesen, Anfragen senden und übernehmen |
audit:read | Audit-Trail lesen |
Anfragen und Antworten
Listen kommen seitenweise mit data, has_more und next_cursor. Den Wert von next_cursor geben Sie als cursor mit. Unbekannte Felder werden abgelehnt, damit Tippfehler sofort auffallen. Bei PATCH bleibt ein fehlendes Feld unverändert, null leert es.
| Kopfzeile | Bedeutung |
|---|---|
Idempotency-Key | Wiederholung ohne zweiten Datensatz, 7 Tage gültig. Gut geeignet ist die Belegnummer aus dem ERP. |
X-Batterypass-Dry-Run: true | Auch ein Live-Schlüssel prüft diese Anfrage nur und speichert nichts. |
X-Request-Id | Kennung des Aufrufs, auch in Fehlern und im Protokoll der App |
X-RateLimit-Limit X-RateLimit-Remaining | Kontingent der laufenden Minute |
Idempotent-Replayed | true, wenn eine gespeicherte Antwort wiederholt wurde |
SDK und API-Konsole
VerfügbarZwei schlanke Clients ohne Abhängigkeiten: Sie wiederholen Anfragen sicher, blättern selbst durch Listen und teilen große Mengen in Aufrufe zu je 1.000 Pässen. Beide sind einzelne Dateien zum Kopieren in Ihr Projekt. Die API-Konsole finden Sie in der App unter Einstellungen, API-Schlüssel.
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"])
import { Batterypass } from "./batterypass.mjs";
const bp = new Batterypass({ apiKey: process.env.BATTERYPASS_KEY });
console.log((await bp.me()).organization.plan);
const items = Array.from({ length: 5000 }, (_, i) => ({ serial: `SN-${i}` }));
console.log(await bp.createPassportsAll("BX-48V", items));
for await (const passport of bp.listAll("/passports", { model_code: "BX-48V" })) {
console.log(passport.serial, passport.url);
}
Komponenten
VerfügbarHalten Sie fest, welche Module, Zellen oder BMS in einer Batterie verbaut sind. Eine Seriennummer kann je Pass nur einmal gleichzeitig verbaut sein. Beim Tausch bleibt das alte Teil mit Ausbaudatum erhalten.
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"}'
Erlaubte Arten sind pack, rack, module, cell, bms und other.
Messwerte
VerfügbarMelden Sie Daten aus dem BMS, einzeln oder bis zu 1.000 Messungen mit items. Lesen lässt sich die Reihe mit since und until. Messwerte gibt es ab dem Paket Pro. Sie erscheinen in der App, nicht auf der öffentlichen Pass-Seite.
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}'
| Feld | Bereich |
|---|---|
recorded_at | ISO 8601 |
soh_pct | 0–100 |
soc_pct | 0–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_event | deep_discharge, overheat, accident |
note | max. 500 |
Nachweise
VerfügbarPrüfberichte, Konformitätserklärungen und ähnliche Dokumente laden Sie in der App beim Modell hoch: PDF, PNG oder JPG bis 10 MB. Über die API lesen Sie die Liste und holen einen Download-Link, der 15 Minuten gilt. Jede Datei hat eine SHA-256-Prüfsumme.
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"
Lieferanten und Datenanfragen
VerfügbarFragen Sie Werte bei Zulieferern an. Sie erhalten eine E-Mail mit einem 30 Tage gültigen Link und tragen nur die angefragten Felder ein, ohne Konto. Gelieferte Werte landen erst nach Ihrer Freigabe im Modell. Verfügbar ab dem Paket Starter, höchstens 20 Anfragen pro Stunde.
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
VerfügbarHinterlegen Sie beim Modell eine GTIN mit gültiger Prüfziffer. Dann führt die GS1-Adresse aus GTIN und Seriennummer auf die Pass-Seite und steht in der API als gs1_link. Ihre QR-Codes enthalten weiter die feste Pass-Adresse, Sie können aber eigene Codes aus dem GS1-Link erzeugen. Die GTIN selbst erhalten Sie von GS1.
https://app.batterypass2027.eu/01/{GTIN}/21/{SERIENNUMMER}
https://app.batterypass2027.eu/01/04012345678901/21/SN-0001
Audit-Trail
VerfügbarGET /audit liefert alle protokollierten Änderungen der Firma, seitenweise und optional ab einem Zeitpunkt mit since. Änderungen über die API tragen den Namen des Schlüssels. In der App sehen Administratoren außerdem die letzten Aufrufe je Schlüssel.
Versionen
Die Hauptversion steht im Pfad. Innerhalb von v1 kommen nur Felder und Endpunkte hinzu. Geplant, aber noch nicht vorhanden: Webhooks, ein Zugang für Behörden und Recycler sowie eine nachprüfbare Änderungskette.
| Version | Datum | Änderung |
|---|---|---|
1.1.0 | 2026-11-06 | Komponenten, Messwerte, Nachweise, Lieferanten, Audit, Einzelpass, GS1, feine Rechte, Dry-Run-Kopfzeile, OpenAPI und Health-Endpunkt |
1.0.0 | 2026-11-06 | Modelle, Pässe, Ereignisse, Schlüssel, Testmodus, Idempotenz |
Häufige Fragen
Kurze Antworten für die Anbindung.
Wie teste ich, ohne echte Pässe zu erzeugen?
Mit einem Testschlüssel. Er prüft alles wie im Echtbetrieb und speichert nichts.
Was tun bei einem Timeout?
Dieselbe Anfrage mit demselben Idempotency-Key erneut senden. Es entsteht kein zweiter Datensatz.
Wie finde ich den Pass zu einer Seriennummer?
Mit GET /passports?serial=… und bei Bedarf model_code.
Kann ich Pässe über die API löschen?
Nein. Das Lebensende melden Sie als Ereignis mit dem Status waste.
Wie viele Pässe sind möglich?
1.000 je Aufruf, 300 Aufrufe je Minute. Grenzen setzen außerdem Ihr Paket und unser Hosting. Planen Sie mehr als 100.000 Pässe im Jahr, stimmen Sie das bitte vorab mit uns ab.
Probieren Sie den Import mit Ihrer Datei.
Der Pilot ist kostenlos und reicht für ein Modell und 25 Pässe im Jahr.