Furniture-ID

Open paspoortformaat · versie 1.1.0

Dit is de vaste vorm waarin een digitaal productpaspoort wordt opgeschreven: één JSON-bestand per meubel. Je kunt die bestanden zelf maken en op je eigen server zetten; Furniture-ID leest ze en toont de paspoortpagina. Het formaat is vrij te gebruiken, ook buiten Furniture-ID om.

01 · Gereedschap

Beide werken zonder account en zonder dat wij iets bewaren.

02 · Mappen op je server

Eén map met een index en per product een bestand. Je geeft in het portal alleen het webadres van de map op.

https://jouwdomein.nl/furniture-id/
├── index.json          lijst van al je producten
├── p/K4TV7.json        op publieke code (de code op de sticker)
└── sku/BUREAU-100.json hetzelfde bestand, op productcode

03 · Voorbeeldbestand

Eén volledig ingevuld paspoort: alle velden gevuld, drie talen, drie duurzaamheidswaarden met verschillende herkomst.

{
  "schema_version": "1.1.0",
  "product": {
    "sku": "BUREAU-100",
    "public_id": "K4TV7",
    "name_nl": "Zit-sta bureau 160 cm",
    "name_en": "Sit-stand desk 160 cm",
    "name_de": "Sitz-Steh-Tisch 160 cm",
    "tagline_nl": "Elektrisch verstelbaar, gemaakt om te repareren.",
    "tagline_en": "Electrically adjustable, built to be repaired.",
    "tagline_de": "Elektrisch verstellbar, reparierbar gebaut.",
    "description_nl": "Elektrisch verstelbaar bureau met massief blad, losneembaar onderstel en verkrijgbare onderdelen.",
    "description_en": "Electrically adjustable desk with a solid top, detachable frame and available spare parts.",
    "description_de": "Elektrisch verstellbarer Tisch mit massiver Platte, abnehmbarem Gestell und verfügbaren Ersatzteilen.",
    "warranty_years": 5,
    "warranty_type": "volledige garantie op motor en onderstel",
    "dimensions": {
      "width": {
        "value": 160,
        "unit": "cm"
      },
      "depth": {
        "value": 80,
        "unit": "cm"
      },
      "height": {
        "min": 65,
        "max": 130,
        "unit": "cm"
      },
      "weight": {
        "value": 42,
        "unit": "kg"
      }
    },
    "specifications": {
      "frame_material": "staal, gepoedercoat",
      "top_material": "eiken, 25 mm",
      "max_load": "80"
    },
    "images": [
      "https://example.org/furniture/bureau-100.jpg"
    ],
    "materials": [
      {
        "name": "Tafelblad",
        "type": "eiken FSC",
        "origin": "EU",
        "percentage": 55,
        "recyclable": true
      },
      {
        "name": "Onderstel",
        "type": "staal",
        "origin": "EU",
        "percentage": 40,
        "recyclable": true
      },
      {
        "name": "Motor",
        "type": "elektronica",
        "origin": "CN",
        "percentage": 5,
        "recyclable": false
      }
    ]
  },
  "metrics": [
    {
      "field_key": "co2_footprint",
      "value_numeric": 128.4,
      "unit": "kg CO₂e",
      "provenance": "third_party_verified",
      "certificate_number": "EPD-NL-2026-0184",
      "issuing_body": "Stichting MRPI",
      "sort_order": 10
    },
    {
      "field_key": "recycled_content_percentage",
      "value_numeric": 62,
      "unit": "%",
      "provenance": "documented",
      "source_url": "https://example.org/furniture/bureau-100-materiaalpaspoort.pdf",
      "sort_order": 20
    },
    {
      "field_key": "expected_lifespan",
      "value_numeric": 15,
      "unit": "jaar",
      "provenance": "self_declared",
      "sort_order": 30
    }
  ],
  "labels": [
    {
      "field_key": "co2_footprint",
      "lang": "nl",
      "display_name": "CO₂-voetafdruk",
      "unit": "kg CO₂e"
    },
    {
      "field_key": "co2_footprint",
      "lang": "en",
      "display_name": "Carbon footprint",
      "unit": "kg CO₂e"
    },
    {
      "field_key": "co2_footprint",
      "lang": "de",
      "display_name": "CO₂-Fußabdruck",
      "unit": "kg CO₂e"
    },
    {
      "field_key": "recycled_content_percentage",
      "lang": "nl",
      "display_name": "Gerecycled materiaal",
      "unit": "%"
    },
    {
      "field_key": "expected_lifespan",
      "lang": "nl",
      "display_name": "Verwachte levensduur",
      "unit": "jaar"
    },
    {
      "field_key": "frame_material",
      "lang": "nl",
      "display_name": "Onderstel"
    },
    {
      "field_key": "top_material",
      "lang": "nl",
      "display_name": "Blad"
    },
    {
      "field_key": "max_load",
      "lang": "nl",
      "display_name": "Maximale belasting",
      "unit": "kg"
    }
  ],
  "fault_codes": [
    {
      "title_nl": "Het bureau gaat niet meer omhoog",
      "title_en": "The desk no longer moves up",
      "title_de": "Der Tisch fährt nicht mehr hoch",
      "solution_nl": "Houd de omlaag-knop tien seconden ingedrukt om te resetten.",
      "solution_en": "Hold the down button for ten seconds to reset.",
      "solution_de": "Halten Sie die Ab-Taste zehn Sekunden gedrückt, um zurückzusetzen.",
      "code": "E01",
      "video_url": "https://www.youtube.com/watch?v=voorbeeld12",
      "requires_service": false,
      "is_common": true
    },
    {
      "title_nl": "Het blad staat scheef",
      "solution_nl": "Zet het bureau helemaal omlaag en reset het opnieuw.",
      "requires_service": true,
      "is_common": true
    }
  ],
  "downloads": [
    {
      "description": "Handleiding zit-sta bureau",
      "file_url": "https://example.org/furniture/bureau-100-handleiding.pdf",
      "file_type": "manual",
      "language": "nl",
      "display_order": 10
    },
    {
      "description": "Milieuverklaring (EPD)",
      "file_url": "https://example.org/furniture/bureau-100-epd.pdf",
      "file_type": "certificate",
      "language": "all",
      "display_order": 20
    }
  ],
  "tenant": {
    "name": "Voorbeeld Meubel",
    "slug": "voorbeeld-meubel",
    "primary_color": "#1B5E43"
  }
}

04 · JSON-schema van een paspoort

Draft 2020-12. Verplicht zijn de productcode en de Nederlandse naam; Engels en Duits zijn optioneel en vallen terug op Nederlands. Een duurzaamheidswaarde zonder herkomst wordt niet getoond.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://furniture-id.com/schema/passport-1.1.0.json",
  "title": "Furniture-ID passport",
  "type": "object",
  "required": [
    "schema_version",
    "product"
  ],
  "properties": {
    "schema_version": {
      "type": "string",
      "enum": [
        "1.0.0",
        "1.1.0"
      ]
    },
    "product": {
      "type": "object",
      "required": [
        "sku",
        "name_nl"
      ],
      "properties": {
        "sku": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "public_id": {
          "type": "string",
          "pattern": "^[A-Z0-9]{4,12}$",
          "description": "De code op de sticker. Leeg laten mag; dan geldt de sku."
        },
        "name_nl": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "name_en": {
          "type": "string",
          "maxLength": 200
        },
        "name_de": {
          "type": "string",
          "maxLength": 200
        },
        "tagline_nl": {
          "type": "string",
          "maxLength": 300
        },
        "tagline_en": {
          "type": "string",
          "maxLength": 300
        },
        "tagline_de": {
          "type": "string",
          "maxLength": 300
        },
        "description_nl": {
          "type": "string",
          "maxLength": 4000
        },
        "description_en": {
          "type": "string",
          "maxLength": 4000
        },
        "description_de": {
          "type": "string",
          "maxLength": 4000
        },
        "warranty_years": {
          "type": "number",
          "minimum": 0,
          "maximum": 100
        },
        "warranty_type": {
          "type": "string",
          "maxLength": 120
        },
        "dimensions": {
          "type": "object",
          "description": "Per maat een waarde met eenheid, of min en max voor een bereik.",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "value": {
                "type": "number"
              },
              "min": {
                "type": "number"
              },
              "max": {
                "type": "number"
              },
              "unit": {
                "type": "string"
              }
            }
          }
        },
        "specifications": {
          "type": "object",
          "description": "Sleutel is een veldsleutel uit labels; waarde is tekst.",
          "additionalProperties": {
            "type": "string"
          }
        },
        "images": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uri"
          }
        },
        "materials": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              },
              "type": {
                "type": "string"
              },
              "origin": {
                "type": "string"
              },
              "percentage": {
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "recyclable": {
                "type": "boolean"
              }
            }
          }
        }
      }
    },
    "metrics": {
      "type": "array",
      "description": "Duurzaamheidswaarden. Zonder label blijft een waarde verborgen.",
      "items": {
        "type": "object",
        "required": [
          "field_key",
          "provenance"
        ],
        "properties": {
          "field_key": {
            "type": "string",
            "minLength": 1
          },
          "value_numeric": {
            "type": [
              "number",
              "null"
            ]
          },
          "value_text": {
            "type": [
              "string",
              "null"
            ]
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "provenance": {
            "type": "string",
            "enum": [
              "self_declared",
              "documented",
              "third_party_verified"
            ]
          },
          "certificate_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "issuing_body": {
            "type": [
              "string",
              "null"
            ]
          },
          "source_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "sort_order": {
            "type": [
              "number",
              "null"
            ]
          }
        }
      }
    },
    "labels": {
      "type": "array",
      "description": "Nette veldnamen per taal. Een veld zonder label wordt niet getoond.",
      "items": {
        "type": "object",
        "required": [
          "field_key",
          "lang",
          "display_name"
        ],
        "properties": {
          "field_key": {
            "type": "string"
          },
          "lang": {
            "type": "string",
            "enum": [
              "nl",
              "en",
              "de"
            ]
          },
          "display_name": {
            "type": "string",
            "minLength": 1
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "sort_order": {
            "type": [
              "number",
              "null"
            ]
          }
        }
      }
    },
    "fault_codes": {
      "type": "array",
      "description": "Klachten in gewone taal. De code is optioneel.",
      "items": {
        "type": "object",
        "required": [
          "title_nl"
        ],
        "properties": {
          "title_nl": {
            "type": "string",
            "minLength": 1
          },
          "title_en": {
            "type": "string"
          },
          "title_de": {
            "type": "string"
          },
          "solution_nl": {
            "type": "string"
          },
          "solution_en": {
            "type": "string"
          },
          "solution_de": {
            "type": "string"
          },
          "code": {
            "type": [
              "string",
              "null"
            ]
          },
          "video_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Optioneel, sinds 1.1.0: één link naar YouTube of Vimeo. Laden gebeurt pas als de bezoeker erop tikt."
          },
          "requires_service": {
            "type": "boolean"
          },
          "is_common": {
            "type": "boolean"
          }
        }
      }
    },
    "downloads": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "description",
          "file_url"
        ],
        "properties": {
          "description": {
            "type": "string",
            "minLength": 1,
            "description": "De titel die je toont."
          },
          "file_url": {
            "type": "string",
            "format": "uri"
          },
          "file_type": {
            "type": "string",
            "enum": [
              "manual",
              "certificate",
              "datasheet"
            ]
          },
          "language": {
            "type": "string",
            "enum": [
              "nl",
              "en",
              "de",
              "all"
            ]
          },
          "display_order": {
            "type": "number"
          }
        }
      }
    },
    "tenant": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "slug": {
          "type": "string"
        },
        "logo_url": {
          "type": "string"
        },
        "primary_color": {
          "type": "string"
        }
      }
    }
  }
}

05 · JSON-schema van de index

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://furniture-id.com/schema/index-1.1.0.json",
  "title": "Furniture-ID index",
  "type": "object",
  "required": [
    "schema_version",
    "products"
  ],
  "properties": {
    "schema_version": {
      "type": "string",
      "enum": [
        "1.0.0",
        "1.1.0"
      ]
    },
    "generated_at": {
      "type": "string"
    },
    "products": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "sku",
          "file"
        ],
        "properties": {
          "sku": {
            "type": "string"
          },
          "public_id": {
            "type": "string"
          },
          "name_nl": {
            "type": "string"
          },
          "file": {
            "type": "string",
            "description": "Pad ten opzichte van dit indexbestand."
          }
        }
      }
    }
  }
}

06 · Changelog

  • 1.1.0 · 2026-08-10

    • Een klacht kan een video_url krijgen: één optionele YouTube- of Vimeo-link. Bestanden zonder dit veld blijven geldig.
  • 1.0.0 · 2026-08-10

    • Eerste vaste versie van het formaat.
    • Namen, taglines en omschrijvingen in nl, en en de; nl is verplicht, en en de zijn optioneel.
    • Duurzaamheidswaarden hebben een verplichte herkomst: self_declared, documented of third_party_verified.
    • Foutcodes heten klachten: de titel is verplicht, de code is optioneel.
    • Documenten dragen een titel; de bestandsnaam wordt nooit publiek getoond.

07 · Licentie

Creative Commons Zero v1.0 (CC0)

Het formaat is vrij te gebruiken, aan te passen en te verspreiden, ook commercieel, zonder naamsvermelding en zonder toestemming.