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.
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
Errors
The API returns standard HTTP status codes. Error responses include a JSON body with an error field.
| Code | Meaning |
|---|---|
| 200 / 201 | Success |
| 400 | Bad request — missing required field or invalid value |
| 401 | Unauthorized — missing or invalid API key |
| 404 | Not found — product or resource doesn't exist |
| 409 | Conflict — product with this GTIN already exists |
| 500 | Server error — contact [email protected] |
Auth endpoints
Creates a new manufacturer account. Sends a verification email via SendGrid.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| company_name | string | required | Legal company name |
| string | required | Account email — used for login | |
| password | string | required | Min 8 characters |
| gcp | string | required | GS1 Company Prefix (7–12 digits) |
Response 201
"message": "Registration successful. Please verify your email.", "api_key": "b79e57f0e3d1..."
| Field | Type | Required |
|---|---|---|
| string | required | |
| password | string | required |
Response 200
"token": "eyJhbGciOiJIUzI1NiJ9...", "api_key": "b79e57f0e3d1...", "tenant": { "id": "uuid", "name": "Acme s.r.o.", "gcp": "0852345" }
Product endpoints
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" } ]
Returns full product data including materials, substances, battery data, and link targets.
URL parameters
| Param | Description |
|---|---|
| :gtin | 14-digit GTIN of the product |
Response 200
Returns the full product object with nested materials, substances, battery, and link_targets arrays.
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" }
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.
dpp.gs/passport/{gtin} reflects changes immediately. No need to reprint QR codes when data changes.Response 200
{ "message": "Product updated", "id": "uuid" }
Soft-deletes the product — sets status to deleted. The DPP is no longer publicly accessible.
Document endpoints
Uploads a document file and attaches it to the product. Use multipart/form-data with the file in the file field.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
| doc_type | string | required | Document type (see list below) |
Supported doc_type values
| Value | Description |
|---|---|
| declaration_of_conformity | EU Declaration of Conformity (DoC) |
| technical_documentation | Technical documentation |
| user_manual | User manual / instructions for use |
| repair_manual | Repair manual / service guide |
| safety_instructions | Safety data sheet or instructions |
| product_datasheet | Product data sheet |
| energy_label | Energy label (Regulation 2017/1369) |
| carbon_footprint_epd | Carbon footprint / EPD report |
| disassembly_instructions | Disassembly / end-of-life instructions |
| supply_chain_report | Supply chain due diligence report |
| test_report | Test / certification report |
| other | Other 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"
}
Deletes a document attachment from the product. Removes the file from storage.
URL parameters
| Param | Description |
|---|---|
| :gtin | 14-digit GTIN of the product |
| :docId | UUID of the document to delete |
Response 200
{ "message": "Document deleted" }
Batch upload
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
Returns a QR code or DataMatrix image for the given GTIN. No authentication required — suitable for embedding in label templates.
Query parameters
| Param | Values | Default | Description |
|---|---|---|---|
| format | qr · datamatrix · svg | qr | Output format |
| batch | string | — | Batch/lot number (GS1 AI 10) |
| serial | string | — | Serial 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)
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.
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
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"
}
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" } ]
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"
}
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.
Downloads a ZIP archive containing QR and/or DataMatrix code images for every serial number in the batch.
Query parameters
| Param | Values | Default | Description |
|---|---|---|---|
| format | qr · datamatrix · both | both | Code format to include |
Response
ZIP file with qr/ and/or datamatrix/ folders + manifest.csv.
Deletes a serial number batch and all associated serial number records.
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.
GS1 Digital Link resolver with full content negotiation.
| Accept header | Response |
|---|---|
text/html or browser | 303 redirect to DPP viewer |
application/json | JSON with link targets |
application/linkset+json | RFC 9264 linkset |
application/ld+json | JSON-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"
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
Returns the public HTML Digital Product Passport page. This is what consumers see when they scan the QR code.
Query parameters
| Param | Description |
|---|---|
| batch | Filter to specific batch/lot (GS1 AI 10) |
| serial | Filter 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.
Exports battery product data in formats accepted by EPR collection schemes and national registries.
Query parameters
| Param | Values | Default | Description |
|---|---|---|---|
| format | csv · json · asekol · mzp-sr | csv | Export format (asekol = Czech ASEKOL scheme, mzp-sr = Slovak Ministry of Environment) |
| from | ISO date | — | Start date filter (inclusive) |
| to | ISO date | — | End date filter (inclusive) |
| country | ISO 3166-1 | — | Filter 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.
Exports individual battery unit records with lifecycle status for EPR reporting.
Query parameters
| Param | Values | Default | Description |
|---|---|---|---|
| format | csv · json | csv | Export format |
| status | string | — | Filter by unit status (e.g. active, recalled, end_of_life) |
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" } ]
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.
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"
}
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" } ]
Returns full detail of a battery unit by its unique identifier, including lifecycle events and state of health history.
URL parameters
| Param | Description |
|---|---|
| :uid | Unique battery identifier (e.g. BAT-2026-00001) |
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" }
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 }
]
}
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" }
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
Returns the EU Declaration of Conformity for the product, auto-generated from the product data and uploaded documents.
Query parameters
| Param | Values | Default | Description |
|---|---|---|---|
| format | json · html | json | Response 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
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.
| Field | Type | Description |
|---|---|---|
| gtin | string | Required. 14-digit GTIN |
| batch_lot | string | Batch/lot number (GS1 AI 10) |
| serial_number | string | Serial number (GS1 AI 21) — mandatory for EV batteries |
| product_name | object | Multilingual name — keys: en, sk, de, fr, etc. |
| brand_name | string | Commercial brand name |
| model_number | string | Model/reference number |
| sector | string | battery · electronics · textile · furniture · construction · chemicals · toys |
| manufacturer_name | string | Full legal name of manufacturer |
| manufacturer_country | string | ISO 3166-1 alpha-2 (e.g. SK, DE, CN) |
| manufacturer_address | string | Full registered address |
| weight_kg | number | Weight in kilograms |
| width_mm / height_mm / depth_mm | number | Dimensions in millimetres |
| carbon_footprint | object | { total_kg_co2: number } |
| carbon_footprint_manufacturing_kg | number | Manufacturing phase CO2 kg |
| carbon_footprint_transport_kg | number | Transport phase CO2 kg |
| recycled_content | number | Total recycled content % |
| repairability_score | number | 1–10 scale (10 = most repairable) |
| spare_parts_availability_years | integer | Years spare parts will be available |
| ce_marking | boolean | CE marking present |
| reach_compliant | boolean | REACH compliant |
| rohs_compliant | boolean | RoHS compliant |
| energy_efficiency_class | string | A+++ through G |
| declaration_of_conformity | string | URL to DoC PDF |
| user_manual_url | string | URL to user manual |
| expected_lifetime_years | integer | Expected product lifetime |
| warranty_years | integer | Warranty period in years |
| battery_category | string | portable · portable_general_use · lmt · sli · industrial · ev |
| place_of_manufacture_city | string | City where the product was manufactured |
| place_of_manufacture_region | string | Region/state where the product was manufactured |
| manufacturing_facility_id | string | Identifier of the manufacturing facility |
| carbon_footprint_class | string | Carbon footprint performance class (A–G) |
| carbon_footprint_total_kg | number | Total lifecycle carbon footprint in kg CO2e |
| pef_methodology_version | string | Product Environmental Footprint methodology version used |
| battery_removable_by_user | boolean | Battery can be removed by the end user |
| battery_removable_by_professional | boolean | Battery can be removed by a professional |
| removal_tools_required | string | Tools required for battery removal |
| removal_instructions_url | string | URL to battery removal instructions |
| replacement_battery_available_years | integer | Years replacement batteries will be available after last unit placed on market |
| removability_exemption_reason | string | Reason for exemption from removability requirement (if applicable) |
| disassembly_steps | array | See Disassembly steps below |
| materials | array | See Materials object below |
| substances | array | See Substances object below |
| battery | object | See Battery object below (sector=battery only) |
Materials array
| Field | Type | Description |
|---|---|---|
| name | string | Material name (e.g. Lithium, Cobalt, Cotton) |
| percentage | number | Share of total product weight % |
| origin_country | string | ISO 3166-1 alpha-2 — mandatory for CRM |
| is_critical | boolean | Critical Raw Material under CRMA 2024/1252 |
| is_recycled | boolean | Is this material from recycled sources |
| recycled_pct | number | Recycled content % of this specific material |
Substances array
| Field | Type | Description |
|---|---|---|
| name | string | Substance name |
| cas_number | string | CAS registry number |
| concentration_ppm | number | Concentration in ppm — declare if >1000 ppm (0.1%) |
| svhc | boolean | On ECHA SVHC Candidate List |
| location_in_product | string | Where in the product this substance is located |
Battery object
| Field | Type | Description |
|---|---|---|
| chemistry | string | NMC · LFP · NCA · LTO · NiMH · Lead-acid |
| capacity_kwh | number | Energy capacity in kWh |
| nominal_voltage | number | Nominal voltage in V |
| cycle_life | integer | Number of charge/discharge cycles |
| operating_temp_min / max | integer | Operating temperature range in degrees C |
| cathode_material | string | e.g. NMC 811, LFP |
| lithium_content_kg | number | Lithium content kg — mandatory under Battery Reg. |
| cobalt_content_kg | number | Cobalt content kg — mandatory under Battery Reg. |
| carbon_footprint_kg_kwh | number | Carbon intensity kg CO2e/kWh |
| recycled_cobalt_pct | number | Recycled cobalt % — target >=16% from 2031 |
| recycled_lithium_pct | number | Recycled lithium % — target >=6% from 2031 |
| un_number | string | UN transport number (e.g. UN3480) |
| supply_chain_due_diligence_url | string | URL to supply chain due diligence report |
| round_trip_efficiency_pct | number | Round-trip energy efficiency % (Annex IV) |
| round_trip_efficiency_50pct_life | number | Round-trip efficiency at 50% of rated cycle life % |
| internal_resistance_mohm | number | Initial internal resistance in milliohms |
| self_discharge_rate_pct_month | number | Self-discharge rate % per month |
| capacity_threshold_exhaustion_pct | number | Capacity threshold for exhaustion % — 2nd life threshold |
| warranty_calendar_years | integer | Calendar years of warranty coverage |
| c_rate_reference | string | C-rate used for reference performance tests |
| battery_weight_kg | number | Total battery weight in kg |
| recycled_nickel_pct | number | Recycled nickel content % |
| recycled_lead_pct | number | Recycled lead content % |
| nickel_content_kg | number | Nickel content in kg |
| manganese_content_kg | number | Manganese 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.
| Field | Type | Description |
|---|---|---|
| battery_category | string | portable · portable_general_use · lmt · sli · industrial · ev |
| place_of_manufacture_city | string | City where the product was manufactured |
| place_of_manufacture_region | string | Region/state where the product was manufactured |
| manufacturing_facility_id | string | Identifier of the manufacturing facility |
| carbon_footprint_class | string | Carbon footprint performance class (A–G) |
| carbon_footprint_total_kg | number | Total lifecycle carbon footprint in kg CO2e |
| pef_methodology_version | string | Product Environmental Footprint methodology version |
| battery_removable_by_user | boolean | Battery can be removed by the end user without tools or with commercially available tools |
| battery_removable_by_professional | boolean | Battery can be removed by a qualified professional |
| removal_tools_required | string | Description of tools required for battery removal |
| removal_instructions_url | string | URL to battery removal instructions |
| replacement_battery_available_years | integer | Years replacement batteries will be available |
| removability_exemption_reason | string | Justification 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:
| Field | Type | Description |
|---|---|---|
| step_order | integer | Sequence number of this step (1-based) |
| step_title | string | Short title for the step |
| step_description | string | Detailed description of the disassembly action |
| tools_required | string | Tools needed for this step (e.g. "Torx T20 screwdriver") |
| fastener_type | string | Type of fastener (e.g. screw, clip, adhesive, bolt) |
| fastener_count | integer | Number of fasteners to remove in this step |
| warning | string | Safety 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."
}
]
}