Conecte los datos del pasaporte a sus sistemas.
API REST, importación y exportación CSV, direcciones fijas y todos los campos de datos. Con una clave de prueba lo prueba todo sin cambiar datos.
Resumen
Cuatro objetos y cuatro vías para intercambiar datos. Para empezar basta un archivo CSV; para la operación continua está la API REST.
- EmpresaSu cuenta con usuarios y plan
- ModeloDatos maestros, una vez por modelo
- PasaporteUna batería con número de serie y dirección propia
- EventoReparación, cambio de uso o residuo
| Vía | Para qué | Estado |
|---|---|---|
| Importación CSV | Traer números de serie desde ERP, MES o Excel | Disponible |
| Exportación CSV | Devolver identificadores y direcciones a sus sistemas | Disponible |
| Dirección del pasaporte y código QR | Crear etiquetas propias o enlazar pasaportes | Disponible |
| API REST | Crear modelos y pasaportes automáticamente, sin subidas manuales | Disponible |
Importación CSV
DisponibleLa vía habitual desde el ERP: exportar una lista y subirla a un modelo. Cada número de serie nuevo recibe un pasaporte.
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
| Regla | Especificación |
|---|---|
| Codificación | UTF-8 con o sin BOM. Windows-1252 se detecta y se convierte. |
| Separador | Punto y coma, coma o tabulador. Decide la primera línea. |
| Tamaño | Máximo 100 MB por archivo, también en Excel (.xlsx). Los archivos desde 1 MB se procesan por secciones. |
| Estructura | Una batería por fila, sin saltos de línea dentro de un campo. |
| Encabezado | Opcional. Con encabezado, las columnas pueden ir en cualquier orden y las adicionales se ignoran. Sin él, se aplica el orden de la tabla inferior. |
| Columna | Campo | Nombres de columna reconocidos | Obligatorio | Regla |
|---|---|---|---|---|
| 1 | Número de serie | seriennummer, serialnummer, serial, serial number, serialnumber, serial no, sn, serien-nr, seriennr, sernr | Sí | Máximo 120 caracteres: letras, dígitos, espacios y - _ . / : |
| 2 | Fecha de fabricación | herstelldatum, produktionsdatum, fertigungsdatum, manufacturing date, production date, date, datum | Opcional | 2027-03-01, 01.03.2027, 1.3.2027, 01/03/2027, 1/3/2027 o 2027/03/01 |
| 3 | Lote | charge, chargennummer, batch, lot, los | Opcional | Máximo 120 caracteres |
| 4 | Lugar de fabricación | herstellort, produktionsort, werk, place, plant, manufacturing place | Opcional | Máximo 190 caracteres |
Qué ocurre al subir el archivo
- Primero aparece una vista previa; aún no se guarda nada.
- Las filas erróneas se indican con su número y se omiten.
- Se omiten los números duplicados en el archivo y los ya existentes en este modelo.
- Los pasaportes se crean solo tras su confirmación, en una única operación. La importación figura en el registro de auditoría.
Comprobar un archivo
DisponibleCompruebe una exportación antes de iniciar sesión. Se aplican las mismas reglas que en la importación de la aplicación.
La comprobación se realiza solo en su navegador; el archivo no se sube. Si un número ya existe en el modelo solo lo muestra la vista previa de la aplicación.
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;freiExportación CSV
DisponibleEn cada modelo se puede descargar la lista de todos los pasaportes, en UTF-8 con BOM y separada por punto y coma. Así vuelven identificadores y direcciones al ERP, MES o la impresión de etiquetas. La descarga requiere iniciar sesión.
Seriennummer;Pass-ID;Pass-URL;Herstelldatum;Charge;Herstellort;Status SN-0001;7KM2XQ9RTA;https://app.digitalbatterypass.eu/p/7KM2XQ9RTA;2027-03-01;L2027-03;Essen;Original
Dirección del pasaporte y código QR
DisponibleCada pasaporte tiene una dirección fija. Un código QR, un enlace de un manual o una entrada del ERP no necesitan más.
https://app.digitalbatterypass.eu/p/{PASS-ID}
https://app.digitalbatterypass.eu/p/{PASS-ID}?lang=en- El identificador tiene 10 caracteres y evita los que se confunden, como 0, O, 1, I y L.
- El código QR solo contiene esta dirección. Si cambian los datos, sigue siendo válido.
- En la aplicación, el código está disponible por pasaporte en SVG y PNG, además de hojas de etiquetas para imprimir.
- Sin iniciar sesión, la página del pasaporte muestra solo los datos públicos. Se pide a los buscadores que no la indexen.
- Con un GTIN hay además un enlace GS1 Digital Link.
Crear etiquetas propias desde la exportación
# 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')
Pasaporte como JSON en formato UE
La misma dirección ofrece la página a las personas y JSON según el esquema UE 1.0.0 a los programas, sin registro y solo con datos públicos. Si faltan datos obligatorios, también faltan en el JSON y el registro rechazaría el pasaporte.
curl -H "Accept: application/json" https://app.digitalbatterypass.eu/p/{PASS-ID}
curl https://app.digitalbatterypass.eu/p/{PASS-ID}?format=json
Campos de datos
DisponibleLa aplicación usa 67 campos según el esquema oficial UE para baterías, versión 1.0.0. Envíe los campos múltiples como lista; GET /fields devuelve los valores permitidos. Las categorías son lmt, industrie, ev, sli y geraet.
Datos generales13
| Campo | Nombre técnico | Tipo | Visible para | Obligatorio |
|---|---|---|---|---|
| Idioma de los textos | content_language | vocab | Público | Opcional |
| Fabricante (nombre) | manufacturer_name | text | Público | Todas las categorías con pasaporte |
| Nombre comercial | manufacturer_trade_name | text | Público | Opcional |
| Marca | manufacturer_trademark | text | Público | Opcional |
| Fabricante (dirección) | manufacturer_address | text | Público | Todas las categorías con pasaporte |
| Sitio web del fabricante | manufacturer_website | url | Público | Opcional |
| Correo del fabricante | manufacturer_email | email | Público | Opcional |
| Número de producto | product_number | text | Público | Opcional |
| Lugar de fabricación (ciudad) | manufacturing_place | text | Público | Opcional |
| Región | manufacturing_region | text | Público | Opcional |
| País de fabricación | manufacturing_country | vocab | Público | Todas las categorías con pasaporte |
| Peso | weight_kg | number · kg | Público | Todas las categorías con pasaporte |
| Garantía comercial | warranty_months | integer · Monate | Público | Opcional |
Materiales y sustancias8
| Campo | Nombre técnico | Tipo | Visible para | Obligatorio |
|---|---|---|---|---|
| Química de la batería | chemistry | list · vocab | Público | Todas las categorías con pasaporte |
| Sustancias peligrosas | hazardous_substances | list | Público | Todas las categorías con pasaporte |
| Materias primas críticas | critical_raw_materials | list · vocab | Público | Todas las categorías con pasaporte |
| Símbolo químico en la etiqueta | chemical_symbol | list · vocab | Público | Opcional |
| Agente extintor | extinguishing_agent | text · lang | Público | Todas las categorías con pasaporte |
| Composición del cátodo | composition_cathode | text | Interés legítimo | Todas las categorías con pasaporte |
| Composición del ánodo | composition_anode | text | Interés legítimo | Todas las categorías con pasaporte |
| Composición del electrolito | composition_electrolyte | text | Interés legítimo | Todas las categorías con pasaporte |
Rendimiento y durabilidad23
| Campo | Nombre técnico | Tipo | Visible para | Obligatorio |
|---|---|---|---|---|
| Capacidad nominal | rated_capacity_ah | number · Ah | Público | Todas las categorías con pasaporte |
| Tensión nominal | nominal_voltage_v | number · V | Público | Todas las categorías con pasaporte |
| Tensión mínima | min_voltage_v | number · V | Público | Todas las categorías con pasaporte |
| Tensión máxima | max_voltage_v | number · V | Público | Todas las categorías con pasaporte |
| Valores de tensión válidos desde | voltage_temp_min_c | number · °C | Público | Todas las categorías con pasaporte |
| Valores de tensión válidos hasta | voltage_temp_max_c | number · °C | Público | Todas las categorías con pasaporte |
| Potencia (original) | rated_power_w | number · W | Público | Todas las categorías con pasaporte |
| Límite de potencia | power_limit_w | number · W | Público | Todas las categorías con pasaporte |
| Límite de potencia válido desde | power_temp_min_c | number · °C | Público | Opcional |
| Límite de potencia válido hasta | power_temp_max_c | number · °C | Público | Opcional |
| Ensayo del rango de temperatura sin uso | temp_test | text · lang | Público | Todas las categorías con pasaporte |
| Rango de temperatura desde | temp_min_c | number · °C | Público | Todas las categorías con pasaporte |
| Rango de temperatura hasta | temp_max_c | number · °C | Público | Todas las categorías con pasaporte |
| Resistencia interna de la celda | internal_cell_resistance_mohm | number · mΩ | Público | Todas las categorías con pasaporte |
| Resistencia interna del paquete | internal_pack_resistance_mohm | number · mΩ | Público | Todas las categorías con pasaporte |
| Vida útil prevista | expected_lifetime_cycles | integer · Zyklen | Público | lmt, ev |
| Ensayo de referencia de vida en ciclos | cycle_life_test | text · lang | Público | lmt, ev |
| Umbral de agotamiento de capacidad | capacity_threshold_pct | number · % | Público | ev |
| Eficiencia energética inicial | initial_rte_pct | number · % | Público | lmt, ev |
| Eficiencia a media vida en ciclos | rte_half_life_pct | number · % | Público | lmt, ev |
| Tasa C de carga en el ensayo | cycle_charge_crate | number · 1/h | Público | lmt, ev |
| Tasa C de descarga en el ensayo | cycle_discharge_crate | number · 1/h | Público | Opcional |
| Energía nominal | rated_energy_kwh | number · kWh | Público | Opcional |
Huella de carbono y contenido reciclado6
| Campo | Nombre técnico | Tipo | Visible para | Obligatorio |
|---|---|---|---|---|
| Porcentaje de contenido renovable | renewable_content_pct | number · % | Público | Todas las categorías con pasaporte |
| Huella de carbono | carbon_footprint | number · kg CO₂e/kWh | Público | Obligación posterior |
| Contenido de cobalto reciclado | recycled_cobalt_pct | number · % | Público | Obligación posterior |
| Contenido de litio reciclado | recycled_lithium_pct | number · % | Público | Obligación posterior |
| Contenido de níquel reciclado | recycled_nickel_pct | number · % | Público | Obligación posterior |
| Contenido de plomo reciclado | recycled_lead_pct | number · % | Público | Obligación posterior |
Conformidad y etiquetado3
| Campo | Nombre técnico | Tipo | Visible para | Obligatorio |
|---|---|---|---|---|
| Símbolo de recogida separada presente | separate_collection_symbol | boolean | Público | Todas las categorías con pasaporte |
| Declaración UE de conformidad (enlace) | doc_url | url | Público | Todas las categorías con pasaporte |
| Informe de diligencia debida (enlace) | due_diligence_url | url | Público | Obligación posterior |
Prevención de residuos y devolución10
| Campo | Nombre técnico | Tipo | Visible para | Obligatorio |
|---|---|---|---|---|
| Papel de los usuarios en la prevención de residuos | end_user_prevention | text · lang | Público | Todas las categorías con pasaporte |
| Papel de los usuarios en la recogida separada | end_user_collection | text · lang | Público | Todas las categorías con pasaporte |
| Puntos de recogida separada | collection_points | text · lang | Público | Todas las categorías con pasaporte |
| Puntos de devolución | take_back_points | text · lang | Público | Todas las categorías con pasaporte |
| Instalaciones de preparación para la reutilización | reuse_facilities | text · lang | Público | Todas las categorías con pasaporte |
| Instalaciones de preparación para cambio de uso | repurposing_facilities | text · lang | Público | Todas las categorías con pasaporte |
| Instalaciones de tratamiento de baterías usadas | treatment_facilities | text · lang | Público | Todas las categorías con pasaporte |
| Instrucciones de seguridad para baterías usadas | waste_safety | text · lang | Público | Todas las categorías con pasaporte |
| Significado de los símbolos de la etiqueta | label_symbols_meaning | text · lang | Público | Todas las categorías con pasaporte |
| Efectos de las sustancias en el medio ambiente y la salud | substances_impact | text · lang | Público | Todas las categorías con pasaporte |
Desmontaje, reparación y recambios3
| Campo | Nombre técnico | Tipo | Visible para | Obligatorio |
|---|---|---|---|---|
| Repuestos y sustitución (enlace) | spare_parts_url | url | Interés legítimo | Todas las categorías con pasaporte |
| Instrucciones de desmontaje (enlace) | dismantling_url | url | Interés legítimo | Todas las categorías con pasaporte |
| Medidas de seguridad (enlace) | safety_url | url | Interés legítimo | Todas las categorías con pasaporte |
Informes de ensayo1
| Campo | Nombre técnico | Tipo | Visible para | Obligatorio |
|---|---|---|---|---|
| Informes de ensayo de conformidad (enlace) | compliance_report_url | url | Autoridades y organismos de control | Todas las categorías con pasaporte |
API REST
DisponibleCree modelos y pasaportes directamente desde ERP, MES o BMS y notifique eventos. JSON sobre HTTPS, autenticación por clave. Dirección base: https://app.digitalbatterypass.eu/api/v1
En producción, la API REST forma parte del plan Enterprise. Con Pro solo envía mediciones del BMS. Las claves de prueba están disponibles en todos los planes.
Empiece en tres pasos
- Inicie sesión como administrador y abra Ajustes y luego Claves API.
- Cree una clave de prueba. Solo se muestra una vez; guárdela como una contraseña.
- Compruebe la conexión con GET /me. Si la API responde, la clave y la ruta de red son correctas.
export BATTERYPASS_KEY="bp_test_..." curl -s https://app.digitalbatterypass.eu/api/v1/me \ -H "Authorization: Bearer $BATTERYPASS_KEY"
Una clave, una empresa
La clave determina qué datos son accesibles. Se crea en la aplicación y solo se muestra una vez.
Las claves de prueba no guardan nada
Una clave de prueba comprueba cada solicitud como en producción, sin cambiar datos ni consumir cuota.
Reintentos seguros
Con la misma clave de idempotencia no se crea un segundo registro, ni siquiera tras una interrupción. El número de documento del ERP sirve bien.
Los pasaportes no se eliminan
La API no tiene DELETE para pasaportes. El fin de vida de una batería se notifica como evento.
Las claves de prueba responden con estado 200 y dry_run: true. Leen datos reales, pero no cambian nada.
Endpoints
| Método | Ruta | Para qué |
|---|---|---|
| GET | /me | Prueba de conexión: empresa, plan, permisos y cuota restante |
| GET | /fields | Catálogo de campos con obligaciones por categoría |
| GET | /models | Listar modelos, también por código |
| POST | /models | Crear un modelo |
| GET | /models/{id} | Leer un modelo con sus datos y campos obligatorios que faltan |
| PATCH | /models/{id} | Cambiar datos maestros |
| GET | /passports | Listar pasaportes, también por número de serie o fecha de cambio |
| POST | /passports/batch | Crear hasta 1.000 pasaportes en una llamada |
| GET | /passports/{id} | Leer un pasaporte con dirección y estado |
| GET | /passports/{id}/events | Leer los eventos de un pasaporte |
| POST | /passports/{id}/events | Notificar un evento, p. ej., reparación o residuo |
| POST | /models/validate | Comprobar un borrador sin guardar |
| POST | /passports | Crear un pasaporte |
| PATCH | /passports/{id} | Cambiar fecha, lote o lugar |
| GET | /passports/{id}/components | Leer componentes |
| POST | /passports/{id}/components | Instalar un componente |
| PATCH | /passports/{id}/components/{cid} | Cambiar o retirar un componente |
| POST | /passports/{id}/components/{cid}/replace | Sustituir un componente |
| GET | /passports/{id}/telemetry | Leer serie de mediciones |
| POST | /passports/{id}/telemetry | Notificar mediciones |
| GET | /certificates | Listar justificantes |
| GET | /certificates/{id} | Justificante con enlace de descarga |
| GET | /suppliers | Listar proveedores |
| GET | /supplier-requests | Listar solicitudes |
| POST | /supplier-requests | Enviar una solicitud |
| GET | /supplier-requests/{id} | Leer una solicitud con valores |
| POST | /supplier-requests/{id}/accept | Aceptar valores en el modelo |
| GET | /audit | Leer el registro de auditoría |
Ejemplo: crear pasaportes desde el ERP
curl -X POST https://app.digitalbatterypass.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.digitalbatterypass.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.digitalbatterypass.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.digitalbatterypass.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);
Respuesta
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.digitalbatterypass.eu/p/7KM2XQ9RTA"
}
]
}
Errores
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 | Significado |
|---|---|---|
400 | invalid_request | La solicitud no es JSON válido o contiene campos desconocidos |
401 | unauthorized | Falta la clave o no es válida |
403 | insufficient_scope | A la clave le falta el permiso necesario |
403 | plan_required | Las claves live requieren el plan Enterprise; con Pro solo para mediciones del BMS |
403 | email_not_verified | El correo de la empresa aún no está confirmado |
403 | quota_exceeded | La cuota del plan está agotada |
404 | not_found | El objeto no existe o pertenece a otra empresa |
409 | duplicate_serial | El número de serie ya existe en este modelo (con on_conflict: fail) |
409 | duplicate_model | El código del modelo ya está en uso |
409 | idempotency_conflict | La clave de idempotencia se usó para otra solicitud |
413 | payload_too_large | La solicitud supera los 2 MB |
422 | invalid_serial | Un número de serie no es válido; la respuesta indica el campo. No se guarda nada. |
422 | invalid_date | Una fecha no sigue el formato AAAA-MM-DD |
422 | out_of_range | Una medición está fuera del rango permitido |
422 | invalid_gtin | El GTIN tiene longitud o dígito de control incorrectos |
422 | validation_failed | Otro valor incumple las reglas |
429 | rate_limited | Demasiadas solicitudes; reintentar tras Retry-After |
500 | internal_error | Error por nuestra parte. Se puede reintentar con la misma clave de idempotencia. |
Límites
| Solicitudes por minuto y clave | Live 300, prueba 60 |
| Pasaportes por llamada | 1.000 |
| Tamaño de una solicitud | 2 MB |
| Entradas por página de lista | 100, máximo 500 |
| Claves activas por empresa | 10 |
| Claves live | Enterprise con todos los permisos, Pro solo con los permisos para mediciones del BMS. Las claves de prueba están disponibles en todos los planes. |
¿Prevé más de 100.000 pasaportes al año? Háblelo antes con nosotros.
Permisos
Cada clave recibe solo los permisos necesarios. Si falta uno, la API responde 403 e insufficient_scope. En la aplicación elige una plantilla: Todos los permisos, ERP, BMS o Solo lectura.
| Permiso | Permite |
|---|---|
models:read | Leer modelos y comprobar borradores |
models:write | Crear y cambiar modelos |
passports:read | Leer pasaportes, eventos y componentes |
passports:write | Crear y cambiar pasaportes, notificar eventos, instalar y sustituir componentes |
telemetry:read telemetry:write | Leer y notificar mediciones |
certificates:read | Leer y descargar justificantes |
suppliers:read suppliers:write | Leer proveedores y solicitudes, enviar y aceptar solicitudes |
audit:read | Leer el registro de auditoría |
Solicitudes y respuestas
Las listas llegan por páginas con data, has_more y next_cursor. Pase next_cursor como cursor. Los campos desconocidos se rechazan para detectar erratas. Con PATCH, un campo ausente no cambia y null lo vacía.
| Encabezado | Significado |
|---|---|
Idempotency-Key | Reintento sin segundo registro, válido 7 días. El número de documento del ERP sirve bien. |
X-Batterypass-Dry-Run: true | Incluso una clave live solo comprueba esta solicitud y no guarda nada. |
X-Request-Id | Identificador de la llamada, también en errores y en el registro |
X-RateLimit-Limit X-RateLimit-Remaining | Cuota del minuto actual |
Idempotent-Replayed | true si se repitió una respuesta guardada |
SDK y consola API
DisponibleDos clientes ligeros sin dependencias: repiten solicitudes con seguridad, recorren listas y dividen grandes volúmenes en llamadas de 1.000 pasaportes. Son archivos únicos para copiar a su proyecto. La consola API está en la aplicación en Ajustes, Claves API. Las bibliotecas forman parte del plan Enterprise.
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);
}
Componentes
DisponibleRegistre qué módulos, celdas o BMS están instalados. Un número de serie solo puede estar instalado una vez a la vez por pasaporte. Al sustituir, la pieza antigua queda registrada con su fecha de retirada.
curl -X POST https://app.digitalbatterypass.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.digitalbatterypass.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"}'
Los tipos permitidos son pack, rack, module, cell, bms y other.
Mediciones
DisponibleNotifique datos del BMS, de uno en uno o hasta 1.000 mediciones con items. Lea la serie con since y until. Las mediciones están disponibles desde el plan Pro. Aparecen en la app y para los interesados, no en la página pública.
curl -X POST https://app.digitalbatterypass.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}'
| Campo | Rango |
|---|---|
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 |
Justificantes
DisponibleSuba informes de ensayo, declaraciones de conformidad y documentos similares en el modelo: PDF, PNG o JPG hasta 10 MB. Por la API lee la lista y obtiene un enlace de descarga válido 15 minutos. Cada archivo tiene una suma SHA-256.
curl -s "https://app.digitalbatterypass.eu/api/v1/certificates?model_code=BX-48V" -H "Authorization: Bearer $BATTERYPASS_KEY" curl -s https://app.digitalbatterypass.eu/api/v1/certificates/42 -H "Authorization: Bearer $BATTERYPASS_KEY"
Proveedores y solicitudes de datos
DisponibleSolicite valores a proveedores. Reciben un correo con un enlace válido 30 días e introducen solo los campos solicitados, sin cuenta. Los valores llegan al modelo solo tras su aprobación. Disponible desde Starter, máximo 20 solicitudes por hora.
curl -X POST https://app.digitalbatterypass.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.digitalbatterypass.eu/api/v1/supplier-requests?status=submitted" -H "Authorization: Bearer $BATTERYPASS_KEY"
curl -X POST https://app.digitalbatterypass.eu/api/v1/supplier-requests/7/accept -H "Authorization: Bearer $BATTERYPASS_KEY"
GS1 Digital Link
DisponibleIndique en el modelo un GTIN con dígito de control válido. La dirección GS1 de GTIN y número de serie lleva entonces a la página del pasaporte y aparece en la API como gs1_link. Sus códigos QR siguen con la dirección fija, pero puede crear los suyos desde el enlace GS1. El GTIN lo obtiene de GS1.
https://app.digitalbatterypass.eu/01/{GTIN}/21/{SERIENNUMMER}
https://app.digitalbatterypass.eu/01/04012345678901/21/SN-0001
Registro de auditoría
DisponibleGET /audit devuelve todos los cambios registrados, por páginas y opcionalmente desde un momento con since. Los cambios por API llevan el nombre de la clave. En la aplicación, los administradores ven también las últimas llamadas.
Registro de la UE
Prueba en el registro real pendienteLa app crea el par de claves de su cuenta de servicio. La clave privada queda cifrada con nosotros. La clave pública va al registro. Su empresa debe verificarse antes allí con un sello cualificado.
Solo se envían pasaportes publicados y completos, en lotes de 100 como máximo. La app y la API muestran el estado. El registro lee la dirección del pasaporte como JSON; con su token de acceso recibe también las vistas protegidas. Los tokens no válidos se rechazan.
Creado a partir de los documentos técnicos de la Comisión del 30/10/2026 y probado con nuestro propio servidor de pruebas. La prueba en el registro real sigue pendiente.
curl -X POST https://app.digitalbatterypass.eu/api/v1/registry/submissions \
-H "Authorization: Bearer $BATTERYPASS_KEY" \
-H "Content-Type: application/json" \
-d '{"model_code":"LMT-48V"}'
curl https://app.digitalbatterypass.eu/api/v1/registry/submissions \
-H "Authorization: Bearer $BATTERYPASS_KEY"
Publicación y prueba
DisponibleCon publish: false se crean borradores. No son accesibles públicamente hasta que los publique. Cada cambio en los datos maestros es una nueva versión enlazada por hash con la anterior. En /p/ID/proof cualquiera puede recalcular el estado público.
POST /api/v1/passports/batch {"model_code":"LMT-48V","publish":false,"items":[...]}
POST /api/v1/passports/PASS-ID/publish
GET /api/v1/models/42/versions
GET /p/PASS-ID/proof
Versiones
La versión principal está en la ruta. Dentro de v1 solo se añaden campos y endpoints. Previsto, pero aún no disponible: webhooks.
| Version | Fecha | Cambio |
|---|---|---|
1.2.0 | 2026-11-06 | Registro, publicación, versiones, más mediciones para las vistas protegidas de la UE |
1.1.0 | 2026-11-06 | Componentes, mediciones, justificantes, proveedores, auditoría, pasaporte único, GS1, permisos detallados, encabezado dry-run, OpenAPI y endpoint de estado |
1.0.0 | 2026-11-06 | Modelos, pasaportes, eventos, claves, modo de prueba, idempotencia |
Preguntas frecuentes
Respuestas breves para la integración.
¿Cómo pruebo sin crear pasaportes reales?
Con una clave de prueba. Comprueba todo como en producción y no guarda nada.
¿Qué hago tras un timeout?
Envíe la misma solicitud con la misma clave de idempotencia. No se crea un segundo registro.
¿Cómo encuentro el pasaporte de un número de serie?
Con GET /passports?serial=… y, si hace falta, model_code.
¿Puedo eliminar pasaportes por API?
No. Notifique el fin de vida como evento con el estado waste.
¿Cuántos pasaportes son posibles?
1.000 por llamada, 300 llamadas por minuto. Su plan y nuestro alojamiento también fijan límites. Si prevé más de 100.000 al año, háblelo antes con nosotros.
Pruebe la importación con su archivo.
El plan Pilot es gratuito e incluye un modelo y 25 pasaportes al año.