---
title: "Textile DPP Implementation Guide"
description: "How to assemble a Textile Digital Product Passport against the published openepcis-dpp-ready textile vocabulary"
canonical_url: "https://openepcis.io/docs/digital-product-passport/textile/implementation-guide"
last_updated: "2026-07-02T20:31:54.008Z"
---

## 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`](https://github.com/openepcis/openepcis-dpp-ready/blob/main/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 `@vocab` is 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](/docs/digital-product-passport/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 of `TextileApparel`, `TextileFootwear`, `TextileAccessories`, `HomeTextiles`, `TechnicalTextiles`.
- `apparelSubcategory` — `TShirts`, `ShirtsBlouses`, `JacketsCoats`, `PantsShorts`, `DressesSkirts`, `Sweaters`, `Underwear`, `Swimwear`, `Denim`, `LeggingsStockingsSocks` (only applies when `textileCategory` is `TextileApparel`).
- `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.

```json
"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:

- `DimensionalChangeTestResult` referencing the test standard (`ISO3759`, `ISO6330`, `ISO16322_3`).
- `SpiralityTestResult` referencing `ISO16322_3`.
- `VisualInspectionResult` for 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`](https://github.com/openepcis/openepcis-dpp-ready/blob/main/extensions/eu/textile/docs/RECYCLABILITY_SCORING.md) and [`ROBUSTNESS_SCORING.md`](https://github.com/openepcis/openepcis-dpp-ready/blob/main/extensions/eu/textile/docs/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:

```json
{
  "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](/docs/digital-product-passport/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 `@context` collisions).
- **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](/docs/digital-product-passport/textile/complete-examples) — links to the canonical garment, footwear and ITIP set passports
- [Textile vocabulary browser](https://ref.openepcis.io/extensions/eu/textile/) — full ontology
- [EUDR Integration](/docs/digital-product-passport/eudr) — for leather and cotton inputs subject to EUDR obligations
- [Multi-component example](/docs/digital-product-passport/multi-component-example) — for a textile component inside a larger product
