Textile DPP Implementation Guide
How to assemble a Textile Digital Product Passport against the published openepcis-dpp-ready textile vocabulary
Overview
This guide walks through assembling a textile DPP that uses only published vocabulary — terms defined in the OpenEPCIS textile ontology and the GS1 Web Vocabulary. It mirrors the canonical reference passport extensions/eu/textile/examples/garment-product.jsonld in the dpp-ready repo.
Conventions. In JSON-LD documents the property names are bare — the JSON-LD context maps them to the right namespace. So you write
"textileCategory": "Apparel", not"textile:textileCategory". Likewise the controlled values come out unprefixed once@vocabis set:"fabricType": "WovenNonDenim".
Prerequisites
- A GS1 Company Prefix and assigned GTINs for the products you'll passport.
- A resolver that can host the linkset for each Digital Link URL (see Resolver Setup).
- The textile JSON-LD context:
https://ref.openepcis.io/extensions/eu/textile/textile-context.jsonld.
Step 1: Identify the product
Every DPP-relevant article needs a GS1 Digital Link URL. For a serialised garment that's https://id.gs1.org/01/{GTIN}/21/{serial}. The same identifier becomes the id of the passport document and the epcList value in every EPCIS event.
Step 2: Classify the textile
The textile module publishes top-level classifications that the consumer-handling page, the recycler and the customs authority all consume:
textileCategory— one ofTextileApparel,TextileFootwear,TextileAccessories,HomeTextiles,TechnicalTextiles.apparelSubcategory—TShirts,ShirtsBlouses,JacketsCoats,PantsShorts,DressesSkirts,Sweaters,Underwear,Swimwear,Denim,LeggingsStockingsSocks(only applies whentextileCategoryisTextileApparel).fabricType—Knitted,WovenNonDenim,Denim.garmentType,targetGender,sizeRange,seasonCollection— free-text classification fields the vocabulary defines.
Dual-type the document: "type": ["Product", "TextileApparel"] (or TextileFootwear, etc.).
Step 3: Declare fibre composition the GS1 way
Fibre composition uses gs1:textileMaterial with one gs1:TextileMaterialDetails entry per fibre. The textile module attaches fiberOrigin, isRecycledFiber, recycledContentSource and fiberCertification inline on each entry — it does not invent a parallel textile:FiberComposition class.
"textileMaterial": [
{
"type": "TextileMaterialDetails",
"textileMaterialContent": { "type": "QuantitativeValue", "value": 55, "unitCode": "P1" },
"textileMaterialDescription": "Recycled polyester (post-consumer PET)",
"fiberOrigin": "TW",
"isRecycledFiber": true,
"recycledContentSource": "Post-consumer PET bottles",
"fiberCertification": {
"type": "CertificationDetails",
"certificationStandard": "GRS"
}
},
{
"type": "TextileMaterialDetails",
"textileMaterialContent": { "type": "QuantitativeValue", "value": 45, "unitCode": "P1" },
"textileMaterialDescription": "Organic cotton",
"fiberOrigin": "TR",
"isRecycledFiber": false
}
]
unitCode: "P1" is the UN/CEFACT Rec 20 percent code. The textile module enforces the percentages summing to ~100% via its SHACL shapes.
Step 4: Care instructions (ISO 3758)
Care is expressed as a list of CareInstruction records carrying a careSymbolCode and supporting metadata. The published controlled values cover the ISO 3758 symbol set:
- Washing:
Wash30,Wash40,Wash60,WashGentle,WashHandOnly,DoNotWash - Bleaching:
BleachAllowed,NonChlorineBleach,DoNotBleach - Tumble drying:
TumbleDryLow,TumbleDryMedium,TumbleDryHigh,DripDry,LineDry,DryFlat,DoNotTumbleDry - Ironing:
IronLow,IronMedium,IronHigh,NoSteam,DoNotIron - Professional / dry-cleaning:
DryCleanAny,DryCleanPCE,DryCleanHydrocarbon,WetClean,DoNotDryClean
Step 5: Durability
DurabilityInfo rolls up the regulated tests into a single DurabilityClass (DurabilityA…DurabilityE). Underlying test results live in dedicated records:
DimensionalChangeTestResultreferencing the test standard (ISO3759,ISO6330,ISO16322_3).SpiralityTestResultreferencingISO16322_3.VisualInspectionResultfor finishing defects.
The RobustnessAssessment and RecyclabilityAssessment records aggregate per-dimension scores defined by the JRC scoring tables; see the textile vocabulary's RECYCLABILITY_SCORING.md and ROBUSTNESS_SCORING.md for the calculation rules.
Step 6: Substances of concern
Each substance of concern goes into a SubstanceOfConcern block:
SubstanceOfConcernType—SoCTypeA,SoCTypeB,SoCTypeC,SoCTypeD(regulatory bucket).CLPHazardCategory,CMR,EndocrineDisruptor,PMT,Sensitizer— hazard classifications attached to the substance.chemicalPurpose— what role the substance played (dyeing, finishing, …).concentrationRange— concentration band, mapped to the same controlled set the regulation uses.safeUseInstructions— guidance for handling residuals.
REACH SVHC and the ZDHC MRSL are referenced via standard certification / verification records.
Step 7: Microplastic shedding (synthetic blends)
For synthetic-fibre-containing products, capture a MicroplasticInfo block with:
MicroplasticRiskLevel—LowShedding,MediumShedding,HighShedding.microplasticMitigationMeasures— what the product / instructions do to reduce shedding (low-friction finishes, washing-bag recommendations, etc.).
Step 8: Recycled content and chain of custody
Use RecycledContentDeclaration to capture the recycled-content claim and how it was traced:
recycledContentSource— narrative describing the source.RecycledSourceType—PreConsumer,PostConsumer,PostIndustrial.ChainOfCustodyMethod—MassBalance,Segregation,IdentityPreserved.
A WasteOriginType qualifier covers waste-stream origin claims when relevant.
Step 9: End-of-life
End-of-life pathways combine a TakeBackProgram (the brand's program), takeBackIncentive (e.g. discount or store credit), endOfLifeDestination (FiberToFiber, OpenLoop, recycler, charity, …), and RecyclingTechnology (MechanicalRecycling, ChemicalRecyclingCotton, ChemicalRecyclingPA6, ThermoMechanicalRecycling, ThermoChemicalRecycling, FiberToFiber). The recyclability score from Step 5 ties this back to the durability/recyclability assessments.
Step 10: Publish the textile linkset
The textile passport is served from an IETF application/linkset+json document (RFC 9264). One object per anchor, GS1 link relations as full-IRI keys, link descriptors as values. For a serialised garment a typical linkset covers the consumer PIP, the EPCIS history (supply chain, take-back), the sustainability declaration, the consumer-handling/care instructions and the certification dossier:
{
"linkset": [
{
"anchor": "https://id.gs1.org/01/09521234000011/21/WJ-2025-00142",
"itemDescription": "Wool jacket, classic cut",
"https://ref.gs1.org/voc/defaultLink": [
{ "href": "https://dpp.example.com/textile/09521234000011/WJ-2025-00142",
"title": "Textile passport" }
],
"https://ref.gs1.org/voc/pip": [
{ "href": "https://dpp.example.com/textile/09521234000011/WJ-2025-00142",
"title": "Textile passport (consumer view)",
"type": "text/html",
"context": ["ALL"], "public": true }
],
"https://ref.gs1.org/voc/epcis": [
{ "href": "https://api.example.com/events?MATCH_anyEPC=https%3A%2F%2Fid.gs1.org%2F01%2F09521234000011%2F21%2FWJ-2025-00142",
"title": "EPCIS event history (supply chain, take-back)",
"type": "application/ld+json",
"context": ["ALL"], "public": true }
],
"https://ref.gs1.org/voc/consumerHandlingStorageInstructions": [
{ "href": "https://dpp.example.com/care/09521234000011/WJ-2025-00142",
"title": "Care instructions (ISO 3758)",
"type": "text/html",
"context": ["ALL"], "public": true }
],
"https://ref.gs1.org/voc/productSustainabilityInfo": [
{ "href": "https://dpp.example.com/sustainability/09521234000011/WJ-2025-00142",
"title": "Fibre composition, microplastic risk, circularity claims",
"type": "application/ld+json",
"context": ["ALL"], "public": true }
],
"https://ref.gs1.org/voc/certificationInfo": [
{ "href": "https://dpp.example.com/certs/09521234000011/WJ-2025-00142",
"title": "OEKO-TEX, GOTS and other conformity certificates",
"type": "application/ld+json",
"context": ["business", "authority"] }
]
}
]
}
The ?linkType= parameter on a resolver URL takes the bare relation name (pip, productSustainabilityInfo, consumerHandlingStorageInstructions, …). See Resolver Setup for hosting options.
Validation
A complete textile DPP should pass three kinds of check:
- JSON-LD shape — normalises against the textile context (no unresolved terms, no
@contextcollisions). - SHACL — instance data satisfies the textile shapes published with the vocabulary.
- JSON Schema — the payload validates against the textile DPP schema.
Tooling: any JSON-LD 1.1 processor for normalisation; any SHACL engine (pySHACL, Apache Jena, TopBraid SHACL); any JSON Schema validator.
Next steps
- Complete examples — links to the canonical garment, footwear and ITIP set passports
- Textile vocabulary browser — full ontology
- EUDR Integration — for leather and cotton inputs subject to EUDR obligations
- Multi-component example — for a textile component inside a larger product