将电池护照数据接入您的系统。
REST API、CSV 导入和导出、固定护照地址及全部数据字段。使用测试密钥可试用所有功能,且不会更改数据。
概览
四个对象,四种数据交换方式。入门只需一个 CSV 文件,日常运行可使用 REST API。
- 公司您的账户,含用户和方案
- 型号主数据,每个型号一次
- 护照一块电池,含序列号和专属地址
- 事件维修、改用或废弃
CSV 导入
可用从 ERP 导入的常用方式:导出列表并上传到型号。每个新序列号都会获得一本护照。
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
| 规则 | 规格 |
|---|---|
| 编码 | UTF-8(含或不含 BOM)。可识别并转换 Windows-1252。 |
| 分隔符 | 分号、逗号或制表符,以第一行为准。 |
| 大小 | 每个文件最大 8 MB、50,000 行。 |
| 结构 | 每行一块电池,字段内不可换行。 |
| 标头 | 可选。有标题行时列顺序不限,多余的列会被忽略;没有时按下表顺序。 |
| 列 | 字段 | 可识别的列名 | 必填 | 规则 |
|---|---|---|---|---|
| 1 | 序列号 | seriennummer, serialnummer, serial, serial number, serialnumber, serial no, sn, serien-nr, seriennr, sernr | 是 | 最多 120 个字符:字母、数字、空格及 - _ . / : |
| 2 | 生产日期 | herstelldatum, produktionsdatum, fertigungsdatum, manufacturing date, production date, date, datum | 可选 | 2027-03-01、01.03.2027、1.3.2027、01/03/2027、1/3/2027 或 2027/03/01 |
| 3 | 批次 | charge, chargennummer, batch, lot, los | 可选 | 最多 120 个字符 |
| 4 | 生产地点 | herstellort, produktionsort, werk, place, plant, manufacturing place | 可选 | 最多 190 个字符 |
上传时会发生什么
- 首先显示预览,此时不会保存任何内容。
- 错误行会标明行号并被跳过。
- 文件内重复及该型号已有的序列号会被跳过。
- 只有在您确认后才会一次性生成护照。导入操作会记入审计记录。
检查文件
可用登录前即可检查导出文件,规则与应用内导入相同。
检查仅在您的浏览器中进行,文件不会上传。序列号是否已存在于型号中,只有应用内预览才会显示。
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 导出
可用每个型号都可下载全部护照列表,格式为含 BOM 的 UTF-8,以分号分隔。这样护照编号和地址可回到 ERP、MES 或标签打印系统。下载需要登录。
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
护照地址和二维码
可用每本护照都有固定地址。二维码、手册链接或 ERP 记录只需这个地址。
https://app.batterypass2027.eu/p/{PASS-ID}
https://app.batterypass2027.eu/p/{PASS-ID}?lang=en- 护照编号为 10 位,避开 0、O、1、I、L 等易混淆字符。
- 二维码仅包含此地址。数据变更后依然有效。
- 应用内可按护照下载 SVG 和 PNG 格式二维码,并可打印标签页。
- 未登录时,护照页面仅显示公开信息,并要求搜索引擎不要收录。
- 设置 GTIN 后还会提供 GS1 Digital Link。
根据导出文件制作自有标签
# 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')
数据字段
可用这 38 个字段目前已在应用中提供,依据附件十三做了简化,在型号表单中维护。类别为 lmt、industrie、ev、sli 和 geraet。
基本信息6
| 字段 | 技术名称 | 类型 | 可见范围 | 必填 |
|---|---|---|---|---|
| 制造商(名称) | manufacturer_name | text | 公开 | 所有需护照的类别 |
| 制造商(地址) | manufacturer_address | text | 公开 | 所有需护照的类别 |
| 联系方式(邮箱或网站) | manufacturer_contact | text | 公开 | 所有需护照的类别 |
| 生产地点(默认) | manufacturing_place | text | 公开 | 所有需护照的类别 |
| 重量 | weight_kg | number · kg | 公开 | 所有需护照的类别 |
| 保修 / 担保 | warranty | text | 公开 | 可选 |
材料和物质6
| 字段 | 技术名称 | 类型 | 可见范围 | 必填 |
|---|---|---|---|---|
| 电池化学体系 | chemistry | text | 公开 | 所有需护照的类别 |
| 危险物质 | hazardous_substances | text | 公开 | 所有需护照的类别 |
| 关键原材料 | critical_raw_materials | text | 公开 | 所有需护照的类别 |
| 正极成分 | composition_cathode | text | 合法利益方 | 所有需护照的类别 |
| 负极成分 | composition_anode | text | 合法利益方 | 所有需护照的类别 |
| 电解液成分 | composition_electrolyte | text | 合法利益方 | 所有需护照的类别 |
性能与耐久性11
| 字段 | 技术名称 | 类型 | 可见范围 | 必填 |
|---|---|---|---|---|
| 额定容量 | rated_capacity_ah | number · Ah | 公开 | 所有需护照的类别 |
| 标称电压 | nominal_voltage_v | number · V | 公开 | 所有需护照的类别 |
| 最低电压 | min_voltage_v | number · V | 公开 | 所有需护照的类别 |
| 最高电压 | max_voltage_v | number · V | 公开 | 所有需护照的类别 |
| 额定能量 | rated_energy_kwh | number · kWh | 公开 | 所有需护照的类别 |
| 功率(初始) | rated_power_w | number · W | 公开 | industrie, ev |
| 预期寿命 | expected_lifetime_cycles | number · Zyklen | 公开 | 所有需护照的类别 |
| 温度范围(从) | temp_min_c | number · °C | 公开 | 所有需护照的类别 |
| 温度范围(至) | temp_max_c | number · °C | 公开 | 所有需护照的类别 |
| 能量效率(往返) | round_trip_efficiency_pct | number · % | 公开 | industrie, ev |
| 内阻 | internal_resistance_mohm | number · mΩ | 公开 | 可选 |
碳足迹和再生材料6
| 字段 | 技术名称 | 类型 | 可见范围 | 必填 |
|---|---|---|---|---|
| 碳足迹 | carbon_footprint | number · kg CO₂e/kWh | 公开 | 义务稍后适用 |
| 再生钴比例 | recycled_cobalt_pct | number · % | 公开 | 义务稍后适用 |
| 锂再生材料含量 | recycled_lithium_pct | number · % | 公开 | 义务稍后适用 |
| 再生镍比例 | recycled_nickel_pct | number · % | 公开 | 义务稍后适用 |
| 再生铅比例 | recycled_lead_pct | number · % | 公开 | 义务稍后适用 |
| 可再生内容比例 | renewable_content_pct | number · % | 公开 | 可选 |
合规与标识4
| 字段 | 技术名称 | 类型 | 可见范围 | 必填 |
|---|---|---|---|---|
| 欧盟符合性声明(链接) | doc_url | url | 公开 | 所有需护照的类别 |
| 标识和符号 | labels_symbols | text | 公开 | 所有需护照的类别 |
| 尽职调查报告(链接) | due_diligence_url | url | 公开 | 义务稍后适用 |
| 退回和处置 | end_of_life_info | text | 公开 | 所有需护照的类别 |
拆解、维修和备件4
| 字段 | 技术名称 | 类型 | 可见范围 | 必填 |
|---|---|---|---|---|
| 拆解说明 | dismantling_info | text | 合法利益方 | 所有需护照的类别 |
| 组件零件编号 | part_numbers | text | 合法利益方 | 所有需护照的类别 |
| 备件来源 | spare_parts_contact | text | 合法利益方 | 所有需护照的类别 |
| 安全措施 | safety_measures | text | 合法利益方 | 所有需护照的类别 |
检测报告1
| 字段 | 技术名称 | 类型 | 可见范围 | 必填 |
|---|---|---|---|---|
| 测试报告(链接或参考) | test_reports | text | 主管机关和检测机构 | 所有需护照的类别 |
REST API
可用直接从 ERP、MES 或 BMS 创建型号和护照并上报事件。基于 HTTPS 的 JSON,通过密钥认证。基础地址:https://app.batterypass2027.eu/api/v1
三步开始
- 以管理员身份登录,打开“设置”中的“API 密钥”。
- 创建测试密钥。它只显示一次,请像密码一样保管。
- 用 GET /me 检查连接。API 有响应即说明密钥和网络路径正确。
export BATTERYPASS_KEY="bp_test_..." curl -s https://app.batterypass2027.eu/api/v1/me \ -H "Authorization: Bearer $BATTERYPASS_KEY"
一个密钥,一家公司
密钥决定可访问的数据。密钥在应用中创建,且只显示一次。
测试密钥不保存任何内容
测试密钥像正式环境一样检查每个请求,但不更改数据,也不消耗额度。
可安全重试
使用相同的 Idempotency-Key,即使中断也不会产生第二条记录。可使用 ERP 单据号。
护照不会被删除
API 不提供删除护照的操作。电池寿命结束以事件形式上报。
测试密钥返回状态 200 和 dry_run: true。它们读取真实数据,但不做任何更改。
端点
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /me | 连接测试:公司、方案、权限和剩余额度 |
| GET | /fields | 字段目录,含各类别必填项 |
| GET | /models | 列出型号,也可按型号标识查询 |
| POST | /models | 创建型号 |
| GET | /models/{id} | 读取单个型号及其数据和缺失的必填字段 |
| PATCH | /models/{id} | 更改主数据 |
| GET | /passports | 列出护照,也可按序列号或更改日期查询 |
| POST | /passports/batch | 一次调用最多创建 1,000 本护照 |
| GET | /passports/{id} | 读取单本护照及其地址和状态 |
| GET | /passports/{id}/events | 读取护照的事件 |
| POST | /passports/{id}/events | 上报事件,例如维修或废弃 |
| POST | /models/validate | 检查草稿,不保存 |
| POST | /passports | 创建一本护照 |
| PATCH | /passports/{id} | 更改日期、批次或地点 |
| GET | /passports/{id}/components | 读取组件 |
| POST | /passports/{id}/components | 安装组件 |
| PATCH | /passports/{id}/components/{cid} | 更改或拆除组件 |
| POST | /passports/{id}/components/{cid}/replace | 更换组件 |
| GET | /passports/{id}/telemetry | 读取测量序列 |
| POST | /passports/{id}/telemetry | 上报测量值 |
| GET | /certificates | 列出证明文件 |
| GET | /certificates/{id} | 含下载链接的证明文件 |
| GET | /suppliers | 列出供应商 |
| GET | /supplier-requests | 列出数据请求 |
| POST | /supplier-requests | 向供应商发送请求 |
| GET | /supplier-requests/{id} | 读取请求及提交的数据 |
| POST | /supplier-requests/{id}/accept | 将提交的数据接受到型号 |
| GET | /audit | 读取审计记录 |
示例:从 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" }
]
}'
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);
响应
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"
}
]
}
错误
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 | 含义 |
|---|---|---|
400 | invalid_request | 请求不是有效的 JSON 或包含未知字段 |
401 | unauthorized | 密钥缺失或无效 |
403 | insufficient_scope | 密钥缺少所需权限 |
403 | plan_required | 正式密钥需要 Pro 或 Enterprise 方案 |
403 | email_not_verified | 公司邮箱尚未确认 |
403 | quota_exceeded | 方案额度已用完 |
404 | not_found | 对象不存在或属于其他公司 |
409 | duplicate_serial | 该型号中已存在此序列号(on_conflict: fail 时) |
409 | duplicate_model | 该型号标识已被使用 |
409 | idempotency_conflict | 该 Idempotency-Key 已用于其他请求 |
413 | payload_too_large | 请求超过 2 MB |
422 | invalid_serial | 序列号无效,响应中会标明字段,不会保存任何内容。 |
422 | invalid_date | 日期不符合 YYYY-MM-DD 格式 |
422 | out_of_range | 测量值超出允许范围 |
422 | invalid_gtin | GTIN 长度或校验位错误 |
422 | validation_failed | 其他值不符合规则 |
429 | rate_limited | 请求过多,请按 Retry-After 重试 |
500 | internal_error | 我方错误。使用相同的 Idempotency-Key 可安全重试。 |
限制
| 每把密钥每分钟的请求数 | 正式 300,测试 60 |
| 每次调用的护照数 | 1.000 |
| 单个请求大小 | 2 MB |
| 每页条目数 | 100,最多 500 |
| 每家公司的有效密钥 | 10 |
| 正式密钥 | Pro 和 Enterprise。所有方案均提供测试密钥。 |
计划每年超过 100,000 本护照?请提前与我们沟通。
权限
每把密钥只获得系统所需的权限。缺少权限时,API 返回 403 和 insufficient_scope。在应用中可选择模板:全部权限、ERP、BMS 或只读。
| 权限 | 允许 |
|---|---|
models:read | 读取型号并检查草稿 |
models:write | 创建和更改型号 |
passports:read | 读取护照、事件和组件 |
passports:write | 创建和更改护照、上报事件、安装和更换组件 |
telemetry:read telemetry:write | 读取和上报测量值 |
certificates:read | 读取和下载证明文件 |
suppliers:read suppliers:write | 读取供应商和数据请求,发送并接受请求 |
audit:read | 读取审计记录 |
请求和响应
列表分页返回,含 data、has_more 和 next_cursor。请将 next_cursor 的值作为 cursor 传入。未知字段会被拒绝,便于立即发现拼写错误。使用 PATCH 时,缺失字段保持不变,null 则清空。
| 标头 | 含义 |
|---|---|
Idempotency-Key | 重试不会产生第二条记录,有效期 7 天。可使用 ERP 单据号。 |
X-Batterypass-Dry-Run: true | 即使是正式密钥也只检查此请求,不保存任何内容。 |
X-Request-Id | 调用编号,也出现在错误和应用日志中 |
X-RateLimit-Limit X-RateLimit-Remaining | 当前分钟的额度 |
Idempotent-Replayed | 重放已存储响应时为 true |
SDK 和 API 控制台
可用两个轻量客户端,无依赖:可安全重试请求、自动翻页,并将大量数据拆分为每次 1,000 本护照的调用。都是单个文件,可复制到您的项目。API 控制台位于应用的“设置 > 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"])
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);
}
组件
可用记录电池中安装的模组、电芯或 BMS。每本护照中同一序列号同时只能安装一次。更换时,旧部件及其拆除日期会保留。
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"}'
允许的类型为 pack、rack、module、cell、bms 和 other。
测量值
可用上报 BMS 数据,可单条或用 items 最多 1,000 条。可用 since 和 until 读取序列。测量值从 Pro 方案起提供,显示在应用中,不显示在公开护照页面。
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}'
| 字段 | 范围 |
|---|---|
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 |
证明文件
可用在应用的型号中上传测试报告、符合性声明等文件:PDF、PNG 或 JPG,最大 10 MB。通过 API 可读取列表并获取 15 分钟有效的下载链接。每个文件都有 SHA-256 校验和。
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"
供应商和数据请求
可用向供应商索取数据。他们会收到含 30 天有效链接的邮件,无需账户,只填写所请求的字段。提交的数据须经您批准才会进入型号。Starter 方案起提供,每小时最多 20 个请求。
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
可用在型号中设置校验位有效的 GTIN。由 GTIN 和序列号组成的 GS1 地址将指向护照页面,并在 API 中显示为 gs1_link。您的二维码仍包含固定地址,但可用 GS1 链接自行生成。GTIN 需从 GS1 获取。
https://app.batterypass2027.eu/01/{GTIN}/21/{SERIENNUMMER}
https://app.batterypass2027.eu/01/04012345678901/21/SN-0001
审计记录
可用GET /audit 返回公司所有已记录的更改,可分页,也可用 since 指定起始时间。通过 API 的更改带有密钥名称。管理员还可在应用中查看最近的调用。
版本
主版本号在路径中。v1 内只会新增字段和端点。计划中但尚未提供:Webhooks、面向主管机关和回收商的入口,以及可验证的更改链。
| Version | 日期 | 更改 |
|---|---|---|
1.1.0 | 2026-11-06 | 组件、测量值、证明文件、供应商、审计、单本护照、GS1、细粒度权限、dry-run 标头、OpenAPI 和健康检查端点 |
1.0.0 | 2026-11-06 | 型号、护照、事件、密钥、测试模式、幂等性 |
常见问题
关于对接的简短解答。
如何在不创建真实护照的情况下测试?
使用测试密钥。它像正式环境一样检查,但不保存任何内容。
超时后该怎么办?
使用相同的 Idempotency-Key 重新发送同一请求,不会产生第二条记录。
如何根据序列号找到护照?
使用 GET /passports?serial=…,必要时加 model_code。
可以通过 API 删除护照吗?
不可以。请以状态 waste 的事件上报寿命结束。
可以创建多少本护照?
每次调用 1,000 本,每分钟 300 次调用。您的方案和我们的托管也有限制。如计划每年超过 100,000 本,请提前联系我们。