ProductDNA

ProductDNA is the product-level identity layer for the localLOOP platform. It references constituent MaterialDNA entries and explores fields that may be relevant to EU Digital Product Passport discussions. This is an early-stage lab concept, not a DPP-ready system.

Lab-only status. Lab-only: exploratory documentation and demo evidence; not a public deployment or compliance claim.

Scope & boundaries

In scope
Draft product identifiers, passport-style fields, material-composition links, and lifecycle stage.
Out of scope
Live inventory tracking, financial settlement, or verified carbon accounting.
Status
Lab-demo concept only — no public pilots or deployments yet.

Why cities adopt ProductDNA

DPP research
Explore data fields that may be relevant to ESPR Art. 9-10; no readiness, mandate coverage, or compliance outcome is claimed.
Circular procurement
Use lab examples to discuss product condition, composition, and lifecycle fields; they do not verify procurement requirements.
Reuse scenarios
Model potential exchange scenarios for research; provenance data is illustrative and not independently verified.
Evidence fields
References to certifications can support review; they do not prevent false claims or establish conformity.
Data control
Data-control patterns are under exploration; deployments must define their own access, retention, and governance controls.

What we aim to enable

A draft product-identity model with example passport-style fields, provenance metadata, material composition references, and lifecycle information.

Identity
Example product identifiers referencing constituent MaterialDNA entries via material_ids
Passport fields
Draft fields for discussing product, certification, and regulatory metadata; no ESPR alignment is claimed.
Lifecycle stage
Condition, repair history, and end-of-life indicators
Interoperability
Compatible with Offer/Match/Transfer flows across city nodes

Data model snapshot

ProductDNA schema

Product ID, category, condition, lifecycle stage, and material composition links.

Provenance & DPP

Example origin, passport-style, certification, and regulatory metadata fields.

Lifecycle stage

Condition tracking, repair records, and end-of-life routing signals.

Current status

Specification

Draft schemas are available in the LOOP repository.

Browse schemas

Status

No public pilots or deployments yet.

Register interest

Integration

Implementation guidance will be published as the spec matures.

Read the guide
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://localloop.urbnia.com/projects/loop-protocol/schemas/v0.2.0/product-dna.schema.json",
  "title": "ProductDNA",
  "description": "Product identity and metadata schema — LOOP v0.2.0 (DPP-aligned, ESPR Art. 9-10 compatible). Products reference constituent materials via material_ids.",
  "type": "object",
  "required": [
    "@context",
    "@type",
    "schema_version",
    "id",
    "product_category",
    "name",
    "condition",
    "quantity",
    "origin_city",
    "current_city",
    "available_from"
  ],
  "properties": {
    "@context": {
      "description": "JSON-LD context",
      "type": "string",
      "enum": [
        "https://localloop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld",
        "https://localloop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"
      ]
    },
    "@type": {
      "description": "Object type identifier",
      "type": "string",
      "const": "ProductDNA"
    },
    "schema_version": {
      "description": "Schema version for the interop flow. Emitters SHOULD use 0.2.0; receivers SHOULD accept additive minor/patch releases.",
      "type": "string",
      "pattern": "^0\\.[1-9]\\d*\\.\\d+$",
      "examples": [
        "0.2.0"
      ]
    },
    "id": {
      "description": "Unique ProductDNA identifier",
      "type": "string",
      "pattern": "^PRD-[A-Z0-9-]{8,}$",
      "examples": [
        "PRD-DE-MUC-2025-LAPTOP-A1B2C3"
      ]
    },
    "product_category": {
      "description": "Standardized product category",
      "type": "string",
      "enum": [
        "furniture-office",
        "furniture-residential",
        "furniture-industrial",
        "building-structural",
        "building-fixture",
        "building-hvac",
        "building-electrical",
        "electronics-computing",
        "electronics-mobile",
        "electronics-appliance",
        "electronics-components",
        "textile-garment",
        "textile-industrial",
        "packaging-reusable",
        "vehicle-parts",
        "equipment-industrial",
        "equipment-medical"
      ]
    },
    "name": {
      "description": "Product name or short description",
      "type": "string",
      "minLength": 2,
      "maxLength": 200,
      "examples": [
        "Standing Desk — Ergotron WorkFit"
      ]
    },
    "condition": {
      "description": "Physical condition of the product",
      "type": "string",
      "enum": [
        "new",
        "like-new",
        "good",
        "fair",
        "poor",
        "for-parts"
      ]
    },
    "quantity": {
      "description": "Amount of product units",
      "type": "object",
      "required": [
        "value",
        "unit"
      ],
      "properties": {
        "value": {
          "description": "Numeric quantity",
          "type": "number",
          "minimum": 0,
          "examples": [
            12,
            1
          ]
        },
        "unit": {
          "description": "Unit of measurement",
          "type": "string",
          "enum": [
            "kg",
            "g",
            "t",
            "l",
            "ml",
            "m3",
            "piece",
            "bundle"
          ],
          "examples": [
            "piece"
          ]
        }
      }
    },
    "origin_city": {
      "description": "City that registered the product",
      "type": "string",
      "minLength": 2,
      "maxLength": 80,
      "examples": [
        "Munich"
      ]
    },
    "current_city": {
      "description": "City currently holding custody of the product",
      "type": "string",
      "minLength": 2,
      "maxLength": 80,
      "examples": [
        "Munich"
      ]
    },
    "available_from": {
      "description": "When product becomes available (ISO 8601)",
      "type": "string",
      "format": "date-time",
      "examples": [
        "2026-03-15T08:00:00Z"
      ]
    },
    "expires": {
      "description": "When product listing expires (ISO 8601)",
      "type": "string",
      "format": "date-time"
    },
    "manufacturer": {
      "description": "Product manufacturer name",
      "type": "string",
      "maxLength": 200,
      "examples": [
        "Ergotron"
      ]
    },
    "model": {
      "description": "Product model name or number",
      "type": "string",
      "maxLength": 200,
      "examples": [
        "WorkFit-S"
      ]
    },
    "manufacture_year": {
      "description": "Year of manufacture",
      "type": "integer",
      "minimum": 1900,
      "examples": [
        2021
      ]
    },
    "serial_number": {
      "description": "Product serial number",
      "type": "string",
      "maxLength": 120
    },
    "functional_status": {
      "description": "Functional state of the product",
      "type": "string",
      "enum": [
        "fully-functional",
        "partially-functional",
        "non-functional",
        "untested"
      ]
    },
    "lifecycle_stage": {
      "description": "Current stage in product lifecycle (ESPR/UNTP aligned)",
      "type": "string",
      "enum": [
        "production",
        "in-use",
        "end-of-first-use",
        "refurbished",
        "end-of-life"
      ]
    },
    "material_ids": {
      "description": "References to constituent MaterialDNA identifiers (composition link)",
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^MAT-[A-Z]{2}-[A-Z]{3}-\\d{4}-[A-Z]+-[A-Z0-9]{6,}$"
      },
      "examples": [
        [
          "MAT-DE-MUC-2025-METAL-4EB84C",
          "MAT-DE-MUC-2025-PLASTIC-96FE78"
        ]
      ]
    },
    "dimensions": {
      "description": "Physical dimensions of the product",
      "type": "object",
      "properties": {
        "length_cm": {
          "description": "Length in centimeters",
          "type": "number",
          "minimum": 0
        },
        "width_cm": {
          "description": "Width in centimeters",
          "type": "number",
          "minimum": 0
        },
        "height_cm": {
          "description": "Height in centimeters",
          "type": "number",
          "minimum": 0
        },
        "weight_kg": {
          "description": "Weight in kilograms",
          "type": "number",
          "minimum": 0
        }
      }
    },
    "images": {
      "description": "Photos of the product",
      "type": "array",
      "items": {
        "type": "string",
        "format": "uri"
      },
      "maxItems": 10
    },
    "reuse_potential": {
      "description": "Free-text notes on reuse potential and condition details",
      "type": "string",
      "maxLength": 500,
      "examples": [
        "Fully functional standing desks from office clearance. Minor cosmetic wear."
      ]
    },
    "certifications": {
      "description": "List of certifications",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "location": {
      "description": "Geographic location of product",
      "type": "object",
      "required": [
        "lat",
        "lon"
      ],
      "properties": {
        "lat": {
          "description": "Latitude",
          "type": "number",
          "minimum": -90,
          "maximum": 90
        },
        "lon": {
          "description": "Longitude",
          "type": "number",
          "minimum": -180,
          "maximum": 180
        },
        "address": {
          "description": "Human-readable address",
          "type": "string"
        }
      }
    },
    "contact": {
      "description": "Reserved. Personal contact details are not permitted in minimal interop payloads.",
      "not": {}
    },
    "passport": {
      "description": "Optional regulatory interoperability metadata for DPP-style integrations (ESPR Art. 9-10, UNTP ProductPassport aligned).",
      "type": "object",
      "properties": {
        "passport_id": {
          "type": "string",
          "maxLength": 160
        },
        "passport_url": {
          "type": "string",
          "format": "uri"
        },
        "backup_copy_url": {
          "type": "string",
          "format": "uri"
        },
        "passport_status": {
          "type": "string",
          "enum": [
            "not_applicable",
            "optional",
            "required",
            "available",
            "restricted"
          ]
        },
        "data_carrier_id": {
          "type": "string",
          "maxLength": 160
        },
        "issued_at": {
          "type": "string",
          "format": "date-time"
        },
        "issuer_node": {
          "type": "string",
          "maxLength": 160
        },
        "access_scope": {
          "type": "string",
          "enum": [
            "public",
            "role-based",
            "restricted"
          ]
        },
        "visible_to": {
          "description": "Minimum audience tier this passport data is intended for, on a cumulative public < operator < regulator scale (each wider tier sees at least what the narrower one sees). Refines access_scope's role-based/restricted values without replacing them; modeling guidance only, not an enforced access-control mechanism. See docs/access-scope-model.md.",
          "type": "string",
          "enum": [
            "public",
            "operator",
            "regulator"
          ]
        },
        "supported_regimes": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "espr-dpp",
              "battery-passport",
              "ppwr",
              "waste-shipment",
              "nkws"
            ]
          }
        },
        "gtin": {
          "description": "GS1 Global Trade Item Number",
          "type": "string",
          "pattern": "^\\d{8,14}$"
        },
        "gs1_digital_link": {
          "description": "GS1 Digital Link URL",
          "type": "string",
          "format": "uri"
        },
        "economic_operator_id": {
          "description": "ESPR economic operator identifier",
          "type": "string",
          "maxLength": 120
        },
        "economic_operator_name": {
          "description": "ESPR economic operator name",
          "type": "string",
          "maxLength": 200
        },
        "manufacturer_id": {
          "description": "Manufacturer identifier",
          "type": "string",
          "maxLength": 120
        },
        "country_of_production": {
          "description": "ISO 3166-1 alpha-2 country code of production",
          "type": "string",
          "pattern": "^[A-Z]{2}$"
        },
        "conformity_declaration_ref": {
          "description": "EU Declaration of Conformity link",
          "type": "string",
          "format": "uri"
        },
        "carbon_footprint_kg_co2e": {
          "description": "Carbon footprint per declared unit (kg CO2e)",
          "type": "number",
          "minimum": 0
        },
        "carbon_footprint_unit": {
          "description": "Declared unit for carbon footprint",
          "type": "string"
        },
        "recycled_content_percent": {
          "description": "Percentage of recycled content (ESPR & PPWR)",
          "type": "number",
          "minimum": 0,
          "maximum": 100
        },
        "recyclable_content_percent": {
          "description": "Percentage of recyclable content (UNTP circularity)",
          "type": "number",
          "minimum": 0,
          "maximum": 100
        },
        "repair_score": {
          "description": "Repairability index 0-10 (ESPR)",
          "type": "number",
          "minimum": 0,
          "maximum": 10
        },
        "durability_score": {
          "description": "Durability rating 0-10",
          "type": "number",
          "minimum": 0,
          "maximum": 10
        },
        "disassembly_instructions": {
          "description": "Link to disassembly information",
          "type": "string",
          "format": "uri"
        },
        "substances_of_concern": {
          "description": "Substances of Concern declarations (ESPR)",
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "cas_number": {
                "type": "string",
                "pattern": "^\\d{1,7}-\\d{2}-\\d$"
              },
              "concentration_ppm": {
                "type": "number"
              },
              "location": {
                "type": "string"
              }
            }
          }
        },
        "hazardous": {
          "description": "Hazardous product flag",
          "type": "boolean"
        },
        "material_safety_info_url": {
          "description": "Material safety data sheet URL",
          "type": "string",
          "format": "uri"
        },
        "verified_ratio": {
          "description": "UNTP data verification coverage (0.0 to 1.0)",
          "type": "number",
          "minimum": 0,
          "maximum": 1
        },
        "verification_evidence_url": {
          "description": "Link to verification attestation",
          "type": "string",
          "format": "uri"
        }
      },
      "additionalProperties": true
    },
    "traceability": {
      "description": "Optional chain-of-custody, retention, and evidence references.",
      "type": "object",
      "properties": {
        "batch_id": {
          "type": "string",
          "maxLength": 120
        },
        "serial_number": {
          "type": "string",
          "maxLength": 160
        },
        "lot_number": {
          "type": "string",
          "maxLength": 120
        },
        "epcis_event_refs": {
          "description": "ISO 19987 (EPCIS) event references for supply chain traceability",
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "event_type",
              "event_id"
            ],
            "properties": {
              "event_type": {
                "type": "string",
                "enum": [
                  "observation",
                  "aggregation",
                  "transaction",
                  "transformation"
                ]
              },
              "event_id": {
                "type": "string"
              },
              "event_url": {
                "type": "string",
                "format": "uri"
              },
              "hash_digest": {
                "type": "string"
              },
              "hash_method": {
                "type": "string",
                "enum": [
                  "SHA-256",
                  "SHA-384",
                  "SHA-512"
                ]
              }
            }
          }
        },
        "chain_of_custody_url": {
          "type": "string",
          "format": "uri"
        },
        "w3c_vc_credential_id": {
          "type": "string",
          "format": "uri"
        },
        "w3c_vc_issuer": {
          "type": "string",
          "format": "uri"
        }
      },
      "additionalProperties": true
    },
    "conformity_claims": {
      "description": "UNTP-aligned conformity claims for regulatory and standards compliance.",
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "claim_id"
        ],
        "properties": {
          "claim_id": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "reference_standard": {
            "type": "string"
          },
          "reference_regulation": {
            "type": "string"
          },
          "conformity_topic": {
            "type": "string",
            "enum": [
              "environment",
              "social",
              "governance",
              "safety",
              "quality"
            ]
          },
          "declared_value": {
            "type": "object",
            "properties": {
              "metric": {
                "type": "string"
              },
              "value": {
                "type": "number"
              },
              "unit": {
                "type": "string"
              },
              "accuracy": {
                "type": "number"
              }
            }
          },
          "conformance": {
            "type": "boolean"
          },
          "assessment_date": {
            "type": "string",
            "format": "date-time"
          },
          "conformity_evidence_url": {
            "type": "string",
            "format": "uri"
          }
        }
      }
    },
    "metadata": {
      "description": "Additional metadata",
      "type": "object",
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}