API Reference

The DPP.GS REST API lets you create and manage Digital Product Passports programmatically — integrate with your ERP, WMS, or label printing system.

Base URL: https://dpp.gs

Authentication

All product endpoints require an API key sent as a request header. You get your API key when you register — it's visible in your dashboard under Account.

x-api-key: your-api-key-here
Your API key identifies your tenant. All products created via the API are associated with your GS1 Company Prefix.

Errors

The API returns standard HTTP status codes. Error responses include a JSON body with an error field.

CodeMeaning
200 / 201Success
400Bad request — missing required field or invalid value
401Unauthorized — missing or invalid API key
404Not found — product or resource doesn't exist
409Conflict — product with this GTIN already exists
500Server error — contact [email protected]

Auth endpoints

POST /api/v1/auth/register No auth Register new account

Creates a new manufacturer account. Sends a verification email via SendGrid.

Request body

FieldTypeRequiredDescription
company_namestringrequiredLegal company name
emailstringrequiredAccount email — used for login
passwordstringrequiredMin 8 characters
gcpstringrequiredGS1 Company Prefix (7–12 digits)

Response 201

"message": "Registration successful. Please verify your email.",
"api_key": "b79e57f0e3d1..."
POST /api/v1/auth/login No auth Login and get JWT
FieldTypeRequired
emailstringrequired
passwordstringrequired

Response 200

"token": "eyJhbGciOiJIUzI1NiJ9...",
"api_key": "b79e57f0e3d1...",
"tenant": { "id": "uuid", "name": "Acme s.r.o.", "gcp": "0852345" }

Product endpoints

GET /api/v1/products API key List all products

Returns all products for the authenticated tenant, ordered by creation date descending.

Response 200

"products": [
  {
    "id": "uuid",
    "gtin": "08523456790018",
    "batch_lot": "LOT2026A",
    "product_name": { "en": "Smart Battery" },
    "sector": "battery",
    "status": "active",
    "created_at": "2026-03-15T10:00:00Z"
  }
]
GET /api/v1/products/:gtin API key Get product detail

Returns full product data including materials, substances, battery data, and link targets.

URL parameters

ParamDescription
:gtin14-digit GTIN of the product

Response 200

Returns the full product object with nested materials, substances, battery, and link_targets arrays.

POST /api/v1/products API key Create product

Creates a new Digital Product Passport. Automatically creates link targets and makes the DPP publicly accessible at https://dpp.gs/passport/{gtin}.

Minimal request

{
  "gtin": "08523456790018",
  "sector": "battery",
  "manufacturer_name": "Acme s.r.o.",
  "manufacturer_country": "SK"
}

Full request with materials and battery

{
  "gtin": "08523456790018",
  "batch_lot": "LOT2026A",
  "serial_number": "SN000001",
  "product_name": { "en": "EV Battery 75kWh", "sk": "EV Bateria 75kWh" },
  "sector": "battery",
  "carbon_footprint": { "total_kg_co2": 8700 },
  "recycled_content": 18.5,
  "ce_marking": true,
  "materials": [
    { "name": "Lithium", "percentage": 8.2, "origin_country": "CL", "is_critical": true }
  ],
  "substances": [
    { "name": "Cobalt", "cas_number": "7440-48-4", "concentration_ppm": 61000, "svhc": true }
  ],
  "battery": {
    "chemistry": "NMC",
    "capacity_kwh": 75.0,
    "nominal_voltage": 400,
    "cycle_life": 1500
  }
}

Response 201

{ "id": "uuid", "gtin": "08523456790018", "message": "Product created" }
PUT /api/v1/products/:gtin API key Update product

Updates product fields. Only include fields you want to change — all other fields remain unchanged. The DPP viewer updates immediately with no QR code reprint needed.

The DPP viewer at dpp.gs/passport/{gtin} reflects changes immediately. No need to reprint QR codes when data changes.

Response 200

{ "message": "Product updated", "id": "uuid" }
DELETE /api/v1/products/:gtin API key Delete product

Soft-deletes the product — sets status to deleted. The DPP is no longer publicly accessible.

Per ESPR requirements, DPP data must remain accessible for the full product lifetime (typically 10+ years). Deletion should only be used for test products or genuine data errors.

Document endpoints

POST /api/v1/products/:gtin/documents?doc_type=... API key Upload document

Uploads a document file and attaches it to the product. Use multipart/form-data with the file in the file field.

Query parameters

ParamTypeRequiredDescription
doc_typestringrequiredDocument type (see list below)

Supported doc_type values

ValueDescription
declaration_of_conformityEU Declaration of Conformity (DoC)
technical_documentationTechnical documentation
user_manualUser manual / instructions for use
repair_manualRepair manual / service guide
safety_instructionsSafety data sheet or instructions
product_datasheetProduct data sheet
energy_labelEnergy label (Regulation 2017/1369)
carbon_footprint_epdCarbon footprint / EPD report
disassembly_instructionsDisassembly / end-of-life instructions
supply_chain_reportSupply chain due diligence report
test_reportTest / certification report
otherOther supporting document

Example (curl)

curl -X POST "https://dpp.gs/api/v1/products/08523456790018/documents?doc_type=declaration_of_conformity" \
  -H "x-api-key: your-key" \
  -F "[email protected]"

Response 201

{
  "id": "uuid",
  "doc_type": "declaration_of_conformity",
  "filename": "declaration.pdf",
  "url": "https://dpp-documents.s3.eu-central-1.amazonaws.com/...",
  "message": "Document uploaded"
}
DELETE /api/v1/products/:gtin/documents/:docId API key Delete document

Deletes a document attachment from the product. Removes the file from storage.

URL parameters

ParamDescription
:gtin14-digit GTIN of the product
:docIdUUID of the document to delete

Response 200

{ "message": "Document deleted" }

Batch upload

POST /api/v1/products/batch API key Upload CSV

Upload a CSV file to create multiple products at once. Use multipart/form-data with the file in the file field.

Example (curl)

curl -X POST https://dpp.gs/api/v1/products/batch \
  -H "x-api-key: your-key" \
  -F "[email protected]"

Response 200

{ "created": 47, "skipped": 2, "errors": [] }

Download the CSV template to see all supported columns:

curl https://dpp.gs/api/v1/template.csv -o template.csv

QR & DataMatrix

GET /qr/:gtin No auth Generate QR or DataMatrix

Returns a QR code or DataMatrix image for the given GTIN. No authentication required — suitable for embedding in label templates.

Query parameters

ParamValuesDefaultDescription
formatqr · datamatrix · svgqrOutput format
batchstringBatch/lot number (GS1 AI 10)
serialstringSerial number (GS1 AI 21)

Examples

GET /qr/08523456790018
 PNG QR code encoding https://dpp.gs/01/08523456790018

GET /qr/08523456790018?batch=LOT2026A&format=datamatrix
 PNG DataMatrix encoding (01)08523456790018(10)LOT2026A

GET /qr/08523456790018?format=svg
 SVG QR code (for vector label templates)
POST /api/v1/qr/batch API key Batch QR ZIP export

Generates a ZIP archive with QR and DataMatrix codes for multiple GTINs.

Request body

{
  "gtins": ["08523456790018", "08523456790025"],
  "format": "both"
}

format accepts: qr · datamatrix · both

Response

Returns a ZIP file containing PNG files named {gtin}_qr.png and {gtin}_datamatrix.png.

POST /api/v1/qr/serial API key Generate serial QR codes ZIP

Generates a ZIP archive with QR + DataMatrix codes for a range of serial numbers. Each code encodes a GS1 Digital Link with AI (01) GTIN + AI (10) batch + AI (21) serial.

Request body

{
  "gtin": "08523456790018",
  "batch": "LOT2026A",
  "prefix": "SN",
  "start": 1,
  "count": 100,
  "format": "both"
}

prefix — serial number prefix (default: "SN"). start — first serial number (default: 1). count — number of codes to generate (max 10,000).

Response

ZIP file with qr/ and datamatrix/ folders + manifest.csv listing all serial numbers, GS1 Digital Link URIs, and GS1 AI strings.

Serial Number Batches

POST /api/v1/products/:gtin/serial-batches API key Create serial batch

Creates a new serial number batch for the product. Supports two modes: sequential (auto-generate a range) or upload (provide your own serial numbers via CSV).

Request body (sequential mode)

{
  "mode": "sequential",
  "batch_lot": "LOT2026A",
  "prefix": "SN",
  "start": 1,
  "count": 500
}

Request body (upload mode)

Use multipart/form-data with a CSV file in the file field. The CSV must contain a serial_number column.

curl -X POST "https://dpp.gs/api/v1/products/08523456790018/serial-batches" \
  -H "x-api-key: your-key" \
  -F "mode=upload" \
  -F "batch_lot=LOT2026A" \
  -F "[email protected]"

Response 201

{
  "id": "uuid",
  "gtin": "08523456790018",
  "batch_lot": "LOT2026A",
  "count": 500,
  "mode": "sequential",
  "message": "Serial batch created"
}
GET /api/v1/products/:gtin/serial-batches API key List serial batches

Returns all serial number batches for the given product, ordered by creation date descending.

Response 200

"batches": [
  {
    "id": "uuid",
    "batch_lot": "LOT2026A",
    "count": 500,
    "mode": "sequential",
    "created_at": "2026-03-15T10:00:00Z"
  }
]
GET /api/v1/serial-batches/:id API key Get batch detail

Returns full detail of a serial batch, including all serial numbers in the batch.

Response 200

{
  "id": "uuid",
  "gtin": "08523456790018",
  "batch_lot": "LOT2026A",
  "count": 500,
  "mode": "sequential",
  "prefix": "SN",
  "start": 1,
  "serials": ["SN000001", "SN000002", "..."],
  "created_at": "2026-03-15T10:00:00Z"
}
GET /api/v1/serial-batches/:id/export.csv API key CSV manifest

Downloads a CSV manifest of all serial numbers in the batch, including GS1 Digital Link URIs and GS1 AI strings.

Response

Returns a CSV file with columns: serial_number, gtin, batch_lot, digital_link, gs1_ai_string.

GET /api/v1/serial-batches/:id/export.zip API key ZIP with QR/DataMatrix codes

Downloads a ZIP archive containing QR and/or DataMatrix code images for every serial number in the batch.

Query parameters

ParamValuesDefaultDescription
formatqr · datamatrix · bothbothCode format to include

Response

ZIP file with qr/ and/or datamatrix/ folders + manifest.csv.

DELETE /api/v1/serial-batches/:id API key Delete serial batch

Deletes a serial number batch and all associated serial number records.

This permanently removes all serial numbers in the batch. QR codes already printed will resolve to a 404.

Response 200

{ "message": "Serial batch deleted" }

GS1 Digital Link Resolver

Our resolver is conformant with the GS1-Conformant Resolver Standard 1.2. Verify conformance: run official test suite.

GET /01/:gtin[/10/:batch][/21/:serial] No auth GS1 Digital Link resolver

GS1 Digital Link resolver with full content negotiation.

Accept headerResponse
text/html or browser303 redirect to DPP viewer
application/jsonJSON with link targets
application/linkset+jsonRFC 9264 linkset
application/ld+jsonJSON-LD with GS1 context

Query parameters

?linkType=gs1:epil — redirect to specific link type. ?linkType=linkset — return full linkset (RFC 9264). All other query params are passed through on redirects.

JSON response

{
  "gtin": "08523456790018",
  "batchLot": "LOT2026A",
  "linkTargets": [
    {
      "linkType": "gs1:epil",
      "title": "Digital Product Passport",
      "targetUrl": "https://dpp.gs/passport/08523456790018"
    },
    {
      "linkType": "gs1:pip",
      "title": "Product Information",
      "targetUrl": "https://dpp.gs/product/08523456790018"
    }
  ]
}

HTTP Link headers

All responses include a Link header pointing to the linkset: Link: <...?linkType=linkset>; rel="linkset"; type="application/linkset+json"

GET /.well-known/gs1resolver No auth Resolver description file

GS1 Resolver Description File per GS1-Conformant Resolver Standard. Returns supported primary keys, link types, and resolver root URL.

Rate Limiting

All API endpoints are rate-limited to 100 requests per minute per API key (or per IP for unauthenticated endpoints). When exceeded, the API returns 429 Too Many Requests.

DPP Viewer

GET /passport/:gtin No auth Public DPP viewer

Returns the public HTML Digital Product Passport page. This is what consumers see when they scan the QR code.

Query parameters

ParamDescription
batchFilter to specific batch/lot (GS1 AI 10)
serialFilter to specific serial number (GS1 AI 21)

Examples

GET /passport/08523456790018?batch=LOT2026A
 Live demo — EV Battery Pack 75kWh

EPR Export

Extended Producer Responsibility (EPR) reporting endpoints for battery and WEEE compliance. Export data in formats accepted by national EPR schemes.

GET /api/v1/epr-export/batteries API key Export battery EPR data

Exports battery product data in formats accepted by EPR collection schemes and national registries.

Query parameters

ParamValuesDefaultDescription
formatcsv · json · asekol · mzp-srcsvExport format (asekol = Czech ASEKOL scheme, mzp-sr = Slovak Ministry of Environment)
fromISO dateStart date filter (inclusive)
toISO dateEnd date filter (inclusive)
countryISO 3166-1Filter by target market country

Example

GET /api/v1/epr-export/batteries?format=csv&from=2026-01-01&to=2026-03-31&country=SK

Response

Returns a file download in the requested format. CSV includes columns for GTIN, batch, weight, chemistry, category, and quantities placed on market.

GET /api/v1/epr-export/battery-units API key Export battery unit records

Exports individual battery unit records with lifecycle status for EPR reporting.

Query parameters

ParamValuesDefaultDescription
formatcsv · jsoncsvExport format
statusstringFilter by unit status (e.g. active, recalled, end_of_life)
GET /api/v1/epr-registrations API key List EPR registrations

Returns all EPR registrations for the tenant — producer registration numbers with national collection schemes.

Response 200

"registrations": [
  {
    "id": "uuid",
    "country": "SK",
    "scheme_name": "NATUR-PACK",
    "registration_number": "SK-BAT-2026-001",
    "valid_from": "2026-01-01",
    "valid_to": "2026-12-31"
  }
]
POST /api/v1/epr-registrations API key Add EPR registration

Registers a new EPR scheme membership for the tenant.

Request body

{
  "country": "SK",
  "scheme_name": "NATUR-PACK",
  "registration_number": "SK-BAT-2026-001",
  "valid_from": "2026-01-01",
  "valid_to": "2026-12-31"
}

Response 201

{ "id": "uuid", "message": "EPR registration created" }

Battery Units

Per-unit tracking for individual battery instances — required for EV and industrial batteries under EU Battery Regulation 2023/1542.

POST /api/v1/products/:gtin/battery-units API key Create battery unit

Creates a per-unit record for an individual battery instance linked to the product GTIN.

Request body

{
  "unique_identifier": "BAT-2026-00001",
  "serial_number": "SN000001",
  "batch_lot": "LOT2026A",
  "manufacturing_date": "2026-03-15",
  "status": "active"
}

Response 201

{
  "uid": "BAT-2026-00001",
  "gtin": "08523456790018",
  "message": "Battery unit created"
}
GET /api/v1/products/:gtin/battery-units API key List units for product

Returns all battery unit records for the given product GTIN.

Response 200

"units": [
  {
    "uid": "BAT-2026-00001",
    "serial_number": "SN000001",
    "batch_lot": "LOT2026A",
    "status": "active",
    "manufacturing_date": "2026-03-15",
    "created_at": "2026-03-15T10:00:00Z"
  }
]
GET /api/v1/battery-units/:uid API key Get unit by identifier

Returns full detail of a battery unit by its unique identifier, including lifecycle events and state of health history.

URL parameters

ParamDescription
:uidUnique battery identifier (e.g. BAT-2026-00001)
PUT /api/v1/battery-units/:uid API key Update unit status

Updates the status or metadata of a battery unit.

Request body

{
  "status": "end_of_life",
  "end_of_life_date": "2026-04-10"
}

Response 200

{ "uid": "BAT-2026-00001", "message": "Battery unit updated" }
GET /api/v1/battery-units/:uid/soh API key Get state of health

Returns the current and historical state of health (SoH) data for the battery unit. Authenticated via Bearer token (API key or JWT).

Response 200

{
  "uid": "BAT-2026-00001",
  "current_soh_pct": 94.2,
  "capacity_fade_pct": 5.8,
  "cycle_count": 312,
  "last_updated": "2026-04-01T08:30:00Z",
  "history": [
    { "date": "2026-04-01", "soh_pct": 94.2, "cycle_count": 312 }
  ]
}
POST /api/v1/battery-units/:uid/soh API key Update SoH from BMS

Submits a new state of health reading from the Battery Management System (BMS). Typically called periodically by the BMS or telematics system.

Request body

{
  "soh_pct": 93.8,
  "capacity_fade_pct": 6.2,
  "cycle_count": 325,
  "internal_resistance_mohm": 2.4,
  "temperature_avg_c": 28,
  "measured_at": "2026-04-10T14:00:00Z"
}

Response 201

{ "message": "SoH reading recorded" }
POST /api/v1/battery-units/:uid/events API key Add lifecycle event

Adds a lifecycle event to the battery unit's history — e.g. commissioning, maintenance, transfer, recall, or end-of-life processing.

Request body

{
  "event_type": "maintenance",
  "description": "Scheduled BMS firmware update and cell balancing",
  "performed_by": "ServiceCo GmbH",
  "event_date": "2026-04-10"
}

Response 201

{ "id": "uuid", "message": "Event recorded" }

Declaration of Conformity

GET /api/v1/products/:gtin/declaration-of-conformity No auth Get declaration of conformity

Returns the EU Declaration of Conformity for the product, auto-generated from the product data and uploaded documents.

Query parameters

ParamValuesDefaultDescription
formatjson · htmljsonResponse format — HTML returns a printable declaration page

Example

GET /api/v1/products/08523456790018/declaration-of-conformity?format=html
 Printable HTML EU Declaration of Conformity

Section Info

GET /api/v1/section-info No auth Regulatory section info

Returns regulatory information for all DPP sections — which EU regulations require each data section, applicability per product sector, and compliance deadlines. Public endpoint, no authentication required.

Response 200

{
  "sections": [
    {
      "key": "battery",
      "title": "Battery Information",
      "regulation": "EU 2023/1542",
      "sectors": ["battery"],
      "mandatory": true,
      "effective_date": "2027-02-18"
    }
  ]
}

Product fields

Complete list of fields supported in the product object. All fields except gtin are optional unless noted.

FieldTypeDescription
gtinstringRequired. 14-digit GTIN
batch_lotstringBatch/lot number (GS1 AI 10)
serial_numberstringSerial number (GS1 AI 21) — mandatory for EV batteries
product_nameobjectMultilingual name — keys: en, sk, de, fr, etc.
brand_namestringCommercial brand name
model_numberstringModel/reference number
sectorstringbattery · electronics · textile · furniture · construction · chemicals · toys
manufacturer_namestringFull legal name of manufacturer
manufacturer_countrystringISO 3166-1 alpha-2 (e.g. SK, DE, CN)
manufacturer_addressstringFull registered address
weight_kgnumberWeight in kilograms
width_mm / height_mm / depth_mmnumberDimensions in millimetres
carbon_footprintobject{ total_kg_co2: number }
carbon_footprint_manufacturing_kgnumberManufacturing phase CO2 kg
carbon_footprint_transport_kgnumberTransport phase CO2 kg
recycled_contentnumberTotal recycled content %
repairability_scorenumber1–10 scale (10 = most repairable)
spare_parts_availability_yearsintegerYears spare parts will be available
ce_markingbooleanCE marking present
reach_compliantbooleanREACH compliant
rohs_compliantbooleanRoHS compliant
energy_efficiency_classstringA+++ through G
declaration_of_conformitystringURL to DoC PDF
user_manual_urlstringURL to user manual
expected_lifetime_yearsintegerExpected product lifetime
warranty_yearsintegerWarranty period in years
battery_categorystringportable · portable_general_use · lmt · sli · industrial · ev
place_of_manufacture_citystringCity where the product was manufactured
place_of_manufacture_regionstringRegion/state where the product was manufactured
manufacturing_facility_idstringIdentifier of the manufacturing facility
carbon_footprint_classstringCarbon footprint performance class (A–G)
carbon_footprint_total_kgnumberTotal lifecycle carbon footprint in kg CO2e
pef_methodology_versionstringProduct Environmental Footprint methodology version used
battery_removable_by_userbooleanBattery can be removed by the end user
battery_removable_by_professionalbooleanBattery can be removed by a professional
removal_tools_requiredstringTools required for battery removal
removal_instructions_urlstringURL to battery removal instructions
replacement_battery_available_yearsintegerYears replacement batteries will be available after last unit placed on market
removability_exemption_reasonstringReason for exemption from removability requirement (if applicable)
disassembly_stepsarraySee Disassembly steps below
materialsarraySee Materials object below
substancesarraySee Substances object below
batteryobjectSee Battery object below (sector=battery only)

Materials array

FieldTypeDescription
namestringMaterial name (e.g. Lithium, Cobalt, Cotton)
percentagenumberShare of total product weight %
origin_countrystringISO 3166-1 alpha-2 — mandatory for CRM
is_criticalbooleanCritical Raw Material under CRMA 2024/1252
is_recycledbooleanIs this material from recycled sources
recycled_pctnumberRecycled content % of this specific material

Substances array

FieldTypeDescription
namestringSubstance name
cas_numberstringCAS registry number
concentration_ppmnumberConcentration in ppm — declare if >1000 ppm (0.1%)
svhcbooleanOn ECHA SVHC Candidate List
location_in_productstringWhere in the product this substance is located

Battery object

FieldTypeDescription
chemistrystringNMC · LFP · NCA · LTO · NiMH · Lead-acid
capacity_kwhnumberEnergy capacity in kWh
nominal_voltagenumberNominal voltage in V
cycle_lifeintegerNumber of charge/discharge cycles
operating_temp_min / maxintegerOperating temperature range in degrees C
cathode_materialstringe.g. NMC 811, LFP
lithium_content_kgnumberLithium content kg — mandatory under Battery Reg.
cobalt_content_kgnumberCobalt content kg — mandatory under Battery Reg.
carbon_footprint_kg_kwhnumberCarbon intensity kg CO2e/kWh
recycled_cobalt_pctnumberRecycled cobalt % — target >=16% from 2031
recycled_lithium_pctnumberRecycled lithium % — target >=6% from 2031
un_numberstringUN transport number (e.g. UN3480)
supply_chain_due_diligence_urlstringURL to supply chain due diligence report
round_trip_efficiency_pctnumberRound-trip energy efficiency % (Annex IV)
round_trip_efficiency_50pct_lifenumberRound-trip efficiency at 50% of rated cycle life %
internal_resistance_mohmnumberInitial internal resistance in milliohms
self_discharge_rate_pct_monthnumberSelf-discharge rate % per month
capacity_threshold_exhaustion_pctnumberCapacity threshold for exhaustion % — 2nd life threshold
warranty_calendar_yearsintegerCalendar years of warranty coverage
c_rate_referencestringC-rate used for reference performance tests
battery_weight_kgnumberTotal battery weight in kg
recycled_nickel_pctnumberRecycled nickel content %
recycled_lead_pctnumberRecycled lead content %
nickel_content_kgnumberNickel content in kg
manganese_content_kgnumberManganese content in kg

Battery Regulation fields

Additional product-level fields required by EU Battery Regulation 2023/1542. These are set on the product object (not the nested battery object) and cover removability, carbon footprint classification, and manufacturing provenance.

FieldTypeDescription
battery_categorystringportable · portable_general_use · lmt · sli · industrial · ev
place_of_manufacture_citystringCity where the product was manufactured
place_of_manufacture_regionstringRegion/state where the product was manufactured
manufacturing_facility_idstringIdentifier of the manufacturing facility
carbon_footprint_classstringCarbon footprint performance class (A–G)
carbon_footprint_total_kgnumberTotal lifecycle carbon footprint in kg CO2e
pef_methodology_versionstringProduct Environmental Footprint methodology version
battery_removable_by_userbooleanBattery can be removed by the end user without tools or with commercially available tools
battery_removable_by_professionalbooleanBattery can be removed by a qualified professional
removal_tools_requiredstringDescription of tools required for battery removal
removal_instructions_urlstringURL to battery removal instructions
replacement_battery_available_yearsintegerYears replacement batteries will be available
removability_exemption_reasonstringJustification for exemption from removability requirement

Disassembly steps

Array of step-by-step disassembly instructions for end-of-life processing. Each element in the disassembly_steps array has the following fields:

FieldTypeDescription
step_orderintegerSequence number of this step (1-based)
step_titlestringShort title for the step
step_descriptionstringDetailed description of the disassembly action
tools_requiredstringTools needed for this step (e.g. "Torx T20 screwdriver")
fastener_typestringType of fastener (e.g. screw, clip, adhesive, bolt)
fastener_countintegerNumber of fasteners to remove in this step
warningstringSafety warning for this step (e.g. "High voltage — disconnect battery first")

Example

{
  "disassembly_steps": [
    {
      "step_order": 1,
      "step_title": "Disconnect high-voltage connector",
      "step_description": "Remove the orange HV safety connector from the battery enclosure.",
      "tools_required": "Insulated gloves, HV multimeter",
      "fastener_type": "clip",
      "fastener_count": 1,
      "warning": "High voltage — ensure vehicle is powered off and wait 10 minutes before proceeding."
    },
    {
      "step_order": 2,
      "step_title": "Remove enclosure bolts",
      "step_description": "Remove the 12 M8 bolts securing the battery enclosure to the vehicle chassis.",
      "tools_required": "13mm socket wrench, torque wrench",
      "fastener_type": "bolt",
      "fastener_count": 12,
      "warning": "Support battery from below before removing final bolts — weight approx. 450 kg."
    }
  ]
}