Skip to main content

DPP data model

A Digital Product Passport (DPP) is a structured record containing the regulatory, environmental, and performance data for a battery product, as required by EU Battery Regulation 2023/1542. This page describes the data model returned by the Traceable public API.

Lifecycle states

A DPP moves through two states:

StateAPI visibleEditableQR code active
draftNo — returns 404YesNo
publishedYes — returned by /api/dpp/{slug}No (create a new version)Yes

The public API only surfaces published DPPs. A draft DPP — one that has been created but not yet submitted for publication — returns a 404 response. This is by design: incomplete data must not be accessible until the manufacturer has confirmed it is ready.

When a published DPP needs to be updated, the manufacturer creates a new draft revision. The existing published version remains accessible until the new revision is published, at which point it replaces the current version and the version counter increments.

The slug

The slug is the URL-safe unique identifier for a product's DPP. It is:

  • Set by the manufacturer at product creation time
  • Constrained to lowercase alphanumeric characters and hyphens (e.g., swiftvolt-48v-100ah-ev-pack)
  • Immutable after the DPP is first published — changing a slug would break all QR codes pointing to it
  • Used as the path parameter in all DPP API calls

Slugs are unique across the entire Traceable platform.

Top-level DPP structure

The complete JSON object returned by GET /api/dpp/{slug}:

interface DppResponse {
// Identity
id: string; // "dpp_01HXYZ..." — internal UUID, prefixed
slug: string; // "swiftvolt-48v-100ah-ev-pack"
productName: string; // "SwiftVolt 48V 100Ah EV Pack"
batteryCategory: BatteryCategory;
status: "published";
version: number; // 1, 2, 3... increments on each republish

// Manufacturer
manufacturer: {
name: string; // "SwiftVolt Energy Systems GmbH"
country: string; // ISO 3166-1 alpha-2: "DE"
registrationNumber: string; // Company registration / VAT number
contactEmail: string;
address: string;
};

// Environmental data
carbonFootprint: CarbonFootprint | null; // null for SLI and Portable
recycledContent: {
cobaltPercent: number; // 0–100
lithiumPercent: number;
nickelPercent: number;
leadPercent: number;
};

// Performance characteristics
performance: {
nominalCapacityKwh: number;
ratedVoltageV: number;
cycleLifeAtEightyPercent: number; // charge cycles to 80% original capacity
roundTripEfficiencyPercent: number;
operatingTempMinC: number;
operatingTempMaxC: number;
initialSelfDischargeRatePercent: number | null;
};

// Chemical / safety
hazardousSubstances: Array<{
name: string; // "Cobalt(II) oxide"
casNumber: string; // "1307-96-6"
concentrationPercent: number;
threshold: string; // Regulatory threshold reference
}>;

// Supply chain
supplyChain: {
dueDiligencePolicyUrl: string | null;
responsibleSourcingCertification: string | null;
// Additional fields are restricted (accessible via PoLI)
};

// Compliance declarations
compliance: {
euBatteryRegulation: boolean;
reachCompliant: boolean;
rohsCompliant: boolean;
certifications: string[]; // e.g. ["IEC 62619:2022", "UN 38.3"]
declarationOfConformityRef: string | null;
};

// Timestamps (all ISO 8601 UTC)
createdAt: string;
publishedAt: string;
updatedAt: string;
}

type BatteryCategory =
| "EV_BATTERY"
| "LMT_BATTERY"
| "INDUSTRIAL_BATTERY"
| "SLI_BATTERY"
| "PORTABLE_BATTERY";

interface CarbonFootprint {
totalKgCO2ePerKwh: number;
lifecycle: {
rawMaterialExtraction: number;
manufacturing: number;
distribution: number;
usePhase: number;
endOfLife: number;
};
calculationMethodology: string; // e.g. "ISO 14067:2018"
verifiedBy: string | null;
verifiedAt: string | null;
declarationRef: string | null;
}

Timestamps

All timestamps in the API are ISO 8601 strings in UTC, with millisecond precision:

2025-03-18T08:45:11.342Z
FieldMeaning
createdAtWhen the DPP record was first created in Traceable (draft creation)
publishedAtWhen the DPP was first made publicly accessible (first publish)
updatedAtWhen the DPP was most recently updated. For a freshly published DPP, updatedAt equals publishedAt.

Use updatedAt to invalidate cached copies of DPP data. If your cached copy has the same updatedAt as the API response, the data has not changed.

Versioning

The version field is an integer that starts at 1 on first publish and increments each time the manufacturer updates and republishes the DPP.

ScenarioVersion
DPP first published1
Minor update (e.g., corrected certification reference)2
Major revision (e.g., updated carbon footprint after audit)3

Version history (previous versions of a DPP) is not accessible via the public API. The endpoint always returns the current published version.

Restricted fields

Some fields are present in the DPP data model but are not returned in public API responses. These fields are accessible only to entities with approved PoLI access. The public API response omits restricted fields entirely — there are no null placeholders for them.

See the PoLI Endpoints page for the access request workflow.