DPP Agent docs

CIRPASS-2 — the EU DPP ontologies

CIRPASS-2 is an EU-funded project that publishes ontologies for the Digital Product Passport: a CORE ontology (https://w3id.org/eudpp#) and sector modules for textiles, batteries and an example tyre ontology, documented at cirpass-2.github.io/ontologies-docs.

CIRPASS-2 is not normative. It is neither a regulation nor a harmonised standard, and no passport is required to use its terms. The requirements are in the ESPR, its delegated acts and the JTC 24 standards. We align with CIRPASS-2 so that tools built on its ontologies can read our passports; a passport that uses none of its terms is graded exactly the same.

How we align

Our field names stay our own. The vocabulary at /vocab/dpp/v1?terms=1 says, for each term, which eudpp term it is the same as (skos:exactMatch) or close to (skos:closeMatch):

  • exactMatch only where the meaning and the unit agree.
  • closeMatch where they do not, with a note saying why: a different unit, a different shape, or a value where the ontology has a structured object.
  • Some fields are left out on purpose, and the vocabulary source says why (for example the passport a product inherits its data from is not its predecessor, and voluntary certification schemes are not EU conformity certificates).

Checked against CORE 2.0.7 / P_DPP 2.1.0 / SOC 2.0.0, textile 1.1.2 (all twelve modules) and battery 0.4.0 / battery-performance 0.3.0, on 14 October 2026.

Textile coverage

The textile modules describe a fibre composition, a substance, a care instruction or a durability claim as structured objects: components, quantitative values with an SI unit, and controlled concepts. Our textile fields hold a value or a sentence, so they are close matches, not exact ones:

Our field eudpp term Match
Production date eudpp:manufacturingDate exact
Country of origin eudpp:countryOfOrigin exact (ISO 3166-1 alpha-2)
Material composition textile-core:hasFibreCompositionComponent close
Recycled content source eudpp:materialRecycledContentType close
Substances of concern eudpp:containsSubstanceOfConcern close
Concentration eudpp:Concentration, textile-soc:TextileConcentrationInformation close
Substance location eudpp:substanceLocation, textile-soc:hasTextileLocationType close
Washing, bleaching, drying, ironing, professional care, care symbols, care text textile-process:TextileCareInstruction close
Knitted or woven textile-process:hasFabricManufacturingMethod close
Durability textile-indicator:DurabilityIndicator close
Repair instructions textile-repairability:RepairGuidance close
Spare parts available textile-repairability:SparePartAvailabilityCondition close
Take-back textile-recyclability:takeBackCollectionScheme close
Recyclable share textile-recyclability:RecyclabilityScore close
Disposal guidance textile-process:TextileEndOfLifeInstruction close
Supply-chain journey textile-process:hasProcessExecution close

Nothing of ours maps to textile-structure (fabric characteristics such as mass per area or thread count), textile-durability (failure modes), textile-assessment (test results), textile-context (how a product is used and cared for) or textile-associated-materials (buttons, zips, packaging): we hold no such fields.

The validator shows this as the CIRPASS-2 data model tab, beside the schemas. It is for information only and never changes the score, the grade or what can be published.

The passport in eudpp terms

Every passport can be read as JSON-LD in the ontology's own terms:

GET /01/09506000134352?format=eudpp HTTP/2

or, by content negotiation on the passport's address:

GET /01/09506000134352 HTTP/2
Accept: application/ld+json; profile="https://w3id.org/eudpp"

The answer has Content-Type: application/ld+json; profile="https://w3id.org/eudpp", and the passport's Link header lists it as a rel="alternate" with that profile. Plain Accept: application/ld+json still returns the default JSON-LD.

{
  "@context": {
    "@version": 1.1,
    "@vocab": "https://dppagent.com/vocab/dpp#",
    "eudpp": "https://w3id.org/eudpp#",
    "eudpp-textile-process": "https://w3id.org/eudpp/textile-process#",
    "…": "one prefix per module"
  },
  "@id": "https://example.dpp.dppagent.com/01/09506000134352",
  "@type": "eudpp:DPP",
  "eudpp:dppUrl": { "@value": "https://example.dpp.dppagent.com/01/09506000134352", "@type": "xsd:anyURI" },
  "eudpp:granularity": "model",
  "eudpp:lastUpdate": { "@value": "2026-10-10T21:59:21.586+00:00", "@type": "xsd:dateTimeStamp" },
  "dppStatus": "active",
  "eudpp:appliesToProduct": {
    "@id": "https://example.dpp.dppagent.com/01/09506000134352#product",
    "@type": "eudpp:Product",
    "eudpp:productName": "Waterproof shell jacket",
    "eudpp:countryOfOrigin": "CN",
    "eudpp:manufacturingDate": { "@value": "2024-06-25", "@type": "xsd:date" },
    "espr.mat.composition": "Main fabric: 100% polyamide",
    "espr.care.washing": "Machine wash 40°"
  }
}

The rules:

  • Exact matches only go out as eudpp properties. A close match, and every field with no match, goes out under our own vocabulary (@vocab), so nothing the passport shows is lost and nothing is claimed to be what it is not.
  • On the right node. Each property sits on the node its domain in the ontology names: eudpp:granularity on the eudpp:DPP, eudpp:productName on the eudpp:Product it appliesToProduct, a battery's nominalVoltage on a BatteryPerformance.
  • In the right form. A value goes out as an eudpp property only if it fits the range: a URL for xsd:anyURI, a number in the stated unit for a decimal, an ISO 3166-1 alpha-2 code for countryOfOrigin (an English country name is converted; "Made in China" is not). A value that does not fit stays under our own term.
  • Public data only. The same fields as the public page: restricted battery data (Annex XIII points 2 to 4 of the Battery Regulation) never appears, and for a brand with role-based access switched on, only the sections the consumer role sees are included.
  • Self-contained. The @context is inline; a processor needs to fetch nothing. https://w3id.org/eudpp names an ontology, not a JSON-LD context.

It is read-only and has no effect on the grade. Draft passports answer only with ?preview=1, as for every other form.