Zum Inhalt springen

Pässe exportieren

Laden Sie BatteryPass-JSON, PDF und QR-Code einer Passversion sowie die Einheiten Ihrer Organisation als Tabelle herunter.

Alle Exporte sind einfache GET-Anfragen mit einem Schlüssel, der den Scope read hat. Sie kommen als Dateien mit dem Header Content-Disposition: attachment zurück, der einen fertigen Dateinamen mitbringt.

ExportOperationContent-TypeDateiname
BatteryPass-v2.0-JSON einer VersionexportPassportJsonapplication/json{gtin}-{serial}-batterypass-v2.json
PDF einer VersionexportPassportPdfapplication/pdf{gtin}-{serial}-v{versionNo}-{lang}.pdf
QR-Code der EinheitgetPassportQrimage/png oder image/svg+xmlqr-{gtin}-{serial}.png oder .svg
Einheiten als TabelleexportUnitsXLSX oder text/csvunits-{YYYYMMDD}.xlsx oder .csv

Ein / in einer Seriennummer wird in Dateinamen zu _.

Passexporte Schritt für Schritt

Version ermitteln

JSON und PDF gehören zu einer veröffentlichten Version. getPassport nennt die aktuelle in current_version.version_no; listPassportVersions listet alle Versionen, die neueste zuerst.

cURL
curl -sS "$BATTERYPASS_URL/api/v1/batteries/0192a3f0-5b7c-7d21-8e4f-6a2b9c1d3e5f/passport" \
  -H "Authorization: Bearer $BATTERYPASS_API_KEY" | jq '{status, passport_id, version: .current_version.version_no}'

Eine Einheit, die nie veröffentlicht wurde, hat keine Version: Die Versionsexporte antworten mit 404 not_found.

Dateien herunterladen

cURL
BATTERY_ID=0192a3f0-5b7c-7d21-8e4f-6a2b9c1d3e5f
# -O -J speichert unter dem Namen aus Content-Disposition
curl -sS -OJ -H "Authorization: Bearer $BATTERYPASS_API_KEY" \
  "$BATTERYPASS_URL/api/v1/batteries/$BATTERY_ID/passport/versions/3/batterypass-v2"
curl -sS -OJ -H "Authorization: Bearer $BATTERYPASS_API_KEY" \
  "$BATTERYPASS_URL/api/v1/batteries/$BATTERY_ID/passport/versions/3/pdf?lang=de"
curl -sS -OJ -H "Authorization: Bearer $BATTERYPASS_API_KEY" \
  "$BATTERYPASS_URL/api/v1/batteries/$BATTERY_ID/passport/qr?format=svg"

Im Code lesen Sie zuerst die Version und übernehmen den Dateinamen aus Content-Disposition:

// exports.mts: npx tsx exports.mts <battery-id>
import { writeFile } from 'node:fs/promises';
import { basename } from 'node:path';

const BASE = `${process.env.BATTERYPASS_URL}/api/v1`;
const headers = { Authorization: `Bearer ${process.env.BATTERYPASS_API_KEY}` };
const batteryId = process.argv[2];

async function download(path: string) {
  const res = await fetch(BASE + path, { headers });
  if (!res.ok) throw new Error(`${path}: ${res.status} ${(await res.json()).code}`);
  // Content-Disposition: attachment; filename=04012345000023-SV2027-000184-v3-de.pdf
  const match = /filename="?([^";]+)"?/.exec(res.headers.get('Content-Disposition') ?? '');
  const file = basename(match?.[1] ?? 'download');
  await writeFile(file, Buffer.from(await res.arrayBuffer()));
  console.log(file, res.headers.get('Content-Type'));
}

const passportRes = await fetch(`${BASE}/batteries/${batteryId}/passport`, { headers });
const passport = await passportRes.json();
const versionNo = passport.current_version?.version_no;
if (!versionNo) throw new Error(`passport is ${passport.status}: no published version yet`);

await download(`/batteries/${batteryId}/passport/versions/${versionNo}/batterypass-v2`);
await download(`/batteries/${batteryId}/passport/versions/${versionNo}/pdf?lang=de`);
await download(`/batteries/${batteryId}/passport/qr?format=svg`);

BatteryPass-JSON

exportPassportJson liefert den Export, der bei der Veröffentlichung der Version erzeugt und gespeichert wurde, im Format des BatteryPass-Ready Data Model v2.0. Er enthält alle Zugriffsstufen einschließlich eingeschränkter Werte; behandeln Sie die Datei vertraulich. Ob er das JSON-Schema des Datenmodells erfüllt, ist ein Hinweis und blockiert keine Veröffentlichung: Die Versionsübersicht trägt batterypass_v2_valid und batterypass_v2_issue_count, getPassportVersion den vollständigen Bericht in batterypass_v2.

PDF

exportPassportPdf erzeugt eine Version mit allen Stufen (eingeschränkte Zeilen mit ihrer Stufe gekennzeichnet), der Signatur und dem QR-Code. lang ist de (Standard) oder en. Wie das JSON enthält auch das PDF eingeschränkte Daten.

QR-Code

getPassportQr erzeugt den QR-Code zum gs1_digital_link der Einheit (Fehlerkorrektur M, Ruhezone von vier Modulen).

formatstringqueryStandard: png
png oder svg. SVG skaliert verlustfrei und eignet sich für den Druck.
sizeintegerqueryStandard: 512
Breite und Höhe des PNG in Pixeln, 128 bis 2048. Bei SVG ohne Wirkung.

Den QR-Code gibt es, sobald die Kennungen gesperrt sind, vor oder mit der ersten Veröffentlichung. Davor lautet die Antwort 409 conflict. Der Link darin ändert sich danach nie mehr; ein gedrucktes Etikett bleibt also auch für spätere Versionen gültig. Für viele Einheiten auf einmal siehe das Rezept QR-Etiketten für eine Charge.

Einheiten als Tabelle

exportUnits liefert die Einheiten, die zu den Filtern passen, mit den Spalten des Tabellenimports: Modell, Version, die Felder der Einheit und jedes Feld auf Einheitsebene, das einen Wert hat. Ein Mitglied kann die Datei bearbeiten und im Portal wieder importieren.

formatstringqueryStandard: xlsx
xlsx oder csv. CSV ist UTF-8 mit Byte Order Mark, durch Kommas getrennt, mit CRLF-Zeilenenden.
battery_model_iduuidquery
Nur Einheiten dieses Modells.
model_version_iduuidquery
Nur Einheiten dieser Modellversion.
passport_statusstringquery
Nur Einheiten, deren Pass diesen Status hat, z. B. published.
serial_prefixstringquery
Nur Seriennummern, die mit diesem Text beginnen.
import_iduuidquery
Nur Einheiten aus diesem Import.
cURL
curl -sS -OJ -H "Authorization: Bearer $BATTERYPASS_API_KEY" \
  "$BATTERYPASS_URL/api/v1/batteries/export?format=csv&passport_status=published&serial_prefix=SV2027-"

Eine Datei fasst höchstens 10 000 Einheiten. Bei mehr lautet die Antwort 400 validation_error auf filter (out_of_range): Schränken Sie die Filter ein, etwa nach Modellversion oder Seriennummernpräfix. In CSV-Dateien bekommt eine Zelle, die mit =, + oder @ beginnt oder mit - beginnt und keine Zahl ist, ein vorangestelltes ', damit Tabellenprogramme sie nicht als Formel ausführen; der Import entfernt es wieder.

Fehler

Status und codeTypische Ursache
400 validation_errorsize außerhalb von 128 bis 2048; unbekanntes format oder lang; mehr als 10 000 Einheiten bei exportUnits
401 unauthenticatedSchlüssel fehlt, ist unbekannt oder widerrufen
403 forbiddenDem Schlüssel fehlt der Scope read
404 not_foundUnbekannte Einheit oder keine Version mit dieser Nummer
409 conflictgetPassportQr, bevor die Kennungen gesperrt sind
429 rate_limitedZu viele Anfragen; Retry-After abwarten

Auf dieser Seite