openapi: 3.1.0
info:
  title: Product API
  version: 1.0.0-Preview1
  description: |
    API for managing product information, specifications, and categories based on ETIM xChange V2.0.

    ## Features

    - Individual product operations via `/products`
    - Bulk data retrieval via `/products/bulk/*` endpoints with cursor-based pagination

    ## Data Model

    Based on ETIM xChange V2.0 Product schema (excluding TradeItem).
    Flattened structure with minimal nesting for efficient API consumption.
  contact:
    name: Product API Support
    email: support@product.2ba.nl
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
  - url: https://{host}{basePath}/v1
    description: Product Data OpenAPI - Product API v1
    variables:
      host:
        default: api.example.com
        description: 'Implementer-specific API hostname. Examples: rest.2ba.nl, selectprerelease.artikelbeheer.nl, acceptation-service-api-dsgo.etimix.com'
      basePath:
        default: ''
        description: Optional path prefix (e.g. /api). Leave empty if the API is served directly under the domain root.
security:
  - oauth2:
      - read:products
tags:
  - name: Products single
    description: Product management operations
    x-displayName: Single Product
  - name: Products bulk
    description: Bulk data retrieval operations for products with cursor-based pagination
    x-displayName: Bulk Products
paths:
  /products/{manufacturerIdGln}/{manufacturerProductNumber}:
    get:
      operationId: getProduct
      tags:
        - Products single
      summary: Get product
      description: |
        Retrieve the complete product information for a specific manufacturer product combination.

        This endpoint returns a single product identified by the composite key of
        `manufacturerIdGln` and `manufacturerProductNumber`. The product key is at the root level,
        with nested objects for each component:

        - **details**: GTINs, brand, dates, customs data, status, warranties
        - **descriptions**: Multilingual product descriptions (nested array)
        - **etimClassifications**: ETIM classifications with embedded features (nested array)
        - **lcaEnvironmental**: Life Cycle Assessment and Environmental Product Declaration (EPD) data
        - **attachments**: Product documents, images, videos, and other attachments (nested array)

        **Subresources**: Each component is also available as a dedicated subresource:
        - `/details` - Core product information
        - `/descriptions` - Multilingual descriptions with language filtering
        - `/etim-classifications` - ETIM classifications with features
        - `/lca-environmental` - Life Cycle Assessment and EPD data
        - `/attachments` - Product documents, images, and certificates

        **ETIM Classification Filtering**: Use the optional `etimReleaseVersion` query parameter
        to filter ETIM classifications to a specific release version (e.g., "9.0", "10.0").

        **Examples**: Example payloads show documented fields only. Clients must accept and ignore additional fields, including nested fields, when they are added in backward-compatible updates.

        **No pagination** - Returns exactly one product document or 404 if not found.

        **Composite Key**: The combination of manufacturer GLN and product number uniquely
        identifies a product in the system.
      parameters:
        - $ref: '#/components/parameters/manufacturer-id-gln'
        - $ref: '#/components/parameters/manufacturer-product-number'
        - $ref: '#/components/parameters/etim-release-version'
      responses:
        '200':
          description: Successfully retrieved the product
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductResponse'
              examples:
                fullProduct:
                  summary: Complete product with all components
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      details:
                        productGtins:
                          - '8718699673826'
                        brandName: Hue
                        productAnnouncementDate: '2024-01-15'
                        productValidityDate: '2024-03-01'
                        productObsolescenceDate: null
                        customsCommodityCode: '8539502090'
                        countryOfOrigin:
                          - NL
                        productStatus: ACTIVE
                        productType: PHYSICAL
                        customisableProduct: false
                        hasSerialNumber: true
                        warrantyConsumer: 24
                        warrantyBusiness: 36
                      descriptions:
                        - descriptionLanguage: en-GB
                          minimalProductDescription: LED Smart Bulb
                          uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Bulb
                      etimClassifications:
                        - etimClassCode: EC002745
                          etimClassVersion: 1
                          etimReleaseVersion: '9.0'
                          etimFeatures:
                            - etimFeatureCode: EF012345
                              etimValueNumeric: 10
                      attachments:
                        - attachmentType: ATX001
                          attachmentOrder: 1
                          attachmentDetails:
                            - attachmentUri: https://images.manufacturer.com/products/LED-12345-front.jpg
                              attachmentFilename: LED-12345-front.jpg
                minimalProduct:
                  summary: Minimal product with required fields only
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: LED-12345-A
                      details:
                        productValidityDate: '2025-01-01'
                      descriptions:
                        - descriptionLanguage: en-GB
                          minimalProductDescription: LED Lamp
                      etimClassifications: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Product not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No product found with manufacturer GLN '1234567890123' and product number '929002376910'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/{manufacturerIdGln}/{manufacturerProductNumber}/details:
    get:
      operationId: getProductDetails
      tags:
        - Products single
      summary: Get product details
      description: |
        Retrieve core product information for a specific manufacturer product combination.

        This endpoint returns comprehensive product information including
        identifiers (GTINs), brand, lifecycle dates, customs data, status, type, 
        warranties, and product groups for a single product identified by the composite key of
        `manufacturerIdGln` and `manufacturerProductNumber`.

        The product key is at the root level, with details nested inside.
        This structure aligns with other single-product subresource responses.

        **Examples**: Example payloads show documented fields only. Clients must accept and ignore additional fields, including nested fields, when they are added in backward-compatible updates.

        **Product descriptions**: For multilingual product descriptions, use the dedicated
        `/descriptions` subresource which supports language filtering.

        **No pagination** - Returns exactly one product's details or 404 if not found.
      parameters:
        - $ref: '#/components/parameters/manufacturer-id-gln'
        - $ref: '#/components/parameters/manufacturer-product-number'
      responses:
        '200':
          description: Successfully retrieved product details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductDetailsResponse'
              examples:
                fullDetails:
                  summary: Complete product details
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      details:
                        productGtins:
                          - '8718699673826'
                        brandName: Hue
                        productValidityDate: '2024-03-01'
                        countryOfOrigin:
                          - NL
                        productStatus: ACTIVE
                        productType: PHYSICAL
                        customisableProduct: false
                        hasSerialNumber: true
                        warrantyConsumer: 24
                        warrantyBusiness: 36
                        relatedManufacturerProductGroup:
                          - Smart Lighting
                          - LED Bulbs
                minimalDetails:
                  summary: Minimal product details
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: LED-12345-A
                      details:
                        productValidityDate: '2024-03-01'
                        productStatus: ACTIVE
                        productType: PHYSICAL
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Product not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No product found with manufacturer GLN '1234567890123' and product number '929002376910'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/{manufacturerIdGln}/{manufacturerProductNumber}/descriptions:
    get:
      operationId: getProductDescriptions
      tags:
        - Products single
      summary: Get product descriptions
      description: |
        Retrieve multilingual descriptions for a specific manufacturer product combination.

        This endpoint returns product descriptions including minimal, unique main, full descriptions,
        marketing text, specification text, application instructions, keywords, and product page URLs
        for each available language.

        **Language filtering**: Use the optional `language` query parameter to filter
        descriptions to specific language(s). If not specified, all available languages are returned.

        **Nested structure**: Unlike the bulk endpoint `/products/bulk/descriptions` which uses
        a flattened structure optimized for ETL, this single-product endpoint returns descriptions
        in their natural nested format for easier consumption.

        **No pagination** - Returns all descriptions for the specified product.
      parameters:
        - $ref: '#/components/parameters/manufacturer-id-gln'
        - $ref: '#/components/parameters/manufacturer-product-number'
        - $ref: '#/components/parameters/language'
      responses:
        '200':
          description: Successfully retrieved product descriptions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductDescriptionsResponse'
              examples:
                multipleLanguages:
                  summary: Product with multiple language descriptions
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      descriptions:
                        - descriptionLanguage: en-GB
                          minimalProductDescription: LED Smart Bulb E27 White & Color
                          uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Bulb, 806 lumens, Bluetooth
                          fullProductDescription: The Philips Hue White and Color Ambiance E27 LED Smart Bulb offers 16 million colors and 50,000 shades of white light.
                          productKeyword:
                            - smart lighting
                            - LED
                            - color
                          productPageUrl: https://www.philips.com/products/hue-white-color-e27
                        - descriptionLanguage: de-DE
                          minimalProductDescription: LED Smart-Lampe E27 Weiß & Farbe
                          uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart-Lampe, 806 Lumen, Bluetooth
                singleLanguage:
                  summary: Filtered to single language
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      descriptions:
                        - descriptionLanguage: en-GB
                          minimalProductDescription: LED Smart Bulb E27
                          uniqueMainProductDescription: Philips Hue LED Smart Bulb
                noDescriptions:
                  summary: Product without descriptions
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      descriptions: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Product not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No product found with manufacturer GLN '1234567890123' and product number '929002376910'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/{manufacturerIdGln}/{manufacturerProductNumber}/etim-classifications:
    get:
      operationId: getProductEtimClassifications
      tags:
        - Products single
      summary: Get product ETIM classifications
      description: |
        Retrieve all ETIM classification information for a specific manufacturer product combination.

        This endpoint returns all ETIM classifications (class codes, features, version information)
        for a single product identified by the composite key of `manufacturerIdGln` and
        `manufacturerProductNumber`.

        **ETIM Classification Filtering**: Use the optional `etimReleaseVersion` query parameter
        to filter classifications to a specific release version (e.g., "9.0", "10.0"). If omitted, the latest etimReleaseVersion is returned.

        **No pagination** - Returns all ETIM classifications for the specified product.
        A product can have multiple ETIM classifications across different releases.

        **Use case**: Ideal for retrieving detailed ETIM classification data for a single
        product without fetching all product details.
      parameters:
        - $ref: '#/components/parameters/manufacturer-id-gln'
        - $ref: '#/components/parameters/manufacturer-product-number'
        - $ref: '#/components/parameters/etim-release-version'
      responses:
        '200':
          description: Successfully retrieved product ETIM classifications
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductEtimClassificationsResponse'
              examples:
                multipleClassifications:
                  summary: Product with multiple ETIM classifications
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      etimClassifications:
                        - etimClassCode: EC002745
                          etimClassVersion: 1
                          etimReleaseVersion: '9.0'
                          etimFeatures:
                            - etimFeatureCode: EF000123
                              etimValueCode: EV000789
                            - etimFeatureCode: EF000456
                              etimValueNumeric: 230
                        - etimClassCode: EC001234
                          etimClassVersion: 2
                          etimReleaseVersion: '11.0'
                          etimFeatures:
                            - etimFeatureCode: EF000789
                              etimValueLogical: true
                noClassifications:
                  summary: Product without ETIM classifications
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: LED-12345-A
                      etimClassifications: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Product not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No product found with manufacturer GLN '1234567890123' and product number '929002376910'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/{manufacturerIdGln}/{manufacturerProductNumber}/lca-environmental:
    get:
      operationId: getProductLcaEnvironmental
      tags:
        - Products single
      summary: Get product LCA environmental
      description: |
        Retrieve Life Cycle Assessment (LCA) environmental data for a specific 
        manufacturer product combination.

        This endpoint returns Environmental Product Declaration (EPD) information including:
        - Declared unit (unit and quantity)
        - Reference service lifetime
        - Third-party verification status
        - EPD operator and registration details
        - Product Category Rules (PCR) references
        - Life cycle declarations for different stages (A1-A3, B1-B7, C1-C4, D)

        The product key is at the root level, with LCA environmental data nested inside.
        This structure aligns with other single-product subresource responses.

        **Examples**: Example payloads show documented fields only. Clients must accept and ignore additional fields, including nested fields, when they are added in backward-compatible updates.

        **No pagination** - Returns exactly one product's LCA data or 404 if not found.
        Returns `null` for `lcaEnvironmental` if the product exists but has no LCA data.
      parameters:
        - $ref: '#/components/parameters/manufacturer-id-gln'
        - $ref: '#/components/parameters/manufacturer-product-number'
      responses:
        '200':
          description: Successfully retrieved product LCA environmental data
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductLcaEnvironmentalResponse'
              examples:
                fullLcaData:
                  summary: Complete LCA environmental data with EPD
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      lcaEnvironmental:
                        declaredUnitUnit: PCE
                        declaredUnitQuantity: 1
                        lcaReferenceLifetime: 25
                        thirdPartyVerification: externally
                        epdValidityStartDate: '2024-01-01'
                        epdValidityExpiryDate: '2029-12-31'
                        epdOperatorName: The International EPD System
                        epdOperatorUri: https://www.environdec.com
                        operatorEpdId: S-P-12345
                        manufacturerEpdId: MFR-EPD-LED-2024-001
                        productCategoryRulesDescription: PCR 2019:14 Lighting equipment
                        productCategoryRulesUri: https://www.environdec.com/pcr-library/pcr-2019-14
                        functionalUnitDescription:
                          - language: en-GB
                            functionalUnitDescription: One LED bulb providing 806 lumens for 25,000 hours
                        lcaDeclaration:
                          - lifeCycleStage: A1-A3
                            lcaDeclarationIndicator: MDE
                            declaredUnitGwpTotal: 15.75
                            declaredUnitGwpFossil: 14.25
                            declaredUnitGwpBiogenic: 1.2
                            declaredUnitAp: 0.05
                            declaredUnitAdpf: 185.5
                          - lifeCycleStage: C1-C4
                            lcaDeclarationIndicator: AGG
                            declaredUnitGwpTotal: 2.5
                          - lifeCycleStage: D
                            lcaDeclarationIndicator: MDE
                            declaredUnitGwpTotal: -5.2
                noLcaData:
                  summary: Product without LCA data
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: LED-NO-EPD-001
                      lcaEnvironmental: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Product not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No product found with manufacturer GLN '1234567890123' and product number '929002376910'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/{manufacturerIdGln}/{manufacturerProductNumber}/attachments:
    get:
      operationId: getProductAttachments
      tags:
        - Products single
      summary: Get product attachments
      description: |
        Retrieve attachments for a specific manufacturer product combination.

        This endpoint returns product attachments including images, datasheets, technical drawings,
        certificates, manuals, and other document types. Each attachment contains type information
        and one or more file detail records (e.g., the same datasheet in different languages or formats).

        **Nested structure**: Unlike the bulk endpoint `/products/bulk/attachments` which uses
        a flattened structure optimized for ETL, this single-product endpoint returns attachments
        in their natural nested format for easier consumption.

        **No pagination** - Returns all attachments for the specified product.

        **ETIM xChange**: `ProductAttachments[]`
        **Path**: `Supplier[].Product[].ProductAttachments[]`
      parameters:
        - $ref: '#/components/parameters/manufacturer-id-gln'
        - $ref: '#/components/parameters/manufacturer-product-number'
      responses:
        '200':
          description: Successfully retrieved product attachments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductAttachmentsResponse'
              examples:
                multipleAttachments:
                  summary: Product with multiple attachments
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      attachments:
                        - attachmentType: ATX001
                          attachmentTypeSpecification: MDX002
                          attachmentOrder: 1
                          attachmentDetails:
                            - attachmentUri: https://images.manufacturer.com/products/LED-12345-front.jpg
                              attachmentFilename: LED-12345-front.jpg
                              attachmentLanguage:
                                - en-GB
                              attachmentDescription:
                                - language: en-GB
                                  attachmentDescription: Front view product image
                        - attachmentType: ATX014
                          attachmentOrder: 2
                          attachmentDetails:
                            - attachmentUri: https://cdn.manufacturer.com/products/datasheets/LED-12345-en.pdf
                              attachmentFilename: LED-12345-datasheet-en.pdf
                              attachmentLanguage:
                                - en-GB
                              attachmentIssueDate: '2024-06-15'
                            - attachmentUri: https://cdn.manufacturer.com/products/datasheets/LED-12345-de.pdf
                              attachmentFilename: LED-12345-datasheet-de.pdf
                              attachmentLanguage:
                                - de-DE
                              attachmentIssueDate: '2024-06-15'
                singleAttachment:
                  summary: Product with one attachment
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      attachments:
                        - attachmentType: ATX001
                          attachmentTypeSpecification: MDX002
                          attachmentOrder: 1
                          attachmentDetails:
                            - attachmentUri: https://images.manufacturer.com/products/LED-12345-front.jpg
                              attachmentFilename: LED-12345-front.jpg
                noAttachments:
                  summary: Product without attachments
                  value:
                    data:
                      manufacturerIdGln: '1234567890123'
                      manufacturerProductNumber: '929002376910'
                      attachments: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Product not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No product found with manufacturer GLN '1234567890123' and product number '929002376910'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/bulk/details:
    get:
      operationId: getBulkProductDetails
      tags:
        - Products bulk
      summary: List product details
      description: |
        Retrieve product detail information in bulk with cursor-based pagination.
        Returns product status, type, descriptions, warranties, and product groups.

        Use this endpoint for product status synchronization.
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/manufacturer-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
      responses:
        '200':
          description: Successfully retrieved product details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkProductDetailsResponse'
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/bulk/descriptions:
    get:
      operationId: getBulkProductDescriptions
      tags:
        - Products bulk
      summary: List product descriptions
      description: |
        Retrieve product descriptions in bulk with cursor-based pagination.
        Returns a flattened structure where each row represents a single language description
        with the product identifier (manufacturerIdGln + manufacturerProductNumber).
            A product with descriptions in 3 languages will result in 3 rows.
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/manufacturer-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
        - $ref: '#/components/parameters/language'
      responses:
        '200':
          description: Successfully retrieved product descriptions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkProductDescriptionsResponse'
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/bulk/etim-classifications:
    get:
      operationId: getBulkProductEtimClassificationFeatures
      tags:
        - Products bulk
      summary: List product ETIM classifications
      description: |
        Retrieve product ETIM classification feature data in a flattened format with cursor-based pagination.

        **Flattened Structure**: Each row represents a single feature value within a product's ETIM classification.
        This structure is optimized for:
        - Predictable payload sizes (each row has consistent structure)
        - Efficient cursor-based pagination by feature
        - ETL/data warehouse ingestion
        - Streaming data processing

        **Payload Optimization**: Optional properties with null values are omitted from the response
        to minimize payload size. Clients should treat missing properties as null/not applicable.

        **Data Reconstruction**: To reconstruct the hierarchical structure:
        1. Group rows by `manufacturerIdGln` + `manufacturerProductNumber` for products
        2. Within each product, group by `etimClassCode` + `etimReleaseVersion` for classifications
        3. Features are individual rows within each classification group

        **Classification-Only Rows**: Products with classifications but no features are represented
        with `etimFeatureCode` omitted to ensure all classifications are included in the response.

        **ETIM Release Filtering**: Use the optional `etimReleaseVersion` query parameter
        to filter classifications to a specific ETIM release version (e.g., "9.0", "10.0"). If omitted, latest etimReleaseVersion is returned.

        **Use case**: Ideal for bulk synchronization of ETIM classification data to external systems,
        data warehouses, or analytics platforms.
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/manufacturer-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
        - $ref: '#/components/parameters/etim-release-version'
      responses:
        '200':
          description: Successfully retrieved product ETIM classification features
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkProductEtimClassificationFeaturesResponse'
              examples:
                multipleProducts:
                  summary: Multiple products with various feature types
                  value:
                    data:
                      - manufacturerIdGln: '1234567890123'
                        manufacturerProductNumber: '929002376910'
                        etimClassCode: EC002745
                        etimClassVersion: 1
                        etimReleaseVersion: '9.0'
                        etimFeatureCode: EF000123
                        etimValueCode: EV000789
                      - manufacturerIdGln: '1234567890123'
                        manufacturerProductNumber: '929002376910'
                        etimClassCode: EC002745
                        etimClassVersion: 1
                        etimReleaseVersion: '9.0'
                        etimFeatureCode: EF000456
                        etimValueNumeric: 230
                      - manufacturerIdGln: '1234567890123'
                        manufacturerProductNumber: '929002376910'
                        etimClassCode: EC002745
                        etimClassVersion: 1
                        etimReleaseVersion: '9.0'
                        etimFeatureCode: EF000789
                        etimValueLogical: true
                      - manufacturerIdGln: '9876543210987'
                        manufacturerProductNumber: LED-12345-A
                        etimClassCode: EC001234
                        etimClassVersion: 2
                        etimReleaseVersion: '9.0'
                    meta:
                      cursor: eyJtYW51ZmFjdHVyZXJJZEdsbkgiOiI5ODc2NTQzMjEwOTg3IiwibWFudWZhY3R1cmVyUHJvZHVjdE51bWJlciI6IkxFRC0xMjM0NS1BIn0=
                      hasNext: true
                      hasPrev: false
                      limit: 1000
                      estimatedTotal: 245830
                emptyResult:
                  summary: No classification features found
                  value:
                    data: []
                    meta:
                      cursor: null
                      hasNext: false
                      hasPrev: false
                      limit: 1000
                      estimatedTotal: 0
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/bulk/lca-environmental:
    get:
      operationId: getBulkProductLcaDeclarations
      tags:
        - Products bulk
      summary: List product LCA declarations
      description: |
        Retrieve product LCA (Life Cycle Assessment) declaration data in a flattened format 
        with cursor-based pagination.

        **Flattened Structure**: Each row represents a single life cycle stage declaration within 
        a product's LCA environmental data. This structure is optimized for:
        - Predictable payload sizes (each row has consistent structure)
        - Efficient cursor-based pagination by declaration
        - ETL/data warehouse ingestion
        - Streaming data processing
        - Filtering by life cycle stage

        **Payload Optimization**: Optional properties with null values are omitted from the response
        to minimize payload size. Clients should treat missing properties as null/not applicable.

        **Parent Context**: Each row includes key parent fields from LcaEnvironmental
        (`declaredUnitUnit`, `declaredUnitQuantity`, `lcaReferenceLifetime`, `thirdPartyVerification`,
        `epdValidityStartDate`, `epdValidityExpiryDate`, `epdOperatorName`, `epdOperatorUri`,
        `operatorEpdId`, `manufacturerEpdId`, `productCategoryRulesDescription`, `productCategoryRulesUri`,
        `productSpecificRulesDescription`, `productSpecificRulesUri`)
        to provide necessary context for interpreting the environmental indicators.

        **Data Reconstruction**: To reconstruct the hierarchical structure:
        1. Group rows by `manufacturerIdGln` + `manufacturerProductNumber` for products
        2. All rows for a product share the same parent context (declared unit, lifetime, verification, EPD metadata)
        3. Each row represents a different life cycle stage (A1-A3, B1-B7, C1-C4, D)

        **Life Cycle Stage Filtering**: Use the optional `lifeCycleStage` query parameter
        to filter declarations to a specific EN 15804 life cycle stage.

        **Use case**: Ideal for bulk synchronization of environmental product declaration data 
        to external systems, sustainability reporting, or analytics platforms.
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/manufacturer-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
        - $ref: '#/components/parameters/life-cycle-stage'
      responses:
        '200':
          description: Successfully retrieved product LCA declarations
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkProductLcaDeclarationsResponse'
              examples:
                multipleProducts:
                  summary: Multiple products with various life cycle stages
                  value:
                    data:
                      - manufacturerIdGln: '1234567890123'
                        manufacturerProductNumber: '929002376910'
                        declaredUnitUnit: PCE
                        declaredUnitQuantity: 1
                        lcaReferenceLifetime: 25
                        thirdPartyVerification: externally
                        epdValidityStartDate: '2024-01-01'
                        epdValidityExpiryDate: '2029-12-31'
                        epdOperatorName: The International EPD System
                        operatorEpdId: S-P-12345
                        lifeCycleStage: A1-A3
                        lcaDeclarationIndicator: MDE
                        declaredUnitGwpTotal: 15.75
                        declaredUnitGwpFossil: 14.25
                        declaredUnitGwpBiogenic: 1.2
                        declaredUnitAp: 0.05
                        declaredUnitAdpf: 185.5
                      - manufacturerIdGln: '1234567890123'
                        manufacturerProductNumber: '929002376910'
                        declaredUnitUnit: PCE
                        declaredUnitQuantity: 1
                        lcaReferenceLifetime: 25
                        thirdPartyVerification: externally
                        epdValidityStartDate: '2024-01-01'
                        epdValidityExpiryDate: '2029-12-31'
                        epdOperatorName: The International EPD System
                        epdOperatorUri: https://www.environdec.com
                        operatorEpdId: S-P-12345
                        manufacturerEpdId: MFR-EPD-LED-2024-001
                        productCategoryRulesDescription: PCR 2019:14 Lighting equipment
                        lifeCycleStage: C1-C4
                        lcaDeclarationIndicator: AGG
                        declaredUnitGwpTotal: 2.5
                        declaredUnitAdpf: 35
                      - manufacturerIdGln: '1234567890123'
                        manufacturerProductNumber: '929002376910'
                        declaredUnitUnit: PCE
                        declaredUnitQuantity: 1
                        lcaReferenceLifetime: 25
                        thirdPartyVerification: externally
                        epdValidityStartDate: '2024-01-01'
                        epdValidityExpiryDate: '2029-12-31'
                        epdOperatorName: The International EPD System
                        epdOperatorUri: https://www.environdec.com
                        operatorEpdId: S-P-12345
                        manufacturerEpdId: MFR-EPD-LED-2024-001
                        productCategoryRulesDescription: PCR 2019:14 Lighting equipment
                        lifeCycleStage: D
                        lcaDeclarationIndicator: MDE
                        declaredUnitGwpTotal: -5.2
                        declaredUnitAdpf: -45
                      - manufacturerIdGln: '9876543210987'
                        manufacturerProductNumber: CABLE-CU-100M
                        declaredUnitUnit: KGM
                        declaredUnitQuantity: 1
                        lcaReferenceLifetime: 50
                        thirdPartyVerification: internally
                        epdValidityStartDate: '2023-06-15'
                        lifeCycleStage: A1-A3
                        lcaDeclarationIndicator: MND
                        declaredUnitGwpTotal: 8.5
                        declaredUnitAdpe: 0.0015
                        declaredUnitAdpf: 120
                    meta:
                      cursor: eyJtYW51ZmFjdHVyZXJJZEdsbkgiOiI5ODc2NTQzMjEwOTg3IiwibWFudWZhY3R1cmVyUHJvZHVjdE51bWJlciI6IkNBQkxFLUNVLTEwME0iLCJsaWZlQ3ljbGVTdGFnZSI6IkExLUEzIn0=
                      hasNext: true
                      hasPrev: false
                      limit: 1000
                      estimatedTotal: 12540
                filteredByStage:
                  summary: Filtered to production stage only
                  value:
                    data:
                      - manufacturerIdGln: '1234567890123'
                        manufacturerProductNumber: '929002376910'
                        declaredUnitUnit: PCE
                        declaredUnitQuantity: 1
                        lcaReferenceLifetime: 25
                        thirdPartyVerification: externally
                        epdValidityStartDate: '2024-01-01'
                        epdValidityExpiryDate: '2029-12-31'
                        epdOperatorName: The International EPD System
                        operatorEpdId: S-P-12345
                        lifeCycleStage: A1-A3
                        lcaDeclarationIndicator: MDE
                        declaredUnitGwpTotal: 15.75
                        declaredUnitGwpFossil: 14.25
                        declaredUnitAdpf: 185.5
                    meta:
                      cursor: null
                      hasNext: false
                      hasPrev: false
                      limit: 1000
                      estimatedTotal: 4180
                emptyResult:
                  summary: No LCA declarations found
                  value:
                    data: []
                    meta:
                      cursor: null
                      hasNext: false
                      hasPrev: false
                      limit: 1000
                      estimatedTotal: 0
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /products/bulk/attachments:
    get:
      operationId: getBulkProductAttachments
      tags:
        - Products bulk
      summary: List product attachments
      description: |
        Retrieve product attachments in bulk with cursor-based pagination.
        Returns a flattened structure where each row represents a single attachment file
        with the product identifier (`manufacturerIdGln` + `manufacturerProductNumber`)
        and attachment-level fields (`attachmentType`, `attachmentTypeSpecification`, `attachmentOrder`)
        denormalized into each row.

        A product with 2 attachment types, each with 2 files (e.g., different languages),
        will result in 4 rows.

        This flattened structure is optimized for:
        - Predictable payload sizes per row
        - Efficient cursor-based pagination
        - ETL/data warehouse ingestion
        - Streaming data processing
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/manufacturer-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
      responses:
        '200':
          description: Successfully retrieved product attachments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkProductAttachmentsResponse'
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
components:
  schemas:
    ProductDetails:
      type: object
      description: |
        Core product information combining identification and details without the composite key fields.
        Contains identifiers, lifecycle dates, and operational details.
        Used in single-product responses where the key (manufacturerIdGln + manufacturerProductNumber) 
        is provided at the root level.

        For bulk retrieval with embedded keys, use `ProductDetailsSummary`.

        For product descriptions (text content), use the dedicated `/descriptions` subresource
        which supports language filtering.
      required:
        - productValidityDate
      properties:
        productGtins:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          description: |
            Global Trade Item Numbers (GTINs) for the product.
            Can include GTIN-8, GTIN-12, GTIN-13, or GTIN-14.

            **ETIM xChange**: `ProductGtin`  
            **Path**: `Supplier[].Product[].ProductIdentification.ProductGtin[]`
        unbrandedProduct:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether this is an unbranded/white-label product.

            **ETIM xChange**: `UnbrandedProduct`  
            **Path**: `Supplier[].Product[].ProductIdentification.UnbrandedProduct`
        brandName:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 50
          description: |
            Brand name of the product.

            **ETIM xChange**: `BrandName`  
            **Path**: `Supplier[].Product[].ProductIdentification.BrandName`
        productAnnouncementDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the product was announced. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `ProductAnnouncementDate`  
            **Path**: `Supplier[].Product[].ProductIdentification.ProductAnnouncementDate`
        productValidityDate:
          type: string
          format: date
          description: |
            Date when the product becomes valid/available. ISO 8601 date format (YYYY-MM-DD).
            Defaults to CatalogueValidityStart if not overridden at the product level.

            **ETIM xChange**: `ProductValidityDate`  
            **Path**: `Supplier[].Product[].ProductIdentification.ProductValidityDate`  
            **Default from**: `CatalogueValidityStart`
        productObsolescenceDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the product becomes obsolete. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `ProductObsolescenceDate`  
            **Path**: `Supplier[].Product[].ProductIdentification.ProductObsolescenceDate`
        customsCommodityCode:
          type:
            - string
            - 'null'
          minLength: 6
          maxLength: 16
          description: |
            Customs/HS commodity code for the product.

            **ETIM xChange**: `CustomsCommodityCode`  
            **Path**: `Supplier[].Product[].ProductIdentification.CustomsCommodityCode`
        factorCustomsCommodityCode:
          type:
            - number
            - 'null'
          format: decimal
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          description: |
            Factor for customs commodity code calculations. Supports up to 4 decimal places.
            Converted from ETIM xChange string pattern to number type.

            **ETIM xChange**: `FactorCustomsCommodityCode` (string with pattern)  
            **Path**: `Supplier[].Product[].ProductIdentification.FactorCustomsCommodityCode`
          examples:
            - 1
            - 0.75
            - null
        countryOfOrigin:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            type: string
            pattern: ^[A-Z]{2}$
          description: |
            ISO 3166-1 alpha-2 country codes for country of origin.

            **ETIM xChange**: `CountryOfOrigin`  
            **Path**: `Supplier[].Product[].ProductIdentification.CountryOfOrigin[]`
        productStatus:
          $ref: '#/components/schemas/ProductStatus'
        productType:
          $ref: '#/components/schemas/ProductType'
        customisableProduct:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether the product can be customised.

            **ETIM xChange**: `CustomisableProduct`  
            **Path**: `Supplier[].Product[].ProductDetails.CustomisableProduct`
        hasSerialNumber:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether the product has a serial number.

            **ETIM xChange**: `HasSerialNumber`  
            **Path**: `Supplier[].Product[].ProductDetails.HasSerialNumber`
        warrantyConsumer:
          type:
            - integer
            - 'null'
          minimum: 0
          exclusiveMaximum: 1000
          description: |
            Consumer warranty period in months.

            **ETIM xChange**: `WarrantyConsumer`  
            **Path**: `Supplier[].Product[].ProductDetails.WarrantyConsumer`
        warrantyBusiness:
          type:
            - integer
            - 'null'
          minimum: 0
          exclusiveMaximum: 1000
          description: |
            Business/B2B warranty period in months.

            **ETIM xChange**: `WarrantyBusiness`  
            **Path**: `Supplier[].Product[].ProductDetails.WarrantyBusiness`
        relatedManufacturerProductGroup:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            type: string
            minLength: 1
            maxLength: 50
          description: |
            Related manufacturer product groups for categorization.

            **ETIM xChange**: `RelatedManufacturerProductGroup`  
            **Path**: `Supplier[].Product[].ProductDetails.RelatedManufacturerProductGroup[]`
      examples:
        - productGtins:
            - '8718699673826'
          brandName: Hue
          productAnnouncementDate: '2024-01-15'
          productValidityDate: '2024-03-01'
          productObsolescenceDate: null
          customsCommodityCode: '8539502090'
          countryOfOrigin:
            - NL
          productStatus: ACTIVE
          productType: PHYSICAL
          customisableProduct: false
          hasSerialNumber: true
          warrantyConsumer: 24
          warrantyBusiness: 12
          relatedManufacturerProductGroup:
            - Smart Lighting
            - LED Bulbs
    ProductDetailsSummary:
      type: object
      description: |
        Core product information for bulk retrieval combining identification and details.
        Contains all key fields plus manufacturer info, identifiers, lifecycle dates, and operational details.

        For product descriptions (text content), use the dedicated `/products/bulk/descriptions` endpoint
        which supports language filtering.
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
        - productValidityDate
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) identifying the manufacturer.
            13-digit GS1 identifier.
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's unique product identifier.

            **ETIM xChange**: `ManufacturerProductNumber`  
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerProductNumber`
          examples:
            - '929002376910'
            - ABC-12345-XYZ
        productGtins:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          description: |
            Global Trade Item Numbers (GTINs) for the product.
            Can include GTIN-8, GTIN-12, GTIN-13, or GTIN-14.
        unbrandedProduct:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether this is an unbranded/white-label product.
        brandName:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 50
          description: |
            Brand name of the product.
        productAnnouncementDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the product was announced. ISO 8601 date format (YYYY-MM-DD).
        productValidityDate:
          type: string
          format: date
          description: |
            Date when the product becomes valid/available. ISO 8601 date format (YYYY-MM-DD).
            Defaults to CatalogueValidityStart if not overridden at the product level.

            **ETIM xChange**: `ProductValidityDate`  
            **Path**: `Supplier[].Product[].ProductIdentification.ProductValidityDate`  
            **Default from**: `CatalogueValidityStart`
        productObsolescenceDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the product becomes obsolete. ISO 8601 date format (YYYY-MM-DD).
        customsCommodityCode:
          type:
            - string
            - 'null'
          minLength: 6
          maxLength: 16
          description: |
            Customs/HS commodity code for the product.
        factorCustomsCommodityCode:
          type:
            - number
            - 'null'
          format: decimal
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          description: |
            Factor for customs commodity code calculations. Supports up to 4 decimal places.
            Converted from ETIM xChange string pattern to number type.

            **ETIM xChange**: `FactorCustomsCommodityCode` (string with pattern)  
            **Path**: `Supplier[].Product[].ProductIdentification.FactorCustomsCommodityCode`
          examples:
            - 1
            - 0.75
            - null
        countryOfOrigin:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            type: string
            pattern: ^[A-Z]{2}$
          description: |
            ISO 3166-1 alpha-2 country codes for country of origin.
        productStatus:
          $ref: '#/components/schemas/ProductStatus'
        productType:
          $ref: '#/components/schemas/ProductType'
        customisableProduct:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether the product can be customised.

            **ETIM xChange**: `CustomisableProduct`  
            **Path**: `Supplier[].Product[].ProductDetails.CustomisableProduct`
        hasSerialNumber:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether the product has a serial number.

            **ETIM xChange**: `HasSerialNumber`  
            **Path**: `Supplier[].Product[].ProductDetails.HasSerialNumber`
        warrantyConsumer:
          type:
            - integer
            - 'null'
          minimum: 0
          exclusiveMaximum: 1000
          description: |
            Consumer warranty period in months.

            **ETIM xChange**: `WarrantyConsumer`  
            **Path**: `Supplier[].Product[].ProductDetails.WarrantyConsumer`
        warrantyBusiness:
          type:
            - integer
            - 'null'
          minimum: 0
          exclusiveMaximum: 1000
          description: |
            Business/B2B warranty period in months.

            **ETIM xChange**: `WarrantyBusiness`  
            **Path**: `Supplier[].Product[].ProductDetails.WarrantyBusiness`
        relatedManufacturerProductGroup:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            type: string
            minLength: 1
            maxLength: 50
          description: |
            Related manufacturer product groups for categorization.

            **ETIM xChange**: `RelatedManufacturerProductGroup`  
            **Path**: `Supplier[].Product[].ProductDetails.RelatedManufacturerProductGroup[]`
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          productGtins:
            - '8718699673826'
          brandName: Hue
          productValidityDate: '2024-03-01'
          countryOfOrigin:
            - NL
          productStatus: ACTIVE
          productType: PHYSICAL
          customisableProduct: false
          hasSerialNumber: true
          warrantyConsumer: 24
          warrantyBusiness: 12
          relatedManufacturerProductGroup:
            - Smart Lighting
            - LED Bulbs
    ProductDescriptionsSummary:
      type: object
      description: |
        Flattened product description for bulk retrieval.
        Each row represents a single language description with the product identifier.

        This flattened structure is optimized for:
        - Predictable payload sizes per row
        - Efficient cursor-based pagination
        - ETL/data warehouse ingestion
        - Streaming data processing
        - Language filtering at row level

        **Payload Optimization**: Optional properties with null values may be omitted from the response
        to minimize payload size. Clients should treat missing properties as null/not applicable.

        **ETIM xChange**: `ProductDetails.ProductDescriptions`  
        **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[]`
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
        - descriptionLanguage
        - minimalProductDescription
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) identifying the manufacturer.
            13-digit GS1 identifier. Part of the composite product identifier.
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's unique product identifier.
            Part of the composite product identifier.

            **ETIM xChange**: `ManufacturerProductNumber`  
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerProductNumber`
          examples:
            - '929002376910'
            - ABC-12345-XYZ
        descriptionLanguage:
          description: |
            Language code for the description in ISO 639-1 and ISO 3166-1 format (e.g., "en-GB", "de-DE").
            Sourced from ETIM xChange `Language` at catalog level, denormalized into each description record.

            **ETIM xChange**: `DescriptionLanguage`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].DescriptionLanguage`
          $ref: '#/components/schemas/LanguageCode'
          examples:
            - en-GB
            - de-DE
            - nl-NL
        minimalProductDescription:
          type: string
          minLength: 1
          maxLength: 80
          description: |
            Short product description (maximum 80 characters). Minimal required description for product identification.

            **ETIM xChange**: `MinimalProductDescription`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].MinimalProductDescription`
          examples:
            - LED Smart Bulb E27 White
            - Industrial Motor 3-Phase
        uniqueMainProductDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 255
          description: |
            Unique main product description (maximum 255 characters). 
            A concise but comprehensive description that uniquely identifies the product.

            **ETIM xChange**: `UniqueMainProductDescription`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].UniqueMainProductDescription`
          examples:
            - Philips Hue White and Color Ambiance E27 LED Smart Bulb, 806 lumens, Bluetooth compatible
        fullProductDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 10000
          description: |
            Complete detailed product description (maximum 10,000 characters).
            Comprehensive technical and functional description of the product.

            **ETIM xChange**: `FullProductDescription`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].FullProductDescription`
          examples:
            - The Philips Hue White and Color Ambiance E27 LED Smart Bulb offers 16 million colors...
        productMarketingText:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 10000
          description: |
            Marketing-focused product text (maximum 10,000 characters).
            Promotional content highlighting product benefits and features for customers.

            **ETIM xChange**: `ProductMarketingText`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductMarketingText`
          examples:
            - Transform your home with smart lighting that adapts to your lifestyle...
        productSpecificationText:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 10000
          description: |
            Technical specification text (maximum 10,000 characters).
            Detailed technical specifications and characteristics of the product.

            **ETIM xChange**: `ProductSpecificationText`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductSpecificationText`
          examples:
            - 'Technical Specifications: Voltage: 220-240V, Power: 9W, Luminous flux: 806 lm...'
        productApplicationInstructions:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 10000
          description: |
            Product application and usage instructions (maximum 10,000 characters).
            Guidelines on how to use and apply the product correctly.

            **ETIM xChange**: `ProductApplicationInstructions`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductApplicationInstructions`
          examples:
            - 'Installation: Screw the bulb into an E27 socket. Connect to the Philips Hue Bridge...'
        productKeyword:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            type: string
            minLength: 1
            maxLength: 50
          description: |
            Keywords for product search and categorization (maximum 50 characters each).
            Array of search terms and keywords associated with the product.

            **ETIM xChange**: `ProductKeyword`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductKeyword[]`
          examples:
            - - smart lighting
              - LED
              - color
              - Bluetooth
              - energy efficient
        productPageUrl:
          type:
            - string
            - 'null'
          format: uri
          description: |
            URL to the manufacturer's product page.
            Direct link to detailed product information on the manufacturer's website.

            **ETIM xChange**: `ProductPageUrl`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductPageUrl`
          examples:
            - https://www.philips.com/products/hue-white-color-e27
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          descriptionLanguage: en-GB
          minimalProductDescription: LED Smart Bulb E27
          uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Bulb
          fullProductDescription: The Philips Hue White and Color Ambiance E27 LED Smart Bulb offers 16 million colors and 50,000 shades of white light.
          productKeyword:
            - smart lighting
            - LED
            - color
            - Bluetooth
          productPageUrl: https://www.philips.com/products/hue-white-color-e27
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          descriptionLanguage: de-DE
          minimalProductDescription: LED Smart Lampe E27
          uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Lampe
          fullProductDescription: Die Philips Hue White and Color Ambiance E27 LED Smart Lampe bietet 16 Millionen Farben und 50.000 Weißtöne.
          productKeyword:
            - intelligente Beleuchtung
            - LED
            - Farbe
            - Bluetooth
          productPageUrl: https://www.philips.de/products/hue-white-color-e27
        - manufacturerIdGln: '9876543210987'
          manufacturerProductNumber: LED-12345-A
          descriptionLanguage: en-GB
          minimalProductDescription: LED Downlight 10W 4000K
    ProductDescription:
      type: object
      required:
        - descriptionLanguage
        - minimalProductDescription
      properties:
        descriptionLanguage:
          description: |
            Language code for the description in ISO 639-1 and ISO 3166-1 format (e.g., "en-GB", "de-DE").
            Sourced from ETIM xChange `Language` at catalog level, denormalized into each description record.

            **ETIM xChange**: `DescriptionLanguage`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].DescriptionLanguage`
          $ref: '#/components/schemas/LanguageCode'
          examples:
            - en-GB
            - de-DE
            - nl-NL
        minimalProductDescription:
          type: string
          minLength: 1
          maxLength: 80
          description: |
            Short product description (maximum 80 characters). Minimal required description for product identification.

            **ETIM xChange**: `MinimalProductDescription`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].MinimalProductDescription`
          examples:
            - LED Smart Bulb E27 White
            - Industrial Motor 3-Phase
        uniqueMainProductDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 255
          description: |
            Unique main product description (maximum 255 characters). 
            A concise but comprehensive description that uniquely identifies the product.

            **ETIM xChange**: `UniqueMainProductDescription`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].UniqueMainProductDescription`
          examples:
            - Philips Hue White and Color Ambiance E27 LED Smart Bulb, 806 lumens, Bluetooth compatible
            - null
        fullProductDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 10000
          description: |
            Complete detailed product description (maximum 10,000 characters).
            Comprehensive technical and functional description of the product.

            **ETIM xChange**: `FullProductDescription`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].FullProductDescription`
          examples:
            - The Philips Hue White and Color Ambiance E27 LED Smart Bulb offers 16 million colors and 50,000 shades of white light...
            - null
        productMarketingText:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 10000
          description: |
            Marketing-focused product text (maximum 10,000 characters).
            Promotional content highlighting product benefits and features for customers.

            **ETIM xChange**: `ProductMarketingText`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductMarketingText`
          examples:
            - Transform your home with smart lighting that adapts to your lifestyle...
            - null
        productSpecificationText:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 10000
          description: |
            Technical specification text (maximum 10,000 characters).
            Detailed technical specifications and characteristics of the product.

            **ETIM xChange**: `ProductSpecificationText`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductSpecificationText`
          examples:
            - 'Technical Specifications: Voltage: 220-240V, Power: 9W, Luminous flux: 806 lm...'
            - null
        productApplicationInstructions:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 10000
          description: |
            Product application and usage instructions (maximum 10,000 characters).
            Guidelines on how to use and apply the product correctly.

            **ETIM xChange**: `ProductApplicationInstructions`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductApplicationInstructions`
          examples:
            - 'Installation: Screw the bulb into an E27 socket. Connect to the Philips Hue Bridge...'
            - null
        productKeyword:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            type: string
            minLength: 1
            maxLength: 50
          description: |
            Keywords for product search and categorization (maximum 50 characters each).
            Array of search terms and keywords associated with the product.

            **ETIM xChange**: `ProductKeyword`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductKeyword[]`
          examples:
            - - smart lighting
              - LED
              - color
              - Bluetooth
              - energy efficient
            - null
        productPageUrl:
          type:
            - string
            - 'null'
          format: uri
          description: |
            URL to the manufacturer's product page.
            Direct link to detailed product information on the manufacturer's website.

            **ETIM xChange**: `ProductPageUrl`  
            **Path**: `Supplier[].Product[].ProductDetails.ProductDescriptions[].ProductPageUrl`
          examples:
            - https://www.philips.com/products/hue-white-color-e27
            - null
      examples:
        - descriptionLanguage: en-GB
          minimalProductDescription: LED Smart Bulb E27 White & Color
          uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Bulb, 806 lumens, Bluetooth
          fullProductDescription: The Philips Hue White and Color Ambiance E27 LED Smart Bulb offers 16 million colors and 50,000 shades of white light. Control it with your smartphone or voice using Alexa, Google Assistant, or Apple HomeKit.
          productKeyword:
            - smart lighting
            - LED
            - color
            - Bluetooth
          productPageUrl: https://www.philips.com/products/hue-white-color-e27
    ProductAttachment:
      type: object
      required:
        - attachmentType
        - attachmentDetails
      properties:
        attachmentType:
          $ref: '#/components/schemas/AttachmentType'
          description: |
            ETIM standardized type code for the attachment.

            **ETIM xChange**: `AttachmentType`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentType`
        attachmentTypeSpecification:
          $ref: '#/components/schemas/AttachmentTypeSpecification'
          description: |
            Additional specification code providing more detail about the attachment type.

            **ETIM xChange**: `AttachmentTypeSpecification`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentTypeSpecification`
        attachmentOrder:
          type:
            - integer
            - 'null'
          minimum: 1
          description: |
            Display order/sequence number for this attachment when multiple attachments are present.
            Lower numbers indicate higher priority or preferred display order.

            **ETIM xChange**: `AttachmentOrder`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentOrder`
          examples:
            - 1
            - 2
            - null
        attachmentDetails:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/AttachmentDetails'
          description: |
            Array of attachment file details. Multiple files can be provided for the same attachment type
            (e.g., same datasheet in different languages or formats).

            **ETIM xChange**: `AttachmentDetails`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[]`
      examples:
        - attachmentType: ATX001
          attachmentTypeSpecification: MDX002
          attachmentOrder: 1
          attachmentDetails:
            - attachmentUri: https://images.manufacturer.com/products/LED-12345-front.jpg
              attachmentFilename: LED-12345-front.jpg
              attachmentLanguage:
                - en-GB
              attachmentDescription:
                - language: en-GB
                  attachmentDescription: Front view product image
        - attachmentType: ATX014
          attachmentOrder: 2
          attachmentDetails:
            - attachmentUri: https://cdn.manufacturer.com/products/datasheets/LED-12345-en.pdf
              attachmentFilename: LED-12345-datasheet-en.pdf
              attachmentLanguage:
                - en-GB
              attachmentIssueDate: '2024-06-15'
            - attachmentUri: https://cdn.manufacturer.com/products/datasheets/LED-12345-de.pdf
              attachmentFilename: LED-12345-datasheet-de.pdf
              attachmentLanguage:
                - de-DE
              attachmentIssueDate: '2024-06-15'
    AttachmentDetails:
      type: object
      required:
        - attachmentUri
      properties:
        attachmentLanguage:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            $ref: '#/components/schemas/LanguageCode'
          description: |
            Languages applicable to this attachment in ISO 639-1 and ISO 3166-1 format (e.g., "en-GB", "de-DE").
            Multiple languages can be specified if the attachment is multilingual.

            **ETIM xChange**: `AttachmentLanguage`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentLanguage[]`
          examples:
            - - en-GB
              - de-DE
            - null
        attachmentFilename:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Original filename of the attachment (maximum 100 characters).

            **ETIM xChange**: `AttachmentFilename`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentFilename`
          examples:
            - product-datasheet-v2.pdf
            - LED-bulb-front-view.jpg
            - null
        attachmentUri:
          type: string
          format: uri
          description: |
            URI/URL to access the attachment file. This is the direct link to download or view the document, image, or video.

            **ETIM xChange**: `AttachmentUri`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentUri`
          examples:
            - https://cdn.manufacturer.com/products/datasheets/LED-12345.pdf
            - https://images.manufacturer.com/products/LED-12345-front.jpg
        attachmentDescription:
          type:
            - array
            - 'null'
          items:
            type: object
            required:
              - language
              - attachmentDescription
            properties:
              language:
                description: |
                  Language code for the description.
                  Sourced from ETIM xChange `Language` at catalog level, denormalized into each description record.
                $ref: '#/components/schemas/LanguageCode'
                examples:
                  - en-GB
                  - de-DE
              attachmentDescription:
                type: string
                minLength: 1
                maxLength: 255
                description: Description of the attachment
                examples:
                  - Technical datasheet with electrical specifications
          description: |
            Multilingual descriptions of the attachment (maximum 255 characters per description).

            **ETIM xChange**: `AttachmentDescription`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentDescription[]`
          examples:
            - - language: en-GB
                attachmentDescription: Technical datasheet with electrical specifications
            - null
        attachmentIssueDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the attachment was issued or published. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `AttachmentIssueDate`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentIssueDate`
          examples:
            - '2024-06-15'
            - null
        attachmentExpiryDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the attachment expires or becomes obsolete. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `AttachmentExpiryDate`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentExpiryDate`
          examples:
            - '2026-12-31'
            - null
      examples:
        - attachmentUri: https://cdn.manufacturer.com/products/datasheets/LED-12345.pdf
          attachmentFilename: LED-12345-datasheet.pdf
          attachmentLanguage:
            - en-GB
          attachmentDescription:
            - language: en-GB
              attachmentDescription: Complete technical specifications and electrical characteristics
          attachmentIssueDate: '2024-06-15'
    ProductAttachmentSummary:
      type: object
      description: |
        Flattened product attachment for bulk retrieval.
        Each row represents a single attachment file with the product identifier
        and attachment-level fields denormalized.

        A product with 2 attachment types, each with 2 files (e.g., different languages),
        will result in 4 rows.

        This flattened structure is optimized for:
        - Predictable payload sizes per row
        - Efficient cursor-based pagination
        - ETL/data warehouse ingestion
        - Streaming data processing

        **Payload Optimization**: Optional properties with null values may be omitted from the response
        to minimize payload size. Clients should treat missing properties as null/not applicable.

        **ETIM xChange**: `ProductAttachments[].AttachmentDetails[]`  
        **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[]`
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
        - attachmentType
        - attachmentUri
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) identifying the manufacturer.
            13-digit GS1 identifier. Part of the composite product identifier.
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's unique product identifier.
            Part of the composite product identifier.

            **ETIM xChange**: `ManufacturerProductNumber`  
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerProductNumber`
          examples:
            - '929002376910'
            - ABC-12345-XYZ
        attachmentType:
          $ref: '#/components/schemas/AttachmentType'
          description: |
            ETIM standardized type code for the attachment.
            Denormalized from the parent attachment record.

            **ETIM xChange**: `AttachmentType`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentType`
        attachmentTypeSpecification:
          $ref: '#/components/schemas/AttachmentTypeSpecification'
          description: |
            Additional specification code providing more detail about the attachment type.
            Denormalized from the parent attachment record.

            **ETIM xChange**: `AttachmentTypeSpecification`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentTypeSpecification`
        attachmentOrder:
          type:
            - integer
            - 'null'
          minimum: 1
          description: |
            Display order/sequence number for this attachment when multiple attachments are present.
            Lower numbers indicate higher priority or preferred display order.
            Denormalized from the parent attachment record.

            **ETIM xChange**: `AttachmentOrder`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentOrder`
          examples:
            - 1
            - 2
            - null
        attachmentFilename:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Original filename of the attachment (maximum 100 characters).

            **ETIM xChange**: `AttachmentFilename`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentFilename`
          examples:
            - LED-12345-datasheet.pdf
            - product-front-view.jpg
            - null
        attachmentUri:
          type: string
          format: uri
          description: |
            URI/URL to access the attachment file.

            **ETIM xChange**: `AttachmentUri`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentUri`
          examples:
            - https://cdn.manufacturer.com/products/datasheets/LED-12345.pdf
            - https://images.manufacturer.com/products/LED-12345-front.jpg
        attachmentIssueDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the attachment was issued or published. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `AttachmentIssueDate`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentIssueDate`
          examples:
            - '2024-06-15'
            - null
        attachmentExpiryDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the attachment expires or becomes obsolete. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `AttachmentExpiryDate`  
            **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentDetails[].AttachmentExpiryDate`
          examples:
            - '2026-12-31'
            - null
      examples:
        - manufacturerIdGln: '0000333000005'
          manufacturerProductNumber: 18591-P47
          attachmentType: ATX015
          attachmentTypeSpecification: null
          attachmentOrder: 1
          attachmentFilename: c0c8542e86907655140d81c9699e7a4c.jpg
          attachmentUri: http://att.2ba.nl/0000333000005/PPI/c0/c0c8/c0c8542e86907655140d81c9699e7a4c.jpg
          attachmentIssueDate: null
          attachmentExpiryDate: null
        - manufacturerIdGln: '0000333000005'
          manufacturerProductNumber: 18591-P47
          attachmentType: ATX018
          attachmentTypeSpecification: null
          attachmentOrder: 1
          attachmentFilename: c0c8542e86907655140d81c9699e7a4c.jpg
          attachmentUri: http://att.2ba.nl/0000333000005/PPI/c0/c0c8/c0c8542e86907655140d81c9699e7a4c.jpg
          attachmentIssueDate: null
          attachmentExpiryDate: null
        - manufacturerIdGln: '0000333000005'
          manufacturerProductNumber: 3244 br hg 47
          attachmentType: ATX015
          attachmentTypeSpecification: null
          attachmentOrder: 1
          attachmentFilename: 9af382818c2af00d8ce97a6b95667b74.jpg
          attachmentUri: http://att.2ba.nl/0000333000005/PPI/9a/9af3/9af382818c2af00d8ce97a6b95667b74.jpg
          attachmentIssueDate: null
          attachmentExpiryDate: null
    EtimClassification:
      type: object
      required:
        - etimClassCode
        - etimReleaseVersion
      properties:
        etimClassCode:
          type: string
          pattern: ^EC[0-9]{6}$
          description: |
            ETIM class code identifying the product category. Format: EC followed by 6 digits.

            **ETIM xChange**: `EtimClassCode`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimClassCode`
          examples:
            - EC000123
            - EC002745
        etimClassVersion:
          type:
            - integer
            - 'null'
          minimum: 1
          description: |
            Version number of the ETIM class. Incremented when class definition changes.
            Optional field matching ETIM xChange specification.

            **ETIM xChange**: `EtimClassVersion`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimClassVersion`
          examples:
            - 1
            - 2
            - null
        etimReleaseVersion:
          type: string
          pattern: ^[0-9]{1,2}[.]{1}[0-9]{1}|DYNAMIC$
          description: |
            ETIM release version where this classification is valid.
            Release number (e.g., "9.0", "10.0", "11.0") or "DYNAMIC" for dynamic ETIM classes.

            **ETIM xChange**: `EtimReleaseVersion`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimReleaseVersion`
          examples:
            - '9.0'
            - '10.0'
            - '11.0'
            - DYNAMIC
        etimDynamicReleaseDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Release date for dynamic ETIM classes. ISO 8601 date format (YYYY-MM-DD).
            Only applicable when `etimReleaseVersion` is "DYNAMIC".

            **ETIM xChange**: `EtimDynamicReleaseDate`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimDynamicReleaseDate`
          examples:
            - '2024-06-15'
            - null
        etimFeatures:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/EtimFeature'
          description: |
            Array of ETIM feature values that characterize the product according to the ETIM class.
            Features define standardized technical specifications and characteristics.

            **ETIM xChange**: `EtimFeatures`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[]`
          examples:
            - - etimFeatureCode: EF000123
                etimValueCode: EV000789
              - etimFeatureCode: EF000456
                etimValueNumeric: 230
            - null
      examples:
        - etimClassCode: EC002745
          etimClassVersion: 1
          etimReleaseVersion: '9.0'
          etimFeatures:
            - etimFeatureCode: EF000123
              etimValueCode: EV000789
            - etimFeatureCode: EF000456
              etimValueNumeric: 230
            - etimFeatureCode: EF000789
              etimValueLogical: true
        - etimClassCode: EC000123
          etimClassVersion: 2
          etimReleaseVersion: '11.0'
        - etimClassCode: EC001234
          etimClassVersion: null
          etimReleaseVersion: '10.0'
    EtimFeature:
      type: object
      required:
        - etimFeatureCode
      properties:
        etimFeatureCode:
          type: string
          pattern: ^EF([0-9]{6}|I[0-9]{5}|[A-Z]{2}[0-9]{4})$
          description: |
            ETIM standardized feature code identifying a specific product characteristic.
            Format: EF followed by 6 digits, or EFI followed by 5 digits, or EF followed by 2 letters and 4 digits.

            **ETIM xChange**: `EtimFeatureCode`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimFeatureCode`
          examples:
            - EF000123
            - EFI00456
        etimValueCode:
          type:
            - string
            - 'null'
          pattern: ^EV[0-9]{6}$
          description: |
            ETIM standardized value code for alphanumeric features (e.g., enumerations, selections).
            Format: EV followed by 6 digits.

            **ETIM xChange**: `EtimValueCode`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueCode`
          examples:
            - EV000789
            - null
        etimValueNumeric:
          type:
            - number
            - 'null'
          format: decimal
          multipleOf: 0.0001
          minimum: -999999999999.9999
          maximum: 999999999999.9999
          description: |
            Numeric value for the ETIM feature (supports up to 4 decimal places).
            Converted from ETIM xChange string pattern to number type.

            **ETIM xChange**: `EtimValueNumeric` (string with pattern)  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueNumeric`
          examples:
            - 230
            - 50.5
            - -10.25
            - null
        etimValueRangeLower:
          type:
            - number
            - 'null'
          format: decimal
          multipleOf: 0.0001
          minimum: -999999999999.9999
          maximum: 999999999999.9999
          description: |
            Lower bound of a numeric range for the feature value.
            Converted from ETIM xChange string pattern to number type.

            **ETIM xChange**: `EtimValueRangeLower` (string with pattern)  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueRangeLower`
          examples:
            - 100
            - 0.5
            - null
        etimValueRangeUpper:
          type:
            - number
            - 'null'
          format: decimal
          multipleOf: 0.0001
          minimum: -999999999999.9999
          maximum: 999999999999.9999
          description: |
            Upper bound of a numeric range for the feature value.
            Converted from ETIM xChange string pattern to number type.

            **ETIM xChange**: `EtimValueRangeUpper` (string with pattern)  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueRangeUpper`
          examples:
            - 240
            - 60
            - null
        etimValueLogical:
          type:
            - boolean
            - 'null'
          description: |
            Boolean/logical value for yes/no type features.

            **ETIM xChange**: `EtimValueLogical`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueLogical`
          examples:
            - true
            - false
            - null
        etimValueDetails:
          type:
            - array
            - 'null'
          items:
            type: object
            required:
              - language
              - etimValueDetails
            properties:
              language:
                description: |
                  Language code for the value details.
                  Sourced from ETIM xChange `Language` at catalog level, denormalized into each record.
                $ref: '#/components/schemas/LanguageCode'
                examples:
                  - en-GB
              etimValueDetails:
                type: string
                minLength: 1
                maxLength: 255
                description: Free-text details about the feature value
                examples:
                  - Special coating applied
          description: |
            Multilingual free-text descriptions providing additional details about the feature value.

            **ETIM xChange**: `EtimValueDetails`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueDetails[]`
          examples:
            - - language: en-GB
                etimValueDetails: Certified for outdoor use
            - null
        reasonNoValue:
          type:
            - string
            - 'null'
          enum:
            - MV
            - NA
            - UN
            - null
          description: |
            Reason code when no feature value is provided.

            - `MV`: Multiple values - feature has multiple applicable values
            - `NA`: Not applicable - feature does not apply to this product
            - `UN`: Unknown - value is currently unknown or unavailable

            **ETIM xChange**: `ReasonNoValue`  
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].ReasonNoValue`
          examples:
            - NA
            - null
      examples:
        - etimFeatureCode: EF000123
          etimValueCode: EV000789
        - etimFeatureCode: EF000456
          etimValueNumeric: 230
        - etimFeatureCode: EF000789
          etimValueRangeLower: 100
          etimValueRangeUpper: 240
        - etimFeatureCode: EF001234
          etimValueLogical: true
        - etimFeatureCode: EF005678
          reasonNoValue: NA
    ProductEtimClassificationFeature:
      type: object
      description: |
        Flattened product ETIM classification feature for bulk retrieval.
        Each row represents a single feature value within a product's ETIM classification.

        This flattened structure is optimized for:
        - Predictable payload sizes per row
        - Efficient cursor-based pagination
        - ETL/data warehouse ingestion
        - Streaming data processing

        **Payload Optimization**: Optional properties with null values are omitted from the response
        to minimize payload size. Clients should treat missing properties as null/not applicable.

        **Classification-only rows**: Products with classification but no features are represented
        with `etimFeatureCode` omitted (or null if explicitly set).
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
        - etimClassCode
        - etimReleaseVersion
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            GLN (Global Location Number) of the product manufacturer.
            Part of the composite product identifier.
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's product number/code.
            Part of the composite product identifier.
          examples:
            - '929002376910'
            - LED-12345-A
        etimClassCode:
          type: string
          pattern: ^EC[0-9]{6}$
          description: |
            ETIM class code identifying the product category. Format: EC followed by 6 digits.

            **ETIM xChange**: `EtimClassCode`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimClassCode`
          examples:
            - EC000123
            - EC002745
        etimClassVersion:
          type:
            - integer
            - 'null'
          minimum: 1
          description: |
            Version number of the ETIM class. Incremented when class definition changes.
            Optional field matching ETIM xChange specification. Omitted when not applicable.

            **ETIM xChange**: `EtimClassVersion`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimClassVersion`
          examples:
            - 1
            - 2
        etimReleaseVersion:
          type: string
          pattern: ^[0-9]{1,2}[.]{1}[0-9]{1}|DYNAMIC$
          description: |
            ETIM release version where this classification is valid.
            Release number (e.g., "9.0", "10.0", "11.0") or "DYNAMIC".

            **ETIM xChange**: `EtimReleaseVersion`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimReleaseVersion`
          examples:
            - '9.0'
            - '10.0'
            - '11.0'
            - DYNAMIC
        etimDynamicReleaseDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Release date for dynamic ETIM classes. ISO 8601 date format (YYYY-MM-DD).
            Only present when `etimReleaseVersion` is "DYNAMIC". Omitted when not applicable.

            **ETIM xChange**: `EtimDynamicReleaseDate`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimDynamicReleaseDate`
          examples:
            - '2024-06-15'
        etimFeatureCode:
          type:
            - string
            - 'null'
          pattern: ^EF([0-9]{6}|I[0-9]{5}|[A-Z]{2}[0-9]{4})$
          description: |
            ETIM standardized feature code identifying a specific product characteristic.
            Format: EF followed by 6 digits, or EFI followed by 5 digits, or EF followed by 2 letters and 4 digits.

            Omitted for classification-only rows (product has class but no features).

            **ETIM xChange**: `EtimFeatureCode`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimFeatureCode`
          examples:
            - EF000123
            - EFI00456
        etimValueCode:
          type:
            - string
            - 'null'
          pattern: ^EV[0-9]{6}$
          description: |
            ETIM standardized value code for alphanumeric features (e.g., enumerations, selections).
            Format: EV followed by 6 digits.
            Only present for alphanumeric feature types. Omitted when not applicable.

            **ETIM xChange**: `EtimValueCode`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueCode`
          examples:
            - EV000789
        etimValueNumeric:
          type:
            - number
            - 'null'
          format: decimal
          multipleOf: 0.0001
          minimum: -999999999999.9999
          maximum: 999999999999.9999
          description: |
            Numeric value for the ETIM feature (supports up to 4 decimal places).
            Only present for numeric feature types. Omitted when not applicable.

            **ETIM xChange**: `EtimValueNumeric`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueNumeric`
          examples:
            - 230
            - 50.5
        etimValueRangeLower:
          type:
            - number
            - 'null'
          format: decimal
          multipleOf: 0.0001
          minimum: -999999999999.9999
          maximum: 999999999999.9999
          description: |
            Lower bound of a numeric range for the feature value.
            Only present for range feature types. Omitted when not applicable.

            **ETIM xChange**: `EtimValueRangeLower`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueRangeLower`
          examples:
            - 100
            - 0.5
        etimValueRangeUpper:
          type:
            - number
            - 'null'
          format: decimal
          multipleOf: 0.0001
          minimum: -999999999999.9999
          maximum: 999999999999.9999
          description: |
            Upper bound of a numeric range for the feature value.
            Only present for range feature types. Omitted when not applicable.

            **ETIM xChange**: `EtimValueRangeUpper`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueRangeUpper`
          examples:
            - 240
            - 60
        etimValueLogical:
          type:
            - boolean
            - 'null'
          description: |
            Boolean/logical value for yes/no type features.
            Only present for logical feature types. Omitted when not applicable.

            **ETIM xChange**: `EtimValueLogical`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueLogical`
          examples:
            - true
            - false
        etimValueDetails:
          type:
            - array
            - 'null'
          items:
            type: object
            required:
              - language
              - etimValueDetails
            properties:
              language:
                description: |
                  Language code for the value details.
                  Sourced from ETIM xChange `Language` at catalog level, denormalized into each record.
                $ref: '#/components/schemas/LanguageCode'
                examples:
                  - en-GB
                  - nl-NL
              etimValueDetails:
                type: string
                minLength: 1
                maxLength: 255
                description: Free-text details about the feature value
                examples:
                  - Special coating applied
          description: |
            Multilingual free-text descriptions providing additional details about the feature value.
            Omitted when not applicable.

            **ETIM xChange**: `EtimValueDetails`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].EtimValueDetails[]`
          examples:
            - - language: en-GB
                etimValueDetails: Certified for outdoor use
        reasonNoValue:
          type:
            - string
            - 'null'
          enum:
            - MV
            - NA
            - UN
            - null
          description: |
            Reason code when no feature value is provided.
            Omitted when a value is present.

            - `MV`: Multiple values - feature has multiple applicable values
            - `NA`: Not applicable - feature does not apply to this product
            - `UN`: Unknown - value is currently unknown or unavailable

            **ETIM xChange**: `ReasonNoValue`
            **Path**: `Supplier[].Product[].EtimClassification[].EtimFeatures[].ReasonNoValue`
          examples:
            - NA
            - MV
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          etimClassCode: EC002745
          etimClassVersion: 1
          etimReleaseVersion: '9.0'
          etimFeatureCode: EF000123
          etimValueCode: EV000789
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          etimClassCode: EC002745
          etimClassVersion: 1
          etimReleaseVersion: '9.0'
          etimFeatureCode: EF000456
          etimValueNumeric: 230
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          etimClassCode: EC002745
          etimClassVersion: 1
          etimReleaseVersion: '10.0'
          etimFeatureCode: EF000789
          etimValueRangeLower: 100
          etimValueRangeUpper: 240
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          etimClassCode: EC002745
          etimClassVersion: 1
          etimReleaseVersion: '10.0'
          etimFeatureCode: EF001234
          etimValueLogical: true
        - manufacturerIdGln: '9876543210987'
          manufacturerProductNumber: LED-12345-A
          etimClassCode: EC001234
          etimClassVersion: 2
          etimReleaseVersion: '11.0'
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          etimClassCode: EC002745
          etimClassVersion: 1
          etimReleaseVersion: '9.0'
          etimFeatureCode: EF005678
          reasonNoValue: NA
    LcaEnvironmental:
      type: object
      required:
        - declaredUnitUnit
        - declaredUnitQuantity
        - lcaReferenceLifetime
        - thirdPartyVerification
        - lcaDeclaration
        - epdValidityStartDate
      properties:
        declaredUnitUnit:
          type: string
          enum:
            - KGM
            - LTR
            - MTK
            - MTQ
            - MTR
            - PCE
            - TNE
            - FOT
            - FTK
            - FTQ
            - LBR
            - LTN
            - YDK
            - YRD
          description: |
            Unit of measurement for the declared/functional unit in LCA.

            Metric units:
            - `KGM`: Kilogram
            - `LTR`: Liter
            - `MTK`: Square meter
            - `MTQ`: Cubic meter
            - `MTR`: Meter
            - `PCE`: Piece/unit
            - `TNE`: Tonne

            Imperial units:
            - `FOT`: Foot
            - `FTK`: Square foot
            - `FTQ`: Cubic foot
            - `LBR`: Pound
            - `LTN`: Long ton
            - `YDK`: Square yard
            - `YRD`: Yard

            **ETIM xChange**: `DeclaredUnitUnit`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.DeclaredUnitUnit`
          examples:
            - KGM
            - PCE
            - MTK
        declaredUnitQuantity:
          type: number
          format: decimal
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          description: |
            Quantity of the declared/functional unit for LCA calculations.
            Converted from ETIM xChange string pattern to number type.

            **ETIM xChange**: `DeclaredUnitQuantity` (string with pattern)  
            **Path**: `Supplier[].Product[].LcaEnvironmental.DeclaredUnitQuantity`
          examples:
            - 1
            - 10.5
            - 100
        functionalUnitDescription:
          type:
            - array
            - 'null'
          items:
            type: object
            required:
              - language
              - functionalUnitDescription
            properties:
              language:
                description: |
                  Language code for the description.
                  Sourced from ETIM xChange `Language` at catalog level, denormalized into each record.
                $ref: '#/components/schemas/LanguageCode'
                examples:
                  - en-GB
              functionalUnitDescription:
                type: string
                minLength: 1
                maxLength: 10000
                description: Description of the functional unit
                examples:
                  - One LED bulb providing 806 lumens for 25,000 hours
          description: |
            Multilingual descriptions of the functional unit for LCA.

            **ETIM xChange**: `FunctionalUnitDescription`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.FunctionalUnitDescription[]`
          examples:
            - - language: en-GB
                functionalUnitDescription: One LED bulb providing 806 lumens for 25,000 hours
            - null
        lcaReferenceLifetime:
          type: integer
          minimum: 0
          description: |
            Reference service life/lifetime for LCA calculations in years.

            **ETIM xChange**: `LcaReferenceLifetime`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaReferenceLifetime`
          examples:
            - 25
            - 10
            - 50
        thirdPartyVerification:
          type: string
          enum:
            - none
            - internally
            - externally
          description: |
            Type of third-party verification for LCA/EPD data.

            - `none`: No third-party verification
            - `internally`: Internal verification
            - `externally`: External independent verification

            **ETIM xChange**: `ThirdPartyVerification`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.ThirdPartyVerification`
          examples:
            - externally
            - none
        epdValidityStartDate:
          type: string
          format: date
          description: |
            Start date of EPD validity period. ISO 8601 date format (YYYY-MM-DD).
            Defaults to CatalogueValidityStart if not overridden at the product level.

            **ETIM xChange**: `EpdValidityStartDate`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.EpdValidityStartDate`  
            **Default from**: `CatalogueValidityStart`
          examples:
            - '2024-01-01'
        epdValidityExpiryDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Expiry date of EPD validity period. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `EpdValidityExpiryDate`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.EpdValidityExpiryDate`
          examples:
            - '2029-12-31'
            - null
        epdOperatorName:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Name of the EPD program operator that published the Environmental Product Declaration.

            **ETIM xChange**: `EpdOperatorName`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.EpdOperatorName`
          examples:
            - IBU - Institut Bauen und Umwelt e.V.
            - The International EPD System
            - null
        epdOperatorUri:
          type:
            - string
            - 'null'
          format: uri
          description: |
            URI/URL to the EPD program operator's website.

            **ETIM xChange**: `EpdOperatorUri`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.EpdOperatorUri`
          examples:
            - https://ibu-epd.com
            - https://www.environdec.com
            - null
        operatorEpdId:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            EPD identifier assigned by the program operator.

            **ETIM xChange**: `OperatorEpdId`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.OperatorEpdId`
          examples:
            - EPD-IBU-2024-001234
            - null
        manufacturerEpdId:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            EPD identifier assigned by the manufacturer for internal reference.

            **ETIM xChange**: `ManufacturerEpdId`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.ManufacturerEpdId`
          examples:
            - MFR-EPD-LED-2024-001
            - null
        productCategoryRulesDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Description of the Product Category Rules (PCR) used for the LCA/EPD.
            PCR defines the rules for the environmental assessment of a specific product category.

            **ETIM xChange**: `ProductCategoryRulesDescription`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.ProductCategoryRulesDescription`
          examples:
            - PCR 2019:14 Lighting equipment
            - EN 15804+A2 Construction products
            - null
        productCategoryRulesUri:
          type:
            - string
            - 'null'
          format: uri
          description: |
            URI/URL to the Product Category Rules (PCR) document.

            **ETIM xChange**: `ProductCategoryRulesUri`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.ProductCategoryRulesUri`
          examples:
            - https://www.environdec.com/pcr-library/pcr-2019-14
            - null
        productSpecificRulesDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Description of Product Specific Rules (PSR) applied in addition to PCR.
            PSR provides additional rules for sub-categories within a PCR.

            **ETIM xChange**: `ProductSpecificRulesDescription`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.ProductSpecificRulesDescription`
          examples:
            - PSR for LED lamps and luminaires
            - null
        productSpecificRulesUri:
          type:
            - string
            - 'null'
          format: uri
          description: |
            URI/URL to the Product Specific Rules (PSR) document.

            **ETIM xChange**: `ProductSpecificRulesUri`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.ProductSpecificRulesUri`
          examples:
            - https://www.environdec.com/psr-library/psr-led-lighting
            - null
        lcaDeclaration:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/LcaDeclaration'
          description: |
            Array of LCA declarations for different life cycle stages.

            **ETIM xChange**: `LcaDeclaration`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[]`
      examples:
        - declaredUnitUnit: PCE
          declaredUnitQuantity: 1
          lcaReferenceLifetime: 25
          thirdPartyVerification: externally
          epdValidityStartDate: '2024-01-01'
          epdValidityExpiryDate: '2029-12-31'
          epdOperatorName: The International EPD System
          epdOperatorUri: https://www.environdec.com
          operatorEpdId: S-P-12345
          manufacturerEpdId: MFR-EPD-LED-2024-001
          productCategoryRulesDescription: PCR 2019:14 Lighting equipment
          productCategoryRulesUri: https://www.environdec.com/pcr-library/pcr-2019-14
          functionalUnitDescription:
            - language: en-GB
              functionalUnitDescription: One LED bulb providing 806 lumens for 25,000 hours
          lcaDeclaration:
            - lifeCycleStage: A1-A3
              lcaDeclarationIndicator: MDE
              declaredUnitGwpTotal: 15.75
              declaredUnitGwpFossil: 14.25
            - lifeCycleStage: C1-C4
              lcaDeclarationIndicator: AGG
              declaredUnitGwpTotal: 2.5
    LcaDeclaration:
      type: object
      required:
        - lifeCycleStage
        - lcaDeclarationIndicator
      properties:
        lifeCycleStage:
          type: string
          enum:
            - A1
            - A2
            - A3
            - A1-A3
            - A4
            - A5
            - B1
            - B2
            - B3
            - B4
            - B5
            - B6
            - B7
            - B1-B7
            - C1
            - C2
            - C3
            - C4
            - C1-C4
            - D
          description: |
            Life cycle assessment stage according to EN 15804.

            Product stage (A):
            - `A1`: Raw material supply
            - `A2`: Transport to manufacturer
            - `A3`: Manufacturing
            - `A1-A3`: Combined product stage
            - `A4`: Transport to building site
            - `A5`: Installation into building

            Use stage (B):
            - `B1`: Use/Application
            - `B2`: Maintenance
            - `B3`: Repair
            - `B4`: Replacement
            - `B5`: Refurbishment
            - `B6`: Operational energy use
            - `B7`: Operational water use
            - `B1-B7`: Combined use stage

            End of life stage (C):
            - `C1`: Deconstruction/demolition
            - `C2`: Transport to waste processing
            - `C3`: Waste processing
            - `C4`: Disposal
            - `C1-C4`: Combined end of life stage

            Beyond life cycle (D):
            - `D`: Reuse, recovery, recycling potential

            **ETIM xChange**: `LifeCycleStage`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].LifeCycleStage`
          examples:
            - A1-A3
            - B6
            - C1-C4
        lcaDeclarationIndicator:
          type: string
          enum:
            - MDE
            - MND
            - MNR
            - AGG
          description: |
            Type of LCA declaration data.

            - `MDE`: Manufacturer-specific data with external verification
            - `MND`: Manufacturer-specific data without external verification
            - `MNR`: Manufacturer-specific data not representative
            - `AGG`: Industry average/aggregated data

            **ETIM xChange**: `LcaDeclarationIndicator`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].LcaDeclarationIndicator`
          examples:
            - MDE
            - AGG
        declaredUnitGwpTotal:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Total Global Warming Potential (GWP) in kg CO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitGwpTotal`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitGwpTotal`
          examples:
            - 15.75
            - 0.85
            - null
        declaredUnitGwpFossil:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Fossil Global Warming Potential in kg CO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitGwpFossil`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitGwpFossil`
          examples:
            - 14.25
            - null
        declaredUnitGwpBiogenic:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Biogenic Global Warming Potential in kg CO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitGwpBiogenic`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitGwpBiogenic`
          examples:
            - 1.2
            - null
        declaredUnitAp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Acidification Potential (AP) in kg SO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitAp`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitAp`
          examples:
            - 0.05
            - null
        declaredUnitEpFreshwater:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Eutrophication Potential for freshwater in kg PO4 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitEpFreshwater`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitEpFreshwater`
          examples:
            - 0.002
            - null
        declaredUnitOdp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Ozone Depletion Potential (ODP) in kg CFC-11 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitOdp`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitOdp`
          examples:
            - 0.0000012
            - null
        declaredUnitGwpLuluc:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Global Warming Potential from Land Use and Land Use Change (GWP-LULUC) 
            in kg CO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitGwpLuluc`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitGwpLuluc`
          examples:
            - 0.25
            - null
        declaredUnitEpMarine:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Eutrophication Potential for marine water (EP-marine) in kg N equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitEpMarine`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitEpMarine`
          examples:
            - 0.0015
            - null
        declaredUnitEpTerrestrial:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Eutrophication Potential for terrestrial ecosystems (EP-terrestrial) 
            in mol N equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitEpTerrestrial`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitEpTerrestrial`
          examples:
            - 0.12
            - null
        declaredUnitPocp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Photochemical Ozone Creation Potential (POCP) in kg NMVOC equivalent per declared unit.
            Also known as summer smog potential.

            **ETIM xChange**: `DeclaredUnitPocp`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitPocp`
          examples:
            - 0.035
            - null
        declaredUnitAdpe:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Abiotic Depletion Potential for non-fossil resources (ADP-elements) 
            in kg Sb equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitAdpe`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitAdpe`
          examples:
            - 0.00025
            - null
        declaredUnitAdpf:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Abiotic Depletion Potential for fossil resources (ADP-fossil) in MJ per declared unit.

            **ETIM xChange**: `DeclaredUnitAdpf`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitAdpf`
          examples:
            - 185.5
            - null
        declaredUnitWdp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Water Deprivation Potential (WDP) in m³ world equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitWdp`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitWdp`
          examples:
            - 2.5
            - null
        declaredUnitPert:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Use of renewable primary energy resources (PERT) in MJ per declared unit.
            Total renewable primary energy.

            **ETIM xChange**: `DeclaredUnitPert`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitPert`
          examples:
            - 45.2
            - null
        declaredUnitPenrt:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Use of non-renewable primary energy resources (PENRT) in MJ per declared unit.
            Total non-renewable primary energy.

            **ETIM xChange**: `DeclaredUnitPenrt`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitPenrt`
          examples:
            - 195.8
            - null
        declaredUnitPm:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Particulate Matter emissions (PM) expressed as disease incidence per declared unit.

            **ETIM xChange**: `DeclaredUnitPm`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitPm`
          examples:
            - 0.0000015
            - null
        declaredUnitIrp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Ionising Radiation Potential (IRP) in kBq U235 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitIrp`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitIrp`
          examples:
            - 1.25
            - null
        declaredUnitEtpfw:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Ecotoxicity Potential for freshwater (ETP-fw) in CTUe (Comparative Toxic Unit for ecosystems) 
            per declared unit.

            **ETIM xChange**: `DeclaredUnitEtpfw`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitEtpfw`
          examples:
            - 125.5
            - null
        declaredUnitHtpc:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Human Toxicity Potential - cancer effects (HTP-c) in CTUh (Comparative Toxic Unit for humans) 
            per declared unit.

            **ETIM xChange**: `DeclaredUnitHtpc`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitHtpc`
          examples:
            - 0.0000025
            - null
        declaredUnitHtpnc:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Human Toxicity Potential - non-cancer effects (HTP-nc) in CTUh (Comparative Toxic Unit for humans) 
            per declared unit.

            **ETIM xChange**: `DeclaredUnitHtpnc`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitHtpnc`
          examples:
            - 0.000045
            - null
        declaredUnitSqp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Soil Quality Potential (SQP) - dimensionless indicator per declared unit.
            Measures the impact on soil quality.

            **ETIM xChange**: `DeclaredUnitSqp`  
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitSqp`
          examples:
            - 15.5
            - null
      examples:
        - lifeCycleStage: A1-A3
          lcaDeclarationIndicator: MDE
          declaredUnitGwpTotal: 15.75
          declaredUnitGwpFossil: 14.25
          declaredUnitGwpBiogenic: 1.2
          declaredUnitGwpLuluc: 0.3
          declaredUnitAp: 0.05
          declaredUnitEpFreshwater: 0.002
          declaredUnitEpMarine: 0.0015
          declaredUnitEpTerrestrial: 0.12
          declaredUnitPocp: 0.035
          declaredUnitOdp: 0.0000012
          declaredUnitAdpe: 0.00025
          declaredUnitAdpf: 185.5
          declaredUnitWdp: 2.5
          declaredUnitPert: 45.2
          declaredUnitPenrt: 195.8
        - lifeCycleStage: C1-C4
          lcaDeclarationIndicator: AGG
          declaredUnitGwpTotal: 2.5
          declaredUnitGwpFossil: 2.3
          declaredUnitGwpBiogenic: 0.15
          declaredUnitAdpf: 35
    ProductLcaDeclarationSummary:
      type: object
      description: |
        Flattened product LCA declaration for bulk retrieval.
        Each row represents a single life cycle declaration within a product's LCA environmental data.

        This flattened structure is optimized for:
        - Predictable payload sizes per row
        - Efficient cursor-based pagination
        - ETL/data warehouse ingestion
        - Streaming data processing

        **Payload Optimization**: Optional properties with null values are omitted from the response
        to minimize payload size. Clients should treat missing properties as null/not applicable.

        **Parent context fields**: Key fields from the parent LcaEnvironmental object are included
        (`declaredUnitUnit`, `declaredUnitQuantity`, `lcaReferenceLifetime`, `thirdPartyVerification`,
        `epdValidityStartDate`, `epdValidityExpiryDate`, `epdOperatorName`, `epdOperatorUri`,
        `operatorEpdId`, `manufacturerEpdId`, `productCategoryRulesDescription`, `productCategoryRulesUri`,
        `productSpecificRulesDescription`, `productSpecificRulesUri`)
        to provide necessary context for interpreting the environmental indicators.
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
        - lifeCycleStage
        - lcaDeclarationIndicator
        - declaredUnitUnit
        - declaredUnitQuantity
        - lcaReferenceLifetime
        - thirdPartyVerification
        - epdValidityStartDate
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            GLN (Global Location Number) of the product manufacturer.
            Part of the composite product identifier.

            **ETIM xChange**: `ManufacturerIdGln`
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerIdGln`
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's product number/code.
            Part of the composite product identifier.

            **ETIM xChange**: `ManufacturerProductNumber`
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerProductNumber`
          examples:
            - '929002376910'
            - LED-12345-A
        declaredUnitUnit:
          type: string
          enum:
            - KGM
            - LTR
            - MTK
            - MTQ
            - MTR
            - PCE
            - TNE
            - FOT
            - FTK
            - FTQ
            - LBR
            - LTN
            - YDK
            - YRD
          description: |
            Unit of measurement for the declared/functional unit in LCA.

            Metric units:
            - `KGM`: Kilogram
            - `LTR`: Liter
            - `MTK`: Square meter
            - `MTQ`: Cubic meter
            - `MTR`: Meter
            - `PCE`: Piece/unit
            - `TNE`: Tonne

            Imperial units:
            - `FOT`: Foot
            - `FTK`: Square foot
            - `FTQ`: Cubic foot
            - `LBR`: Pound
            - `LTN`: Long ton
            - `YDK`: Square yard
            - `YRD`: Yard

            **ETIM xChange**: `DeclaredUnitUnit`
            **Path**: `Supplier[].Product[].LcaEnvironmental.DeclaredUnitUnit`
          examples:
            - KGM
            - PCE
            - MTK
        declaredUnitQuantity:
          type: number
          format: decimal
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          description: |
            Quantity of the declared/functional unit for LCA calculations.
            Converted from ETIM xChange string pattern to number type.

            **ETIM xChange**: `DeclaredUnitQuantity` (string with pattern)
            **Path**: `Supplier[].Product[].LcaEnvironmental.DeclaredUnitQuantity`
          examples:
            - 1
            - 10.5
            - 100
        lcaReferenceLifetime:
          type: integer
          minimum: 0
          description: |
            Reference service life/lifetime for LCA calculations in years.

            **ETIM xChange**: `LcaReferenceLifetime`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaReferenceLifetime`
          examples:
            - 25
            - 10
            - 50
        thirdPartyVerification:
          type: string
          enum:
            - none
            - internally
            - externally
          description: |
            Type of third-party verification for LCA/EPD data.

            - `none`: No third-party verification
            - `internally`: Internal verification
            - `externally`: External independent verification

            **ETIM xChange**: `ThirdPartyVerification`
            **Path**: `Supplier[].Product[].LcaEnvironmental.ThirdPartyVerification`
          examples:
            - externally
            - none
        epdValidityStartDate:
          type: string
          format: date
          description: |
            Start date of EPD validity period. ISO 8601 date format (YYYY-MM-DD).
            Defaults to CatalogueValidityStart if not overridden at the product level.

            **ETIM xChange**: `EpdValidityStartDate`
            **Path**: `Supplier[].Product[].LcaEnvironmental.EpdValidityStartDate`
            **Default from**: `CatalogueValidityStart`
          examples:
            - '2024-01-01'
        epdValidityExpiryDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Expiry date of EPD validity period. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `EpdValidityExpiryDate`
            **Path**: `Supplier[].Product[].LcaEnvironmental.EpdValidityExpiryDate`
          examples:
            - '2029-12-31'
            - null
        epdOperatorName:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Name of the EPD program operator that published the Environmental Product Declaration.

            **ETIM xChange**: `EpdOperatorName`
            **Path**: `Supplier[].Product[].LcaEnvironmental.EpdOperatorName`
          examples:
            - IBU - Institut Bauen und Umwelt e.V.
            - The International EPD System
            - null
        epdOperatorUri:
          type:
            - string
            - 'null'
          format: uri
          description: |
            URI/URL to the EPD program operator's website.

            **ETIM xChange**: `EpdOperatorUri`
            **Path**: `Supplier[].Product[].LcaEnvironmental.EpdOperatorUri`
          examples:
            - https://ibu-epd.com
            - https://www.environdec.com
            - null
        operatorEpdId:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            EPD identifier assigned by the program operator.

            **ETIM xChange**: `OperatorEpdId`
            **Path**: `Supplier[].Product[].LcaEnvironmental.OperatorEpdId`
          examples:
            - EPD-IBU-2024-001234
            - null
        manufacturerEpdId:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            EPD identifier assigned by the manufacturer for internal reference.

            **ETIM xChange**: `ManufacturerEpdId`
            **Path**: `Supplier[].Product[].LcaEnvironmental.ManufacturerEpdId`
          examples:
            - MFR-EPD-LED-2024-001
            - null
        productCategoryRulesDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Description of the Product Category Rules (PCR) used for the LCA/EPD.
            PCR defines the rules for the environmental assessment of a specific product category.

            **ETIM xChange**: `ProductCategoryRulesDescription`
            **Path**: `Supplier[].Product[].LcaEnvironmental.ProductCategoryRulesDescription`
          examples:
            - PCR 2019:14 Lighting equipment
            - EN 15804+A2 Construction products
            - null
        productCategoryRulesUri:
          type:
            - string
            - 'null'
          format: uri
          description: |
            URI/URL to the Product Category Rules (PCR) document.

            **ETIM xChange**: `ProductCategoryRulesUri`
            **Path**: `Supplier[].Product[].LcaEnvironmental.ProductCategoryRulesUri`
          examples:
            - https://www.environdec.com/pcr-library/pcr-2019-14
            - null
        productSpecificRulesDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Description of Product Specific Rules (PSR) applied in addition to PCR.
            PSR provides additional rules for sub-categories within a PCR.

            **ETIM xChange**: `ProductSpecificRulesDescription`
            **Path**: `Supplier[].Product[].LcaEnvironmental.ProductSpecificRulesDescription`
          examples:
            - PSR for LED lamps and luminaires
            - null
        productSpecificRulesUri:
          type:
            - string
            - 'null'
          format: uri
          description: |
            URI/URL to the Product Specific Rules (PSR) document.

            **ETIM xChange**: `ProductSpecificRulesUri`
            **Path**: `Supplier[].Product[].LcaEnvironmental.ProductSpecificRulesUri`
          examples:
            - https://www.environdec.com/psr-library/psr-led-lighting
            - null
        lifeCycleStage:
          type: string
          enum:
            - A1
            - A2
            - A3
            - A1-A3
            - A4
            - A5
            - B1
            - B2
            - B3
            - B4
            - B5
            - B6
            - B7
            - B1-B7
            - C1
            - C2
            - C3
            - C4
            - C1-C4
            - D
          description: |
            Life cycle assessment stage according to EN 15804.

            Product stage (A):
            - `A1`: Raw material supply
            - `A2`: Transport to manufacturer
            - `A3`: Manufacturing
            - `A1-A3`: Combined product stage
            - `A4`: Transport to building site
            - `A5`: Installation into building

            Use stage (B):
            - `B1`: Use/Application
            - `B2`: Maintenance
            - `B3`: Repair
            - `B4`: Replacement
            - `B5`: Refurbishment
            - `B6`: Operational energy use
            - `B7`: Operational water use
            - `B1-B7`: Combined use stage

            End of life stage (C):
            - `C1`: Deconstruction/demolition
            - `C2`: Transport to waste processing
            - `C3`: Waste processing
            - `C4`: Disposal
            - `C1-C4`: Combined end of life stage

            Beyond life cycle (D):
            - `D`: Reuse, recovery, recycling potential

            **ETIM xChange**: `LifeCycleStage`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].LifeCycleStage`
          examples:
            - A1-A3
            - B6
            - C1-C4
        lcaDeclarationIndicator:
          type: string
          enum:
            - MDE
            - MND
            - MNR
            - AGG
          description: |
            Type of LCA declaration data.

            - `MDE`: Manufacturer-specific data with external verification
            - `MND`: Manufacturer-specific data without external verification
            - `MNR`: Manufacturer-specific data not representative
            - `AGG`: Industry average/aggregated data

            **ETIM xChange**: `LcaDeclarationIndicator`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].LcaDeclarationIndicator`
          examples:
            - MDE
            - AGG
        declaredUnitGwpTotal:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Total Global Warming Potential (GWP) in kg CO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitGwpTotal`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitGwpTotal`
          examples:
            - 15.75
            - 0.85
        declaredUnitGwpFossil:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Fossil Global Warming Potential in kg CO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitGwpFossil`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitGwpFossil`
          examples:
            - 14.25
        declaredUnitGwpBiogenic:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Biogenic Global Warming Potential in kg CO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitGwpBiogenic`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitGwpBiogenic`
          examples:
            - 1.2
        declaredUnitGwpLuluc:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Global Warming Potential from Land Use and Land Use Change (GWP-LULUC) 
            in kg CO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitGwpLuluc`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitGwpLuluc`
          examples:
            - 0.25
        declaredUnitAp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Acidification Potential (AP) in kg SO2 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitAp`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitAp`
          examples:
            - 0.05
        declaredUnitEpFreshwater:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Eutrophication Potential for freshwater in kg PO4 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitEpFreshwater`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitEpFreshwater`
          examples:
            - 0.002
        declaredUnitEpMarine:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Eutrophication Potential for marine water (EP-marine) in kg N equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitEpMarine`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitEpMarine`
          examples:
            - 0.0015
        declaredUnitEpTerrestrial:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Eutrophication Potential for terrestrial ecosystems (EP-terrestrial) 
            in mol N equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitEpTerrestrial`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitEpTerrestrial`
          examples:
            - 0.12
        declaredUnitPocp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Photochemical Ozone Creation Potential (POCP) in kg NMVOC equivalent per declared unit.
            Also known as summer smog potential.

            **ETIM xChange**: `DeclaredUnitPocp`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitPocp`
          examples:
            - 0.035
        declaredUnitOdp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Ozone Depletion Potential (ODP) in kg CFC-11 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitOdp`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitOdp`
          examples:
            - 0.0000012
        declaredUnitAdpe:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Abiotic Depletion Potential for non-fossil resources (ADP-elements) 
            in kg Sb equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitAdpe`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitAdpe`
          examples:
            - 0.00025
        declaredUnitAdpf:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Abiotic Depletion Potential for fossil resources (ADP-fossil) in MJ per declared unit.

            **ETIM xChange**: `DeclaredUnitAdpf`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitAdpf`
          examples:
            - 185.5
        declaredUnitWdp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Water Deprivation Potential (WDP) in m³ world equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitWdp`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitWdp`
          examples:
            - 2.5
        declaredUnitPert:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Use of renewable primary energy resources (PERT) in MJ per declared unit.
            Total renewable primary energy.

            **ETIM xChange**: `DeclaredUnitPert`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitPert`
          examples:
            - 45.2
        declaredUnitPenrt:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Use of non-renewable primary energy resources (PENRT) in MJ per declared unit.
            Total non-renewable primary energy.

            **ETIM xChange**: `DeclaredUnitPenrt`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitPenrt`
          examples:
            - 195.8
        declaredUnitPm:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Particulate Matter emissions (PM) expressed as disease incidence per declared unit.

            **ETIM xChange**: `DeclaredUnitPm`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitPm`
          examples:
            - 0.0000015
        declaredUnitIrp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Ionising Radiation Potential (IRP) in kBq U235 equivalent per declared unit.

            **ETIM xChange**: `DeclaredUnitIrp`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitIrp`
          examples:
            - 1.25
        declaredUnitEtpfw:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Ecotoxicity Potential for freshwater (ETP-fw) in CTUe (Comparative Toxic Unit for ecosystems) 
            per declared unit.

            **ETIM xChange**: `DeclaredUnitEtpfw`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitEtpfw`
          examples:
            - 125.5
        declaredUnitHtpc:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Human Toxicity Potential - cancer effects (HTP-c) in CTUh (Comparative Toxic Unit for humans) 
            per declared unit.

            **ETIM xChange**: `DeclaredUnitHtpc`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitHtpc`
          examples:
            - 0.0000025
        declaredUnitHtpnc:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Human Toxicity Potential - non-cancer effects (HTP-nc) in CTUh (Comparative Toxic Unit for humans) 
            per declared unit.

            **ETIM xChange**: `DeclaredUnitHtpnc`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitHtpnc`
          examples:
            - 0.000045
        declaredUnitSqp:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Soil Quality Potential (SQP) - dimensionless indicator per declared unit.
            Measures the impact on soil quality.

            **ETIM xChange**: `DeclaredUnitSqp`
            **Path**: `Supplier[].Product[].LcaEnvironmental.LcaDeclaration[].DeclaredUnitSqp`
          examples:
            - 15.5
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          declaredUnitUnit: PCE
          declaredUnitQuantity: 1
          lcaReferenceLifetime: 25
          thirdPartyVerification: externally
          epdValidityStartDate: '2024-01-01'
          epdValidityExpiryDate: '2029-12-31'
          epdOperatorName: The International EPD System
          epdOperatorUri: https://www.environdec.com
          operatorEpdId: S-P-12345
          manufacturerEpdId: MFR-EPD-LED-2024-001
          productCategoryRulesDescription: PCR 2019:14 Lighting equipment
          productCategoryRulesUri: https://www.environdec.com/pcr-library/pcr-2019-14
          lifeCycleStage: A1-A3
          lcaDeclarationIndicator: MDE
          declaredUnitGwpTotal: 15.75
          declaredUnitGwpFossil: 14.25
          declaredUnitGwpBiogenic: 1.2
          declaredUnitGwpLuluc: 0.3
          declaredUnitAp: 0.05
          declaredUnitEpFreshwater: 0.002
          declaredUnitPocp: 0.035
          declaredUnitOdp: 0.0000012
          declaredUnitAdpf: 185.5
          declaredUnitPert: 45.2
          declaredUnitPenrt: 195.8
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          declaredUnitUnit: PCE
          declaredUnitQuantity: 1
          lcaReferenceLifetime: 25
          thirdPartyVerification: externally
          epdValidityStartDate: '2024-01-01'
          epdValidityExpiryDate: '2029-12-31'
          epdOperatorName: The International EPD System
          epdOperatorUri: https://www.environdec.com
          operatorEpdId: S-P-12345
          manufacturerEpdId: MFR-EPD-LED-2024-001
          productCategoryRulesDescription: PCR 2019:14 Lighting equipment
          productCategoryRulesUri: https://www.environdec.com/pcr-library/pcr-2019-14
          lifeCycleStage: C1-C4
          lcaDeclarationIndicator: AGG
          declaredUnitGwpTotal: 2.5
          declaredUnitGwpFossil: 2.3
          declaredUnitAdpf: 35
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          declaredUnitUnit: PCE
          declaredUnitQuantity: 1
          lcaReferenceLifetime: 25
          thirdPartyVerification: externally
          epdValidityStartDate: '2024-01-01'
          epdValidityExpiryDate: '2029-12-31'
          epdOperatorName: The International EPD System
          epdOperatorUri: https://www.environdec.com
          operatorEpdId: S-P-12345
          manufacturerEpdId: MFR-EPD-LED-2024-001
          productCategoryRulesDescription: PCR 2019:14 Lighting equipment
          productCategoryRulesUri: https://www.environdec.com/pcr-library/pcr-2019-14
          lifeCycleStage: D
          lcaDeclarationIndicator: MDE
          declaredUnitGwpTotal: -5.2
          declaredUnitAdpf: -45
        - manufacturerIdGln: '9876543210987'
          manufacturerProductNumber: CABLE-CU-100M
          declaredUnitUnit: KGM
          declaredUnitQuantity: 1
          lcaReferenceLifetime: 50
          thirdPartyVerification: internally
          epdValidityStartDate: '2023-06-15'
          lifeCycleStage: A1-A3
          lcaDeclarationIndicator: MND
          declaredUnitGwpTotal: 8.5
          declaredUnitAdpe: 0.0015
          declaredUnitAdpf: 120
    ProductStatus:
      type:
        - string
        - 'null'
      enum:
        - PRE-LAUNCH
        - ACTIVE
        - ON HOLD
        - PLANNED WITHDRAWAL
        - OBSOLETE
        - null
      description: |
        Current product lifecycle status.

        - `PRE-LAUNCH`: Product announced but not yet available for sale
        - `ACTIVE`: Product is currently available for sale
        - `ON HOLD`: Product temporarily unavailable
        - `PLANNED WITHDRAWAL`: Product scheduled for discontinuation
        - `OBSOLETE`: Product no longer available

        **ETIM xChange**: `ProductStatus`  
        **Path**: `Supplier[].Product[].ProductDetails.ProductStatus`
      examples:
        - ACTIVE
        - PRE-LAUNCH
        - OBSOLETE
        - null
    ProductType:
      type:
        - string
        - 'null'
      enum:
        - PHYSICAL
        - CONTRACT
        - LICENCE
        - SERVICE
        - null
      description: |
        Type classification of the product.

        - `PHYSICAL`: Physical product (tangible item)
        - `CONTRACT`: Service contract or agreement
        - `LICENCE`: Software or usage license
        - `SERVICE`: Service offering

        **ETIM xChange**: `ProductType`  
        **Path**: `Supplier[].Product[].ProductDetails.ProductType`
      examples:
        - PHYSICAL
        - SERVICE
        - LICENCE
        - null
    AttachmentType:
      type: string
      enum:
        - ATX001
        - ATX002
        - ATX003
        - ATX004
        - ATX010
        - ATX011
        - ATX012
        - ATX013
        - ATX014
        - ATX015
        - ATX016
        - ATX017
        - ATX018
        - ATX019
        - ATX020
        - ATX021
        - ATX022
        - ATX023
        - ATX024
        - ATX025
        - ATX026
        - ATX099
      description: |
        ETIM standardized attachment/document type codes for product-level attachments.

        Product-level codes (per ETIM xChange V2.0 schema):
        - `ATX001`: Product image
        - `ATX002`: Ambience photo
        - `ATX003`: Technical image
        - `ATX004`: Technical drawing
        - `ATX010`: User manual
        - `ATX011`: Installation guide
        - `ATX012`: Maintenance manual
        - `ATX013`: Spare parts list
        - `ATX014`: Data sheet
        - `ATX015`: Product brochure
        - `ATX016`: Product video
        - `ATX017`: Safety data sheet (SDS/MSDS)
        - `ATX018`: Declaration of conformity
        - `ATX019`: Test report
        - `ATX020`: Marketing text
        - `ATX021`: Dimension drawing
        - `ATX022`: Circuit diagram
        - `ATX023`: Application example
        - `ATX024`: CAD file
        - `ATX025`: BIM model
        - `ATX026`: Certificate (CE, RoHS, etc.)
        - `ATX099`: Other attachment type

        **ETIM xChange**: `AttachmentType`  
        **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentType`
      examples:
        - ATX001
        - ATX014
        - ATX018
    AttachmentTypeSpecification:
      type:
        - string
        - 'null'
      enum:
        - MDX002
        - MDX005
        - MDX007
        - MDX008
        - MDX010
        - MDX012
        - MDX013
        - MDX014
        - MDX015
        - MDX016
        - MDX017
        - MDX018
        - MDX019
        - MDX020
        - MDX021
        - MDX022
        - MDX023
        - MDX024
        - MDX025
        - MDX026
        - MDX027
        - MDX028
        - MDX029
        - MDX030
        - MDX033
        - MDX034
        - MDX035
        - MDX037
        - MDX038
        - MDX039
        - MDX041
        - MDX042
        - MDX045
        - MDX047
        - MDX048
        - MDX049
        - MDX050
        - MDX051
        - MDX052
        - MDX053
        - MDX054
        - MDX055
        - MDX057
        - MDX058
        - MDX059
        - MDX060
        - MDX061
        - MDX062
        - MDX063
        - MDX064
        - MDX065
        - MDX100
        - MDX101
        - MDX102
        - MDX103
        - MDX104
        - MDX105
        - MDX106
        - MDX107
        - MDX108
        - MDX109
        - MDX999
        - null
      description: |
        ETIM standardized media/attachment specification codes providing additional detail about the attachment type.

        Examples:
        - `MDX002`: Front view
        - `MDX005`: Side view
        - `MDX007`: Technical specification
        - `MDX010`: Wiring diagram
        - `MDX020`: Assembly instructions
        - `MDX100`: Video
        - `MDX101`: 3D model
        - `MDX105`: M4A
        - `MDX106`: WMA
        - `MDX107`: AIFF
        - `MDX108`: APE
        - `MDX109`: WEBM
        - `MDX999`: Other

        **ETIM xChange**: `AttachmentTypeSpecification`  
        **Path**: `Supplier[].Product[].ProductAttachments[].AttachmentTypeSpecification`
      examples:
        - MDX002
        - MDX007
        - MDX020
        - null
    WeeeCategory:
      type:
        - string
        - 'null'
      enum:
        - '1'
        - '2'
        - '3'
        - '4'
        - '5'
        - '6'
        - null
      description: |
        WEEE (Waste Electrical and Electronic Equipment) category for electronic products according to EU directive.

        Categories:
        - `1`: Large household appliances
        - `2`: Small household appliances
        - `3`: IT and telecommunications equipment
        - `4`: Consumer equipment (audio/video)
        - `5`: Lighting equipment
        - `6`: Electrical and electronic tools

        **ETIM xChange**: `WeeeCategory`  
        **Path**: `Supplier[].Product[].Legislation.WeeeCategory`
      examples:
        - '3'
        - '5'
        - null
    ProductResponse:
      type: object
      description: |
        Response containing a single product with all its components.

        The product key (`manufacturerIdGln` + `manufacturerProductNumber`) is at the root level,
        with nested objects for each component:
        - `details`: GTINs, brand, dates, customs data, status, warranties
        - `descriptions`: Array of multilingual descriptions (nested, not flattened)
        - `etimClassifications`: Array of ETIM classifications with embedded features (nested)
        - `lcaEnvironmental`: Life Cycle Assessment and Environmental Product Declaration (EPD) data

        This structure aligns with the subresource endpoints (`/details`, 
        `/descriptions`, `/etim-classifications`, `/lca-environmental`) which all include the key at the root level.
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/ProductResponseData'
      examples:
        - data:
            manufacturerIdGln: '1234567890123'
            manufacturerProductNumber: '929002376910'
            details:
              productGtins:
                - '8718699673826'
              brandName: Hue
              productAnnouncementDate: '2024-01-15'
              productValidityDate: '2024-03-01'
              productObsolescenceDate: null
              customsCommodityCode: '8539502090'
              countryOfOrigin:
                - NL
              productStatus: ACTIVE
              productType: PHYSICAL
              customisableProduct: false
              hasSerialNumber: true
              warrantyConsumer: 24
              warrantyBusiness: 36
            descriptions:
              - descriptionLanguage: en-GB
                minimalProductDescription: LED Smart Bulb E27
                uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Bulb with Bluetooth
                productKeyword:
                  - smart lighting
                  - LED
                  - color
            etimClassifications:
              - etimClassCode: EC002745
                etimClassVersion: 1
                etimReleaseVersion: '9.0'
                etimFeatures:
                  - etimFeatureCode: EF012345
                    etimValueNumeric: 10
            lcaEnvironmental:
              declaredUnitUnit: PCE
              declaredUnitQuantity: 1
              lcaReferenceLifetime: 25
              thirdPartyVerification: externally
              epdValidityStartDate: '2024-01-01'
              epdValidityExpiryDate: '2029-12-31'
              epdOperatorName: The International EPD System
              epdOperatorUri: https://www.environdec.com
              operatorEpdId: S-P-12345
              lcaDeclaration:
                - lifeCycleStage: A1-A3
                  lcaDeclarationIndicator: MDE
                  declaredUnitGwpTotal: 15.75
                  declaredUnitGwpFossil: 14.25
                - lifeCycleStage: C1-C4
                  lcaDeclarationIndicator: AGG
                  declaredUnitGwpTotal: 2.5
    ProductResponseData:
      type: object
      description: |
        Single product data with all its components.

        The product key (`manufacturerIdGln` + `manufacturerProductNumber`) is at the root level,
        with nested objects for each component:
        - `details`: GTINs, brand, dates, customs data, status, warranties
        - `descriptions`: Array of multilingual descriptions (nested, not flattened)
        - `etimClassifications`: Array of ETIM classifications with embedded features (nested)
        - `lcaEnvironmental`: Life Cycle Assessment and Environmental Product Declaration (EPD) data
        - `attachments`: Product documents, images, videos, and other attachments (nested)

        This structure aligns with the subresource endpoints (`/details`, `/descriptions`,
        `/etim-classifications`, `/lca-environmental`, `/attachments`) which all include
        the key at the root level.
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
        - details
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the manufacturer
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Manufacturer's unique product number/code
          examples:
            - '929002376910'
        details:
          $ref: '#/components/schemas/ProductDetails'
          description: |
            Core product information including GTINs, brand,
            dates, customs data, status, type, warranties, and product groups.
        descriptions:
          type:
            - array
            - 'null'
          description: |
            Array of multilingual product descriptions. Each item contains descriptions
            in a specific language. Returns null if no descriptions are available.
          items:
            $ref: '#/components/schemas/ProductDescription'
        etimClassifications:
          type:
            - array
            - 'null'
          description: |
            Array of ETIM classifications for this product with embedded features.
            Returns null if the product has no ETIM classifications.
            Multiple classifications can exist across different ETIM releases.
          items:
            $ref: '#/components/schemas/EtimClassification'
        lcaEnvironmental:
          anyOf:
            - $ref: '#/components/schemas/LcaEnvironmental'
            - type: 'null'
          description: |
            Life Cycle Assessment and Environmental Product Declaration (EPD) data.
            Returns null if the product has no LCA/EPD data.

            **ETIM xChange**: `LcaEnvironmental`  
            **Path**: `Supplier[].Product[].LcaEnvironmental`
        attachments:
          type:
            - array
            - 'null'
          description: |
            Array of product attachments including images, documents, certificates, and other files.
            Each item groups attachment details by type and order.
            Returns null if the product has no attachments.

            **ETIM xChange**: `ProductAttachments`  
            **Path**: `Supplier[].Product[].ProductAttachments[]`
          items:
            $ref: '#/components/schemas/ProductAttachment'
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          details:
            productGtins:
              - '8718699673826'
            brandName: Hue
            productAnnouncementDate: '2024-01-15'
            productValidityDate: '2024-03-01'
            productObsolescenceDate: null
            customsCommodityCode: '8539502090'
            countryOfOrigin:
              - NL
            productStatus: ACTIVE
            productType: PHYSICAL
            customisableProduct: false
            hasSerialNumber: true
            warrantyConsumer: 24
            warrantyBusiness: 36
          descriptions:
            - descriptionLanguage: en-GB
              minimalProductDescription: LED Smart Bulb E27
              uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Bulb with Bluetooth
              productKeyword:
                - smart lighting
                - LED
                - color
          etimClassifications:
            - etimClassCode: EC002745
              etimClassVersion: 1
              etimReleaseVersion: '9.0'
              etimFeatures:
                - etimFeatureCode: EF012345
                  etimValueNumeric: 10
          lcaEnvironmental:
            declaredUnitUnit: PCE
            declaredUnitQuantity: 1
            lcaReferenceLifetime: 25
            thirdPartyVerification: externally
            epdValidityStartDate: '2024-01-01'
            epdValidityExpiryDate: '2029-12-31'
            epdOperatorName: The International EPD System
            epdOperatorUri: https://www.environdec.com
            operatorEpdId: S-P-12345
            lcaDeclaration:
              - lifeCycleStage: A1-A3
                lcaDeclarationIndicator: MDE
                declaredUnitGwpTotal: 15.75
                declaredUnitGwpFossil: 14.25
              - lifeCycleStage: C1-C4
                lcaDeclarationIndicator: AGG
                declaredUnitGwpTotal: 2.5
          attachments:
            - attachmentType: ATX001
              attachmentTypeSpecification: MDX002
              attachmentOrder: 1
              attachmentDetails:
                - attachmentUri: https://images.manufacturer.com/products/LED-12345-front.jpg
                  attachmentFilename: LED-12345-front.jpg
                  attachmentLanguage:
                    - en-GB
            - attachmentType: ATX014
              attachmentOrder: 2
              attachmentDetails:
                - attachmentUri: https://cdn.manufacturer.com/products/datasheets/LED-12345-en.pdf
                  attachmentFilename: LED-12345-datasheet-en.pdf
                  attachmentLanguage:
                    - en-GB
                  attachmentIssueDate: '2024-06-15'
    ProductDetailsResponse:
      type: object
      description: |
        Response containing core product information for a single product.
        The product key is at the root level, with details nested inside.

        This structure aligns with other single-product subresource responses
        (`/descriptions`, `/etim-classifications`).

        Note: Product descriptions are available through the dedicated `/descriptions` subresource
        which supports language filtering.
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/ProductDetailsResponseData'
      examples:
        - data:
            manufacturerIdGln: '1234567890123'
            manufacturerProductNumber: '929002376910'
            details:
              productGtins:
                - '8718699673826'
              brandName: Hue
              productValidityDate: '2024-03-01'
              countryOfOrigin:
                - NL
              productStatus: ACTIVE
              productType: PHYSICAL
              customisableProduct: false
              hasSerialNumber: true
              warrantyConsumer: 24
              warrantyBusiness: 36
              relatedManufacturerProductGroup:
                - Smart Lighting
                - LED Bulbs
    ProductDetailsResponseData:
      type: object
      description: |
        Single product identification keys with core product details.
        The product key is at the root level, with details nested inside.
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the manufacturer
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Manufacturer's unique product number/code
          examples:
            - '929002376910'
        details:
          $ref: '#/components/schemas/ProductDetails'
          description: |
            Core product information including identifiers,
            brand, dates, customs data, status, warranties, and product groups.
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          details:
            productGtins:
              - '8718699673826'
            brandName: Hue
            productValidityDate: '2024-03-01'
            countryOfOrigin:
              - NL
            productStatus: ACTIVE
            productType: PHYSICAL
            customisableProduct: false
            hasSerialNumber: true
            warrantyConsumer: 24
            warrantyBusiness: 36
            relatedManufacturerProductGroup:
              - Smart Lighting
              - LED Bulbs
    ProductDescriptionsResponse:
      type: object
      description: |
        Response containing multilingual product descriptions for a single product.
        Returns the product identification keys and a nested array of `ProductDescription` objects,
        each containing descriptions in a specific language.

        Unlike the bulk endpoint `/products/bulk/descriptions` which uses a flattened structure
        optimized for ETL, this single-product endpoint returns descriptions in their natural
        nested format for easier consumption.

        **Language Filtering**: Use the optional `language` query parameter to filter
        descriptions to specific language(s).
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/ProductDescriptionsResponseData'
      examples:
        - data:
            manufacturerIdGln: '1234567890123'
            manufacturerProductNumber: '929002376910'
            descriptions:
              - descriptionLanguage: en-GB
                minimalProductDescription: LED Smart Bulb E27 White & Color
                uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Bulb, 806 lumens, Bluetooth
                fullProductDescription: The Philips Hue White and Color Ambiance E27 LED Smart Bulb offers 16 million colors and 50,000 shades of white light. Control it with your smartphone or voice using Alexa, Google Assistant, or Apple HomeKit.
                productKeyword:
                  - smart lighting
                  - LED
                  - color
                  - Bluetooth
                productPageUrl: https://www.philips.com/products/hue-white-color-e27
              - descriptionLanguage: de-DE
                minimalProductDescription: LED Smart-Lampe E27 Weiß & Farbe
                uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart-Lampe, 806 Lumen, Bluetooth
        - data:
            manufacturerIdGln: '1234567890123'
            manufacturerProductNumber: '929002376910'
            descriptions: null
    ProductDescriptionsResponseData:
      type: object
      description: |
        Single product identification keys with multilingual product descriptions.
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the manufacturer
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Manufacturer's unique product number/code
          examples:
            - '929002376910'
        descriptions:
          type:
            - array
            - 'null'
          description: |
            Array of product descriptions. Each item contains descriptions in a specific language.
            Returns null if no descriptions are available, or an empty array if filtering
            by language yields no matches.
          items:
            $ref: '#/components/schemas/ProductDescription'
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          descriptions:
            - descriptionLanguage: en-GB
              minimalProductDescription: LED Smart Bulb E27 White & Color
              uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Bulb, 806 lumens, Bluetooth
              fullProductDescription: The Philips Hue White and Color Ambiance E27 LED Smart Bulb offers 16 million colors and 50,000 shades of white light. Control it with your smartphone or voice using Alexa, Google Assistant, or Apple HomeKit.
              productKeyword:
                - smart lighting
                - LED
                - color
                - Bluetooth
              productPageUrl: https://www.philips.com/products/hue-white-color-e27
            - descriptionLanguage: de-DE
              minimalProductDescription: LED Smart-Lampe E27 Weiß & Farbe
              uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart-Lampe, 806 Lumen, Bluetooth
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          descriptions: null
    ProductEtimClassificationsResponse:
      type: object
      description: |
        Response containing all ETIM classifications for a single product.
        Returns the product identification keys and all associated ETIM classifications.
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/ProductEtimClassificationsResponseData'
      examples:
        - data:
            manufacturerIdGln: '1234567890123'
            manufacturerProductNumber: '929002376910'
            etimClassifications:
              - etimClassCode: EC002745
                etimClassVersion: 1
                etimReleaseVersion: '9.0'
                etimFeatures:
                  - etimFeatureCode: EF000123
                    etimValueCode: EV000789
                  - etimFeatureCode: EF000456
                    etimValueNumeric: 230
              - etimClassCode: EC001234
                etimClassVersion: 2
                etimReleaseVersion: '11.0'
                etimFeatures:
                  - etimFeatureCode: EF000789
                    etimValueLogical: true
    ProductEtimClassificationsResponseData:
      type: object
      description: |
        Single product identification keys with all associated ETIM classifications.
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the manufacturer
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Manufacturer's unique product number/code
          examples:
            - '929002376910'
        etimClassifications:
          type:
            - array
            - 'null'
          description: |
            Array of ETIM classifications for this product.
            May be null if the product has no ETIM classifications.
            Multiple classifications can exist across different ETIM releases.
          items:
            $ref: '#/components/schemas/EtimClassification'
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          etimClassifications:
            - etimClassCode: EC002745
              etimClassVersion: 1
              etimReleaseVersion: '9.0'
              etimFeatures:
                - etimFeatureCode: EF000123
                  etimValueCode: EV000789
                - etimFeatureCode: EF000456
                  etimValueNumeric: 230
            - etimClassCode: EC001234
              etimClassVersion: 2
              etimReleaseVersion: '11.0'
              etimFeatures:
                - etimFeatureCode: EF000789
                  etimValueLogical: true
    BulkProductDetailsResponse:
      type: object
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ProductDetailsSummary'
          description: Array of product details summaries
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
          description: Cursor-based pagination metadata
      examples:
        - data:
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376910'
              productGtins:
                - '8718699673826'
              brandName: Hue
              productValidityDate: '2024-03-01'
              countryOfOrigin:
                - NL
              productStatus: ACTIVE
              productType: PHYSICAL
              customisableProduct: false
              hasSerialNumber: true
              warrantyConsumer: 24
              warrantyBusiness: 12
              relatedManufacturerProductGroup:
                - Smart Lighting
                - LED Bulbs
          meta:
            cursor: eyJpZCI6MTIzfQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 1523
    BulkProductDescriptionsResponse:
      type: object
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ProductDescriptionsSummary'
          description: |
            Array of flattened product descriptions.
            Each row represents a single language description with the product identifier.
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
          description: Cursor-based pagination metadata
      examples:
        - data:
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376910'
              descriptionLanguage: en-GB
              minimalProductDescription: LED Smart Bulb E27
              uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Bulb
              fullProductDescription: The Philips Hue White and Color Ambiance E27 LED Smart Bulb offers 16 million colors...
              productKeyword:
                - smart lighting
                - LED
                - color
              productPageUrl: https://www.philips.com/products/hue-white-color-e27
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376910'
              descriptionLanguage: de-DE
              minimalProductDescription: LED Smart Lampe E27
              uniqueMainProductDescription: Philips Hue White and Color Ambiance E27 LED Smart Lampe
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376911'
              descriptionLanguage: en-GB
              minimalProductDescription: LED Downlight 10W
              uniqueMainProductDescription: Philips CoreLine Recessed LED Downlight 10W 4000K
          meta:
            cursor: eyJpZCI6MTIzfQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 4523
    BulkProductEtimClassificationFeaturesResponse:
      type: object
      description: |
        Bulk response containing flattened product ETIM classification features with cursor-based pagination.

        **Flattened Structure**: Each row represents a single feature value within a product's ETIM classification.
        This structure is optimized for:
        - Predictable payload sizes (each row has consistent structure)
        - Efficient cursor-based pagination by feature
        - ETL/data warehouse ingestion
        - Streaming data processing

        **Payload Optimization**: Optional properties with null values are omitted from the response
        to minimize payload size. Clients should treat missing properties as null/not applicable.

        **Data Reconstruction**: To reconstruct the hierarchical structure:
        1. Group rows by `manufacturerIdGln` + `manufacturerProductNumber` for products
        2. Within each product, group by `etimClassCode` + `etimClassVersion` for classifications
        3. Features are individual rows within each classification group

        **Classification-Only Rows**: Products with classifications but no features are represented
        with `etimFeatureCode` omitted to ensure all classifications are included.
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: |
            Array of flattened product ETIM classification features.
            Each item represents a single feature value for a product classification.

            Rows are ordered by:
            1. `manufacturerIdGln` (ascending)
            2. `manufacturerProductNumber` (ascending)
            3. `etimClassCode` (ascending)
            4. `etimFeatureCode` (ascending, nulls first)
          items:
            $ref: '#/components/schemas/ProductEtimClassificationFeature'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
          description: |
            Cursor-based pagination metadata.

            The cursor encodes the position based on the composite key:
            `manufacturerIdGln` + `manufacturerProductNumber` + `etimClassCode` + `etimFeatureCode`
      examples:
        - data:
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376910'
              etimClassCode: EC002745
              etimClassVersion: 1
              etimReleaseVersion: '9.0'
              etimFeatureCode: EF000123
              etimValueCode: EV000789
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376910'
              etimClassCode: EC002745
              etimClassVersion: 1
              etimReleaseVersion: '9.0'
              etimFeatureCode: EF000456
              etimValueNumeric: 230
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376910'
              etimClassCode: EC002745
              etimClassVersion: 1
              etimReleaseVersion: '10.0'
              etimFeatureCode: EF000789
              etimValueLogical: true
            - manufacturerIdGln: '9876543210987'
              manufacturerProductNumber: LED-12345-A
              etimClassCode: EC001234
              etimClassVersion: 2
              etimReleaseVersion: '11.0'
          meta:
            cursor: eyJtYW51ZmFjdHVyZXJJZEdsbkgiOiI5ODc2NTQzMjEwOTg3IiwibWFudWZhY3R1cmVyUHJvZHVjdE51bWJlciI6IkxFRC0xMjM0NS1BIiwiZXRpbUNsYXNzQ29kZSI6IkVDMDAxMjM0IiwiZXRpbUZlYXR1cmVDb2RlIjpudWxsfQ==
            hasNext: true
            hasPrev: false
            limit: 1000
            estimatedTotal: 245830
    ProductLcaEnvironmentalResponse:
      type: object
      description: |
        Response containing LCA environmental data for a single product.
        The product key is at the root level, with LCA environmental data nested inside.

        This structure aligns with other single-product subresource responses
        (`/identification`, `/details`, `/descriptions`, `/etim-classifications`).

        Contains Environmental Product Declaration (EPD) information, declared units,
        reference lifetime, third-party verification status, and life cycle assessment
        declarations for different stages.
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/ProductLcaEnvironmentalResponseData'
      examples:
        - data:
            manufacturerIdGln: '1234567890123'
            manufacturerProductNumber: '929002376910'
            lcaEnvironmental:
              declaredUnitUnit: PCE
              declaredUnitQuantity: 1
              lcaReferenceLifetime: 25
              thirdPartyVerification: externally
              epdValidityStartDate: '2024-01-01'
              epdValidityExpiryDate: '2029-12-31'
              epdOperatorName: The International EPD System
              operatorEpdId: S-P-12345
              productCategoryRulesDescription: PCR 2019:14 Lighting equipment
              lcaDeclaration:
                - lifeCycleStage: A1-A3
                  lcaDeclarationIndicator: MDE
                  declaredUnitGwpTotal: 15.75
                  declaredUnitGwpFossil: 14.25
                  declaredUnitGwpBiogenic: 1.2
                - lifeCycleStage: C1-C4
                  lcaDeclarationIndicator: AGG
                  declaredUnitGwpTotal: 2.5
        - data:
            manufacturerIdGln: '1234567890123'
            manufacturerProductNumber: LED-NO-EPD-001
            lcaEnvironmental: null
    ProductLcaEnvironmentalResponseData:
      type: object
      description: |
        Single product identification keys with LCA environmental data.
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the manufacturer
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Manufacturer's unique product number/code
          examples:
            - '929002376910'
        lcaEnvironmental:
          anyOf:
            - $ref: '#/components/schemas/LcaEnvironmental'
            - type: 'null'
          description: |
            LCA environmental data including EPD information, declared units,
            and life cycle assessment declarations. Null if no LCA data is available
            for this product.
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          lcaEnvironmental:
            declaredUnitUnit: PCE
            declaredUnitQuantity: 1
            lcaReferenceLifetime: 25
            thirdPartyVerification: externally
            epdValidityStartDate: '2024-01-01'
            epdValidityExpiryDate: '2029-12-31'
            epdOperatorName: The International EPD System
            operatorEpdId: S-P-12345
            productCategoryRulesDescription: PCR 2019:14 Lighting equipment
            lcaDeclaration:
              - lifeCycleStage: A1-A3
                lcaDeclarationIndicator: MDE
                declaredUnitGwpTotal: 15.75
                declaredUnitGwpFossil: 14.25
                declaredUnitGwpBiogenic: 1.2
              - lifeCycleStage: C1-C4
                lcaDeclarationIndicator: AGG
                declaredUnitGwpTotal: 2.5
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: LED-NO-EPD-001
          lcaEnvironmental: null
    BulkProductLcaDeclarationsResponse:
      type: object
      description: |
        Bulk response containing flattened product LCA declarations with cursor-based pagination.

        **Flattened Structure**: Each row represents a single life cycle declaration within a product's 
        LCA environmental data. This structure is optimized for:
        - Predictable payload sizes (each row has consistent structure)
        - Efficient cursor-based pagination by declaration
        - ETL/data warehouse ingestion
        - Streaming data processing
        - Filtering by life cycle stage

        **Payload Optimization**: Optional properties with null values are omitted from the response
        to minimize payload size. Clients should treat missing properties as null/not applicable.

        **Parent Context**: Each row includes key parent fields from LcaEnvironmental
        (`declaredUnitUnit`, `declaredUnitQuantity`, `lcaReferenceLifetime`, `thirdPartyVerification`,
        `epdValidityStartDate`, `epdValidityExpiryDate`, `epdOperatorName`, `epdOperatorUri`,
        `operatorEpdId`, `manufacturerEpdId`, `productCategoryRulesDescription`, `productCategoryRulesUri`,
        `productSpecificRulesDescription`, `productSpecificRulesUri`)
        to provide necessary context for interpreting the environmental indicators.

        **Data Reconstruction**: To reconstruct the hierarchical structure:
        1. Group rows by `manufacturerIdGln` + `manufacturerProductNumber` for products
        2. All rows for a product share the same parent context (declared unit, lifetime, verification, EPD metadata)
        3. Each row represents a different life cycle stage (A1-A3, B1-B7, C1-C4, D)
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: |
            Array of flattened product LCA declarations.
            Each item represents a single life cycle stage declaration for a product.

            Rows are ordered by:
            1. `manufacturerIdGln` (ascending)
            2. `manufacturerProductNumber` (ascending)
            3. `lifeCycleStage` (ascending)
          items:
            $ref: '#/components/schemas/ProductLcaDeclarationSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
          description: |
            Cursor-based pagination metadata.

            The cursor encodes the position based on the composite key:
            `manufacturerIdGln` + `manufacturerProductNumber` + `lifeCycleStage`
      examples:
        - data:
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376910'
              declaredUnitUnit: PCE
              declaredUnitQuantity: 1
              lcaReferenceLifetime: 25
              thirdPartyVerification: externally
              epdValidityStartDate: '2024-01-01'
              epdValidityExpiryDate: '2029-12-31'
              epdOperatorName: The International EPD System
              operatorEpdId: S-P-12345
              productCategoryRulesDescription: PCR 2019:14 Lighting equipment
              lifeCycleStage: A1-A3
              lcaDeclarationIndicator: MDE
              declaredUnitGwpTotal: 15.75
              declaredUnitGwpFossil: 14.25
              declaredUnitGwpBiogenic: 1.2
              declaredUnitAp: 0.05
              declaredUnitAdpf: 185.5
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376910'
              declaredUnitUnit: PCE
              declaredUnitQuantity: 1
              lcaReferenceLifetime: 25
              thirdPartyVerification: externally
              epdValidityStartDate: '2024-01-01'
              epdValidityExpiryDate: '2029-12-31'
              epdOperatorName: The International EPD System
              epdOperatorUri: https://www.environdec.com
              operatorEpdId: S-P-12345
              manufacturerEpdId: MFR-EPD-LED-2024-001
              productCategoryRulesDescription: PCR 2019:14 Lighting equipment
              lifeCycleStage: C1-C4
              lcaDeclarationIndicator: AGG
              declaredUnitGwpTotal: 2.5
              declaredUnitAdpf: 35
            - manufacturerIdGln: '1234567890123'
              manufacturerProductNumber: '929002376910'
              declaredUnitUnit: PCE
              declaredUnitQuantity: 1
              lcaReferenceLifetime: 25
              thirdPartyVerification: externally
              epdValidityStartDate: '2024-01-01'
              epdValidityExpiryDate: '2029-12-31'
              epdOperatorName: The International EPD System
              epdOperatorUri: https://www.environdec.com
              operatorEpdId: S-P-12345
              manufacturerEpdId: MFR-EPD-LED-2024-001
              productCategoryRulesDescription: PCR 2019:14 Lighting equipment
              lifeCycleStage: D
              lcaDeclarationIndicator: MDE
              declaredUnitGwpTotal: -5.2
              declaredUnitAdpf: -45
            - manufacturerIdGln: '9876543210987'
              manufacturerProductNumber: CABLE-CU-100M
              declaredUnitUnit: KGM
              declaredUnitQuantity: 1
              lcaReferenceLifetime: 50
              thirdPartyVerification: internally
              epdValidityStartDate: '2023-06-15'
              lifeCycleStage: A1-A3
              lcaDeclarationIndicator: MND
              declaredUnitGwpTotal: 8.5
              declaredUnitAdpe: 0.0015
              declaredUnitAdpf: 120
          meta:
            cursor: eyJtYW51ZmFjdHVyZXJJZEdsbkgiOiI5ODc2NTQzMjEwOTg3IiwibWFudWZhY3R1cmVyUHJvZHVjdE51bWJlciI6IkNBQkxFLUNVLTEwME0iLCJsaWZlQ3ljbGVTdGFnZSI6IkExLUEzIn0=
            hasNext: true
            hasPrev: false
            limit: 1000
            estimatedTotal: 12540
    ProductAttachmentsResponse:
      type: object
      description: |
        Response containing product attachments for a single product.
        Returns the product identification keys and a nested array of `ProductAttachment` objects,
        each containing attachment type, specification, display order, and file details.

        Unlike the bulk endpoint `/products/bulk/attachments` which uses a flattened structure
        optimized for ETL, this single-product endpoint returns attachments in their natural
        nested format for easier consumption.

        **ETIM xChange**: `ProductAttachments[]`
        **Path**: `Supplier[].Product[].ProductAttachments[]`
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/ProductAttachmentsResponseData'
      examples:
        - data:
            manufacturerIdGln: '1234567890123'
            manufacturerProductNumber: '929002376910'
            attachments:
              - attachmentType: ATX001
                attachmentTypeSpecification: MDX002
                attachmentOrder: 1
                attachmentDetails:
                  - attachmentUri: https://images.manufacturer.com/products/LED-12345-front.jpg
                    attachmentFilename: LED-12345-front.jpg
                    attachmentLanguage:
                      - en-GB
                    attachmentDescription:
                      - language: en-GB
                        attachmentDescription: Front view product image
              - attachmentType: ATX014
                attachmentOrder: 2
                attachmentDetails:
                  - attachmentUri: https://cdn.manufacturer.com/products/datasheets/LED-12345-en.pdf
                    attachmentFilename: LED-12345-datasheet-en.pdf
                    attachmentLanguage:
                      - en-GB
                    attachmentIssueDate: '2024-06-15'
        - data:
            manufacturerIdGln: '1234567890123'
            manufacturerProductNumber: '929002376910'
            attachments: null
    ProductAttachmentsResponseData:
      type: object
      description: |
        Single product identification keys with product attachment data.
        Returns the product composite key and a nested array of `ProductAttachment` objects,
        each containing attachment type, specification, ordering, and detailed file information.
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
      properties:
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the manufacturer
          examples:
            - '1234567890123'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Manufacturer's unique product number/code
          examples:
            - '929002376910'
        attachments:
          type:
            - array
            - 'null'
          description: |
            Array of product attachments. Each item contains an attachment type with
            one or more attachment detail records (e.g., same datasheet in different languages).
            Returns null if no attachments are available.
          items:
            $ref: '#/components/schemas/ProductAttachment'
      examples:
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          attachments:
            - attachmentType: ATX001
              attachmentTypeSpecification: MDX002
              attachmentOrder: 1
              attachmentDetails:
                - attachmentUri: https://images.manufacturer.com/products/LED-12345-front.jpg
                  attachmentFilename: LED-12345-front.jpg
                  attachmentLanguage:
                    - en-GB
                  attachmentDescription:
                    - language: en-GB
                      attachmentDescription: Front view product image
            - attachmentType: ATX014
              attachmentOrder: 2
              attachmentDetails:
                - attachmentUri: https://cdn.manufacturer.com/products/datasheets/LED-12345-en.pdf
                  attachmentFilename: LED-12345-datasheet-en.pdf
                  attachmentLanguage:
                    - en-GB
                  attachmentIssueDate: '2024-06-15'
                - attachmentUri: https://cdn.manufacturer.com/products/datasheets/LED-12345-de.pdf
                  attachmentFilename: LED-12345-datasheet-de.pdf
                  attachmentLanguage:
                    - de-DE
                  attachmentIssueDate: '2024-06-15'
        - manufacturerIdGln: '1234567890123'
          manufacturerProductNumber: '929002376910'
          attachments: null
    BulkProductAttachmentsResponse:
      type: object
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ProductAttachmentSummary'
          description: |
            Array of flattened product attachments.
            Each row represents a single attachment file with the product identifier
            and attachment-level fields denormalized.
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
          description: Cursor-based pagination metadata
      examples:
        - data:
            - manufacturerIdGln: '0000333000005'
              manufacturerProductNumber: 18591-P47
              attachmentType: ATX015
              attachmentTypeSpecification: null
              attachmentOrder: 1
              attachmentFilename: c0c8542e86907655140d81c9699e7a4c.jpg
              attachmentUri: http://att.2ba.nl/0000333000005/PPI/c0/c0c8/c0c8542e86907655140d81c9699e7a4c.jpg
              attachmentIssueDate: null
              attachmentExpiryDate: null
            - manufacturerIdGln: '0000333000005'
              manufacturerProductNumber: 18591-P47
              attachmentType: ATX018
              attachmentTypeSpecification: null
              attachmentOrder: 1
              attachmentFilename: c0c8542e86907655140d81c9699e7a4c.jpg
              attachmentUri: http://att.2ba.nl/0000333000005/PPI/c0/c0c8/c0c8542e86907655140d81c9699e7a4c.jpg
              attachmentIssueDate: null
              attachmentExpiryDate: null
            - manufacturerIdGln: '0000333000005'
              manufacturerProductNumber: 3244 br hg 47
              attachmentType: ATX015
              attachmentTypeSpecification: null
              attachmentOrder: 1
              attachmentFilename: 9af382818c2af00d8ce97a6b95667b74.jpg
              attachmentUri: http://att.2ba.nl/0000333000005/PPI/9a/9af3/9af382818c2af00d8ce97a6b95667b74.jpg
              attachmentIssueDate: null
              attachmentExpiryDate: null
          meta:
            cursor: eyJpZCI6MTIzfQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 15420
    TechnicalId:
      type: string
      description: Generic technical identifier that can hold an integer, string, or GUID/UUID value. Used for opaque system-generated identifiers such as selection IDs, internal references, and other technical keys where the format is not prescribed.
      minLength: 1
      maxLength: 50
      examples:
        - SELECTION-2024-Q1
        - '123456'
        - f47ac10b-58cc-4372-a567-0e02b2c3d479
    ProblemDetails:
      type: object
      title: Problem Details
      description: |
        A machine-readable format for specifying errors in HTTP API responses,
        based on RFC 7807 (https://datatracker.ietf.org/doc/html/rfc7807).
      properties:
        type:
          type: string
          format: uri
          description: A URI reference that identifies the problem type.
        title:
          type: string
          description: A short, human-readable summary of the problem type.
        status:
          type: integer
          format: int32
          description: The HTTP status code generated by the origin server.
        detail:
          type: string
          description: A human-readable explanation specific to this occurrence of the problem.
        instance:
          type: string
          format: uri
          description: A URI reference that identifies the specific occurrence of the problem.
      additionalProperties: true
      examples:
        - type: about:blank
          title: Forbidden
          status: 403
          detail: Your current balance is 30, but that costs 50.
        - type: about:blank
          title: Not Found
          status: 404
          detail: The requested resource could not be found.
    CursorPaginationMetadata:
      type: object
      description: |
        Cursor-based pagination metadata exposed in the `meta` object. Includes the opaque pagination cursor,
        navigation flags, the requested page size, and an optional estimated total count for windowed scans.
      properties:
        cursor:
          type:
            - string
            - 'null'
          description: Cursor bookmark to request the next page of data. Always opaque and URL-safe. Null when no next page exists.
          minLength: 1
          examples:
            - eyJpZCI6MTIzNDU2Nzg5MCwic29ydCI6ImFzYyJ9
            - null
        prevCursor:
          type:
            - string
            - 'null'
          description: Cursor bookmark that replays the previous page of data when present.
          examples:
            - eyJpZCI6MTIzNDU2NzAwMCwic29ydCI6ImFzYyJ9
            - null
        hasNext:
          type: boolean
          description: Indicates whether another page of data is available after the current window.
          examples:
            - true
        hasPrev:
          type: boolean
          description: Indicates whether a previous page of data can be fetched using `prevCursor`.
          examples:
            - false
        limit:
          type: integer
          description: Effective page size applied for this request.
          minimum: 1
          maximum: 1000
          examples:
            - 100
        estimatedTotal:
          type:
            - integer
            - 'null'
          description: Estimated total number of records that satisfy the filter window. May be null when unknown or expensive to calculate.
          minimum: 0
          examples:
            - 15234
            - null
      required:
        - cursor
        - hasNext
        - limit
    Gln:
      type: string
      description: Global Location Number (GLN) - 13 digit GS1 identifier
      pattern: ^\d{13}$
      minLength: 13
      maxLength: 13
      examples:
        - '4012345000016'
        - '8712345678906'
    Gtin:
      type: string
      description: Global Trade Item Number (GTIN) - Can be GTIN-8, GTIN-12, GTIN-13, or GTIN-14
      pattern: ^[0-9]{8,14}$
      examples:
        - '12345678'
        - '012345678905'
        - '4012345678901'
        - '04012345678901'
    LanguageCode:
      type: string
      description: |
        Language code in ISO 639-1 + ISO 3166-1 format (e.g., "en-GB", "de-DE").

        **ETIM xChange**: `Language`
      pattern: ^[a-z]{2}[-][A-Z]{2}$
      examples:
        - en-GB
        - nl-NL
        - de-DE
    ValidationProblemDetails:
      allOf:
        - $ref: '#/components/schemas/ProblemDetails'
        - type: object
          title: Validation Problem Details
          description: |
            A validation problem details object, extending RFC 7807 ProblemDetails
            to include model validation errors. Matches .NET's ValidationProblemDetails.
          properties:
            errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: string
              description: A dictionary of validation errors keyed by field name.
      examples:
        - type: https://example.com/validation-error
          title: One or more validation errors occurred.
          status: 400
          errors:
            name:
              - The Name field is required.
            age:
              - Age must be greater than or equal to 18.
        - type: https://example.com/validation-error
          title: Validation failed
          status: 400
          errors:
            email:
              - Email must be a valid email address.
  parameters:
    ManufacturerIdGlnPath:
      $ref: '#/components/parameters/manufacturer-id-gln'
    ManufacturerProductNumberPath:
      $ref: '#/components/parameters/manufacturer-product-number'
    Cursor:
      $ref: '#/components/parameters/cursor'
    Limit:
      $ref: '#/components/parameters/limit'
    SelectionId:
      $ref: '#/components/parameters/selection-id'
    ManufacturerIdGln:
      $ref: '#/components/parameters/manufacturer-id-gln-filter'
    MutationDateTime:
      $ref: '#/components/parameters/mutation-date-time'
    Language:
      $ref: '#/components/parameters/language'
    LifeCycleStage:
      $ref: '#/components/parameters/life-cycle-stage'
    manufacturer-id-gln:
      name: manufacturerIdGln
      in: path
      description: |
        Global Location Number (GLN) of the manufacturer. Must be a valid 13-digit GLN.
        Part of the composite key for identifying a unique product.
      required: true
      schema:
        type: string
        pattern: ^[0-9]{13}$
        minLength: 13
        maxLength: 13
        description: 13-digit Global Location Number
      example: '1234567890123'
    manufacturer-product-number:
      name: manufacturerProductNumber
      in: path
      description: |
        Manufacturer's unique product number (MPN). Part of the composite key for identifying a unique product.
        Together with manufacturerIdGln, this uniquely identifies a product.
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 35
        description: Manufacturer product number (1-35 characters)
      example: '929002376910'
    etim-release-version:
      name: etimReleaseVersion
      in: query
      required: false
      schema:
        type: string
        pattern: ^[0-9]{1,2}[.]{1}[0-9]{1}|DYNAMIC$
        examples:
          - '9.0'
          - '10.0'
          - DYNAMIC
      description: |
        Filter ETIM classifications by ETIM release version.
        Format: Major.Minor version number (e.g., "9.0", "10.0") or "DYNAMIC" for dynamic releases.
    language:
      name: language
      in: query
      description: |
        Filter results by language code(s).
        Uses ISO 639-1 language code with ISO 3166-1 country code (e.g., "en-GB", "de-DE", "nl-NL").

        If not specified, all available languages are returned.
        Multiple languages can be specified to return descriptions in those languages only.
      required: false
      schema:
        type: array
        items:
          $ref: '#/components/schemas/LanguageCode'
      style: form
      explode: true
      examples:
        singleLanguage:
          summary: Single language filter
          value:
            - en-GB
        multipleLanguages:
          summary: Multiple language filter
          value:
            - en-GB
            - de-DE
            - nl-NL
    cursor:
      name: cursor
      in: query
      description: Cursor for pagination to fetch the next set of results
      required: false
      schema:
        type: string
      example: eyJpZCI6MTIzNDU2Nzg5MCwic29ydCI6ImFzYyJ9
    limit:
      name: limit
      in: query
      description: Maximum number of items to return per page
      required: false
      schema:
        type: integer
        default: 100
        minimum: 1
        maximum: 1000
        examples:
          - 10
          - 50
          - 100
    selection-id:
      name: selectionId
      in: query
      description: Filter results by selection identifier. Used to retrieve a specific subset of items based on a predefined selection.
      required: false
      schema:
        $ref: '#/components/schemas/TechnicalId'
      example: SELECTION-2024-Q1
    manufacturer-id-gln-filter:
      name: manufacturerIdGln
      in: query
      required: false
      schema:
        $ref: '#/components/schemas/Gln'
      description: |
        Filter products by manufacturer Global Location Number (GLN). 
        A 13-digit identifier for the manufacturer of the products.
      example: '1234567890123'
    mutation-date-time:
      name: mutationDateTime
      in: query
      description: |
        Filter results by mutation timestamp (RFC 3339 / ISO 8601 UTC format).
        Returns items created or modified on or after this timestamp.
        Must use UTC timezone with 'Z' suffix.
      required: false
      schema:
        type: string
        format: date-time
      example: '2024-10-15T00:00:00Z'
    life-cycle-stage:
      name: lifeCycleStage
      in: query
      description: |
        Filter LCA declarations by life cycle stage(s) according to EN 15804.
        Multiple stages can be specified to return declarations for those stages only.
        If not specified, all stages are returned.

        Product stage (A):
        - `A1`: Raw material supply
        - `A2`: Transport to manufacturer
        - `A3`: Manufacturing
        - `A1-A3`: Combined product stage
        - `A4`: Transport to building site
        - `A5`: Installation into building

        Use stage (B):
        - `B1`: Use/Application
        - `B2`: Maintenance
        - `B3`: Repair
        - `B4`: Replacement
        - `B5`: Refurbishment
        - `B6`: Operational energy use
        - `B7`: Operational water use
        - `B1-B7`: Combined use stage

        End of life stage (C):
        - `C1`: Deconstruction/demolition
        - `C2`: Transport to waste processing
        - `C3`: Waste processing
        - `C4`: Disposal
        - `C1-C4`: Combined end of life stage

        Beyond life cycle (D):
        - `D`: Reuse, recovery, recycling potential
      required: false
      style: form
      explode: true
      schema:
        type: array
        items:
          type: string
          enum:
            - A1
            - A2
            - A3
            - A1-A3
            - A4
            - A5
            - B1
            - B2
            - B3
            - B4
            - B5
            - B6
            - B7
            - B1-B7
            - C1
            - C2
            - C3
            - C4
            - C1-C4
            - D
      examples:
        productStage:
          summary: Product stage only
          value:
            - A1-A3
        multipleStages:
          summary: Product and end-of-life stages
          value:
            - A1-A3
            - C1-C4
            - D
        useStage:
          summary: Operational energy use
          value:
            - B6
  responses:
    BadRequest:
      $ref: '#/components/responses/400-bad-request'
    Unauthorized:
      $ref: '#/components/responses/401-unauthorized'
    Forbidden:
      $ref: '#/components/responses/403-forbidden'
    NotFound:
      $ref: '#/components/responses/404-not-found'
    InternalServerError:
      $ref: '#/components/responses/500-internal-server-error'
    400-bad-request:
      description: Bad request
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ValidationProblemDetails'
          examples:
            invalid-request:
              summary: Invalid request example
              value:
                type: about:blank
                title: Bad Request
                status: 400
                detail: One or more validation errors occurred
                errors:
                  field1:
                    - Field1 is required.
                    - Field1 must be at least 3 characters.
                  field2:
                    - Field2 must be a valid email address.
    401-unauthorized:
      description: Unauthorized - Authentication required or failed
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          examples:
            unauthorized:
              summary: Unauthorized access example
              value:
                type: about:blank
                title: Unauthorized
                status: 401
                detail: Authentication is required and has failed or has not yet been provided
    403-forbidden:
      description: Forbidden - Insufficient permissions
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          examples:
            forbidden:
              summary: Forbidden access example
              value:
                type: about:blank
                title: Forbidden
                status: 403
                detail: You do not have permission to access this resource.
    500-internal-server-error:
      description: Internal Server Error - An unexpected error occurred
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          examples:
            internal-server-error:
              summary: Internal Server Error example
              value:
                type: about:blank
                title: Internal Server Error
                status: 500
                detail: An unexpected error occurred. Please try again later
    404-not-found:
      description: Not Found - The requested resource does not exist
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          examples:
            notFound:
              summary: Resource not found
              value:
                type: about:blank
                title: Not Found
                status: 404
                detail: The requested resource does not exist
  securitySchemes:
    oauth2:
      type: oauth2
      description: |
        OAuth 2.0 Client Credentials grant (RFC 6749 §4.4).
        Supports both client_secret and client_assertion (RFC 7523) authentication.

        The token URL is implementer-specific. Each implementer provides their own
        OAuth 2.0 authorization server. The placeholder below must be replaced with
        the actual token endpoint for your environment.
      flows:
        clientCredentials:
          tokenUrl: https://auth.example.com/connect/token
          scopes:
            read:products: Grants read access to products
x-tagGroups:
  - name: Products
    tags:
      - Products single
      - Products bulk
