openapi: 3.1.0
info:
  title: Trade Item API
  version: 1.0.0-Preview1
  description: |
    API for managing trade item information, specifications based on ETIM xChange V2.0.

    ## Features

    - Individual trade item operations via `/trade-items`
    - Bulk data retrieval via `/trade-items/bulk/*` endpoints with cursor-based pagination

    ## Data Model

    Based on ETIM xChange V2.0 Trade Item schema.
    Flattened structure with minimal nesting for efficient API consumption.
  contact:
    name: Trade Item API Support
    email: support@tradeitem.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 - Trade Item 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:tradeitems
tags:
  - name: TradeItems single
    description: Single trade item operations
    x-displayName: Single Trade Item
  - name: TradeItems bulk
    description: Bulk data retrieval operations with cursor-based pagination for high-volume data exchange
    x-displayName: Bulk Trade Items
paths:
  /trade-items/{supplierIdGln}/{supplierItemNumber}/details:
    get:
      operationId: getTradeItemDetails
      tags:
        - TradeItems single
      summary: Get trade item details
      description: |
        Retrieve item identification and details for a specific trade item.

        This endpoint returns comprehensive trade item information including:
        - Alternative item numbers (supplier, manufacturer, buyer)
        - Global Trade Item Numbers (GTINs)
        - Discount and bonus group information
        - Validity and obsolescence dates
        - Item status and condition

        **Note**: Item descriptions are available via the separate `/descriptions` endpoint.

        The trade item key (`supplierIdGln` + `supplierItemNumber`) is at the root level,
        with details nested inside. This structure aligns with other single-item 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 trade item's details or 404 if not found.
      parameters:
        - $ref: '#/components/parameters/supplier-id-gln'
        - $ref: '#/components/parameters/supplier-item-number'
      responses:
        '200':
          description: Successfully retrieved trade item details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeItemDetailsResponse'
              examples:
                fullDetails:
                  summary: Complete trade item details
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      details:
                        supplierAltItemNumber: ALT-12345
                        manufacturerItemNumber: MFG-98765
                        manufacturerIdGln: '9876543210987'
                        manufacturerProductNumber: '929002376910'
                        itemGtins:
                          - '4012345678901'
                        buyerItemNumber: BUYER-XYZ-123
                        discountGroupId: DG-001
                        bonusGroupId: BG-002
                        itemValidityDate: '2024-01-01'
                        itemObsolescenceDate: '2026-12-31'
                        itemStatus: ACTIVE
                        itemCondition: NEW
                        stockItem: true
                        shelfLifePeriod: 365
                minimalDetails:
                  summary: Minimal trade item details
                  value:
                    data:
                      supplierIdGln: '9876543210987'
                      supplierItemNumber: SKU-MIN-001
                      details:
                        supplierAltItemNumber: null
                        manufacturerItemNumber: null
                        manufacturerIdGln: '1234567890123'
                        manufacturerProductNumber: PROD-BASIC-001
                        itemGtins: null
                        buyerItemNumber: null
                        discountGroupId: null
                        bonusGroupId: null
                        itemValidityDate: '2024-01-01'
                        itemObsolescenceDate: null
                        itemStatus: ACTIVE
                        itemCondition: NEW
                        stockItem: true
                        shelfLifePeriod: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Trade item not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Trade item not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No trade item found with supplier GLN '1234567890123' and item number 'UNKNOWN-SKU'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /trade-items/{supplierIdGln}/{supplierItemNumber}/descriptions:
    get:
      operationId: getTradeItemDescriptions
      tags:
        - TradeItems single
      summary: Get trade item descriptions
      description: |
        Retrieve multilingual descriptions for a specific trade item.

        This endpoint returns trade item descriptions including minimal and unique main descriptions
        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 `/trade-items/bulk/descriptions` which uses
        a flattened structure optimized for ETL, this single-item endpoint returns descriptions
        in their natural nested format for easier consumption.

        **No pagination** - Returns all descriptions for the specified trade item.
      parameters:
        - $ref: '#/components/parameters/supplier-id-gln'
        - $ref: '#/components/parameters/supplier-item-number'
        - $ref: '#/components/parameters/language'
      responses:
        '200':
          description: Successfully retrieved trade item descriptions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeItemDescriptionsResponse'
              examples:
                multipleLanguages:
                  summary: Trade item with multiple language descriptions
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      descriptions:
                        - descriptionLanguage: en-GB
                          minimalItemDescription: LED Lamp 10W E27
                          uniqueMainItemDescription: Professional LED lamp with E27 socket, 10W warm white
                          discountGroupDescription: Lighting products discount group
                          bonusGroupDescription: null
                        - descriptionLanguage: de-DE
                          minimalItemDescription: LED Lampe 10W E27
                          uniqueMainItemDescription: Professionelle LED-Lampe mit E27-Fassung, 10W warmweiß
                          discountGroupDescription: Beleuchtungsprodukte Rabattgruppe
                          bonusGroupDescription: null
                        - descriptionLanguage: nl-NL
                          minimalItemDescription: LED Lamp 10W E27
                          uniqueMainItemDescription: Professionele LED lamp met E27 fitting, 10W warm wit
                          discountGroupDescription: Verlichtingsproducten kortingsgroep
                          bonusGroupDescription: null
                singleLanguage:
                  summary: Filtered to single language
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      descriptions:
                        - descriptionLanguage: en-GB
                          minimalItemDescription: LED Lamp 10W E27
                          uniqueMainItemDescription: Professional LED lamp with E27 socket, 10W warm white
                          discountGroupDescription: Lighting products discount group
                          bonusGroupDescription: null
                noDescriptions:
                  summary: Trade item without descriptions
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      descriptions: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Trade item not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Trade item not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No trade item found with supplier GLN '1234567890123' and item number 'UNKNOWN-SKU'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /trade-items/{supplierIdGln}/{supplierItemNumber}/orderings:
    get:
      operationId: getTradeItemOrderings
      tags:
        - TradeItems single
      summary: Get trade item orderings
      description: |
        Retrieve ordering information for a specific trade item.

        This endpoint returns comprehensive ordering details including:
        - Order unit and quantity constraints (minimum, step size)
        - Standard lead time for orders
        - Use unit conversions (for items sold in one unit but used in another)
        - Alternative use unit conversions

        The trade item key (`supplierIdGln` + `supplierItemNumber`) is at the root level,
        with ordering details nested inside. This structure aligns with other single-item subresource responses.

        **No pagination** - Returns exactly one trade item's ordering information or 404 if not found.

        **ETIM xChange**: `Ordering`
        **Path**: `Supplier[].Product[].TradeItem[].Ordering`
      parameters:
        - $ref: '#/components/parameters/supplier-id-gln'
        - $ref: '#/components/parameters/supplier-item-number'
      responses:
        '200':
          description: Successfully retrieved trade item ordering information
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeItemOrderingsResponse'
              examples:
                basicOrdering:
                  summary: Basic ordering configuration
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      ordering:
                        orderUnit: C62
                        minimumOrderQuantity: 1
                        orderStepSize: 1
                        standardOrderLeadTime: 5
                        useUnit: null
                        useUnitConversionFactor: null
                        singleUseUnitQuantity: null
                        alternativeUseUnit: null
                        alternativeUseUnitConversionFactor: null
                cableOrdering:
                  summary: Cable with meter-based ordering
                  value:
                    data:
                      supplierIdGln: '8712423012485'
                      supplierItemNumber: SKU-CABLE-002
                      ordering:
                        orderUnit: MTR
                        minimumOrderQuantity: 10
                        orderStepSize: 5
                        standardOrderLeadTime: 3
                        useUnit: MTR
                        useUnitConversionFactor: 1
                        singleUseUnitQuantity: 1
                        alternativeUseUnit: null
                        alternativeUseUnitConversionFactor: null
                bulkOrdering:
                  summary: Bulk item with different use unit
                  value:
                    data:
                      supplierIdGln: '9876543210987'
                      supplierItemNumber: BULK-PAINT-001
                      ordering:
                        orderUnit: BX
                        minimumOrderQuantity: 5
                        orderStepSize: 1
                        standardOrderLeadTime: 14
                        useUnit: LTR
                        useUnitConversionFactor: 10
                        singleUseUnitQuantity: 10
                        alternativeUseUnit: null
                        alternativeUseUnitConversionFactor: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Trade item not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Trade item not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No trade item found with supplier GLN '1234567890123' and item number 'UNKNOWN-SKU'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /trade-items/{supplierIdGln}/{supplierItemNumber}/pricings:
    get:
      operationId: getTradeItemPricings
      tags:
        - TradeItems single
      summary: Get trade item pricings
      description: |
        Retrieve pricing information for a specific trade item.

        This endpoint returns comprehensive pricing details including:
        - Price unit and quantity
        - Gross list price, net price, and recommended retail price
        - VAT percentage
        - Price validity and expiry dates
        - Currency code (catalog-level `CurrencyCode`)

        **Allowances & Surcharges**: The `allowanceSurcharges` property is always `null` in this response.
        Use the separate `/{supplierIdGln}/{supplierItemNumber}/allowance-surcharges` endpoint for flat retrieval,
        or the complete trade item endpoint for nested retrieval within each pricing entry.

        A trade item may have multiple pricing entries for different conditions,
        customer groups, or validity periods.

        The trade item key (`supplierIdGln` + `supplierItemNumber`) is at the root level,
        with pricings nested inside. This structure aligns with other single-item 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 trade item's pricing information or 404 if not found.

        **ETIM xChange**: `Pricing[]`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
      parameters:
        - $ref: '#/components/parameters/supplier-id-gln'
        - $ref: '#/components/parameters/supplier-item-number'
      responses:
        '200':
          description: Successfully retrieved trade item pricing information
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeItemPricingsResponse'
              examples:
                singlePricing:
                  summary: Trade item with single pricing entry
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      pricings:
                        - pricingRef: price-c62-1-20250101
                          priceUnit: C62
                          priceUnitFactor: null
                          priceQuantity: 1
                          currencyCode: EUR
                          priceOnRequest: false
                          grossListPrice: 130
                          netPrice: 100
                          recommendedRetailPrice: 150
                          vat: 21
                          priceValidityDate: '2025-01-01'
                          priceExpiryDate: '2025-12-31'
                          allowanceSurcharges: null
                multiplePricings:
                  summary: Trade item with volume pricing
                  value:
                    data:
                      supplierIdGln: '8712423012485'
                      supplierItemNumber: SKU-CABLE-002
                      pricings:
                        - pricingRef: price-mtr-1-20250101
                          priceUnit: MTR
                          priceUnitFactor: 1
                          priceQuantity: 1
                          currencyCode: EUR
                          priceOnRequest: false
                          grossListPrice: 2.5
                          netPrice: 1.99
                          recommendedRetailPrice: 3.49
                          vat: 21
                          priceValidityDate: '2025-01-01'
                          priceExpiryDate: '2025-06-30'
                          allowanceSurcharges: null
                        - pricingRef: price-mtr-100-20250101
                          priceUnit: MTR
                          priceUnitFactor: 1
                          priceQuantity: 100
                          currencyCode: EUR
                          priceOnRequest: false
                          grossListPrice: 2
                          netPrice: 1.59
                          recommendedRetailPrice: 2.99
                          vat: 21
                          priceValidityDate: '2025-01-01'
                          priceExpiryDate: '2025-06-30'
                          allowanceSurcharges: null
                priceOnRequest:
                  summary: Trade item with price on request
                  value:
                    data:
                      supplierIdGln: '9876543210987'
                      supplierItemNumber: CUSTOM-BUILD-001
                      pricings:
                        - pricingRef: price-c62-1-20250101
                          priceUnit: C62
                          priceUnitFactor: null
                          priceQuantity: 1
                          currencyCode: EUR
                          priceOnRequest: true
                          grossListPrice: null
                          netPrice: null
                          recommendedRetailPrice: null
                          vat: 21
                          priceValidityDate: '2025-01-01'
                          priceExpiryDate: null
                          allowanceSurcharges: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Trade item not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Trade item not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No trade item found with supplier GLN '1234567890123' and item number 'UNKNOWN-SKU'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /trade-items/{supplierIdGln}/{supplierItemNumber}/allowance-surcharges:
    get:
      operationId: getTradeItemAllowanceSurcharges
      tags:
        - TradeItems single
      summary: Get trade item allowances and surcharges
      description: |
        Retrieve allowances (discounts) and surcharges (additional charges) for a specific trade item.

        This endpoint returns all allowances and surcharges associated with the trade item's pricing entries.
        Each allowance/surcharge includes a `pricingRef` to enable correlation with the corresponding 
        pricing record from the `/pricings` endpoint.

        **Design Decision**: Allowances and surcharges are provided in a separate endpoint to:
        - Enable direct ETL/data warehouse fact table loading
        - Provide predictable pagination for datasets with varying surcharge counts
        - Support star schema design patterns (pricing fact table + surcharges fact table)

        **No pagination** - Returns exactly one trade item's allowances/surcharges or 404 if not found.

        **ETIM xChange**: `AllowanceSurcharge[]`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[]`
      parameters:
        - $ref: '#/components/parameters/supplier-id-gln'
        - $ref: '#/components/parameters/supplier-item-number'
      responses:
        '200':
          description: Successfully retrieved trade item allowances and surcharges
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeItemAllowanceSurchargesResponse'
              examples:
                withAllowancesAndSurcharges:
                  summary: Trade item with multiple allowances and surcharges
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      allowanceSurcharges:
                        - pricingRef: price-c62-1-20250101
                          allowanceSurchargeIndicator: ALLOWANCE
                          allowanceSurchargeValidityDate: '2025-01-01'
                          allowanceSurchargeType: AEQ
                          allowanceSurchargeAmount: null
                          allowanceSurchargeSequenceNumber: 1
                          allowanceSurchargePercentage: 5.5
                          allowanceSurchargeMinimumQuantity: 50
                        - pricingRef: price-c62-1-20250101
                          allowanceSurchargeIndicator: SURCHARGE
                          allowanceSurchargeValidityDate: null
                          allowanceSurchargeType: DBD
                          allowanceSurchargeAmount: 25
                          allowanceSurchargeSequenceNumber: 2
                          allowanceSurchargePercentage: null
                          allowanceSurchargeMinimumQuantity: null
                noSurcharges:
                  summary: Trade item without allowances or surcharges
                  value:
                    data:
                      supplierIdGln: '8712423012485'
                      supplierItemNumber: SKU-BASIC-001
                      allowanceSurcharges: null
                multiplePricings:
                  summary: Trade item with surcharges across multiple pricing entries
                  value:
                    data:
                      supplierIdGln: '9876543210987'
                      supplierItemNumber: SKU-VOLUME-002
                      allowanceSurcharges:
                        - pricingRef: price-mtr-1-20250101
                          allowanceSurchargeIndicator: ALLOWANCE
                          allowanceSurchargeValidityDate: '2025-01-01'
                          allowanceSurchargeType: AEQ
                          allowanceSurchargeAmount: null
                          allowanceSurchargeSequenceNumber: 1
                          allowanceSurchargePercentage: 2
                          allowanceSurchargeMinimumQuantity: 100
                        - pricingRef: price-mtr-100-20250101
                          allowanceSurchargeIndicator: ALLOWANCE
                          allowanceSurchargeValidityDate: '2025-01-01'
                          allowanceSurchargeType: AEQ
                          allowanceSurchargeAmount: null
                          allowanceSurchargeSequenceNumber: 1
                          allowanceSurchargePercentage: 5
                          allowanceSurchargeMinimumQuantity: 500
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Trade item not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Trade item not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No trade item found with supplier GLN '1234567890123' and item number 'UNKNOWN-SKU'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /trade-items/{supplierIdGln}/{supplierItemNumber}/relations:
    get:
      operationId: getTradeItemRelations
      tags:
        - TradeItems single
      summary: Get trade item relations
      description: |
        Retrieve item relations for a specific trade item.

        This endpoint returns all relationships the trade item has with other items,
        including accessories, spare parts, consumables, successors, and other relation types.

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

        **No pagination** - Returns all relations for the specified trade item.

        **ETIM xChange**: `ItemRelations[]`
        **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[]`
      parameters:
        - $ref: '#/components/parameters/supplier-id-gln'
        - $ref: '#/components/parameters/supplier-item-number'
      responses:
        '200':
          description: Successfully retrieved trade item relations
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeItemRelationsResponse'
              examples:
                multipleRelations:
                  summary: Trade item with multiple relations
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      relations:
                        - relatedSupplierItemNumber: SPART-001
                          relatedManufacturerItemNumber: MFG-SPART-100
                          relatedItemGtins:
                            - '4012345678918'
                          relationType: SPAREPART
                          relatedItemQuantity: 2
                        - relatedSupplierItemNumber: ACC-789
                          relatedManufacturerItemNumber: null
                          relatedItemGtins: null
                          relationType: ACCESSORY
                          relatedItemQuantity: 1
                        - relatedSupplierItemNumber: SKU-12346
                          relatedManufacturerItemNumber: MFG-98766
                          relatedItemGtins:
                            - '4012345678902'
                          relationType: SUCCESSOR
                          relatedItemQuantity: 1
                singleRelation:
                  summary: Trade item with one relation
                  value:
                    data:
                      supplierIdGln: '8712423012485'
                      supplierItemNumber: SKU-LAMP-001
                      relations:
                        - relatedSupplierItemNumber: '251270'
                          relatedManufacturerItemNumber: null
                          relatedItemGtins:
                            - '04015081027125'
                          relationType: UPSELLING
                          relatedItemQuantity: 1
                noRelations:
                  summary: Trade item without relations
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      relations: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Trade item not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Trade item not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No trade item found with supplier GLN '1234567890123' and item number 'UNKNOWN-SKU'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /trade-items/{supplierIdGln}/{supplierItemNumber}/logistics-details:
    get:
      operationId: getTradeItemLogisticsDetails
      tags:
        - TradeItems single
      summary: Get trade item logistics details
      description: |
        Retrieve item logistics details for a specific trade item.

        This endpoint returns base item logistic measurements including net dimensions
        (length, width, height, diameter), weight, and volume with their respective units.

        **Nested structure**: Unlike the bulk endpoint `/trade-items/bulk/logistics-details` which uses
        a flattened structure optimized for ETL, this single-item endpoint returns logistics
        in their natural nested format for easier consumption.

        **No pagination** - Returns all logistics entries for the specified trade item.

        **ETIM xChange**: `ItemLogisticDetails[]`
        **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[]`
      parameters:
        - $ref: '#/components/parameters/supplier-id-gln'
        - $ref: '#/components/parameters/supplier-item-number'
      responses:
        '200':
          description: Successfully retrieved trade item logistics details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeItemLogisticsDetailsResponse'
              examples:
                withLogistics:
                  summary: Trade item with logistics details
                  value:
                    data:
                      supplierIdGln: '8712423012485'
                      supplierItemNumber: SKU-LAMP-001
                      itemLogistics:
                        - baseItemNetLength: 96
                          baseItemNetWidth: 5
                          baseItemNetHeight: 56
                          baseItemNetDiameter: null
                          netDimensionUnit: CMT
                          baseItemNetWeight: 0.26
                          netWeightUnit: KGM
                          baseItemNetVolume: 68
                          netVolumeUnit: MMQ
                minimalLogistics:
                  summary: Trade item with partial logistics (weight only)
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      itemLogistics:
                        - baseItemNetLength: null
                          baseItemNetWidth: null
                          baseItemNetHeight: null
                          baseItemNetDiameter: null
                          netDimensionUnit: null
                          baseItemNetWeight: 500
                          netWeightUnit: GRM
                          baseItemNetVolume: null
                          netVolumeUnit: null
                noLogistics:
                  summary: Trade item without logistics details
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      itemLogistics: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Trade item not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Trade item not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No trade item found with supplier GLN '1234567890123' and item number 'UNKNOWN-SKU'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /trade-items/{supplierIdGln}/{supplierItemNumber}/attachments:
    get:
      operationId: getTradeItemAttachments
      tags:
        - TradeItems single
      summary: Get trade item attachments
      description: |
        Retrieve attachments for a specific trade item.

        This endpoint returns all attachments associated with the trade item,
        including product images, datasheets, technical drawings, certificates,
        manuals, and other document types.

        **Flat structure**: Each attachment entry represents a single file with its
        type, specification, filename, URI, and metadata.

        Unlike the bulk endpoint `/trade-items/bulk/attachments` which adds trade item
        identification keys to each row for ETL optimization, this single-item endpoint
        returns attachments scoped to the specified trade item.

        **No pagination** - Returns all attachments for the specified trade item.

        **ETIM xChange**: `ItemAttachments[]`
        **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[]`
      parameters:
        - $ref: '#/components/parameters/supplier-id-gln'
        - $ref: '#/components/parameters/supplier-item-number'
      responses:
        '200':
          description: Successfully retrieved trade item attachments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeItemAttachmentsResponse'
              examples:
                multipleAttachments:
                  summary: Trade item with multiple attachments
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      attachments:
                        - attachmentType: ATX001
                          attachmentTypeSpecification: MDX002
                          attachmentLanguages: null
                          attachmentFilename: product_image.jpg
                          attachmentUri: https://example.com/images/product.jpg
                          attachmentDescription: Front view product image
                          attachmentIssueDate: '2024-01-15'
                          attachmentExpiryDate: null
                        - attachmentType: ATX014
                          attachmentTypeSpecification: MDX005
                          attachmentLanguages:
                            - en-GB
                          attachmentFilename: datasheet-en.pdf
                          attachmentUri: https://cdn.supplier.com/datasheets/datasheet-en.pdf
                          attachmentDescription: Technical datasheet
                          attachmentIssueDate: '2024-06-15'
                          attachmentExpiryDate: null
                        - attachmentType: ATX026
                          attachmentTypeSpecification: null
                          attachmentLanguages: null
                          attachmentFilename: ce-certificate.pdf
                          attachmentUri: https://cdn.supplier.com/certs/ce-certificate.pdf
                          attachmentDescription: null
                          attachmentIssueDate: '2024-03-01'
                          attachmentExpiryDate: '2029-03-01'
                singleAttachment:
                  summary: Trade item with one attachment
                  value:
                    data:
                      supplierIdGln: '8712423012485'
                      supplierItemNumber: SKU-LAMP-001
                      attachments:
                        - attachmentType: ATX001
                          attachmentTypeSpecification: MDX002
                          attachmentLanguages: null
                          attachmentFilename: lamp-front.jpg
                          attachmentUri: https://example.com/images/lamp-front.jpg
                          attachmentDescription: Front view
                          attachmentIssueDate: null
                          attachmentExpiryDate: null
                noAttachments:
                  summary: Trade item without attachments
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      attachments: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Trade item not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Trade item not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No trade item found with supplier GLN '1234567890123' and item number 'UNKNOWN-SKU'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /trade-items/{supplierIdGln}/{supplierItemNumber}/enclosed-items:
    get:
      operationId: getTradeItemEnclosedItems
      tags:
        - TradeItems single
      summary: Get trade item enclosed items
      description: |
        Retrieve enclosed items for a specific trade item.

        This endpoint returns all items enclosed within the trade item's packaging units.
        Each enclosed item includes a `packagingTypeCode` to identify which packaging unit
        contains it, enabling correlation with packaging data from the main trade item response.

        **No pagination** - Returns all enclosed items for the specified trade item.

        **ETIM xChange**: `TradeItemEnclosed[]`
        **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[]`
      parameters:
        - $ref: '#/components/parameters/supplier-id-gln'
        - $ref: '#/components/parameters/supplier-item-number'
      responses:
        '200':
          description: Successfully retrieved trade item enclosed items
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TradeItemEnclosedItemsResponse'
              examples:
                multipleEnclosedItems:
                  summary: Trade item with enclosed items across packaging units
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      enclosedItems:
                        - packagingTypeCode: BX
                          enclosedSupplierItemNumber: WIDGET-001
                          enclosedManufacturerItemNumber: MFG-WIDGET-001
                          enclosedItemGtins:
                            - '4012345678901'
                          enclosedItemQuantity: 5
                        - packagingTypeCode: BX
                          enclosedSupplierItemNumber: SCREW-M8-50
                          enclosedManufacturerItemNumber: null
                          enclosedItemGtins: null
                          enclosedItemQuantity: 100
                        - packagingTypeCode: PF
                          enclosedSupplierItemNumber: WIDGET-001
                          enclosedManufacturerItemNumber: MFG-WIDGET-001
                          enclosedItemGtins:
                            - '4012345678901'
                          enclosedItemQuantity: 50
                singleEnclosedItem:
                  summary: Trade item with one enclosed item
                  value:
                    data:
                      supplierIdGln: '8712423012485'
                      supplierItemNumber: SKU-KIT-001
                      enclosedItems:
                        - packagingTypeCode: BX
                          enclosedSupplierItemNumber: '251270'
                          enclosedManufacturerItemNumber: null
                          enclosedItemGtins:
                            - '04015081027125'
                          enclosedItemQuantity: 1
                noEnclosedItems:
                  summary: Trade item without enclosed items
                  value:
                    data:
                      supplierIdGln: '1234567890123'
                      supplierItemNumber: SKU-12345
                      enclosedItems: null
        '400':
          $ref: '#/components/responses/400-bad-request'
        '401':
          $ref: '#/components/responses/401-unauthorized'
        '403':
          $ref: '#/components/responses/403-forbidden'
        '404':
          description: Trade item not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                notFound:
                  summary: Trade item not found
                  value:
                    type: about:blank
                    title: Not Found
                    status: 404
                    detail: No trade item found with supplier GLN '1234567890123' and item number 'UNKNOWN-SKU'
        '500':
          $ref: '#/components/responses/500-internal-server-error'
  /trade-items/bulk/details:
    get:
      operationId: getBulkTradeItemDetails
      tags:
        - TradeItems bulk
      summary: List trade item details
      description: |
        Retrieve trade item identification and details in bulk with cursor-based pagination.

        Returns a flat structure where each item includes its composite key 
        (`supplierIdGln` + `supplierItemNumber`) along with all identification and details fields:
        - Alternative item numbers (supplier, manufacturer, buyer)
        - Global Trade Item Numbers (GTINs)
        - Discount and bonus group information
        - Validity and obsolescence dates
        - Item status and condition

        **Note**: Item descriptions are available via `/trade-items/bulk/descriptions` endpoint.

        Use this endpoint for:
        - Initial data synchronization
        - Incremental updates (using `mutationDateTime` filter)
        - Filtered data retrieval (using `selectionId` or `supplierIdGln`)

        **Pagination**: Use the `cursor` from the response `meta` to retrieve subsequent pages.
        **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.
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/supplier-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
      responses:
        '200':
          description: Successfully retrieved trade item details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkTradeItemDetailsResponse'
              examples:
                multipleItems:
                  summary: Multiple trade items with pagination
                  value:
                    data:
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-LAMP-001
                        supplierAltItemNumber: ALT-SKU-001
                        manufacturerItemNumber: MFR-12345
                        manufacturerIdGln: '9876543210987'
                        manufacturerProductNumber: '929002376910'
                        itemGtins:
                          - '08712423012485'
                        buyerItemNumber: null
                        discountGroupId: DG-LIGHTING
                        bonusGroupId: null
                        itemValidityDate: '2024-01-01'
                        itemObsolescenceDate: null
                        itemStatus: ACTIVE
                        itemCondition: NEW
                        stockItem: true
                        shelfLifePeriod: null
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-TOOL-002
                        supplierAltItemNumber: null
                        manufacturerItemNumber: MFR-54321
                        manufacturerIdGln: '9876543210987'
                        manufacturerProductNumber: HAMMER-PRO-500
                        itemGtins:
                          - '08712423054321'
                        buyerItemNumber: BUYER-002
                        discountGroupId: DG-TOOLS
                        bonusGroupId: BG-PREMIUM
                        itemValidityDate: '2023-06-01'
                        itemObsolescenceDate: '2028-12-31'
                        itemStatus: ACTIVE
                        itemCondition: NEW
                        stockItem: true
                        shelfLifePeriod: null
                    meta:
                      cursor: eyJzdXBwbGllcklkR2xuIjoiODcxMjQyMzAxMjQ4NSIsInN1cHBsaWVySXRlbU51bWJlciI6IlNLVS1UT09MLTAwMiJ9
                      hasNext: true
                      hasPrev: false
                      limit: 100
                      estimatedTotal: 15420
                emptyResult:
                  summary: No items match the filter criteria
                  value:
                    data: []
                    meta:
                      cursor: null
                      hasNext: false
                      hasPrev: false
                      limit: 100
                      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'
  /trade-items/bulk/descriptions:
    get:
      operationId: getBulkTradeItemDescriptions
      tags:
        - TradeItems bulk
      summary: List trade item descriptions
      description: |
        Retrieve trade item descriptions in bulk with cursor-based pagination.
        Returns a flattened structure where each row represents a single language description
        with the trade item identifier (`supplierIdGln` + `supplierItemNumber`).

        A trade item with descriptions in 3 languages will result in 3 rows.

        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
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/supplier-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
        - $ref: '#/components/parameters/language'
      responses:
        '200':
          description: Successfully retrieved trade item descriptions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkTradeItemDescriptionsResponse'
              examples:
                multipleItems:
                  summary: Multiple trade item descriptions
                  value:
                    data:
                      - supplierIdGln: '1234567890123'
                        supplierItemNumber: SKU-12345
                        descriptionLanguage: en-GB
                        minimalItemDescription: LED Lamp 10W E27
                        uniqueMainItemDescription: Professional LED lamp with E27 socket, 10W warm white
                        discountGroupDescription: Lighting products discount group
                        bonusGroupDescription: null
                      - supplierIdGln: '1234567890123'
                        supplierItemNumber: SKU-12345
                        descriptionLanguage: de-DE
                        minimalItemDescription: LED Lampe 10W E27
                        uniqueMainItemDescription: Professionelle LED-Lampe mit E27-Fassung, 10W warmweiß
                        discountGroupDescription: Beleuchtungsprodukte Rabattgruppe
                        bonusGroupDescription: null
                      - supplierIdGln: '1234567890123'
                        supplierItemNumber: SKU-67890
                        descriptionLanguage: en-GB
                        minimalItemDescription: Hammer 500g
                        uniqueMainItemDescription: Professional claw hammer with fiberglass handle
                        discountGroupDescription: Hand tools discount group
                        bonusGroupDescription: Premium tier
                    meta:
                      cursor: eyJpZCI6MTIzfQ==
                      hasNext: true
                      hasPrev: false
                      limit: 100
                      estimatedTotal: 15420
        '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'
  /trade-items/bulk/orderings:
    get:
      operationId: getBulkTradeItemOrderings
      summary: List trade item orderings
      description: |
        Retrieve trade item ordering information in bulk with cursor-based pagination.
        Returns ordering details including order units, minimum/maximum quantities, order step sizes,
        lead times, and unit conversions.

        Each item in the response includes its composite key (`supplierIdGln` + `supplierItemNumber`)
        along with all ordering fields in a flat structure.

        This endpoint is optimized for scenarios where only ordering data is needed,
        such as inventory management or order processing systems.

        **ETIM xChange**: Bulk retrieval of `Ordering` data  
        **Path**: `Supplier[].Product[].TradeItem[].Ordering`
      tags:
        - TradeItems bulk
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/mutation-date-time'
        - $ref: '#/components/parameters/supplier-id-gln-filter'
      responses:
        '200':
          description: Successfully retrieved trade item ordering information
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkTradeItemOrderingsResponse'
              examples:
                success:
                  summary: Successful bulk retrieval
                  value:
                    data:
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-LAMP-001
                        orderUnit: C62
                        minimumOrderQuantity: 1
                        orderStepSize: 1
                        standardOrderLeadTime: 5
                        useUnit: null
                        useUnitConversionFactor: null
                        singleUseUnitQuantity: null
                        alternativeUseUnit: null
                        alternativeUseUnitConversionFactor: null
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-CABLE-002
                        orderUnit: MTR
                        minimumOrderQuantity: 10
                        orderStepSize: 5
                        standardOrderLeadTime: 3
                        useUnit: MTR
                        useUnitConversionFactor: 1
                        singleUseUnitQuantity: 1
                        alternativeUseUnit: null
                        alternativeUseUnitConversionFactor: null
                    meta:
                      cursor: eyJzdXBwbGllcklkR2xuIjoiODcxMjQyMzAxMjQ4NSJ9
                      hasNext: true
                      hasPrev: false
                      limit: 100
                      estimatedTotal: 15420
        '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'
  /trade-items/bulk/pricings:
    get:
      operationId: getBulkTradeItemPricings
      summary: List trade item pricings
      description: |
        Retrieve trade item pricing information in bulk with cursor-based pagination.
        Returns pricing details including net prices, gross list prices, recommended retail prices,
        VAT, price validity periods, and the catalog-level currency code.

        **Allowances & Surcharges**: The `allowanceSurcharges` property is always `null` in this response.
        Use the separate `/trade-items/bulk/allowance-surcharges` endpoint for flat retrieval.

        **Flattened Structure**: Each row represents a single price entry with embedded composite key
        (`supplierIdGln` + `supplierItemNumber`). This follows the same pattern as 
        `/products/bulk/etim-classifications` - 1 row per data point.

        A trade item with multiple price tiers (e.g., quantity breaks, validity periods) will have
        multiple rows with the same composite key but different pricing data.

        This endpoint is optimized for:
        - Predictable payload sizes per row
        - Efficient cursor-based pagination
        - ETL/data warehouse ingestion
        - Price synchronization scenarios

        **ETIM xChange**: Bulk retrieval of `Pricing[]` data  
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
      tags:
        - TradeItems bulk
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/mutation-date-time'
        - $ref: '#/components/parameters/supplier-id-gln-filter'
      responses:
        '200':
          description: Successfully retrieved trade item pricing entries (1 row per price)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkTradeItemPricingsResponse'
              examples:
                success:
                  summary: Successful bulk retrieval (flattened - 1 row per price entry)
                  value:
                    data:
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-LAMP-001
                        pricingRef: price-c62-1-20250101
                        priceUnit: C62
                        priceQuantity: 1
                        currencyCode: EUR
                        priceOnRequest: false
                        grossListPrice: 12.99
                        netPrice: 9.99
                        recommendedRetailPrice: 15.99
                        vat: 21
                        priceValidityDate: '2025-01-01'
                        priceExpiryDate: '2025-12-31'
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-CABLE-002
                        pricingRef: price-mtr-1-20250101
                        priceUnit: MTR
                        priceQuantity: 1
                        currencyCode: EUR
                        netPrice: 1.99
                        priceValidityDate: '2025-01-01'
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-CABLE-002
                        pricingRef: price-mtr-100-20250101
                        priceUnit: MTR
                        priceQuantity: 100
                        currencyCode: EUR
                        netPrice: 1.59
                        priceValidityDate: '2025-01-01'
                    meta:
                      cursor: eyJzdXBwbGllcklkR2xuIjoiODcxMjQyMzAxMjQ4NSIsInByaWNlUXVhbnRpdHkiOjEwMH0=
                      hasNext: true
                      hasPrev: false
                      limit: 100
                      estimatedTotal: 24850
        '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'
  /trade-items/bulk/allowance-surcharges:
    get:
      operationId: getBulkAllowanceSurcharges
      summary: List trade item allowances and surcharges
      description: |
        Retrieve trade item allowances and surcharges in bulk with cursor-based pagination.
        Returns discount allowances and additional charge surcharges applied to trade item pricing.

        **Flattened Structure**: Each row represents a single allowance/surcharge entry with embedded 
        composite key (`supplierIdGln` + `supplierItemNumber`) and a `pricingRef` to correlate
        with the parent pricing entry.

        **Join Pattern**: Use this endpoint in combination with `/trade-items/bulk/pricings` to build
        a complete pricing picture:
        ```sql
        SELECT p.*, a.*
        FROM pricings p
        LEFT JOIN allowance_surcharges a
          ON p.supplierIdGln = a.supplierIdGln
         AND p.supplierItemNumber = a.supplierItemNumber
         AND p.pricingRef = a.pricingRef
        ```

        This endpoint is optimized for:
        - Predictable payload sizes per row
        - Efficient cursor-based pagination
        - ETL/data warehouse ingestion (star schema: pricing fact + surcharges fact)
        - Price adjustment synchronization scenarios

        **ETIM xChange**: Bulk retrieval of `AllowanceSurcharge[]` data  
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[]`
      tags:
        - TradeItems bulk
      parameters:
        - $ref: '#/components/parameters/cursor'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/selection-id'
        - $ref: '#/components/parameters/mutation-date-time'
        - $ref: '#/components/parameters/supplier-id-gln-filter'
      responses:
        '200':
          description: Successfully retrieved allowance/surcharge entries (1 row per surcharge)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkAllowanceSurchargesResponse'
              examples:
                success:
                  summary: Successful bulk retrieval (flattened - 1 row per surcharge entry)
                  value:
                    data:
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-LAMP-001
                        pricingRef: price-c62-1-20250101
                        allowanceSurchargeIndicator: ALLOWANCE
                        allowanceSurchargeType: AEQ
                        allowanceSurchargeSequenceNumber: 1
                        allowanceSurchargePercentage: 5.5
                        allowanceSurchargeMinimumQuantity: 50
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-CABLE-002
                        pricingRef: price-mtr-1-20250101
                        allowanceSurchargeIndicator: SURCHARGE
                        allowanceSurchargeType: DBD
                        allowanceSurchargeSequenceNumber: 1
                        allowanceSurchargeAmount: 25
                    meta:
                      cursor: eyJzdXBwbGllcklkR2xuIjoiODcxMjQyMzAxMjQ4NSJ9
                      hasNext: true
                      hasPrev: false
                      limit: 100
                      estimatedTotal: 3250
        '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'
  /trade-items/bulk/relations:
    get:
      operationId: getBulkTradeItemRelations
      tags:
        - TradeItems bulk
      summary: List trade item relations
      description: |
        Retrieve trade item relations in bulk with cursor-based pagination.
        Returns a flattened structure where each row represents a single relation
        with the trade item identifier (`supplierIdGln` + `supplierItemNumber`).

        A trade item with 5 relations (e.g., 2 accessories, 2 spare parts, 1 successor)
        will result in 5 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/supplier-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
      responses:
        '200':
          description: Successfully retrieved trade item relations
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkTradeItemRelationsResponse'
              examples:
                multipleItems:
                  summary: Multiple trade item relations
                  value:
                    data:
                      - supplierIdGln: '1234567890123'
                        supplierItemNumber: SKU-12345
                        relatedSupplierItemNumber: SPART-001
                        relatedManufacturerItemNumber: MFG-SPART-100
                        relatedItemGtins:
                          - '4012345678918'
                        relationType: SPAREPART
                        relatedItemQuantity: 2
                      - supplierIdGln: '1234567890123'
                        supplierItemNumber: SKU-12345
                        relatedSupplierItemNumber: ACC-789
                        relatedManufacturerItemNumber: null
                        relatedItemGtins: null
                        relationType: ACCESSORY
                        relatedItemQuantity: 1
                      - supplierIdGln: '9876543210987'
                        supplierItemNumber: SKU-CABLE-002
                        relatedSupplierItemNumber: SKU-CABLE-003
                        relatedManufacturerItemNumber: MFG-CABLE-V2
                        relatedItemGtins:
                          - '8712345678901'
                        relationType: SUCCESSOR
                        relatedItemQuantity: 1
                    meta:
                      cursor: eyJpZCI6MTIzfQ==
                      hasNext: true
                      hasPrev: false
                      limit: 100
                      estimatedTotal: 8450
        '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'
  /trade-items/bulk/logistics-details:
    get:
      operationId: getBulkTradeItemLogisticsDetails
      tags:
        - TradeItems bulk
      summary: List trade item logistics details
      description: |
        Retrieve trade item logistics details in bulk with cursor-based pagination.
        Returns a flattened structure where each row represents a single logistics entry
        with the trade item identifier (`supplierIdGln` + `supplierItemNumber`).

        A trade item typically has 0 or 1 logistics entries containing base item
        net dimensions (length, width, height, diameter), weight, and volume.

        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/supplier-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
      responses:
        '200':
          description: Successfully retrieved trade item logistics details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkTradeItemLogisticsDetailsResponse'
              examples:
                multipleItems:
                  summary: Multiple trade item logistics entries
                  value:
                    data:
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-LAMP-001
                        baseItemNetLength: 96
                        baseItemNetWidth: 5
                        baseItemNetHeight: 56
                        baseItemNetDiameter: null
                        netDimensionUnit: CMT
                        baseItemNetWeight: 0.26
                        netWeightUnit: KGM
                        baseItemNetVolume: 68
                        netVolumeUnit: MMQ
                      - supplierIdGln: '1234567890123'
                        supplierItemNumber: SKU-12345
                        baseItemNetLength: 25.5
                        baseItemNetWidth: 15
                        baseItemNetHeight: 10
                        baseItemNetDiameter: null
                        netDimensionUnit: CMT
                        baseItemNetWeight: 500
                        netWeightUnit: GRM
                        baseItemNetVolume: null
                        netVolumeUnit: null
                      - supplierIdGln: '9876543210987'
                        supplierItemNumber: SKU-CABLE-002
                        baseItemNetLength: 1000
                        baseItemNetWidth: null
                        baseItemNetHeight: null
                        baseItemNetDiameter: 5.5
                        netDimensionUnit: MMT
                        baseItemNetWeight: 3.2
                        netWeightUnit: KGM
                        baseItemNetVolume: null
                        netVolumeUnit: null
                    meta:
                      cursor: eyJpZCI6MTIzfQ==
                      hasNext: true
                      hasPrev: false
                      limit: 100
                      estimatedTotal: 12500
        '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'
  /trade-items/bulk/attachments:
    get:
      operationId: getBulkTradeItemAttachments
      tags:
        - TradeItems bulk
      summary: List trade item attachments
      description: |
        Retrieve trade item attachments in bulk with cursor-based pagination.
        Returns a flattened structure where each row represents a single attachment
        with the trade item identifier (`supplierIdGln` + `supplierItemNumber`).

        A trade item with 3 attachments (e.g., 1 image, 1 datasheet, 1 certificate)
        will result in 3 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/supplier-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
      responses:
        '200':
          description: Successfully retrieved trade item attachments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkTradeItemAttachmentsResponse'
              examples:
                multipleItems:
                  summary: Multiple trade item attachments
                  value:
                    data:
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-LAMP-001
                        attachmentType: ATX001
                        attachmentTypeSpecification: MDX002
                        attachmentLanguages: null
                        attachmentFilename: product_image.jpg
                        attachmentUri: https://example.com/images/product.jpg
                        attachmentDescription: Front view product image
                        attachmentIssueDate: '2024-01-15'
                        attachmentExpiryDate: null
                      - supplierIdGln: '8712423012485'
                        supplierItemNumber: SKU-LAMP-001
                        attachmentType: ATX014
                        attachmentTypeSpecification: MDX005
                        attachmentLanguages:
                          - en-GB
                        attachmentFilename: datasheet-en.pdf
                        attachmentUri: https://cdn.supplier.com/datasheets/datasheet-en.pdf
                        attachmentDescription: Technical datasheet
                        attachmentIssueDate: '2024-06-15'
                        attachmentExpiryDate: null
                      - supplierIdGln: '9876543210987'
                        supplierItemNumber: ITEM-67890
                        attachmentType: ATX026
                        attachmentTypeSpecification: null
                        attachmentLanguages: null
                        attachmentFilename: ce-certificate.pdf
                        attachmentUri: https://cdn.supplier.com/certs/ce-certificate.pdf
                        attachmentDescription: null
                        attachmentIssueDate: '2024-03-01'
                        attachmentExpiryDate: '2029-03-01'
                    meta:
                      cursor: eyJpZCI6MTIzfQ==
                      hasNext: true
                      hasPrev: false
                      limit: 100
                      estimatedTotal: 24500
        '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'
  /trade-items/bulk/enclosed-items:
    get:
      operationId: getBulkTradeItemEnclosedItems
      tags:
        - TradeItems bulk
      summary: List trade item enclosed items
      description: |
        Retrieve trade item enclosed items in bulk with cursor-based pagination.
        Returns a flattened structure where each row represents a single enclosed item
        within a packaging unit, with the trade item identifier (`supplierIdGln` + `supplierItemNumber`)
        and packaging context (`packagingTypeCode`).

        A trade item with 2 packaging units, each containing 3 enclosed items,
        will result in 6 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/supplier-id-gln-filter'
        - $ref: '#/components/parameters/mutation-date-time'
      responses:
        '200':
          description: Successfully retrieved trade item enclosed items
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkTradeItemEnclosedItemsResponse'
              examples:
                multipleItems:
                  summary: Multiple enclosed items across trade items
                  value:
                    data:
                      - supplierIdGln: '1234567890123'
                        supplierItemNumber: SKU-KIT-001
                        packagingTypeCode: BX
                        enclosedSupplierItemNumber: WIDGET-001
                        enclosedManufacturerItemNumber: MFG-WIDGET-001
                        enclosedItemGtins:
                          - '4012345678901'
                        enclosedItemQuantity: 5
                      - supplierIdGln: '1234567890123'
                        supplierItemNumber: SKU-KIT-001
                        packagingTypeCode: BX
                        enclosedSupplierItemNumber: SCREW-M8-50
                        enclosedManufacturerItemNumber: null
                        enclosedItemGtins: null
                        enclosedItemQuantity: 100
                      - supplierIdGln: '9876543210987'
                        supplierItemNumber: SKU-PALLET-002
                        packagingTypeCode: PF
                        enclosedSupplierItemNumber: WIDGET-001
                        enclosedManufacturerItemNumber: MFG-WIDGET-001
                        enclosedItemGtins:
                          - '4012345678901'
                        enclosedItemQuantity: 50
                    meta:
                      cursor: eyJpZCI6MTIzfQ==
                      hasNext: true
                      hasPrev: false
                      limit: 100
                      estimatedTotal: 2340
        '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:
    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.
    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
    TradeItemDetails:
      type: object
      description: |
        Trade item identification and details information without composite key fields.
        Combines fields from ETIM xChange `ItemIdentification` and `ItemDetails` sections.

        Used in single-item responses where the key (`supplierIdGln` + `supplierItemNumber`) 
        is provided at the root level.

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

        **Note**: Item descriptions are available via a separate `/descriptions` endpoint.
      required:
        - manufacturerIdGln
        - manufacturerProductNumber
        - itemValidityDate
      properties:
        supplierAltItemNumber:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            Alternative supplier item number. Used when the supplier has multiple numbering 
            systems or legacy item numbers.

            **ETIM xChange**: `SupplierAltItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierAltItemNumber`
          examples:
            - ALT-98765
            - null
        manufacturerItemNumber:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's item number. May differ from supplier's number if supplier 
            is a distributor.

            **ETIM xChange**: `ManufacturerItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ManufacturerItemNumber`
          examples:
            - MFG-54321
            - null
        manufacturerIdGln:
          description: |
            Global Location Number (GLN) of the manufacturer. 13-digit GS1 identifier.
            Required product key reference - together with `manufacturerProductNumber` identifies the parent product.

            **ETIM xChange**: `ManufacturerIdGln`  
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerIdGln`
          $ref: '#/components/schemas/Gln'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's product number. Required product key reference - together with 
            `manufacturerIdGln` identifies the parent product.

            **ETIM xChange**: `ManufacturerProductNumber`  
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerProductNumber`
          examples:
            - '929002376910'
            - PROD-ABC-123
        itemGtins:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          description: |
            Array of Global Trade Item Numbers (GTIN-8, GTIN-12, GTIN-13, or GTIN-14) 
            for the item. Multiple GTINs may exist for different packaging levels or markets.

            **ETIM xChange**: `ItemGtin[]`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ItemGtin[]`
          examples:
            - - '4012345678901'
              - '04012345678901'
            - null
        buyerItemNumber:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            Buyer's specific item number. Used when buyer has assigned their own 
            numbering to supplier items.

            **ETIM xChange**: `BuyerItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.BuyerItemNumber`
          examples:
            - BUYER-XYZ-123
            - null
        discountGroupId:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 20
          description: |
            Identifier for the discount group this item belongs to. 
            Used for pricing and discount calculations.

            **ETIM xChange**: `DiscountGroupId`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.DiscountGroupId`
          examples:
            - DG-001
            - null
        bonusGroupId:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 20
          description: |
            Identifier for the bonus group this item belongs to. 
            Used for bonus/rebate calculations.

            **ETIM xChange**: `BonusGroupId`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.BonusGroupId`
          examples:
            - BG-002
            - null
        itemValidityDate:
          type: string
          format: date
          description: |
            Date from which the trade item is valid for ordering. 
            ISO 8601 date format (YYYY-MM-DD).
            Defaults to CatalogueValidityStart if not overridden at the trade item level.

            **ETIM xChange**: `ItemValidityDate`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ItemValidityDate`  
            **Default from**: `CatalogueValidityStart`
          examples:
            - '2025-01-15'
            - '2024-06-01'
        itemObsolescenceDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the trade item becomes obsolete and is no longer available for ordering.
            ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `ItemObsolescenceDate`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ItemObsolescenceDate`
          examples:
            - '2026-12-31'
            - null
        itemStatus:
          description: |
            Current lifecycle status of the trade item in the supplier's catalog.

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

            **ETIM xChange**: `ItemStatus`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemStatus`
          anyOf:
            - $ref: '#/components/schemas/ItemStatus'
            - type: 'null'
          examples:
            - ACTIVE
            - PRE-LAUNCH
            - null
        itemCondition:
          description: |
            Physical condition of the trade item.

            - `NEW`: Brand new item
            - `USED`: Previously used item
            - `REFURBISHED`: Restored to working condition

            **ETIM xChange**: `ItemCondition`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemCondition`
          anyOf:
            - $ref: '#/components/schemas/ItemCondition'
            - type: 'null'
          examples:
            - NEW
            - REFURBISHED
            - null
        stockItem:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether the item is a stock item (true) or made-to-order (false).
            Stock items are typically available for immediate delivery.

            **ETIM xChange**: `StockItem`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.StockItem`
          examples:
            - true
            - false
            - null
        shelfLifePeriod:
          type:
            - integer
            - 'null'
          minimum: 0
          maximum: 999
          description: |
            Shelf life period of the item in days. Indicates how long the item remains 
            usable after production. Applicable for items with limited shelf life.

            **ETIM xChange**: `ShelfLifePeriod`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ShelfLifePeriod`
          examples:
            - 365
            - 730
            - null
      examples:
        - supplierAltItemNumber: ALT-12345
          manufacturerItemNumber: MFG-98765
          manufacturerIdGln: '9876543210987'
          manufacturerProductNumber: '929002376910'
          itemGtins:
            - '4012345678901'
          buyerItemNumber: null
          discountGroupId: DG-001
          bonusGroupId: null
          itemValidityDate: '2024-01-01'
          itemObsolescenceDate: null
          itemStatus: ACTIVE
          itemCondition: NEW
          stockItem: true
          shelfLifePeriod: null
    TradeItemDetailsSummary:
      type: object
      description: |
        Trade item identification and details for bulk retrieval, with embedded composite key fields.
        Combines fields from ETIM xChange `ItemIdentification` and `ItemDetails` sections.

        This flat structure is optimized for bulk data retrieval where each item in the response
        must be self-contained with its own key.

        For single-item responses (where key is at root level), use `TradeItemDetails`.

        **Note**: Item descriptions are available via `/trade-items/bulk/descriptions` endpoint.
      required:
        - supplierIdGln
        - supplierItemNumber
        - manufacturerIdGln
        - manufacturerProductNumber
        - itemValidityDate
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) of the supplier. 13-digit GS1 identifier.
            Part of the composite key for the trade item.

            **ETIM xChange**: `SupplierIdGln`  
            **Path**: `Supplier[].SupplierIdGln`
          examples:
            - '1234567890123'
            - '8712423012485'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item number. Part of the composite key for the trade item.
            This is the primary identifier for items in the supplier's catalog system.

            **ETIM xChange**: `SupplierItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-ABC-789
        supplierAltItemNumber:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            Alternative supplier item number. Used when the supplier has multiple numbering 
            systems or legacy item numbers.

            **ETIM xChange**: `SupplierAltItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierAltItemNumber`
          examples:
            - ALT-98765
            - null
        manufacturerItemNumber:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's item number. May differ from supplier's number if supplier 
            is a distributor.

            **ETIM xChange**: `ManufacturerItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ManufacturerItemNumber`
          examples:
            - MFG-54321
            - null
        manufacturerIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) of the manufacturer. 13-digit GS1 identifier.
            Required product key reference - together with `manufacturerProductNumber` identifies the parent product.

            **ETIM xChange**: `ManufacturerIdGln`  
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerIdGln`
          examples:
            - '9876543210987'
        manufacturerProductNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's product number. Required product key reference - together with 
            `manufacturerIdGln` identifies the parent product.

            **ETIM xChange**: `ManufacturerProductNumber`  
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerProductNumber`
          examples:
            - '929002376910'
            - PROD-ABC-123
        itemGtins:
          type:
            - array
            - 'null'
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          description: |
            Array of Global Trade Item Numbers (GTIN-8, GTIN-12, GTIN-13, or GTIN-14) 
            for the item. Multiple GTINs may exist for different packaging levels or markets.

            **ETIM xChange**: `ItemGtin[]`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ItemGtin[]`
          examples:
            - - '4012345678901'
              - '04012345678901'
            - null
        buyerItemNumber:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            Buyer's specific item number. Used when buyer has assigned their own 
            numbering to supplier items.

            **ETIM xChange**: `BuyerItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.BuyerItemNumber`
          examples:
            - BUYER-XYZ-123
            - null
        discountGroupId:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 20
          description: |
            Identifier for the discount group this item belongs to. 
            Used for pricing and discount calculations.

            **ETIM xChange**: `DiscountGroupId`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.DiscountGroupId`
          examples:
            - DG-001
            - null
        bonusGroupId:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 20
          description: |
            Identifier for the bonus group this item belongs to. 
            Used for bonus/rebate calculations.

            **ETIM xChange**: `BonusGroupId`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.BonusGroupId`
          examples:
            - BG-002
            - null
        itemValidityDate:
          type: string
          format: date
          description: |
            Date from which the trade item is valid for ordering. 
            ISO 8601 date format (YYYY-MM-DD).
            Defaults to CatalogueValidityStart if not overridden at the trade item level.

            **ETIM xChange**: `ItemValidityDate`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ItemValidityDate`  
            **Default from**: `CatalogueValidityStart`
          examples:
            - '2025-01-15'
        itemObsolescenceDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the trade item becomes obsolete and is no longer available for ordering.
            ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `ItemObsolescenceDate`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ItemObsolescenceDate`
          examples:
            - '2026-12-31'
            - null
        itemStatus:
          description: |
            Current lifecycle status of the trade item in the supplier's catalog.

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

            **ETIM xChange**: `ItemStatus`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemStatus`
          anyOf:
            - $ref: '#/components/schemas/ItemStatus'
            - type: 'null'
          examples:
            - ACTIVE
            - PRE-LAUNCH
            - null
        itemCondition:
          description: |
            Physical condition of the trade item.

            - `NEW`: Brand new item
            - `USED`: Previously used item
            - `REFURBISHED`: Restored to working condition

            **ETIM xChange**: `ItemCondition`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemCondition`
          anyOf:
            - $ref: '#/components/schemas/ItemCondition'
            - type: 'null'
          examples:
            - NEW
            - REFURBISHED
            - null
        stockItem:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether the item is a stock item (true) or made-to-order (false).
            Stock items are typically available for immediate delivery.

            **ETIM xChange**: `StockItem`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.StockItem`
          examples:
            - true
            - false
            - null
        shelfLifePeriod:
          type:
            - integer
            - 'null'
          minimum: 0
          maximum: 999
          description: |
            Shelf life period of the item in days. Indicates how long the item remains 
            usable after production. Applicable for items with limited shelf life.

            **ETIM xChange**: `ShelfLifePeriod`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ShelfLifePeriod`
          examples:
            - 365
            - 730
            - null
      examples:
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          supplierAltItemNumber: ALT-SKU-001
          manufacturerItemNumber: MFR-12345
          manufacturerIdGln: '9876543210987'
          manufacturerProductNumber: '929002376910'
          itemGtins:
            - '08712423012485'
            - '12345678901234'
          buyerItemNumber: null
          discountGroupId: DG-LIGHTING
          bonusGroupId: null
          itemValidityDate: '2024-01-01'
          itemObsolescenceDate: null
          itemStatus: ACTIVE
          itemCondition: NEW
          stockItem: true
          shelfLifePeriod: null
    ItemDescriptionsSummary:
      type: object
      description: |
        Flattened trade item description for bulk retrieval.
        Each row represents a single language description with the trade item 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**: `ItemDetails.ItemDescriptions`  
        **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemDescriptions[]`
      required:
        - supplierIdGln
        - supplierItemNumber
        - descriptionLanguage
        - minimalItemDescription
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) identifying the supplier.
            13-digit GS1 identifier. Part of the composite trade item identifier.
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item identifier.
            Part of the composite trade item identifier.

            **ETIM xChange**: `SupplierItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-ABC-789
        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[].TradeItem[].ItemDetails.ItemDescriptions[].DescriptionLanguage`
          $ref: '#/components/schemas/LanguageCode'
          examples:
            - en-GB
            - de-DE
            - nl-NL
        minimalItemDescription:
          type: string
          minLength: 1
          maxLength: 80
          description: |
            Short item description (maximum 80 characters). Minimal required description for item identification.

            **ETIM xChange**: `MinimalItemDescription`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemDescriptions[].MinimalItemDescription`
          examples:
            - LED Lamp 10W E27
            - Hammer 500g
        uniqueMainItemDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 255
          description: |
            Unique main item description (maximum 255 characters). 
            A concise but comprehensive description that uniquely identifies the trade item.

            **ETIM xChange**: `UniqueMainItemDescription`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemDescriptions[].UniqueMainItemDescription`
          examples:
            - Professional LED lamp with E27 socket, 10W warm white
            - Professional claw hammer with fiberglass handle, 500g head weight
        discountGroupDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Human-readable description of the discount group in this language.

            **ETIM xChange**: `DiscountGroupDescription[].DiscountGroupDescription`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.DiscountGroupDescription[].DiscountGroupDescription`
          examples:
            - Standard tools discount group
            - null
        bonusGroupDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Human-readable description of the bonus group in this language.

            **ETIM xChange**: `BonusGroupDescription[].BonusGroupDescription`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.BonusGroupDescription[].BonusGroupDescription`
          examples:
            - Premium bonus tier
            - null
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          descriptionLanguage: en-GB
          minimalItemDescription: LED Lamp 10W E27
          uniqueMainItemDescription: Professional LED lamp with E27 socket, 10W warm white
          discountGroupDescription: Lighting products discount group
          bonusGroupDescription: null
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          descriptionLanguage: de-DE
          minimalItemDescription: LED Lampe 10W E27
          uniqueMainItemDescription: Professionelle LED-Lampe mit E27-Fassung, 10W warmweiß
          discountGroupDescription: Beleuchtungsprodukte Rabattgruppe
          bonusGroupDescription: null
        - supplierIdGln: '9876543210987'
          supplierItemNumber: ITEM-67890
          descriptionLanguage: en-GB
          minimalItemDescription: Hammer 500g
    TradeItemOrdering:
      type: object
      description: |
        Ordering information for the trade item including order unit, minimum quantities, and lead time.
        Extracted from ETIM xChange `TradeItem.Ordering` structure.

        **ETIM xChange**: `Ordering`
        **Path**: `Supplier[].Product[].TradeItem[].Ordering`
      required:
        - orderUnit
        - minimumOrderQuantity
        - orderStepSize
      properties:
        orderUnit:
          description: |
            Unit in which the item can be ordered (e.g., pieces, boxes, meters).

            **ETIM xChange**: `OrderUnit`
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.OrderUnit`
          $ref: '#/components/schemas/UnitCodes'
          examples:
            - C62
            - BX
            - MTR
        minimumOrderQuantity:
          type: number
          format: decimal
          description: |
            Minimum quantity that must be ordered (converted from ETIM xChange string to number).

            **ETIM xChange**: `MinimumOrderQuantity` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.MinimumOrderQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - 10
            - 500
        orderStepSize:
          type: number
          format: decimal
          description: |
            Quantity increment for orders beyond minimum (converted from ETIM xChange string to number).
            For example, if minimum is 10 and step is 5, you can order 10, 15, 20, etc.

            **ETIM xChange**: `OrderStepSize` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.OrderStepSize`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - 5
            - 100
        standardOrderLeadTime:
          type:
            - integer
            - 'null'
          description: |
            Standard lead time for orders in days.

            **ETIM xChange**: `StandardOrderLeadTime`
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.StandardOrderLeadTime`
          minimum: 0
          examples:
            - 5
            - 14
            - null
        useUnit:
          description: |
            Unit in which the item is used or consumed (may differ from order unit, nullable).

            **ETIM xChange**: `UseUnit`
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.UseUnit`
          anyOf:
            - $ref: '#/components/schemas/UnitCodes'
            - type: 'null'
          examples:
            - MTR
            - KGM
            - null
        useUnitConversionFactor:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Conversion factor from order unit to use unit (converted from ETIM xChange string to number).

            **ETIM xChange**: `UseUnitConversionFactor` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.UseUnitConversionFactor`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - 100
            - null
        singleUseUnitQuantity:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Quantity of use units in a single order unit (converted from ETIM xChange string to number).

            **ETIM xChange**: `SingleUseUnitQuantity` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.SingleUseUnitQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - 100
            - null
        alternativeUseUnit:
          description: |
            Alternative unit in which the item can be used or consumed (nullable).

            **ETIM xChange**: `AlternativeUseUnit`
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.AlternativeUseUnit`
          anyOf:
            - $ref: '#/components/schemas/UnitCodes'
            - type: 'null'
          examples:
            - LTR
            - null
        alternativeUseUnitConversionFactor:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Conversion factor from order unit to alternative use unit (converted from ETIM xChange string to number).

            **ETIM xChange**: `AlternativeUseUnitConversionFactor` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.AlternativeUseUnitConversionFactor`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - null
      examples:
        - orderUnit: C62
          minimumOrderQuantity: 1
          orderStepSize: 1
          standardOrderLeadTime: 5
          useUnit: null
          useUnitConversionFactor: null
          singleUseUnitQuantity: null
          alternativeUseUnit: null
          alternativeUseUnitConversionFactor: null
    TradeItemOrderingsSummary:
      type: object
      description: |
        Trade item ordering information for bulk retrieval, with embedded composite key fields.
        Contains ordering details from ETIM xChange `TradeItem.Ordering` section.

        This flat structure is optimized for bulk data retrieval where each item in the response
        must be self-contained with its own key.

        For single-item responses (where key is at root level), use `TradeItemOrdering`.

        **ETIM xChange**: `Ordering`
        **Path**: `Supplier[].Product[].TradeItem[].Ordering`
      required:
        - supplierIdGln
        - supplierItemNumber
        - orderUnit
        - minimumOrderQuantity
        - orderStepSize
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) of the supplier. 13-digit GS1 identifier.
            Part of the composite key for the trade item.

            **ETIM xChange**: `SupplierIdGln`  
            **Path**: `Supplier[].SupplierIdGln`
          examples:
            - '1234567890123'
            - '8712423012485'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item number. Part of the composite key for the trade item.
            This is the primary identifier for items in the supplier's catalog system.

            **ETIM xChange**: `SupplierItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-ABC-789
        orderUnit:
          description: |
            Unit in which the item can be ordered (e.g., pieces, boxes, meters).

            **ETIM xChange**: `OrderUnit`
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.OrderUnit`
          $ref: '#/components/schemas/UnitCodes'
          examples:
            - C62
            - BX
            - MTR
        minimumOrderQuantity:
          type: number
          format: decimal
          description: |
            Minimum quantity that must be ordered (converted from ETIM xChange string to number).

            **ETIM xChange**: `MinimumOrderQuantity` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.MinimumOrderQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - 10
            - 500
        orderStepSize:
          type: number
          format: decimal
          description: |
            Quantity increment for orders beyond minimum (converted from ETIM xChange string to number).
            For example, if minimum is 10 and step is 5, you can order 10, 15, 20, etc.

            **ETIM xChange**: `OrderStepSize` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.OrderStepSize`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - 5
            - 100
        standardOrderLeadTime:
          type:
            - integer
            - 'null'
          description: |
            Standard lead time for orders in days.

            **ETIM xChange**: `StandardOrderLeadTime`
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.StandardOrderLeadTime`
          minimum: 0
          examples:
            - 5
            - 14
            - null
        useUnit:
          description: |
            Unit in which the item is used or consumed (may differ from order unit, nullable).

            **ETIM xChange**: `UseUnit`
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.UseUnit`
          anyOf:
            - $ref: '#/components/schemas/UnitCodes'
            - type: 'null'
          examples:
            - MTR
            - KGM
            - null
        useUnitConversionFactor:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Conversion factor from order unit to use unit (converted from ETIM xChange string to number).

            **ETIM xChange**: `UseUnitConversionFactor` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.UseUnitConversionFactor`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - 100
            - null
        singleUseUnitQuantity:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Quantity of use units in a single order unit (converted from ETIM xChange string to number).

            **ETIM xChange**: `SingleUseUnitQuantity` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.SingleUseUnitQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - 100
            - null
        alternativeUseUnit:
          description: |
            Alternative unit in which the item can be used or consumed (nullable).

            **ETIM xChange**: `AlternativeUseUnit`
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.AlternativeUseUnit`
          anyOf:
            - $ref: '#/components/schemas/UnitCodes'
            - type: 'null'
          examples:
            - LTR
            - null
        alternativeUseUnitConversionFactor:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Conversion factor from order unit to alternative use unit (converted from ETIM xChange string to number).

            **ETIM xChange**: `AlternativeUseUnitConversionFactor` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Ordering.AlternativeUseUnitConversionFactor`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1
            - null
      examples:
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          orderUnit: C62
          minimumOrderQuantity: 1
          orderStepSize: 1
          standardOrderLeadTime: 5
          useUnit: null
          useUnitConversionFactor: null
          singleUseUnitQuantity: null
          alternativeUseUnit: null
          alternativeUseUnitConversionFactor: null
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-CABLE-002
          orderUnit: MTR
          minimumOrderQuantity: 10
          orderStepSize: 5
          standardOrderLeadTime: 3
          useUnit: MTR
          useUnitConversionFactor: 1
          singleUseUnitQuantity: 1
          alternativeUseUnit: null
          alternativeUseUnitConversionFactor: null
    TradeItemPricing:
      type: object
      description: |
        Pricing information for a trade item including prices, price unit, and validity dates.
        Extracted from ETIM xChange `TradeItem.Pricing[]` structure.

        **Allowances & Surcharges**: Included as nested array in the complete `TradeItemResponse`.
        Always `null` in subresource (`/pricings`) and bulk (`/trade-items/bulk/pricings`) responses —
        use the separate `/allowance-surcharges` or `/trade-items/bulk/allowance-surcharges` endpoints for flat retrieval.

        **ETIM xChange**: `Pricing`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
      required:
        - pricingRef
        - priceUnit
        - priceQuantity
        - currencyCode
        - priceValidityDate
      properties:
        pricingRef:
          description: |
            Server-generated opaque reference key that uniquely identifies this pricing entry
            within the scope of a trade item (identified by `supplierIdGln` + `supplierItemNumber`).

            This is a technical identifier not present in the ETIM xChange domain model.
            Use `pricingRef` to correlate pricing entries with their allowances/surcharges
            from the `/allowance-surcharges` endpoint.
          $ref: '#/components/schemas/TechnicalId'
          examples:
            - price-c62-1-20250101
            - f47ac10b-58cc-4372-a567-0e02b2c3d479
        priceUnit:
          description: |
            Unit for which the price applies (e.g., pieces, boxes, meters).

            **ETIM xChange**: `PriceUnit`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceUnit`
          $ref: '#/components/schemas/UnitCodes'
          examples:
            - C62
            - BX
            - MTR
        priceUnitFactor:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Factor to convert price unit to order unit (converted from ETIM xChange string to number).

            **ETIM xChange**: `PriceUnitFactor` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceUnitFactor`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 1
            - 100
            - null
        priceQuantity:
          type: number
          format: decimal
          description: |
            Quantity for which the price applies (converted from ETIM xChange string to number).

            **ETIM xChange**: `PriceQuantity` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999.9999
          examples:
            - 1
            - 10
            - 100
        currencyCode:
          description: |
            Currency code for all monetary values in this pricing entry.
            Sourced from ETIM xChange `CurrencyCode` at catalog level.
          $ref: '#/components/schemas/CurrencyCode'
          examples:
            - EUR
        priceOnRequest:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether the price is available only on request.

            **ETIM xChange**: `PriceOnRequest`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceOnRequest`
          examples:
            - false
            - true
            - null
        grossListPrice:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Gross list price (before discounts) (converted from ETIM xChange string to number).

            **ETIM xChange**: `GrossListPrice` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].GrossListPrice`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 130
            - 1500
            - null
        netPrice:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net price (after discounts, before tax) (converted from ETIM xChange string to number).

            **ETIM xChange**: `NetPrice` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].NetPrice`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 100
            - 1200
            - null
        recommendedRetailPrice:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Recommended retail price (MSRP) (converted from ETIM xChange string to number).

            **ETIM xChange**: `RecommendedRetailPrice` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].RecommendedRetailPrice`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 150
            - 1800
            - null
        vat:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            VAT/tax percentage (converted from ETIM xChange string to number).

            **ETIM xChange**: `Vat` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].Vat`
          minimum: 0
          multipleOf: 0.01
          maximum: 99.99
          examples:
            - 21
            - 19
            - null
        priceValidityDate:
          type: string
          format: date
          description: |
            Date from which the price is valid. ISO 8601 date format (YYYY-MM-DD).
            Defaults to CatalogueValidityStart if not overridden at the pricing level.

            **ETIM xChange**: `PriceValidityDate`  
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceValidityDate`  
            **Default from**: `CatalogueValidityStart`
          examples:
            - '2025-01-01'
        priceExpiryDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the price expires. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `PriceExpiryDate`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceExpiryDate`
          examples:
            - '2025-12-31'
            - null
        allowanceSurcharges:
          type:
            - array
            - 'null'
          description: |
            Allowances and surcharges applied to this pricing entry.

            **Populated** in the complete `TradeItemResponse` (nested inside each pricing entry).
            **Always `null`** in subresource (`/pricings`) and bulk (`/trade-items/bulk/pricings`) responses.
            For flat retrieval, use the dedicated `/allowance-surcharges` or `/trade-items/bulk/allowance-surcharges` endpoints.

            **ETIM xChange**: `AllowanceSurcharge[]`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[]`
          items:
            $ref: '#/components/schemas/AllowanceSurcharge'
          examples:
            - - allowanceSurchargeIndicator: ALLOWANCE
                allowanceSurchargeType: AEQ
                allowanceSurchargeSequenceNumber: 1
                allowanceSurchargePercentage: 10
                allowanceSurchargeMinimumQuantity: 100
            - null
      examples:
        - pricingRef: price-c62-1-20250101
          priceUnit: C62
          priceUnitFactor: null
          priceQuantity: 1
          currencyCode: EUR
          priceOnRequest: false
          grossListPrice: 130
          netPrice: 100
          recommendedRetailPrice: 150
          vat: 21
          priceValidityDate: '2025-01-01'
          priceExpiryDate: '2025-12-31'
          allowanceSurcharges:
            - allowanceSurchargeIndicator: ALLOWANCE
              allowanceSurchargeType: AEQ
              allowanceSurchargeSequenceNumber: 1
              allowanceSurchargePercentage: 10
              allowanceSurchargeMinimumQuantity: 100
        - pricingRef: price-mtr-1-20250101
          priceUnit: MTR
          priceUnitFactor: 1
          priceQuantity: 1
          currencyCode: EUR
          priceOnRequest: false
          grossListPrice: 2.5
          netPrice: 1.99
          recommendedRetailPrice: 3.49
          vat: 21
          priceValidityDate: '2025-01-01'
          priceExpiryDate: '2025-06-30'
          allowanceSurcharges: null
    TradeItemPricingsSummary:
      type: object
      description: |
        Trade item pricing information for bulk retrieval, with embedded composite key fields.
        Contains pricing details from ETIM xChange `TradeItem.Pricing[]` structure.

        This structure is optimized for bulk data retrieval where each item in the response
        must be self-contained with its own key. A trade item may have multiple pricing entries
        for different conditions, customer groups, or validity periods.

        For single-item responses (where key is at root level), use `TradeItemPricing`.

        **ETIM xChange**: `Pricing[]`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
      required:
        - supplierIdGln
        - supplierItemNumber
        - pricings
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) of the supplier. 13-digit GS1 identifier.
            Part of the composite key for the trade item.

            **ETIM xChange**: `SupplierIdGln`  
            **Path**: `Supplier[].SupplierIdGln`
          examples:
            - '1234567890123'
            - '8712423012485'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item number. Part of the composite key for the trade item.
            This is the primary identifier for items in the supplier's catalog system.

            **ETIM xChange**: `SupplierItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-ABC-789
        pricings:
          type: array
          description: |
            Array of pricing information for this trade item. A trade item may have multiple
            pricing entries for different conditions, customer groups, or validity periods.

            **ETIM xChange**: `Pricing[]`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
          items:
            $ref: '#/components/schemas/TradeItemPricing'
      examples:
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          pricings:
            - pricingRef: price-c62-1-20250101
              priceUnit: C62
              priceUnitFactor: null
              priceQuantity: 1
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 12.99
              netPrice: 9.99
              recommendedRetailPrice: 15.99
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-12-31'
              allowanceSurcharges: null
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-CABLE-002
          pricings:
            - pricingRef: price-mtr-1-20250101
              priceUnit: MTR
              priceUnitFactor: 1
              priceQuantity: 1
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 2.5
              netPrice: 1.99
              recommendedRetailPrice: 3.49
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-06-30'
              allowanceSurcharges: null
            - pricingRef: price-mtr-100-20250101
              priceUnit: MTR
              priceUnitFactor: 1
              priceQuantity: 100
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 2
              netPrice: 1.59
              recommendedRetailPrice: 2.99
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-06-30'
              allowanceSurcharges: null
    AllowanceSurcharge:
      type: object
      description: |
        Allowance or surcharge applied to trade item pricing, including fixed and percentage-based adjustments.
        **ETIM xChange**: `AllowanceSurcharge`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[]`
      required:
        - allowanceSurchargeIndicator
        - allowanceSurchargeType
      properties:
        allowanceSurchargeIndicator:
          type: string
          description: |
            Indicates whether this price adjustment is an allowance (discount) or a surcharge (additional charge).
            **ETIM xChange**: `AllowanceSurchargeIndicator`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeIndicator`
          enum:
            - ALLOWANCE
            - SURCHARGE
          examples:
            - ALLOWANCE
            - SURCHARGE
        allowanceSurchargeValidityDate:
          type:
            - string
            - 'null'
          description: |
            Date from which the allowance or surcharge becomes valid. ISO 8601 date format (YYYY-MM-DD).
            **ETIM xChange**: `AllowanceSurchargeValidityDate`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeValidityDate`
          format: date
          examples:
            - '2025-01-01'
            - null
        allowanceSurchargeType:
          description: |
            Code describing the reason for the allowance or surcharge. Uses shared enumeration aligned with ETIM codes.
            **ETIM xChange**: `AllowanceSurchargeType`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeType`
          $ref: '#/components/schemas/AllowanceSurchargeTypes'
        allowanceSurchargeAmount:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Fixed monetary amount of the allowance or surcharge (converted from ETIM string pattern to numeric form).
            **ETIM xChange**: `AllowanceSurchargeAmount`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeAmount`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 15.5
            - 250
            - null
        allowanceSurchargeSequenceNumber:
          type:
            - integer
            - 'null'
          description: |
            Sequence number used to order multiple allowances or surcharges applied to the same price.
            **ETIM xChange**: `AllowanceSurchargeSequenceNumber`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeSequenceNumber`
          minimum: 1
          examples:
            - 1
            - 3
            - null
        allowanceSurchargePercentage:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Percentage rate of the allowance or surcharge (converted from ETIM string pattern to numeric form).
            **ETIM xChange**: `AllowanceSurchargePercentage`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargePercentage`
          minimum: 0
          multipleOf: 0.001
          maximum: 999.999
          examples:
            - 5.5
            - 12.75
            - null
        allowanceSurchargeMinimumQuantity:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Minimum ordered quantity required for the allowance or surcharge to apply (converted from ETIM string pattern to numeric form).
            **ETIM xChange**: `AllowanceSurchargeMinimumQuantity`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeMinimumQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 10
            - 1250.5
            - null
      examples:
        - allowanceSurchargeIndicator: ALLOWANCE
          allowanceSurchargeValidityDate: '2025-01-01'
          allowanceSurchargeType: AEQ
          allowanceSurchargeAmount: null
          allowanceSurchargeSequenceNumber: 1
          allowanceSurchargePercentage: 5.5
          allowanceSurchargeMinimumQuantity: 50
        - allowanceSurchargeIndicator: SURCHARGE
          allowanceSurchargeValidityDate: null
          allowanceSurchargeType: DBD
          allowanceSurchargeAmount: 25
          allowanceSurchargeSequenceNumber: null
          allowanceSurchargePercentage: null
          allowanceSurchargeMinimumQuantity: null
    AllowanceSurchargeSummary:
      type: object
      description: |
        Flattened allowance or surcharge for bulk retrieval.
        Each row represents a single allowance/surcharge entry with embedded keys for joining
        back to the parent trade item and pricing entry.

        This flattened structure is optimized for:
        - Predictable payload sizes per row
        - Efficient cursor-based pagination
        - ETL/data warehouse ingestion (star schema: pricing fact + surcharges fact)
        - Streaming data processing

        **Join Keys**: Use `supplierIdGln` + `supplierItemNumber` + `pricingRef` to join
        with `/trade-items/bulk/pricings` data.

        **ETIM xChange**: `AllowanceSurcharge`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[]`
      required:
        - supplierIdGln
        - supplierItemNumber
        - pricingRef
        - allowanceSurchargeIndicator
        - allowanceSurchargeType
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) of the supplier. 13-digit GS1 identifier.
            Part of the composite key for the trade item.

            **ETIM xChange**: `SupplierIdGln`  
            **Path**: `Supplier[].SupplierIdGln`
          examples:
            - '1234567890123'
            - '8712423012485'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item number. Part of the composite key for the trade item.

            **ETIM xChange**: `SupplierItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-ABC-789
        pricingRef:
          description: |
            Server-generated opaque reference key that identifies the parent pricing entry.
            Use this to correlate with the corresponding pricing record from the
            `/trade-items/bulk/pricings` endpoint.

            This is a technical identifier not present in the ETIM xChange domain model.
          $ref: '#/components/schemas/TechnicalId'
          examples:
            - price-c62-1-20250101
            - f47ac10b-58cc-4372-a567-0e02b2c3d479
        allowanceSurchargeIndicator:
          type: string
          description: |
            Indicates whether this price adjustment is an allowance (discount) or a surcharge (additional charge).

            **ETIM xChange**: `AllowanceSurchargeIndicator`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeIndicator`
          enum:
            - ALLOWANCE
            - SURCHARGE
          examples:
            - ALLOWANCE
            - SURCHARGE
        allowanceSurchargeType:
          description: |
            Code describing the reason for the allowance or surcharge.

            **ETIM xChange**: `AllowanceSurchargeType`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeType`
          $ref: '#/components/schemas/AllowanceSurchargeTypes'
        allowanceSurchargeSequenceNumber:
          type:
            - integer
            - 'null'
          description: |
            Sequence number used to order multiple allowances or surcharges applied to the same price.

            **ETIM xChange**: `AllowanceSurchargeSequenceNumber`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeSequenceNumber`
          minimum: 1
          examples:
            - 1
            - 2
        allowanceSurchargeValidityDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date from which the allowance or surcharge becomes valid. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `AllowanceSurchargeValidityDate`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeValidityDate`
          examples:
            - '2025-01-01'
        allowanceSurchargeAmount:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Fixed monetary amount of the allowance or surcharge.
            Mutually exclusive with `allowanceSurchargePercentage` (typically one or the other is set).

            **ETIM xChange**: `AllowanceSurchargeAmount` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeAmount`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 15.5
            - 250
        allowanceSurchargePercentage:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Percentage rate of the allowance or surcharge.
            Mutually exclusive with `allowanceSurchargeAmount` (typically one or the other is set).

            **ETIM xChange**: `AllowanceSurchargePercentage` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargePercentage`
          minimum: 0
          multipleOf: 0.001
          maximum: 999.999
          examples:
            - 5.5
            - 12.75
        allowanceSurchargeMinimumQuantity:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Minimum ordered quantity required for the allowance or surcharge to apply.

            **ETIM xChange**: `AllowanceSurchargeMinimumQuantity` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[].AllowanceSurchargeMinimumQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 10
            - 50
      examples:
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          pricingRef: price-c62-1-20250101
          allowanceSurchargeIndicator: ALLOWANCE
          allowanceSurchargeType: AEQ
          allowanceSurchargeSequenceNumber: 1
          allowanceSurchargePercentage: 5.5
          allowanceSurchargeMinimumQuantity: 50
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-CABLE-002
          pricingRef: price-mtr-1-20250101
          allowanceSurchargeIndicator: SURCHARGE
          allowanceSurchargeType: DBD
          allowanceSurchargeSequenceNumber: 1
          allowanceSurchargeAmount: 25
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-TOOL-003
          pricingRef: price-c62-1-20250101
          allowanceSurchargeIndicator: ALLOWANCE
          allowanceSurchargeType: AEQ
          allowanceSurchargeSequenceNumber: 1
          allowanceSurchargePercentage: 10
          allowanceSurchargeMinimumQuantity: 100
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-TOOL-003
          pricingRef: price-c62-1-20250101
          allowanceSurchargeIndicator: ALLOWANCE
          allowanceSurchargeType: AEQ
          allowanceSurchargeSequenceNumber: 2
          allowanceSurchargePercentage: 15
          allowanceSurchargeMinimumQuantity: 500
    ItemRelation:
      type: object
      description: |
        Defines a relationship between trade items (e.g., accessories, spare parts, related products).
        Extracted from ETIM xChange `TradeItem.ItemRelations[]` structure.
      required:
        - relatedSupplierItemNumber
        - relationType
        - relatedItemQuantity
      properties:
        relatedSupplierItemNumber:
          type: string
          description: |
            Supplier item number of the related trade item.
            **ETIM xChange**: `RelatedSupplierItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelatedSupplierItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - SPART-001
            - ACC-789
        relatedManufacturerItemNumber:
          type:
            - string
            - 'null'
          description: |
            Manufacturer item number of the related trade item.
            **ETIM xChange**: `RelatedManufacturerItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelatedManufacturerItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - MFG-PART-456
            - null
        relatedItemGtins:
          type:
            - array
            - 'null'
          description: |
            Array of GTINs for the related trade item.
            **ETIM xChange**: `RelatedItemGtin[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelatedItemGtin[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          examples:
            - - '4012345678918'
            - null
        relationType:
          description: |
            Type of relationship between this item and the related item.
            **ETIM xChange**: `RelationType`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelationType`
          $ref: '#/components/schemas/RelationType'
          examples:
            - SPAREPART
            - ACCESSORY
            - MANDATORY
        relatedItemQuantity:
          type: integer
          description: |
            Quantity of the related item required or recommended (converted from ETIM xChange string to integer).
            **ETIM xChange**: `RelatedItemQuantity` (string with pattern in ETIM, converted to integer)
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelatedItemQuantity`
          minimum: 1
          examples:
            - 1
            - 4
            - 10
      examples:
        - relatedSupplierItemNumber: SPART-001
          relatedManufacturerItemNumber: MFG-SPART-100
          relatedItemGtins:
            - '4012345678918'
          relationType: SPAREPART
          relatedItemQuantity: 2
    ItemRelationSummary:
      type: object
      description: |
        Flattened item relation for bulk retrieval.
        Each row represents a single relationship between a trade item and a related item,
        with the trade item identifier embedded at top level.

        A trade item with 5 relations (e.g., 2 accessories, 2 spare parts, 1 successor)
        will result in 5 rows.

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

        **ETIM xChange**: `ItemRelations[]`  
        **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[]`
      required:
        - supplierIdGln
        - supplierItemNumber
        - relatedSupplierItemNumber
        - relationType
        - relatedItemQuantity
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) identifying the supplier.
            13-digit GS1 identifier. Part of the composite trade item identifier.
          examples:
            - '1234567890123'
            - '8712423012485'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item identifier.
            Part of the composite trade item identifier.

            **ETIM xChange**: `SupplierItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-ABC-789
        relatedSupplierItemNumber:
          type: string
          description: |
            Supplier item number of the related trade item.
            **ETIM xChange**: `RelatedSupplierItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelatedSupplierItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - SPART-001
            - ACC-789
        relatedManufacturerItemNumber:
          type:
            - string
            - 'null'
          description: |
            Manufacturer item number of the related trade item.
            **ETIM xChange**: `RelatedManufacturerItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelatedManufacturerItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - MFG-PART-456
            - null
        relatedItemGtins:
          type:
            - array
            - 'null'
          description: |
            Array of GTINs for the related trade item.
            **ETIM xChange**: `RelatedItemGtin[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelatedItemGtin[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          examples:
            - - '4012345678918'
            - null
        relationType:
          description: |
            Type of relationship between this item and the related item.
            **ETIM xChange**: `RelationType`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelationType`
          $ref: '#/components/schemas/RelationType'
          examples:
            - SPAREPART
            - ACCESSORY
            - MANDATORY
        relatedItemQuantity:
          type: integer
          description: |
            Quantity of the related item required or recommended (converted from ETIM xChange string to integer).
            **ETIM xChange**: `RelatedItemQuantity`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelatedItemQuantity`
          minimum: 1
          examples:
            - 1
            - 4
            - 10
      examples:
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          relatedSupplierItemNumber: SPART-001
          relatedManufacturerItemNumber: MFG-SPART-100
          relatedItemGtins:
            - '4012345678918'
          relationType: SPAREPART
          relatedItemQuantity: 2
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          relatedSupplierItemNumber: ACC-789
          relatedManufacturerItemNumber: null
          relatedItemGtins: null
          relationType: ACCESSORY
          relatedItemQuantity: 1
        - supplierIdGln: '9876543210987'
          supplierItemNumber: SKU-CABLE-002
          relatedSupplierItemNumber: SKU-CABLE-003
          relatedManufacturerItemNumber: MFG-CABLE-V2
          relatedItemGtins:
            - '8712345678901'
          relationType: SUCCESSOR
          relatedItemQuantity: 1
    ItemLogistic:
      type: object
      description: |
        Logistic details including dimensions, weight, and volume of the base item.
        Extracted from ETIM xChange `TradeItem.ItemLogisticDetails[]` structure.
      properties:
        baseItemNetLength:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net length of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetLength` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetLength`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 25.5
            - 100
            - null
        baseItemNetWidth:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net width of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetWidth` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetWidth`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 15.25
            - 50
            - null
        baseItemNetHeight:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net height of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetHeight` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetHeight`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 10.5
            - 30
            - null
        baseItemNetDiameter:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net diameter of the base item in specified unit (for cylindrical items) (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetDiameter` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetDiameter`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 8.75
            - null
        netDimensionUnit:
          type:
            - string
            - 'null'
          description: |
            Unit of measurement for net dimensions (CMT=centimeter, MTR=meter, etc.).
            **ETIM xChange**: `NetDimensionUnit`
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].NetDimensionUnit`
          enum:
            - CMT
            - DMT
            - KMT
            - MMT
            - MTR
            - FOT
            - INH
            - SMI
            - YRD
            - null
          examples:
            - CMT
            - MTR
            - null
        baseItemNetWeight:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net weight of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetWeight` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetWeight`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1.5
            - 1250.75
            - null
        netWeightUnit:
          type:
            - string
            - 'null'
          description: |
            Unit of measurement for net weight (GRM=gram, KGM=kilogram, etc.).
            **ETIM xChange**: `NetWeightUnit`
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].NetWeightUnit`
          enum:
            - GRM
            - KGM
            - MGM
            - TNE
            - LTN
            - LBR
            - ONZ
            - null
          examples:
            - GRM
            - KGM
            - null
        baseItemNetVolume:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net volume of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetVolume` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetVolume`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 0.5
            - 10.25
            - null
        netVolumeUnit:
          type:
            - string
            - 'null'
          description: |
            Unit of measurement for net volume (LTR=liter, MTQ=cubic meter, etc.).
            **ETIM xChange**: `NetVolumeUnit`
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].NetVolumeUnit`
          enum:
            - FTQ
            - INQ
            - MTQ
            - MMQ
            - OZA
            - GLL
            - LTR
            - MLT
            - PT
            - QT
            - null
          examples:
            - LTR
            - MTQ
            - null
      examples:
        - baseItemNetLength: 25.5
          baseItemNetWidth: 15
          baseItemNetHeight: 10
          baseItemNetDiameter: null
          netDimensionUnit: CMT
          baseItemNetWeight: 500
          netWeightUnit: GRM
          baseItemNetVolume: null
          netVolumeUnit: null
    ItemLogisticSummary:
      type: object
      description: |
        Flattened item logistics for bulk retrieval.
        Each row represents a single logistics entry for a trade item,
        with the trade item identifier embedded at top level.

        A trade item typically has 0 or 1 logistics entries. Items with logistics data
        will result in 1 row per logistics entry.

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

        **ETIM xChange**: `ItemLogisticDetails[]`  
        **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[]`
      required:
        - supplierIdGln
        - supplierItemNumber
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) identifying the supplier.
            13-digit GS1 identifier. Part of the composite trade item identifier.
          examples:
            - '1234567890123'
            - '8712423012485'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item identifier.
            Part of the composite trade item identifier.

            **ETIM xChange**: `SupplierItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-ABC-789
        baseItemNetLength:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net length of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetLength` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetLength`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 25.5
            - 100
            - null
        baseItemNetWidth:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net width of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetWidth` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetWidth`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 15.25
            - 50
            - null
        baseItemNetHeight:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net height of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetHeight` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetHeight`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 10.5
            - 30
            - null
        baseItemNetDiameter:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net diameter of the base item in specified unit (for cylindrical items) (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetDiameter` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetDiameter`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 8.75
            - null
        netDimensionUnit:
          type:
            - string
            - 'null'
          description: |
            Unit of measurement for net dimensions (CMT=centimeter, MTR=meter, etc.).
            **ETIM xChange**: `NetDimensionUnit`
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].NetDimensionUnit`
          enum:
            - CMT
            - DMT
            - KMT
            - MMT
            - MTR
            - FOT
            - INH
            - SMI
            - YRD
            - null
          examples:
            - CMT
            - MTR
            - null
        baseItemNetWeight:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net weight of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetWeight` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetWeight`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 1.5
            - 1250.75
            - null
        netWeightUnit:
          type:
            - string
            - 'null'
          description: |
            Unit of measurement for net weight (GRM=gram, KGM=kilogram, etc.).
            **ETIM xChange**: `NetWeightUnit`
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].NetWeightUnit`
          enum:
            - GRM
            - KGM
            - MGM
            - TNE
            - LTN
            - LBR
            - ONZ
            - null
          examples:
            - GRM
            - KGM
            - null
        baseItemNetVolume:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net volume of the base item in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `BaseItemNetVolume` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].BaseItemNetVolume`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 0.5
            - 10.25
            - null
        netVolumeUnit:
          type:
            - string
            - 'null'
          description: |
            Unit of measurement for net volume (LTR=liter, MTQ=cubic meter, etc.).
            **ETIM xChange**: `NetVolumeUnit`
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[].NetVolumeUnit`
          enum:
            - FTQ
            - INQ
            - MTQ
            - MMQ
            - OZA
            - GLL
            - LTR
            - MLT
            - PT
            - QT
            - null
          examples:
            - LTR
            - MTQ
            - null
      examples:
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          baseItemNetLength: 96
          baseItemNetWidth: 5
          baseItemNetHeight: 56
          baseItemNetDiameter: null
          netDimensionUnit: CMT
          baseItemNetWeight: 0.26
          netWeightUnit: KGM
          baseItemNetVolume: 68
          netVolumeUnit: MMQ
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          baseItemNetLength: 25.5
          baseItemNetWidth: 15
          baseItemNetHeight: 10
          baseItemNetDiameter: null
          netDimensionUnit: CMT
          baseItemNetWeight: 500
          netWeightUnit: GRM
          baseItemNetVolume: null
          netVolumeUnit: null
    ItemAttachment:
      type: object
      description: |
        Attachment information for trade items (images, documents, certificates, etc.).
        Extracted from ETIM xChange `TradeItem.ItemAttachments[]` structure.
      required:
        - attachmentType
        - attachmentUri
      properties:
        attachmentType:
          $ref: '#/components/schemas/AttachmentType'
          description: |
            Type of attachment (image, document, certificate, etc.).
            **ETIM xChange**: `AttachmentType`
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentType`
        attachmentTypeSpecification:
          $ref: '#/components/schemas/AttachmentTypeSpecification'
          description: |
            Additional specification code providing more detail about the attachment type.
            **ETIM xChange**: `AttachmentTypeSpecification`
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentTypeSpecification`
        attachmentLanguages:
          type:
            - array
            - 'null'
          description: |
            Languages for which the attachment is applicable (e.g., 'en-GB', 'de-DE').
            **ETIM xChange**: `AttachmentLanguage[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentLanguage[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/LanguageCode'
          examples:
            - - en-GB
              - de-DE
            - null
        attachmentFilename:
          type:
            - string
            - 'null'
          description: |
            Filename of the attachment.
            **ETIM xChange**: `AttachmentFilename`
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentFilename`
          minLength: 1
          maxLength: 100
          examples:
            - product_image.jpg
            - manual_en.pdf
            - null
        attachmentUri:
          type: string
          format: uri
          description: |
            URI/URL to the attachment file.
            **ETIM xChange**: `AttachmentUri`
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentUri`
          examples:
            - https://example.com/attachments/product_image.jpg
            - https://cdn.supplier.com/manuals/manual_en.pdf
        attachmentDescription:
          type:
            - string
            - 'null'
          description: |
            Human-readable description of the attachment. Flattened from multilingual array.
            **ETIM xChange**: `AttachmentDescription[].AttachmentDescription`
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentDescription[].AttachmentDescription`
          minLength: 1
          maxLength: 255
          examples:
            - Front view product image
            - User manual in English
            - null
        attachmentIssueDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the attachment was issued. ISO 8601 date format (YYYY-MM-DD).
            **ETIM xChange**: `AttachmentIssueDate`
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentIssueDate`
          examples:
            - '2024-01-15'
            - null
        attachmentExpiryDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the attachment expires. ISO 8601 date format (YYYY-MM-DD).
            **ETIM xChange**: `AttachmentExpiryDate`
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentExpiryDate`
          examples:
            - '2026-12-31'
            - null
      examples:
        - attachmentType: ATX001
          attachmentTypeSpecification: MDX002
          attachmentLanguages: null
          attachmentFilename: product_image.jpg
          attachmentUri: https://example.com/images/product.jpg
          attachmentDescription: Front view product image
          attachmentIssueDate: '2024-01-15'
          attachmentExpiryDate: null
    ItemAttachmentSummary:
      type: object
      description: |
        Flattened trade item attachment for bulk retrieval.
        Each row represents a single attachment with the trade item identifier embedded at top level.

        A trade item with 3 attachments (e.g., 1 image, 1 datasheet, 1 certificate)
        will result in 3 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**: `ItemAttachments[]`  
        **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[]`
      required:
        - supplierIdGln
        - supplierItemNumber
        - attachmentType
        - attachmentUri
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) identifying the supplier.
            13-digit GS1 identifier. Part of the composite trade item identifier.
          examples:
            - '1234567890123'
            - '8712423012485'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item identifier.
            Part of the composite trade item identifier.

            **ETIM xChange**: `SupplierItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-ABC-789
        attachmentType:
          $ref: '#/components/schemas/AttachmentType'
          description: |
            Type of attachment (image, document, certificate, etc.).

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

            **ETIM xChange**: `AttachmentTypeSpecification`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentTypeSpecification`
        attachmentLanguages:
          type:
            - array
            - 'null'
          description: |
            Languages for which the attachment is applicable (e.g., "en-GB", "de-DE").

            **ETIM xChange**: `AttachmentLanguage[]`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentLanguage[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/LanguageCode'
          examples:
            - - en-GB
              - de-DE
            - null
        attachmentFilename:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          description: |
            Filename of the attachment.

            **ETIM xChange**: `AttachmentFilename`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentFilename`
          examples:
            - product_image.jpg
            - manual_en.pdf
            - null
        attachmentUri:
          type: string
          format: uri
          description: |
            URI/URL to the attachment file.

            **ETIM xChange**: `AttachmentUri`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentUri`
          examples:
            - https://example.com/attachments/product_image.jpg
            - https://cdn.supplier.com/manuals/manual_en.pdf
        attachmentDescription:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 255
          description: |
            Human-readable description of the attachment.

            **ETIM xChange**: `AttachmentDescription[].AttachmentDescription`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentDescription[].AttachmentDescription`
          examples:
            - Front view product image
            - User manual in English
            - null
        attachmentIssueDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the attachment was issued. ISO 8601 date format (YYYY-MM-DD).

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

            **ETIM xChange**: `AttachmentExpiryDate`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[].AttachmentDetails[].AttachmentExpiryDate`
          examples:
            - '2026-12-31'
            - null
      examples:
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          attachmentType: ATX001
          attachmentTypeSpecification: MDX002
          attachmentLanguages: null
          attachmentFilename: product_image.jpg
          attachmentUri: https://example.com/images/product.jpg
          attachmentDescription: Front view product image
          attachmentIssueDate: '2024-01-15'
          attachmentExpiryDate: null
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          attachmentType: ATX014
          attachmentTypeSpecification: MDX005
          attachmentLanguages:
            - en-GB
          attachmentFilename: datasheet-en.pdf
          attachmentUri: https://cdn.supplier.com/datasheets/datasheet-en.pdf
          attachmentDescription: Technical datasheet
          attachmentIssueDate: '2024-06-15'
          attachmentExpiryDate: null
        - supplierIdGln: '9876543210987'
          supplierItemNumber: ITEM-67890
          attachmentType: ATX026
          attachmentTypeSpecification: null
          attachmentLanguages: null
          attachmentFilename: ce-certificate.pdf
          attachmentUri: https://cdn.supplier.com/certs/ce-certificate.pdf
          attachmentDescription: null
          attachmentIssueDate: '2024-03-01'
          attachmentExpiryDate: '2029-03-01'
    TradeItemEnclosed:
      type: object
      description: |
        An item enclosed within a packaging unit, describing which trade items are
        physically contained in a specific package.

        **ETIM xChange**: `TradeItemEnclosed`
        **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[]`
      required:
        - enclosedSupplierItemNumber
        - enclosedItemQuantity
      properties:
        enclosedSupplierItemNumber:
          type: string
          description: |
            Supplier item number of the enclosed trade item.
            **ETIM xChange**: `SupplierItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].SupplierItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - WIDGET-001
            - SCREW-M8-50
        enclosedManufacturerItemNumber:
          type:
            - string
            - 'null'
          description: |
            Manufacturer item number of the enclosed trade item.
            **ETIM xChange**: `ManufacturerItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].ManufacturerItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - MFG-WIDGET-001
            - null
        enclosedItemGtins:
          type:
            - array
            - 'null'
          description: |
            Array of GTINs for the enclosed trade item.
            **ETIM xChange**: `ItemGtin[]`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].ItemGtin[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          examples:
            - - '4012345678901'
            - null
        enclosedItemQuantity:
          type: integer
          description: |
            Quantity of this enclosed item within the packaging unit.
            **ETIM xChange**: `EnclosedItemQuantity`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].EnclosedItemQuantity`
          minimum: 1
          examples:
            - 1
            - 5
            - 100
      examples:
        - enclosedSupplierItemNumber: WIDGET-001
          enclosedManufacturerItemNumber: MFG-WIDGET-001
          enclosedItemGtins:
            - '4012345678901'
          enclosedItemQuantity: 5
        - enclosedSupplierItemNumber: SCREW-M8-50
          enclosedManufacturerItemNumber: null
          enclosedItemGtins: null
          enclosedItemQuantity: 100
    TradeItemEnclosedSummary:
      type: object
      description: |
        Flattened enclosed item for bulk retrieval.
        Each row represents a single enclosed item within a packaging unit,
        with the trade item identifier (`supplierIdGln` + `supplierItemNumber`)
        and packaging context (`packagingTypeCode`) embedded at top level.

        A trade item with 2 packaging units, each containing 3 enclosed items,
        will result in 6 rows.

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

        **ETIM xChange**: `TradeItemEnclosed[]`
        **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[]`
      required:
        - supplierIdGln
        - supplierItemNumber
        - packagingTypeCode
        - enclosedSupplierItemNumber
        - enclosedItemQuantity
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) identifying the supplier.
            13-digit GS1 identifier. Part of the composite trade item identifier.
          examples:
            - '1234567890123'
            - '8712423012485'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item identifier.
            Part of the composite trade item identifier.

            **ETIM xChange**: `SupplierItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-KIT-001
        packagingTypeCode:
          description: |
            Type of packaging unit that contains this enclosed item.
            Denormalized from the parent `PackagingUnit` for flat bulk structure.

            **ETIM xChange**: `PackagingTypeCode`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.PackagingTypeCode`
          $ref: '#/components/schemas/PackagingTypeCode'
          examples:
            - BX
            - PF
        enclosedSupplierItemNumber:
          type: string
          description: |
            Supplier item number of the enclosed trade item.
            **ETIM xChange**: `SupplierItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].SupplierItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - WIDGET-001
            - SCREW-M8-50
        enclosedManufacturerItemNumber:
          type:
            - string
            - 'null'
          description: |
            Manufacturer item number of the enclosed trade item.
            **ETIM xChange**: `ManufacturerItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].ManufacturerItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - MFG-WIDGET-001
            - null
        enclosedItemGtins:
          type:
            - array
            - 'null'
          description: |
            Array of GTINs for the enclosed trade item.
            **ETIM xChange**: `ItemGtin[]`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].ItemGtin[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          examples:
            - - '4012345678901'
            - null
        enclosedItemQuantity:
          type: integer
          description: |
            Quantity of this enclosed item within the packaging unit.
            **ETIM xChange**: `EnclosedItemQuantity`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].EnclosedItemQuantity`
          minimum: 1
          examples:
            - 1
            - 5
            - 100
      examples:
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-KIT-001
          packagingTypeCode: BX
          enclosedSupplierItemNumber: WIDGET-001
          enclosedManufacturerItemNumber: MFG-WIDGET-001
          enclosedItemGtins:
            - '4012345678901'
          enclosedItemQuantity: 5
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-KIT-001
          packagingTypeCode: BX
          enclosedSupplierItemNumber: SCREW-M8-50
          enclosedManufacturerItemNumber: null
          enclosedItemGtins: null
          enclosedItemQuantity: 100
        - supplierIdGln: '9876543210987'
          supplierItemNumber: SKU-PALLET-002
          packagingTypeCode: PF
          enclosedSupplierItemNumber: WIDGET-001
          enclosedManufacturerItemNumber: MFG-WIDGET-001
          enclosedItemGtins:
            - '4012345678901'
          enclosedItemQuantity: 50
    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 trade item attachments.

        Trade item 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[].TradeItem[].ItemAttachments[].AttachmentType`
      examples:
        - ATX001
        - ATX014
        - ATX010
    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[].TradeItem[].ItemAttachments[].AttachmentTypeSpecification`
      examples:
        - MDX002
        - MDX007
        - MDX020
        - null
    RelationType:
      type: string
      description: |
        Type of relationship between trade items.
        **ETIM xChange**: `RelationType`
        **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[].RelationType`
      enum:
        - ACCESSORY
        - CONSISTS_OF
        - CONSUMABLES
        - CROSS-SELLING
        - MAIN_PRODUCT
        - MANDATORY
        - PREDECESSOR
        - REFURBISHED
        - SELECT
        - SIMILAR
        - SPAREPART
        - SUCCESSOR
        - UPSELLING
        - USED
        - OTHER
      examples:
        - SPAREPART
        - ACCESSORY
        - MANDATORY
    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
    TradeItemResponse:
      type: object
      description: |
        Response containing a single trade item. No pagination metadata - returns exactly one trade item document.
        Used for composite-key lookups via GET /trade-items/{supplierIdGln}/{supplierItemNumber}.
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TradeItemResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: ART-12345
            supplierAltItemNumber: ALT-12345
            manufacturerItemNumber: MFG-98765
            manufacturerIdGln: '9876543210987'
            itemGtins:
              - '4012345678901'
            buyerItemNumber: null
            discountGroupId: DG-001
            bonusGroupId: null
            itemValidityDate: '2024-01-01'
            itemObsolescenceDate: null
            itemDetails:
              itemStatus: ACTIVE
              itemCondition: NEW
              stockItem: true
              shelfLifePeriod: null
            ordering:
              orderUnit: C62
              minimumOrderQuantity: 1
              orderStepSize: 1
              standardOrderLeadTime: 5
            pricings:
              - pricingRef: price-c62-1-20250101
                priceUnit: C62
                priceQuantity: 1
                currencyCode: EUR
                priceOnRequest: false
                netPrice: 100
                grossListPrice: 130
                recommendedRetailPrice: 150
                vat: 21
                priceValidityDate: '2025-01-01'
                priceExpiryDate: '2025-12-31'
                allowanceSurcharges:
                  - allowanceSurchargeIndicator: ALLOWANCE
                    allowanceSurchargeType: AEQ
                    allowanceSurchargeSequenceNumber: 1
                    allowanceSurchargePercentage: 10
                    allowanceSurchargeMinimumQuantity: 100
            itemRelations: null
            itemLogistics:
              - baseItemNetLength: 25.5
                baseItemNetWidth: 15
                baseItemNetHeight: 10
                netDimensionUnit: CMT
                baseItemNetWeight: 500
                netWeightUnit: GRM
            itemAttachments: null
            packagingUnits: null
            itemCountrySpecificFields: null
        - data:
            supplierIdGln: '9876543210987'
            supplierItemNumber: SKU-MIN-001
            supplierAltItemNumber: null
            manufacturerItemNumber: null
            manufacturerIdGln: null
            itemGtins: null
            buyerItemNumber: null
            discountGroupId: null
            bonusGroupId: null
            itemValidityDate: '2024-01-01'
            itemObsolescenceDate: null
            itemDetails:
              itemStatus: ACTIVE
              itemCondition: NEW
              stockItem: true
            ordering:
              orderUnit: C62
              minimumOrderQuantity: 1
              orderStepSize: 1
            pricings: null
            itemRelations: null
            itemLogistics: null
            itemAttachments: null
            packagingUnits: null
            itemCountrySpecificFields: null
    TradeItemResponseData:
      type: object
      description: |
        Single trade item data with all its components.

        The trade item key (`supplierIdGln` + `supplierItemNumber`) is at the root level,
        with nested objects for each component:
        - `itemDetails`: Status, condition, stock item flag, shelf life
        - `ordering`: Order unit, minimum order quantity, step size, lead time
        - `pricings`: Array of pricing conditions with allowance/surcharges
        - `itemRelations`: Accessories, spare parts, and other related items
        - `itemLogistics`: Dimensions, weights, and volumes
        - `itemAttachments`: Images, documents, and certificates
        - `packagingUnits`: Packaging level information
        - `itemCountrySpecificFields`: Country-specific extensibility fields

        This structure aligns with the subresource endpoints (`/details`, `/descriptions`,
        `/orderings`, `/pricings`, `/relations`, `/logistics-details`, `/allowance-surcharges`,
        `/attachments`, `/enclosed-items`) which all include the composite key at the root level.
      required:
        - supplierIdGln
        - supplierItemNumber
        - itemDetails
        - ordering
        - itemValidityDate
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) of the supplier. Primary key component.
            **ETIM xChange**: Inherited from `Supplier[].SupplierIdGln`
            **Path**: `Supplier[].SupplierIdGln`
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          description: |
            Supplier's unique item number. Primary key component.
            **ETIM xChange**: `SupplierItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - ART-12345
            - SKU-ABC-789
        supplierAltItemNumber:
          type:
            - string
            - 'null'
          description: |
            Alternative supplier item number.
            **ETIM xChange**: `SupplierAltItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierAltItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - ALT-98765
            - null
        manufacturerItemNumber:
          type:
            - string
            - 'null'
          description: |
            Manufacturer's item number.
            **ETIM xChange**: `ManufacturerItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ManufacturerItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - MFG-54321
            - null
        manufacturerIdGln:
          description: |
            Global Location Number (GLN) of the manufacturer (nullable).
            **ETIM xChange**: Inherited from Product level `ManufacturerIdGln`
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerIdGln`
          anyOf:
            - $ref: '#/components/schemas/Gln'
            - type: 'null'
          examples:
            - '9876543210987'
            - null
        manufacturerProductNumber:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 35
          description: |
            Manufacturer's product number. Links this trade item to its parent product.
            Inherited from Product level - required in ETIM xChange Product.ProductIdentification.

            **ETIM xChange**: `ManufacturerProductNumber`  
            **Path**: `Supplier[].Product[].ProductIdentification.ManufacturerProductNumber`
          examples:
            - '929002376910'
            - PROD-ABC-123
            - null
        itemGtins:
          type:
            - array
            - 'null'
          description: |
            Array of Global Trade Item Numbers (GTINs) for the item.
            **ETIM xChange**: `ItemGtin[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ItemGtin[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          examples:
            - - '4012345678901'
              - '04012345678901'
            - null
        buyerItemNumber:
          type:
            - string
            - 'null'
          description: |
            Buyer's specific item number.
            **ETIM xChange**: `BuyerItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.BuyerItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - BUYER-XYZ-123
            - null
        discountGroupId:
          type:
            - string
            - 'null'
          description: |
            Identifier for the discount group.
            **ETIM xChange**: `DiscountGroupId`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.DiscountGroupId`
          minLength: 1
          maxLength: 20
          examples:
            - DG-001
            - null
        bonusGroupId:
          type:
            - string
            - 'null'
          description: |
            Identifier for the bonus group.
            **ETIM xChange**: `BonusGroupId`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.BonusGroupId`
          minLength: 1
          maxLength: 20
          examples:
            - BG-002
            - null
        itemValidityDate:
          type: string
          format: date
          description: |
            Date from which the trade item is valid for ordering. ISO 8601 date format (YYYY-MM-DD).
            Defaults to CatalogueValidityStart if not overridden at the trade item level.

            **ETIM xChange**: `ItemValidityDate`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ItemValidityDate`  
            **Default from**: `CatalogueValidityStart`
          examples:
            - '2025-01-15'
        itemObsolescenceDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the trade item becomes obsolete. ISO 8601 date format (YYYY-MM-DD).
            **ETIM xChange**: `ItemObsolescenceDate`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.ItemObsolescenceDate`
          examples:
            - '2026-12-31'
            - null
        itemDetails:
          $ref: '#/components/schemas/ItemDetails'
          description: |
            Detailed information about the trade item including status and condition.
            Note: Item descriptions are available via `/{supplierIdGln}/{supplierItemNumber}/descriptions`.
            **ETIM xChange**: `ItemDetails`
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails`
        ordering:
          $ref: '#/components/schemas/TradeItemOrdering'
          description: |
            Ordering information for the trade item.
            **ETIM xChange**: `Ordering`
            **Path**: `Supplier[].Product[].TradeItem[].Ordering`
        pricings:
          type:
            - array
            - 'null'
          description: |
            Array of pricing information for different conditions or customer groups.
            **ETIM xChange**: `Pricing[]`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
          items:
            $ref: '#/components/schemas/TradeItemPricing'
          examples:
            - null
        itemRelations:
          type:
            - array
            - 'null'
          description: |
            Array of relationships to other trade items (accessories, spare parts, etc.).
            **ETIM xChange**: `ItemRelations[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[]`
          items:
            $ref: '#/components/schemas/ItemRelation'
          examples:
            - null
        itemLogistics:
          type:
            - array
            - 'null'
          description: |
            Array of logistic details including dimensions and weights.
            **ETIM xChange**: `ItemLogisticDetails[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[]`
          items:
            $ref: '#/components/schemas/ItemLogistic'
          examples:
            - null
        itemAttachments:
          type:
            - array
            - 'null'
          description: |
            Array of attachments (images, documents, certificates, etc.).
            **ETIM xChange**: `ItemAttachments[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[]`
          items:
            $ref: '#/components/schemas/ItemAttachment'
          examples:
            - null
        packagingUnits:
          type:
            - array
            - 'null'
          description: |
            Array of packaging unit information for different packaging levels.
            **ETIM xChange**: `PackagingUnit[]`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[]`
          items:
            $ref: '#/components/schemas/PackagingUnit'
          examples:
            - null
        itemCountrySpecificFields:
          type:
            - array
            - 'null'
          description: |
            Array of country-specific custom fields for extensibility.
            **ETIM xChange**: `ItemCountrySpecificFields[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[]`
          items:
            $ref: '#/components/schemas/ItemCountrySpecificField'
          examples:
            - null
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: ART-12345
          supplierAltItemNumber: ALT-12345
          manufacturerItemNumber: MFG-98765
          manufacturerIdGln: '9876543210987'
          itemGtins:
            - '4012345678901'
          buyerItemNumber: null
          discountGroupId: DG-001
          bonusGroupId: null
          itemValidityDate: '2024-01-01'
          itemObsolescenceDate: null
          itemDetails:
            itemStatus: ACTIVE
            itemCondition: NEW
            stockItem: true
            shelfLifePeriod: null
          ordering:
            orderUnit: C62
            minimumOrderQuantity: 1
            orderStepSize: 1
            standardOrderLeadTime: 5
            useUnit: null
            useUnitConversionFactor: null
            singleUseUnitQuantity: null
            alternativeUseUnit: null
            alternativeUseUnitConversionFactor: null
          pricings:
            - pricingRef: price-c62-1-20250101
              priceUnit: C62
              priceUnitFactor: null
              priceQuantity: 1
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 130
              netPrice: 100
              recommendedRetailPrice: 150
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-12-31'
              allowanceSurcharges:
                - allowanceSurchargeIndicator: ALLOWANCE
                  allowanceSurchargeType: AEQ
                  allowanceSurchargeSequenceNumber: 1
                  allowanceSurchargePercentage: 10
                  allowanceSurchargeMinimumQuantity: 100
                - allowanceSurchargeIndicator: SURCHARGE
                  allowanceSurchargeType: DBD
                  allowanceSurchargeSequenceNumber: 2
                  allowanceSurchargeAmount: 25
                  allowanceSurchargeMinimumQuantity: null
          itemRelations: null
          itemLogistics:
            - baseItemNetLength: 25.5
              baseItemNetWidth: 15
              baseItemNetHeight: 10
              baseItemNetDiameter: null
              netDimensionUnit: CMT
              baseItemNetWeight: 500
              netWeightUnit: GRM
              baseItemNetVolume: null
              netVolumeUnit: null
          itemAttachments: null
          packagingUnits: null
          itemCountrySpecificFields: null
    TradeItemDetailsResponse:
      type: object
      description: |
        Response containing trade item identification and details for a single trade item.

        The trade item key (`supplierIdGln` + `supplierItemNumber`) is at the root level,
        with the `details` object containing all identification and details fields.

        This structure aligns with other single-item subresource responses
        (`/orderings`, `/pricings`).
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TradeItemDetailsResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            details:
              supplierAltItemNumber: ALT-12345
              manufacturerItemNumber: MFG-98765
              manufacturerIdGln: '9876543210987'
              manufacturerProductNumber: '929002376910'
              itemGtins:
                - '4012345678901'
              buyerItemNumber: null
              discountGroupId: DG-001
              bonusGroupId: null
              itemValidityDate: '2024-01-01'
              itemObsolescenceDate: null
              itemStatus: ACTIVE
              itemCondition: NEW
              stockItem: true
              shelfLifePeriod: null
    TradeItemDetailsResponseData:
      type: object
      description: |
        Single trade item identification keys with details.

        The trade item key (`supplierIdGln` + `supplierItemNumber`) is at the root level,
        with the `details` object containing all identification and details fields.
      required:
        - supplierIdGln
        - supplierItemNumber
        - details
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) uniquely identifying the supplier.
            Part of the composite key for the trade item.
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item number/code.
            Part of the composite key for the trade item.
          examples:
            - SKU-12345
        details:
          $ref: '#/components/schemas/TradeItemDetails'
          description: |
            Trade item identification and details including alternative item numbers,
            GTINs, discount/bonus groups, validity dates, status, condition, and descriptions.
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          details:
            supplierAltItemNumber: ALT-12345
            manufacturerItemNumber: MFG-98765
            manufacturerIdGln: '9876543210987'
            manufacturerProductNumber: '929002376910'
            itemGtins:
              - '4012345678901'
            buyerItemNumber: null
            discountGroupId: DG-001
            bonusGroupId: null
            itemValidityDate: '2024-01-01'
            itemObsolescenceDate: null
            itemStatus: ACTIVE
            itemCondition: NEW
            stockItem: true
            shelfLifePeriod: null
    TradeItemDescriptionsResponse:
      type: object
      description: |
        Response containing multilingual trade item descriptions for a single trade item.
        Returns the trade item identification keys and a nested array of `ItemDescription` objects,
        each containing descriptions in a specific language.

        Unlike the bulk endpoint `/trade-items/bulk/descriptions` which uses a flattened structure
        optimized for ETL, this single-item 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/TradeItemDescriptionsResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            descriptions:
              - descriptionLanguage: en-GB
                minimalItemDescription: LED Lamp 10W E27
                uniqueMainItemDescription: Professional LED lamp with E27 socket, 10W warm white
                discountGroupDescription: Lighting products discount group
                bonusGroupDescription: null
              - descriptionLanguage: de-DE
                minimalItemDescription: LED Lampe 10W E27
                uniqueMainItemDescription: Professionelle LED-Lampe mit E27-Fassung, 10W warmweiß
                discountGroupDescription: Beleuchtungsprodukte Rabattgruppe
                bonusGroupDescription: null
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            descriptions: null
    TradeItemDescriptionsResponseData:
      type: object
      description: |
        Single trade item identification keys with multilingual descriptions.
      required:
        - supplierIdGln
        - supplierItemNumber
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the supplier
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Supplier's unique item number
          examples:
            - SKU-12345
        descriptions:
          type:
            - array
            - 'null'
          description: |
            Array of trade item 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/ItemDescription'
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          descriptions:
            - descriptionLanguage: en-GB
              minimalItemDescription: LED Lamp 10W E27
              uniqueMainItemDescription: Professional LED lamp with E27 socket, 10W warm white
              discountGroupDescription: Lighting products discount group
              bonusGroupDescription: null
            - descriptionLanguage: de-DE
              minimalItemDescription: LED Lampe 10W E27
              uniqueMainItemDescription: Professionelle LED-Lampe mit E27-Fassung, 10W warmweiß
              discountGroupDescription: Beleuchtungsprodukte Rabattgruppe
              bonusGroupDescription: null
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          descriptions: null
    BulkTradeItemDetailsResponse:
      type: object
      description: |
        Response containing trade item identification and details in bulk with cursor-based pagination.

        Each item in the `data` array includes its composite key (`supplierIdGln` + `supplierItemNumber`)
        along with all identification and details fields in a flat structure.

        Use the `cursor` from `meta` to retrieve the next page of results.
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: Array of trade item details summaries with embedded keys
          items:
            $ref: '#/components/schemas/TradeItemDetailsSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
          description: Cursor-based pagination metadata
      examples:
        - data:
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-LAMP-001
              supplierAltItemNumber: ALT-SKU-001
              manufacturerItemNumber: MFR-12345
              manufacturerIdGln: '9876543210987'
              manufacturerProductNumber: '929002376910'
              itemGtins:
                - '08712423012485'
                - '12345678901234'
              buyerItemNumber: null
              discountGroupId: DG-LIGHTING
              bonusGroupId: null
              itemValidityDate: '2024-01-01'
              itemObsolescenceDate: null
              itemStatus: ACTIVE
              itemCondition: NEW
              stockItem: true
              shelfLifePeriod: null
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-TOOL-002
              supplierAltItemNumber: null
              manufacturerItemNumber: MFR-54321
              manufacturerIdGln: '9876543210987'
              manufacturerProductNumber: HAMMER-PRO-500
              itemGtins:
                - '08712423054321'
              buyerItemNumber: BUYER-002
              discountGroupId: DG-TOOLS
              bonusGroupId: BG-PREMIUM
              itemValidityDate: '2023-06-01'
              itemObsolescenceDate: '2028-12-31'
              itemStatus: ACTIVE
              itemCondition: NEW
              stockItem: true
              shelfLifePeriod: null
          meta:
            cursor: eyJzdXBwbGllcklkR2xuIjoiODcxMjQyMzAxMjQ4NSIsInN1cHBsaWVySXRlbU51bWJlciI6IlNLVS1UT09MLTAwMiJ9
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 15420
    BulkTradeItemDescriptionsResponse:
      type: object
      description: |
        Bulk response containing trade item descriptions with cursor-based pagination.

        Each item in the `data` array represents a single language description for a trade item.
        A trade item with descriptions in 3 languages will result in 3 rows.

        This flattened structure is optimized for ETL/data warehouse ingestion and
        streaming data processing.
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: Array of trade item descriptions. Each row is one language per trade item.
          items:
            $ref: '#/components/schemas/ItemDescriptionsSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
      examples:
        - data:
            - supplierIdGln: '1234567890123'
              supplierItemNumber: SKU-12345
              descriptionLanguage: en-GB
              minimalItemDescription: LED Lamp 10W E27
              uniqueMainItemDescription: Professional LED lamp with E27 socket, 10W warm white
              discountGroupDescription: Lighting products discount group
              bonusGroupDescription: null
            - supplierIdGln: '1234567890123'
              supplierItemNumber: SKU-12345
              descriptionLanguage: de-DE
              minimalItemDescription: LED Lampe 10W E27
              uniqueMainItemDescription: Professionelle LED-Lampe mit E27-Fassung, 10W warmweiß
              discountGroupDescription: Beleuchtungsprodukte Rabattgruppe
              bonusGroupDescription: null
            - supplierIdGln: '1234567890123'
              supplierItemNumber: SKU-67890
              descriptionLanguage: en-GB
              minimalItemDescription: Hammer 500g
              uniqueMainItemDescription: Professional claw hammer with fiberglass handle
              discountGroupDescription: Hand tools discount group
              bonusGroupDescription: Premium tier
          meta:
            cursor: eyJpZCI6MTIzfQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 15420
    TradeItemOrderingsResponse:
      type: object
      description: |
        Response containing trade item ordering information for a single trade item.

        The trade item key (`supplierIdGln` + `supplierItemNumber`) is at the root level,
        with the `ordering` object containing all ordering fields.

        This structure aligns with other single-item subresource responses
        (`/details`, `/descriptions`, `/pricings`).

        **ETIM xChange**: `Ordering`
        **Path**: `Supplier[].Product[].TradeItem[].Ordering`
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TradeItemOrderingsResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            ordering:
              orderUnit: C62
              minimumOrderQuantity: 1
              orderStepSize: 1
              standardOrderLeadTime: 5
              useUnit: null
              useUnitConversionFactor: null
              singleUseUnitQuantity: null
              alternativeUseUnit: null
              alternativeUseUnitConversionFactor: null
        - data:
            supplierIdGln: '8712423012485'
            supplierItemNumber: SKU-CABLE-002
            ordering:
              orderUnit: MTR
              minimumOrderQuantity: 10
              orderStepSize: 5
              standardOrderLeadTime: 3
              useUnit: MTR
              useUnitConversionFactor: 1
              singleUseUnitQuantity: 1
              alternativeUseUnit: null
              alternativeUseUnitConversionFactor: null
    TradeItemOrderingsResponseData:
      type: object
      description: |
        Single trade item identification keys with ordering information.

        **ETIM xChange**: `Ordering`
        **Path**: `Supplier[].Product[].TradeItem[].Ordering`
      required:
        - supplierIdGln
        - supplierItemNumber
        - ordering
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) uniquely identifying the supplier.
            Part of the composite key for the trade item.
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item number/code.
            Part of the composite key for the trade item.
          examples:
            - SKU-12345
        ordering:
          $ref: '#/components/schemas/TradeItemOrdering'
          description: |
            Trade item ordering details including order unit, minimum quantities,
            order step size, lead time, and unit conversions.
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          ordering:
            orderUnit: C62
            minimumOrderQuantity: 1
            orderStepSize: 1
            standardOrderLeadTime: 5
            useUnit: null
            useUnitConversionFactor: null
            singleUseUnitQuantity: null
            alternativeUseUnit: null
            alternativeUseUnitConversionFactor: null
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-CABLE-002
          ordering:
            orderUnit: MTR
            minimumOrderQuantity: 10
            orderStepSize: 5
            standardOrderLeadTime: 3
            useUnit: MTR
            useUnitConversionFactor: 1
            singleUseUnitQuantity: 1
            alternativeUseUnit: null
            alternativeUseUnitConversionFactor: null
    BulkTradeItemOrderingsResponse:
      type: object
      description: |
        Bulk response containing trade item ordering information with cursor-based pagination.

        Each item in the `data` array includes its composite key (`supplierIdGln` + `supplierItemNumber`)
        along with all ordering fields in a flat structure.

        Use the `cursor` from `meta` to retrieve the next page of results.

        **ETIM xChange**: Response wrapper for flattened `Ordering` data
        **Path**: `Supplier[].Product[].TradeItem[].Ordering`
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: Array of trade item ordering summaries with embedded keys
          items:
            $ref: '#/components/schemas/TradeItemOrderingsSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
          description: Cursor-based pagination metadata
      examples:
        - data:
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-LAMP-001
              orderUnit: C62
              minimumOrderQuantity: 1
              orderStepSize: 1
              standardOrderLeadTime: 5
              useUnit: null
              useUnitConversionFactor: null
              singleUseUnitQuantity: null
              alternativeUseUnit: null
              alternativeUseUnitConversionFactor: null
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-CABLE-002
              orderUnit: MTR
              minimumOrderQuantity: 10
              orderStepSize: 5
              standardOrderLeadTime: 3
              useUnit: MTR
              useUnitConversionFactor: 1
              singleUseUnitQuantity: 1
              alternativeUseUnit: null
              alternativeUseUnitConversionFactor: null
          meta:
            cursor: eyJzdXBwbGllcklkR2xuIjoiODcxMjQyMzAxMjQ4NSIsInN1cHBsaWVySXRlbU51bWJlciI6IlNLVS1DQUJMRS0wMDIifQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 15420
    TradeItemPricingsResponse:
      type: object
      description: |
        Response containing trade item pricing information for a single trade item.

        The trade item key (`supplierIdGln` + `supplierItemNumber`) is at the root level,
        with the `pricings` array containing all pricing entries for this trade item.

        A trade item may have multiple pricing entries for different conditions, 
        customer groups, or validity periods.

        **Allowances & Surcharges**: Available via separate `/{supplierIdGln}/{supplierItemNumber}/allowance-surcharges` endpoint.

        This structure aligns with other single-item subresource responses
        (`/details`, `/descriptions`, `/orderings`).

        **ETIM xChange**: `Pricing[]`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TradeItemPricingsResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            pricings:
              - pricingRef: price-c62-1-20250101
                priceUnit: C62
                priceUnitFactor: null
                priceQuantity: 1
                currencyCode: EUR
                priceOnRequest: false
                grossListPrice: 130
                netPrice: 100
                recommendedRetailPrice: 150
                vat: 21
                priceValidityDate: '2025-01-01'
                priceExpiryDate: '2025-12-31'
        - data:
            supplierIdGln: '8712423012485'
            supplierItemNumber: SKU-CABLE-002
            pricings:
              - pricingRef: price-mtr-1-20250101
                priceUnit: MTR
                priceUnitFactor: 1
                priceQuantity: 1
                currencyCode: EUR
                priceOnRequest: false
                grossListPrice: 2.5
                netPrice: 1.99
                recommendedRetailPrice: 3.49
                vat: 21
                priceValidityDate: '2025-01-01'
                priceExpiryDate: '2025-06-30'
              - pricingRef: price-mtr-100-20250101
                priceUnit: MTR
                priceUnitFactor: 1
                priceQuantity: 100
                currencyCode: EUR
                priceOnRequest: false
                grossListPrice: 2
                netPrice: 1.59
                recommendedRetailPrice: 2.99
                vat: 21
                priceValidityDate: '2025-01-01'
                priceExpiryDate: '2025-06-30'
    TradeItemPricingsResponseData:
      type: object
      description: |
        Single trade item identification keys with pricing information.

        A trade item may have multiple pricing entries for different conditions, 
        customer groups, or validity periods.

        **ETIM xChange**: `Pricing[]`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
      required:
        - supplierIdGln
        - supplierItemNumber
        - pricings
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) uniquely identifying the supplier.
            Part of the composite key for the trade item.
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item number/code.
            Part of the composite key for the trade item.
          examples:
            - SKU-12345
        pricings:
          type: array
          description: |
            Array of pricing information for this trade item. A trade item may have
            multiple pricing entries for different conditions, customer groups, or
            validity periods.
          items:
            $ref: '#/components/schemas/TradeItemPricing'
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          pricings:
            - pricingRef: price-c62-1-20250101
              priceUnit: C62
              priceUnitFactor: null
              priceQuantity: 1
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 130
              netPrice: 100
              recommendedRetailPrice: 150
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-12-31'
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-CABLE-002
          pricings:
            - pricingRef: price-mtr-1-20250101
              priceUnit: MTR
              priceUnitFactor: 1
              priceQuantity: 1
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 2.5
              netPrice: 1.99
              recommendedRetailPrice: 3.49
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-06-30'
            - pricingRef: price-mtr-100-20250101
              priceUnit: MTR
              priceUnitFactor: 1
              priceQuantity: 100
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 2
              netPrice: 1.59
              recommendedRetailPrice: 2.99
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-06-30'
    BulkTradeItemPricingsResponse:
      type: object
      description: |
        Bulk response containing trade item pricing information with cursor-based pagination.

        **Flattened Structure**: Each row in the `data` array represents a single price entry
        with embedded composite key (`supplierIdGln` + `supplierItemNumber`). This follows the
        same pattern as `ProductEtimClassificationFeature` - 1 row per data point.

        A trade item with multiple price tiers (e.g., quantity breaks) will have multiple rows
        with the same composite key but different pricing data.

        Use the `cursor` from `meta` to retrieve the next page of results.

        **ETIM xChange**: Response wrapper for `Pricing[]` data
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: Array of flattened trade item pricing entries (1 row per price)
          items:
            $ref: '#/components/schemas/TradeItemPricingSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
          description: Cursor-based pagination metadata
      examples:
        - data:
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-LAMP-001
              pricingRef: price-c62-1-20250101
              priceUnit: C62
              priceQuantity: 1
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 12.99
              netPrice: 9.99
              recommendedRetailPrice: 15.99
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-12-31'
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-CABLE-002
              pricingRef: price-mtr-1-20250101
              priceUnit: MTR
              priceUnitFactor: 1
              priceQuantity: 1
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 2.5
              netPrice: 1.99
              recommendedRetailPrice: 3.49
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-06-30'
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-CABLE-002
              pricingRef: price-mtr-100-20250101
              priceUnit: MTR
              priceUnitFactor: 1
              priceQuantity: 100
              currencyCode: EUR
              priceOnRequest: false
              grossListPrice: 2
              netPrice: 1.59
              recommendedRetailPrice: 2.99
              vat: 21
              priceValidityDate: '2025-01-01'
              priceExpiryDate: '2025-06-30'
          meta:
            cursor: eyJzdXBwbGllcklkR2xuIjoiODcxMjQyMzAxMjQ4NSIsInN1cHBsaWVySXRlbU51bWJlciI6IlNLVS1DQUJMRS0wMDIiLCJwcmljZVF1YW50aXR5IjoxMDB9
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 24850
    BulkAllowanceSurchargesResponse:
      type: object
      description: |
        Bulk response containing trade item allowance and surcharge information with cursor-based pagination.

        **Flattened Structure**: Each row in the `data` array represents a single allowance/surcharge entry
        with embedded keys for joining back to pricing data. This follows the same pattern as 
        `ProductEtimClassificationFeature` - 1 row per data point.

        **Join Keys**: Use `supplierIdGln` + `supplierItemNumber` + `pricingRef` to join
        with `/trade-items/bulk/pricings` data.

        Use the `cursor` from `meta` to retrieve the next page of results.

        **ETIM xChange**: Response wrapper for `AllowanceSurcharge[]` data
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[]`
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: Array of flattened allowance/surcharge entries (1 row per surcharge)
          items:
            $ref: '#/components/schemas/AllowanceSurchargeSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
          description: Cursor-based pagination metadata
      examples:
        - data:
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-LAMP-001
              pricingRef: price-c62-1-20250101
              allowanceSurchargeIndicator: ALLOWANCE
              allowanceSurchargeType: AEQ
              allowanceSurchargeSequenceNumber: 1
              allowanceSurchargePercentage: 5.5
              allowanceSurchargeMinimumQuantity: 50
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-CABLE-002
              pricingRef: price-mtr-1-20250101
              allowanceSurchargeIndicator: SURCHARGE
              allowanceSurchargeType: DBD
              allowanceSurchargeSequenceNumber: 1
              allowanceSurchargeAmount: 25
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-TOOL-003
              pricingRef: price-c62-1-20250101
              allowanceSurchargeIndicator: ALLOWANCE
              allowanceSurchargeType: AEQ
              allowanceSurchargeSequenceNumber: 1
              allowanceSurchargePercentage: 10
              allowanceSurchargeMinimumQuantity: 100
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-TOOL-003
              pricingRef: price-c62-1-20250101
              allowanceSurchargeIndicator: ALLOWANCE
              allowanceSurchargeType: AEQ
              allowanceSurchargeSequenceNumber: 2
              allowanceSurchargePercentage: 15
              allowanceSurchargeMinimumQuantity: 500
          meta:
            cursor: eyJzdXBwbGllcklkR2xuIjoiODcxMjQyMzAxMjQ4NSIsInNlcXVlbmNlIjoyfQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 3250
    TradeItemAllowanceSurchargesResponse:
      type: object
      description: |
        Response containing allowances and surcharges for a specific trade item.
        Returns the trade item key and all associated allowances/surcharges linked to pricing entries
        via `pricingRef`.

        **Pricing Reference**: Each allowance/surcharge includes a `pricingRef` to enable 
        correlation with the corresponding pricing entry from the `/pricings` endpoint.

        **ETIM xChange**: `AllowanceSurcharge[]`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[]`
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TradeItemAllowanceSurchargesResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            allowanceSurcharges:
              - pricingRef: price-c62-1-20250101
                allowanceSurchargeIndicator: ALLOWANCE
                allowanceSurchargeValidityDate: '2025-01-01'
                allowanceSurchargeType: AEQ
                allowanceSurchargeAmount: null
                allowanceSurchargeSequenceNumber: 1
                allowanceSurchargePercentage: 5.5
                allowanceSurchargeMinimumQuantity: 50
              - pricingRef: price-c62-1-20250101
                allowanceSurchargeIndicator: SURCHARGE
                allowanceSurchargeValidityDate: null
                allowanceSurchargeType: DBD
                allowanceSurchargeAmount: 25
                allowanceSurchargeSequenceNumber: 2
                allowanceSurchargePercentage: null
                allowanceSurchargeMinimumQuantity: null
    TradeItemAllowanceSurchargesResponseData:
      type: object
      description: |
        Single trade item identification keys with allowances and surcharges.

        **Pricing Reference**: Each allowance/surcharge includes a `pricingRef` to enable 
        correlation with the corresponding pricing entry from the `/pricings` endpoint.

        **ETIM xChange**: `AllowanceSurcharge[]`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[]`
      required:
        - supplierIdGln
        - supplierItemNumber
        - allowanceSurcharges
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            GLN (Global Location Number) of the supplier.
            **ETIM xChange**: `SupplierIdGln`
            **Path**: `Supplier[].SupplierIdGln`
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          description: |
            The supplier's own item number for this trade item.
            **ETIM xChange**: `SupplierItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - SKU-12345
        allowanceSurcharges:
          type:
            - array
            - 'null'
          description: |
            Array of allowances and surcharges linked to pricing entries via `pricingRef`.
            Each item includes a `pricingRef` to correlate with pricing entries.
          items:
            $ref: '#/components/schemas/TradeItemAllowanceSurchargeItem'
          examples:
            - - pricingRef: price-c62-1-20250101
                allowanceSurchargeIndicator: ALLOWANCE
                allowanceSurchargeType: AEQ
                allowanceSurchargePercentage: 5.5
                allowanceSurchargeMinimumQuantity: 50
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          allowanceSurcharges:
            - pricingRef: price-c62-1-20250101
              allowanceSurchargeIndicator: ALLOWANCE
              allowanceSurchargeValidityDate: '2025-01-01'
              allowanceSurchargeType: AEQ
              allowanceSurchargeAmount: null
              allowanceSurchargeSequenceNumber: 1
              allowanceSurchargePercentage: 5.5
              allowanceSurchargeMinimumQuantity: 50
            - pricingRef: price-c62-1-20250101
              allowanceSurchargeIndicator: SURCHARGE
              allowanceSurchargeValidityDate: null
              allowanceSurchargeType: DBD
              allowanceSurchargeAmount: 25
              allowanceSurchargeSequenceNumber: 2
              allowanceSurchargePercentage: null
              allowanceSurchargeMinimumQuantity: null
    TradeItemAllowanceSurchargeItem:
      type: object
      description: |
        Allowance or surcharge linked to a pricing entry via `pricingRef`.
        Use `pricingRef` to correlate with the corresponding pricing record
        from the `/pricings` endpoint.

        **ETIM xChange**: `AllowanceSurcharge`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[].AllowanceSurcharge[]`
      required:
        - pricingRef
        - allowanceSurchargeIndicator
        - allowanceSurchargeType
      properties:
        pricingRef:
          description: |
            Server-generated opaque reference key that identifies the parent pricing entry.
            Use this to correlate with the corresponding pricing record from the `/pricings` endpoint.

            This is a technical identifier not present in the ETIM xChange domain model.
          $ref: '#/components/schemas/TechnicalId'
          examples:
            - price-c62-1-20250101
            - f47ac10b-58cc-4372-a567-0e02b2c3d479
        allowanceSurchargeIndicator:
          type: string
          description: |
            Indicates whether this price adjustment is an allowance (discount) or a surcharge (additional charge).
            **ETIM xChange**: `AllowanceSurchargeIndicator`
          enum:
            - ALLOWANCE
            - SURCHARGE
          examples:
            - ALLOWANCE
            - SURCHARGE
        allowanceSurchargeValidityDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date from which the allowance or surcharge becomes valid.
            **ETIM xChange**: `AllowanceSurchargeValidityDate`
          examples:
            - '2025-01-01'
            - null
        allowanceSurchargeType:
          description: |
            Code describing the reason for the allowance or surcharge.
            **ETIM xChange**: `AllowanceSurchargeType`
          $ref: '#/components/schemas/AllowanceSurchargeTypes'
        allowanceSurchargeAmount:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Fixed monetary amount of the allowance or surcharge.
            **ETIM xChange**: `AllowanceSurchargeAmount`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 15.5
            - null
        allowanceSurchargeSequenceNumber:
          type:
            - integer
            - 'null'
          description: |
            Sequence number used to order multiple allowances or surcharges applied to the same price.
            **ETIM xChange**: `AllowanceSurchargeSequenceNumber`
          minimum: 1
          examples:
            - 1
            - null
        allowanceSurchargePercentage:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Percentage rate of the allowance or surcharge.
            **ETIM xChange**: `AllowanceSurchargePercentage`
          minimum: 0
          multipleOf: 0.001
          maximum: 999.999
          examples:
            - 5.5
            - null
        allowanceSurchargeMinimumQuantity:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Minimum ordered quantity required for the allowance or surcharge to apply.
            **ETIM xChange**: `AllowanceSurchargeMinimumQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 10
            - null
      examples:
        - pricingRef: price-c62-1-20250101
          allowanceSurchargeIndicator: ALLOWANCE
          allowanceSurchargeValidityDate: '2025-01-01'
          allowanceSurchargeType: AEQ
          allowanceSurchargeAmount: null
          allowanceSurchargeSequenceNumber: 1
          allowanceSurchargePercentage: 5.5
          allowanceSurchargeMinimumQuantity: 50
    TradeItemRelationsResponse:
      type: object
      description: |
        Response containing item relations for a specific trade item.
        Returns the trade item identification keys and a nested array of `ItemRelation` objects,
        each defining a relationship to another trade item (e.g., accessories, spare parts, successors).

        Unlike the bulk endpoint `/trade-items/bulk/relations` which uses a flattened structure
        optimized for ETL, this single-item endpoint returns relations in their natural
        nested format for easier consumption.

        **ETIM xChange**: `ItemRelations[]`
        **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[]`
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TradeItemRelationsResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            relations:
              - relatedSupplierItemNumber: SPART-001
                relatedManufacturerItemNumber: MFG-SPART-100
                relatedItemGtins:
                  - '4012345678918'
                relationType: SPAREPART
                relatedItemQuantity: 2
              - relatedSupplierItemNumber: ACC-789
                relatedManufacturerItemNumber: null
                relatedItemGtins: null
                relationType: ACCESSORY
                relatedItemQuantity: 1
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            relations: null
    TradeItemRelationsResponseData:
      type: object
      description: |
        Single trade item identification keys with item relations.

        **ETIM xChange**: `ItemRelations[]`
        **Path**: `Supplier[].Product[].TradeItem[].ItemRelations[]`
      required:
        - supplierIdGln
        - supplierItemNumber
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the supplier
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Supplier's unique item number
          examples:
            - SKU-12345
        relations:
          type:
            - array
            - 'null'
          description: |
            Array of item relations. Each item defines a relationship to another trade item
            (e.g., accessories, spare parts, successors).
            Returns null if no relations are available.
          items:
            $ref: '#/components/schemas/ItemRelation'
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          relations:
            - relatedSupplierItemNumber: SPART-001
              relatedManufacturerItemNumber: MFG-SPART-100
              relatedItemGtins:
                - '4012345678918'
              relationType: SPAREPART
              relatedItemQuantity: 2
            - relatedSupplierItemNumber: ACC-789
              relatedManufacturerItemNumber: null
              relatedItemGtins: null
              relationType: ACCESSORY
              relatedItemQuantity: 1
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          relations: null
    BulkTradeItemRelationsResponse:
      type: object
      description: |
        Bulk response containing item relations with cursor-based pagination.

        Each item in the `data` array represents a single relation between a trade item
        and a related item. A trade item with 5 relations will result in 5 rows.

        This flattened structure is optimized for ETL/data warehouse ingestion and
        streaming data processing.
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: Array of item relations. Each row is one relation per trade item.
          items:
            $ref: '#/components/schemas/ItemRelationSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
      examples:
        - data:
            - supplierIdGln: '1234567890123'
              supplierItemNumber: SKU-12345
              relatedSupplierItemNumber: SPART-001
              relatedManufacturerItemNumber: MFG-SPART-100
              relatedItemGtins:
                - '4012345678918'
              relationType: SPAREPART
              relatedItemQuantity: 2
            - supplierIdGln: '1234567890123'
              supplierItemNumber: SKU-12345
              relatedSupplierItemNumber: ACC-789
              relatedManufacturerItemNumber: null
              relatedItemGtins: null
              relationType: ACCESSORY
              relatedItemQuantity: 1
            - supplierIdGln: '9876543210987'
              supplierItemNumber: SKU-CABLE-002
              relatedSupplierItemNumber: SKU-CABLE-003
              relatedManufacturerItemNumber: MFG-CABLE-V2
              relatedItemGtins:
                - '8712345678901'
              relationType: SUCCESSOR
              relatedItemQuantity: 1
          meta:
            cursor: eyJpZCI6MTIzfQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 8450
    TradeItemLogisticsDetailsResponse:
      type: object
      description: |
        Response containing item logistics details for a specific trade item.
        Returns the trade item identification keys and a nested array of `ItemLogistic` objects,
        each defining base item dimensions, weight, and volume.

        Unlike the bulk endpoint `/trade-items/bulk/logistics-details` which uses a flattened structure
        optimized for ETL, this single-item endpoint returns logistics in their natural
        nested format for easier consumption.

        **ETIM xChange**: `ItemLogisticDetails[]`
        **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[]`
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TradeItemLogisticsDetailsResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            itemLogistics:
              - baseItemNetLength: 96
                baseItemNetWidth: 5
                baseItemNetHeight: 56
                baseItemNetDiameter: null
                netDimensionUnit: CMT
                baseItemNetWeight: 0.26
                netWeightUnit: KGM
                baseItemNetVolume: 68
                netVolumeUnit: MMQ
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            itemLogistics: null
    TradeItemLogisticsDetailsResponseData:
      type: object
      description: |
        Single trade item identification keys with item logistics details.

        **ETIM xChange**: `ItemLogisticDetails[]`
        **Path**: `Supplier[].Product[].TradeItem[].ItemLogisticDetails[]`
      required:
        - supplierIdGln
        - supplierItemNumber
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the supplier
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Supplier's unique item number
          examples:
            - SKU-12345
        itemLogistics:
          type:
            - array
            - 'null'
          description: |
            Array of item logistics entries. Each entry defines base item dimensions, weight, and volume.
            Returns null if no logistics data is available.
          items:
            $ref: '#/components/schemas/ItemLogistic'
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          itemLogistics:
            - baseItemNetLength: 96
              baseItemNetWidth: 5
              baseItemNetHeight: 56
              baseItemNetDiameter: null
              netDimensionUnit: CMT
              baseItemNetWeight: 0.26
              netWeightUnit: KGM
              baseItemNetVolume: 68
              netVolumeUnit: MMQ
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          itemLogistics: null
    BulkTradeItemLogisticsDetailsResponse:
      type: object
      description: |
        Bulk response containing item logistics details with cursor-based pagination.

        Each item in the `data` array represents a single logistics entry for a trade item,
        with the trade item identifier embedded at top level. A trade item typically has 0 or 1
        logistics entries.

        This flattened structure is optimized for ETL/data warehouse ingestion and
        streaming data processing.
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: Array of item logistics entries. Each row is one logistics entry per trade item.
          items:
            $ref: '#/components/schemas/ItemLogisticSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
      examples:
        - data:
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-LAMP-001
              baseItemNetLength: 96
              baseItemNetWidth: 5
              baseItemNetHeight: 56
              baseItemNetDiameter: null
              netDimensionUnit: CMT
              baseItemNetWeight: 0.26
              netWeightUnit: KGM
              baseItemNetVolume: 68
              netVolumeUnit: MMQ
            - supplierIdGln: '1234567890123'
              supplierItemNumber: SKU-12345
              baseItemNetLength: 25.5
              baseItemNetWidth: 15
              baseItemNetHeight: 10
              baseItemNetDiameter: null
              netDimensionUnit: CMT
              baseItemNetWeight: 500
              netWeightUnit: GRM
              baseItemNetVolume: null
              netVolumeUnit: null
          meta:
            cursor: eyJpZCI6MTIzfQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 12500
    TradeItemAttachmentsResponse:
      type: object
      description: |
        Response containing item attachments for a specific trade item.
        Returns the trade item identification keys and a nested array of `ItemAttachment` objects.

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

        **ETIM xChange**: `ItemAttachments[]`
        **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[]`
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TradeItemAttachmentsResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            attachments:
              - attachmentType: ATX001
                attachmentTypeSpecification: MDX002
                attachmentLanguages: null
                attachmentFilename: product_image.jpg
                attachmentUri: https://example.com/images/product.jpg
                attachmentDescription: Front view product image
                attachmentIssueDate: '2024-01-15'
                attachmentExpiryDate: null
              - attachmentType: ATX014
                attachmentTypeSpecification: MDX005
                attachmentLanguages:
                  - en-GB
                attachmentFilename: datasheet-en.pdf
                attachmentUri: https://cdn.supplier.com/datasheets/datasheet-en.pdf
                attachmentDescription: Technical datasheet
                attachmentIssueDate: '2024-06-15'
                attachmentExpiryDate: null
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            attachments: null
    TradeItemAttachmentsResponseData:
      type: object
      description: |
        Single trade item identification keys with item attachment data.

        **ETIM xChange**: `ItemAttachments[]`
        **Path**: `Supplier[].Product[].TradeItem[].ItemAttachments[]`
      required:
        - supplierIdGln
        - supplierItemNumber
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the supplier
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Supplier's unique item number
          examples:
            - SKU-12345
        attachments:
          type:
            - array
            - 'null'
          description: |
            Array of item attachments (images, documents, certificates, etc.).
            Returns null if no attachments are available.
          items:
            $ref: '#/components/schemas/ItemAttachment'
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          attachments:
            - attachmentType: ATX001
              attachmentTypeSpecification: MDX002
              attachmentLanguages: null
              attachmentFilename: product_image.jpg
              attachmentUri: https://example.com/images/product.jpg
              attachmentDescription: Front view product image
              attachmentIssueDate: '2024-01-15'
              attachmentExpiryDate: null
            - attachmentType: ATX014
              attachmentTypeSpecification: MDX005
              attachmentLanguages:
                - en-GB
              attachmentFilename: datasheet-en.pdf
              attachmentUri: https://cdn.supplier.com/datasheets/datasheet-en.pdf
              attachmentDescription: Technical datasheet
              attachmentIssueDate: '2024-06-15'
              attachmentExpiryDate: null
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          attachments: null
    BulkTradeItemAttachmentsResponse:
      type: object
      description: |
        Bulk response containing trade item attachments with cursor-based pagination.

        Each item in the `data` array represents a single attachment for a trade item.
        A trade item with 3 attachments will result in 3 rows.

        This flattened structure is optimized for ETL/data warehouse ingestion and
        streaming data processing.
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: Array of item attachments. Each row is one attachment per trade item.
          items:
            $ref: '#/components/schemas/ItemAttachmentSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
      examples:
        - data:
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-LAMP-001
              attachmentType: ATX001
              attachmentTypeSpecification: MDX002
              attachmentLanguages: null
              attachmentFilename: product_image.jpg
              attachmentUri: https://example.com/images/product.jpg
              attachmentDescription: Front view product image
              attachmentIssueDate: '2024-01-15'
              attachmentExpiryDate: null
            - supplierIdGln: '8712423012485'
              supplierItemNumber: SKU-LAMP-001
              attachmentType: ATX014
              attachmentTypeSpecification: MDX005
              attachmentLanguages:
                - en-GB
              attachmentFilename: datasheet-en.pdf
              attachmentUri: https://cdn.supplier.com/datasheets/datasheet-en.pdf
              attachmentDescription: Technical datasheet
              attachmentIssueDate: '2024-06-15'
              attachmentExpiryDate: null
            - supplierIdGln: '9876543210987'
              supplierItemNumber: ITEM-67890
              attachmentType: ATX026
              attachmentTypeSpecification: null
              attachmentLanguages: null
              attachmentFilename: ce-certificate.pdf
              attachmentUri: https://cdn.supplier.com/certs/ce-certificate.pdf
              attachmentDescription: null
              attachmentIssueDate: '2024-03-01'
              attachmentExpiryDate: '2029-03-01'
          meta:
            cursor: eyJpZCI6MTIzfQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 24500
    TradeItemEnclosedItemsResponse:
      type: object
      description: |
        Response containing enclosed items for a specific trade item.
        Returns the trade item identification keys and a flat array of enclosed items,
        each with a `packagingTypeCode` to identify the parent packaging unit.

        Unlike the bulk endpoint `/trade-items/bulk/enclosed-items` which uses a flattened
        structure optimized for ETL, this single-item endpoint returns enclosed items
        in a nested format for easier consumption.

        **ETIM xChange**: `TradeItemEnclosed[]`
        **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[]`
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TradeItemEnclosedItemsResponseData'
      examples:
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            enclosedItems:
              - packagingTypeCode: BX
                enclosedSupplierItemNumber: WIDGET-001
                enclosedManufacturerItemNumber: MFG-WIDGET-001
                enclosedItemGtins:
                  - '4012345678901'
                enclosedItemQuantity: 5
              - packagingTypeCode: BX
                enclosedSupplierItemNumber: SCREW-M8-50
                enclosedManufacturerItemNumber: null
                enclosedItemGtins: null
                enclosedItemQuantity: 100
        - data:
            supplierIdGln: '1234567890123'
            supplierItemNumber: SKU-12345
            enclosedItems: null
    TradeItemEnclosedItemsResponseData:
      type: object
      description: |
        Single trade item identification keys with enclosed items.

        **Packaging Reference**: Each enclosed item includes a `packagingTypeCode` to enable
        correlation with the corresponding packaging unit from the main trade item response.

        **ETIM xChange**: `TradeItemEnclosed[]`
        **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[]`
      required:
        - supplierIdGln
        - supplierItemNumber
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: Global Location Number (GLN) uniquely identifying the supplier
          examples:
            - '1234567890123'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: Supplier's unique item number
          examples:
            - SKU-12345
        enclosedItems:
          type:
            - array
            - 'null'
          description: |
            Array of enclosed items across all packaging units.
            Each item includes a `packagingTypeCode` to identify which packaging unit
            contains the enclosed trade item.
            Returns null if no enclosed items are available.
          items:
            $ref: '#/components/schemas/TradeItemEnclosedItem'
      examples:
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          enclosedItems:
            - packagingTypeCode: BX
              enclosedSupplierItemNumber: WIDGET-001
              enclosedManufacturerItemNumber: MFG-WIDGET-001
              enclosedItemGtins:
                - '4012345678901'
              enclosedItemQuantity: 5
            - packagingTypeCode: BX
              enclosedSupplierItemNumber: SCREW-M8-50
              enclosedManufacturerItemNumber: null
              enclosedItemGtins: null
              enclosedItemQuantity: 100
            - packagingTypeCode: PF
              enclosedSupplierItemNumber: WIDGET-001
              enclosedManufacturerItemNumber: MFG-WIDGET-001
              enclosedItemGtins:
                - '4012345678901'
              enclosedItemQuantity: 50
        - supplierIdGln: '1234567890123'
          supplierItemNumber: SKU-12345
          enclosedItems: null
    TradeItemEnclosedItem:
      type: object
      description: |
        An enclosed trade item with packaging unit context.
        Each item includes a `packagingTypeCode` to identify which packaging unit
        contains the enclosed item, enabling correlation with the packaging data
        from the main trade item response.

        This is a response-specific schema not present in the ETIM xChange domain model.

        **ETIM xChange**: `TradeItemEnclosed`
        **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[]`
      required:
        - packagingTypeCode
        - enclosedSupplierItemNumber
        - enclosedItemQuantity
      properties:
        packagingTypeCode:
          description: |
            Type of packaging unit that contains this enclosed item.
            Use this to correlate with the corresponding packaging unit from the main trade item response.

            This is a contextual identifier denormalized from the parent `PackagingUnit`.
            **ETIM xChange**: `PackagingTypeCode`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.PackagingTypeCode`
          $ref: '#/components/schemas/PackagingTypeCode'
          examples:
            - BX
            - PF
        enclosedSupplierItemNumber:
          type: string
          description: |
            Supplier item number of the enclosed trade item.
            **ETIM xChange**: `SupplierItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].SupplierItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - WIDGET-001
            - SCREW-M8-50
        enclosedManufacturerItemNumber:
          type:
            - string
            - 'null'
          description: |
            Manufacturer item number of the enclosed trade item.
            **ETIM xChange**: `ManufacturerItemNumber`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].ManufacturerItemNumber`
          minLength: 1
          maxLength: 35
          examples:
            - MFG-WIDGET-001
            - null
        enclosedItemGtins:
          type:
            - array
            - 'null'
          description: |
            Array of GTINs for the enclosed trade item.
            **ETIM xChange**: `ItemGtin[]`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].ItemGtin[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          examples:
            - - '4012345678901'
            - null
        enclosedItemQuantity:
          type: integer
          description: |
            Quantity of this enclosed item within the packaging unit.
            **ETIM xChange**: `EnclosedItemQuantity`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[].EnclosedItemQuantity`
          minimum: 1
          examples:
            - 1
            - 5
            - 100
      examples:
        - packagingTypeCode: BX
          enclosedSupplierItemNumber: WIDGET-001
          enclosedManufacturerItemNumber: MFG-WIDGET-001
          enclosedItemGtins:
            - '4012345678901'
          enclosedItemQuantity: 5
        - packagingTypeCode: PF
          enclosedSupplierItemNumber: SCREW-M8-50
          enclosedManufacturerItemNumber: null
          enclosedItemGtins: null
          enclosedItemQuantity: 100
    BulkTradeItemEnclosedItemsResponse:
      type: object
      description: |
        Bulk response containing enclosed items with cursor-based pagination.

        Each item in the `data` array represents a single enclosed item within a packaging unit.
        A trade item with 2 packaging units, each containing 3 enclosed items, will result in 6 rows.

        This flattened structure is optimized for ETL/data warehouse ingestion and
        streaming data processing.
      required:
        - data
        - meta
      properties:
        data:
          type: array
          description: Array of enclosed items. Each row is one enclosed item per packaging unit per trade item.
          items:
            $ref: '#/components/schemas/TradeItemEnclosedSummary'
        meta:
          $ref: '#/components/schemas/CursorPaginationMetadata'
      examples:
        - data:
            - supplierIdGln: '1234567890123'
              supplierItemNumber: SKU-KIT-001
              packagingTypeCode: BX
              enclosedSupplierItemNumber: WIDGET-001
              enclosedManufacturerItemNumber: MFG-WIDGET-001
              enclosedItemGtins:
                - '4012345678901'
              enclosedItemQuantity: 5
            - supplierIdGln: '1234567890123'
              supplierItemNumber: SKU-KIT-001
              packagingTypeCode: BX
              enclosedSupplierItemNumber: SCREW-M8-50
              enclosedManufacturerItemNumber: null
              enclosedItemGtins: null
              enclosedItemQuantity: 100
            - supplierIdGln: '9876543210987'
              supplierItemNumber: SKU-PALLET-002
              packagingTypeCode: PF
              enclosedSupplierItemNumber: WIDGET-001
              enclosedManufacturerItemNumber: MFG-WIDGET-001
              enclosedItemGtins:
                - '4012345678901'
              enclosedItemQuantity: 50
          meta:
            cursor: eyJpZCI6MTIzfQ==
            hasNext: true
            hasPrev: false
            limit: 100
            estimatedTotal: 2340
    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'
    ItemStatus:
      type: string
      description: |
        Status of the trade item in its lifecycle.
        **ETIM xChange**: `ItemStatus`
        **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemStatus`
      enum:
        - PRE-LAUNCH
        - ACTIVE
        - ON HOLD
        - PLANNED WITHDRAWAL
        - OBSOLETE
      examples:
        - ACTIVE
        - OBSOLETE
    ItemCondition:
      type: string
      description: |
        Physical condition of the trade item.
        **ETIM xChange**: `ItemCondition`
        **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemCondition`
      enum:
        - NEW
        - USED
        - REFURBISHED
      examples:
        - NEW
        - REFURBISHED
    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.
    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
    ItemDescription:
      type: object
      description: |
        Item description in a specific language.
        Extracted from ETIM xChange `TradeItem.ItemDetails.ItemDescriptions[]` structure.
      required:
        - descriptionLanguage
        - minimalItemDescription
      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[].TradeItem[].ItemDetails.ItemDescriptions[].DescriptionLanguage`
          $ref: '#/components/schemas/LanguageCode'
          examples:
            - en-GB
            - de-DE
            - nl-NL
        minimalItemDescription:
          type: string
          description: |
            Minimal description of the trade item (short description).
            **ETIM xChange**: `MinimalItemDescription`
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemDescriptions[].MinimalItemDescription`
          minLength: 1
          maxLength: 80
          examples:
            - Hammer 500g
            - Screwdriver Phillips
        uniqueMainItemDescription:
          type:
            - string
            - 'null'
          description: |
            Extended unique description of the trade item (long description).
            **ETIM xChange**: `UniqueMainItemDescription`
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemDescriptions[].UniqueMainItemDescription`
          minLength: 1
          maxLength: 255
          examples:
            - Professional claw hammer with fiberglass handle, 500g head weight, ergonomic grip
            - null
        discountGroupDescription:
          type:
            - string
            - 'null'
          description: |
            Human-readable description of the discount group in this language.
            **ETIM xChange**: `DiscountGroupDescription[].DiscountGroupDescription`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.DiscountGroupDescription[].DiscountGroupDescription`
          minLength: 1
          maxLength: 100
          examples:
            - Standard tools discount group
            - null
        bonusGroupDescription:
          type:
            - string
            - 'null'
          description: |
            Human-readable description of the bonus group in this language.
            **ETIM xChange**: `BonusGroupDescription[].BonusGroupDescription`
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.BonusGroupDescription[].BonusGroupDescription`
          minLength: 1
          maxLength: 100
          examples:
            - Premium bonus tier
            - null
      examples:
        - descriptionLanguage: en-US
          minimalItemDescription: Hammer 500g
          uniqueMainItemDescription: Professional claw hammer with fiberglass handle, 500g head weight
          discountGroupDescription: Standard tools discount group
          bonusGroupDescription: null
        - descriptionLanguage: de-DE
          minimalItemDescription: Hammer 500g
          discountGroupDescription: Standardwerkzeuge Rabattgruppe
          bonusGroupDescription: null
    UnitCodes:
      type: string
      description: |
        Unit of measurement codes following UN/CEFACT Rec. 20 standard.
        Categories:
        - Weight: GRM, KGM, MGM, TNE, LTN, LBR, ONZ
        - Length: CMT, DTM, KTM, MMT, MTR, FOT, INH, SMI, YRD
        - Area: CMK, CMQ, MMK, MMQ, MTK, MTQ, FTQ, INQ
        - Volume: LTR, MLT, HLT
        - Time: ANN, DAY, HUR, MIN, SEC, WEE
        - Quantity: C62, DZN, NMP, NPL, NRL, PA, PF, PK, PL, PR, PU, RG, RL, RO, SA, SET, ST, TN, TU, Z2, Z3
        - Container: BE, BG, BO, BX, CA, CI, CL, CQ, CR, CS, CT, DR
      enum:
        - ANN
        - DAY
        - HUR
        - MIN
        - SEC
        - WEE
        - GRM
        - KGM
        - MGM
        - TNE
        - LTN
        - LBR
        - ONZ
        - CMT
        - KTM
        - MMT
        - MTR
        - FOT
        - INH
        - SMI
        - YRD
        - CMK
        - CMQ
        - MMK
        - MMQ
        - MTK
        - MTQ
        - FTQ
        - INQ
        - LTR
        - MLT
        - HLT
        - BE
        - BG
        - BO
        - BX
        - CA
        - CI
        - CL
        - CQ
        - CR
        - CS
        - CT
        - DR
        - C62
        - DZN
        - NMP
        - NPL
        - NRL
        - PA
        - PF
        - PK
        - PL
        - PR
        - PU
        - RG
        - RL
        - RO
        - SA
        - SET
        - ST
        - TN
        - TU
        - Z2
        - Z3
        - D99
        - KG
      examples:
        - C62
        - KGM
        - MTR
        - LTR
    CurrencyCode:
      type: string
      description: ISO 4217 currency code
      enum:
        - EUR
        - USD
        - GBP
        - CHF
        - SEK
        - NOK
        - DKK
        - PLN
        - CZK
      examples:
        - EUR
        - USD
    AllowanceSurchargeTypes:
      type: string
      description: |
        Allowance and surcharge type codes for pricing adjustments.
        These codes define the reason for price adjustments.
      enum:
        - AAT
        - ABL
        - ADO
        - ADR
        - ADZ
        - AEM
        - AEO
        - AEP
        - AEQ
        - CAI
        - DAE
        - DBD
        - FC
        - HD
        - INS
        - MAC
        - MAT
        - PAD
        - PI
        - QD
        - RAD
        - SH
        - TD
        - WHE
        - X21
      examples:
        - TD
        - QD
        - FC
    PackagingTypeCode:
      type: string
      description: |
        Type of packaging for the trade item or packaging unit.
        **ETIM xChange**: `PackagingTypeCode`
        **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.PackagingTypeCode`
      enum:
        - BE
        - BG
        - BJ
        - BO
        - BR
        - BX
        - C62
        - CA
        - CL
        - CQ
        - CR
        - CS
        - CT
        - CY
        - D99
        - DR
        - EV
        - KG
        - NE
        - PA
        - PF
        - PK
        - PL
        - PR
        - PU
        - RG
        - RL
        - RO
        - SA
        - SET
        - TN
        - TU
        - WR
        - Z2
        - Z3
      examples:
        - BX
        - PA
        - PF
    TradeItemPricingSummary:
      type: object
      description: |
        Flattened trade item pricing for bulk retrieval.
        Each row represents a single price entry with the trade item identifier, following the 
        same pattern as `ProductEtimClassificationFeature` (1 row = 1 data point).

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

        A trade item may have multiple pricing entries (e.g., quantity tiers, validity periods),
        resulting in multiple rows with the same composite key but different pricing data.

        **Allowances & Surcharges**: Available via separate `/trade-items/bulk/allowance-surcharges` endpoint.
        Join using `pricingRef` to correlate pricing entries with their allowances/surcharges.

        **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**: `Pricing`
        **Path**: `Supplier[].Product[].TradeItem[].Pricing[]`
      required:
        - supplierIdGln
        - supplierItemNumber
        - pricingRef
        - priceUnit
        - priceQuantity
        - currencyCode
        - priceValidityDate
      properties:
        supplierIdGln:
          $ref: '#/components/schemas/Gln'
          description: |
            Global Location Number (GLN) of the supplier. 13-digit GS1 identifier.
            Part of the composite key for the trade item.

            **ETIM xChange**: `SupplierIdGln`  
            **Path**: `Supplier[].SupplierIdGln`
          examples:
            - '1234567890123'
            - '8712423012485'
        supplierItemNumber:
          type: string
          minLength: 1
          maxLength: 35
          description: |
            Supplier's unique item number. Part of the composite key for the trade item.
            This is the primary identifier for items in the supplier's catalog system.

            **ETIM xChange**: `SupplierItemNumber`  
            **Path**: `Supplier[].Product[].TradeItem[].ItemIdentification.SupplierItemNumber`
          examples:
            - SKU-12345
            - ITEM-ABC-789
        pricingRef:
          description: |
            Server-generated opaque reference key that uniquely identifies this pricing entry
            within the scope of a trade item (identified by `supplierIdGln` + `supplierItemNumber`).

            This is a technical identifier not present in the ETIM xChange domain model.
            Use `pricingRef` to correlate pricing entries with their allowances/surcharges
            from the `/trade-items/bulk/allowance-surcharges` endpoint.
          $ref: '#/components/schemas/TechnicalId'
          examples:
            - price-c62-1-20250101
            - f47ac10b-58cc-4372-a567-0e02b2c3d479
        priceUnit:
          description: |
            Unit for which the price applies (e.g., pieces, boxes, meters).

            **ETIM xChange**: `PriceUnit`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceUnit`
          $ref: '#/components/schemas/UnitCodes'
          examples:
            - C62
            - BX
            - MTR
        priceUnitFactor:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Factor to convert price unit to order unit (converted from ETIM xChange string to number).

            **ETIM xChange**: `PriceUnitFactor` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceUnitFactor`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 1
            - 100
        priceQuantity:
          type: number
          format: decimal
          description: |
            Quantity for which the price applies (converted from ETIM xChange string to number).
            Used for quantity-based pricing tiers.

            **ETIM xChange**: `PriceQuantity` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999.9999
          examples:
            - 1
            - 10
            - 100
        currencyCode:
          description: |
            Currency code for all monetary values in this pricing entry.
            Sourced from ETIM xChange `CurrencyCode` at catalog level.
          $ref: '#/components/schemas/CurrencyCode'
          examples:
            - EUR
        priceOnRequest:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether the price is available only on request.

            **ETIM xChange**: `PriceOnRequest`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceOnRequest`
          examples:
            - false
            - true
        grossListPrice:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Gross list price (before discounts) (converted from ETIM xChange string to number).

            **ETIM xChange**: `GrossListPrice` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].GrossListPrice`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 130
            - 1500
        netPrice:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Net price (after discounts, before tax) (converted from ETIM xChange string to number).

            **ETIM xChange**: `NetPrice` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].NetPrice`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 100
            - 1200
        recommendedRetailPrice:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Recommended retail price (MSRP) (converted from ETIM xChange string to number).

            **ETIM xChange**: `RecommendedRetailPrice` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].RecommendedRetailPrice`
          minimum: 0
          multipleOf: 0.0001
          maximum: 99999999999.9999
          examples:
            - 150
            - 1800
        vat:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            VAT/tax percentage (converted from ETIM xChange string to number).

            **ETIM xChange**: `Vat` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].Vat`
          minimum: 0
          multipleOf: 0.01
          maximum: 99.99
          examples:
            - 21
            - 19
        priceValidityDate:
          type: string
          format: date
          description: |
            Date from which the price is valid. ISO 8601 date format (YYYY-MM-DD).
            Defaults to CatalogueValidityStart if not overridden at the pricing level.

            **ETIM xChange**: `PriceValidityDate`  
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceValidityDate`  
            **Default from**: `CatalogueValidityStart`
          examples:
            - '2025-01-01'
        priceExpiryDate:
          type:
            - string
            - 'null'
          format: date
          description: |
            Date when the price expires. ISO 8601 date format (YYYY-MM-DD).

            **ETIM xChange**: `PriceExpiryDate`
            **Path**: `Supplier[].Product[].TradeItem[].Pricing[].PriceExpiryDate`
          examples:
            - '2025-12-31'
      examples:
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-LAMP-001
          pricingRef: price-c62-1-20250101
          priceUnit: C62
          priceQuantity: 1
          currencyCode: EUR
          priceOnRequest: false
          grossListPrice: 12.99
          netPrice: 9.99
          recommendedRetailPrice: 15.99
          vat: 21
          priceValidityDate: '2025-01-01'
          priceExpiryDate: '2025-12-31'
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-CABLE-002
          pricingRef: price-mtr-1-20250101
          priceUnit: MTR
          priceUnitFactor: 1
          priceQuantity: 1
          currencyCode: EUR
          priceOnRequest: false
          grossListPrice: 2.5
          netPrice: 1.99
          recommendedRetailPrice: 3.49
          vat: 21
          priceValidityDate: '2025-01-01'
          priceExpiryDate: '2025-06-30'
        - supplierIdGln: '8712423012485'
          supplierItemNumber: SKU-CABLE-002
          pricingRef: price-mtr-100-20250101
          priceUnit: MTR
          priceUnitFactor: 1
          priceQuantity: 100
          currencyCode: EUR
          priceOnRequest: false
          grossListPrice: 2
          netPrice: 1.59
          recommendedRetailPrice: 2.99
          vat: 21
          priceValidityDate: '2025-01-01'
          priceExpiryDate: '2025-06-30'
    ItemDetails:
      type: object
      description: |
        Detailed information about the trade item including status, condition, and shelf life.
        Extracted from ETIM xChange `TradeItem.ItemDetails` structure.

        **Note**: Item descriptions are available via a separate `/descriptions` endpoint.
      properties:
        itemStatus:
          description: |
            Current lifecycle status of the trade item (nullable).
            **ETIM xChange**: `ItemStatus`
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemStatus`
          anyOf:
            - $ref: '#/components/schemas/ItemStatus'
            - type: 'null'
          examples:
            - ACTIVE
            - OBSOLETE
            - null
        itemCondition:
          description: |
            Physical condition of the trade item (nullable).
            **ETIM xChange**: `ItemCondition`
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ItemCondition`
          anyOf:
            - $ref: '#/components/schemas/ItemCondition'
            - type: 'null'
          examples:
            - NEW
            - REFURBISHED
            - null
        stockItem:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether the item is a stock item (true) or made-to-order (false).
            **ETIM xChange**: `StockItem`
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.StockItem`
          examples:
            - true
            - false
            - null
        shelfLifePeriod:
          type:
            - integer
            - 'null'
          description: |
            Shelf life period of the item in days (0-999).
            **ETIM xChange**: `ShelfLifePeriod`
            **Path**: `Supplier[].Product[].TradeItem[].ItemDetails.ShelfLifePeriod`
          minimum: 0
          maximum: 999
          examples:
            - 365
            - 730
            - null
      examples:
        - itemStatus: ACTIVE
          itemCondition: NEW
          stockItem: true
          shelfLifePeriod: null
    PackagingUnit:
      type: object
      description: |
        Packaging unit information describing hierarchical packaging levels (e.g., piece, box, pallet).
        Extracted from ETIM xChange `TradeItem.PackagingUnit[]` structure.
      required:
        - packagingTypeCode
      properties:
        supplierPackagingNumber:
          type:
            - string
            - 'null'
          description: |
            Supplier's packaging number for this packaging unit.
            **ETIM xChange**: `SupplierPackagingNumber`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.SupplierPackagingNumber`
          minLength: 1
          maxLength: 35
          examples:
            - PKG-12345
            - null
        manufacturerPackagingNumber:
          type:
            - string
            - 'null'
          description: |
            Manufacturer's packaging number for this packaging unit.
            **ETIM xChange**: `ManufacturerPackagingNumber`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.ManufacturerPackagingNumber`
          minLength: 1
          maxLength: 35
          examples:
            - MFG-PKG-789
            - null
        packagingGtins:
          type:
            - array
            - 'null'
          description: |
            Array of GTINs for this packaging unit.
            **ETIM xChange**: `PackagingGtin[]`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.PackagingGtin[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          examples:
            - - '04012345678901'
            - null
        packagingTypeCode:
          description: |
            Type of packaging (box, pallet, etc.).
            **ETIM xChange**: `PackagingTypeCode`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.PackagingTypeCode`
          $ref: '#/components/schemas/PackagingTypeCode'
          examples:
            - BX
            - PF
            - C62
        packagingUnitName:
          type:
            - string
            - 'null'
          description: |
            Human-readable name of the packaging unit. Flattened from multilingual array.
            **ETIM xChange**: `PackagingUnitName[].PackagingUnitName`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.PackagingUnitName[].PackagingUnitName`
          minLength: 1
          maxLength: 20
          examples:
            - Box
            - Pallet
            - null
        packagingQuantity:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Quantity of base items in this packaging unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `PackagingQuantity` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.PackagingQuantity`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 10
            - 100
            - 1000
            - null
        tradeItemPrimaryPackaging:
          type:
            - boolean
            - 'null'
          description: |
            Indicates whether this is the primary/consumer packaging.
            **ETIM xChange**: `TradeItemPrimaryPackaging`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.TradeItemPrimaryPackaging`
          examples:
            - true
            - false
            - null
        packagingGs1Code128:
          type:
            - string
            - 'null'
          description: |
            GS1-128 barcode for the packaging unit.
            **ETIM xChange**: `PackagingGs1Code128`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingIdentification.PackagingGs1Code128`
          minLength: 1
          maxLength: 48
          examples:
            - '01040123456789011710123456'
            - null
        grossLength:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Gross length of the packaging in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `GrossLength` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingLogistics.GrossLength`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 40
            - 120
            - null
        grossWidth:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Gross width of the packaging in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `GrossWidth` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingLogistics.GrossWidth`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 30
            - 80
            - null
        grossHeight:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Gross height of the packaging in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `GrossHeight` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingLogistics.GrossHeight`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 20
            - 100
            - null
        grossDiameter:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Gross diameter of the packaging in specified unit (for cylindrical packaging) (converted from ETIM xChange string to number).
            **ETIM xChange**: `GrossDiameter` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingLogistics.GrossDiameter`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 15
            - null
        grossDimensionUnit:
          type:
            - string
            - 'null'
          description: |
            Unit of measurement for gross dimensions (CMT=centimeter, MTR=meter, etc.).
            **ETIM xChange**: `GrossDimensionUnit`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingLogistics.GrossDimensionUnit`
          enum:
            - CMT
            - DMT
            - KMT
            - MMT
            - MTR
            - FOT
            - INH
            - SMI
            - YRD
            - null
          examples:
            - CMT
            - MTR
            - null
        grossWeight:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Gross weight of the packaging in specified unit (converted from ETIM xChange string to number).
            **ETIM xChange**: `GrossWeight` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingLogistics.GrossWeight`
          minimum: 0
          multipleOf: 0.0001
          maximum: 999999999999.9999
          examples:
            - 500
            - 15000
            - null
        grossWeightUnit:
          type:
            - string
            - 'null'
          description: |
            Unit of measurement for gross weight (GRM=gram, KGM=kilogram, etc.).
            **ETIM xChange**: `GrossWeightUnit`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].PackagingLogistics.GrossWeightUnit`
          enum:
            - GRM
            - KGM
            - MGM
            - TNE
            - LTN
            - LBR
            - ONZ
            - null
          examples:
            - GRM
            - KGM
            - null
        tradeItemEnclosed:
          type:
            - array
            - 'null'
          description: |
            Array of trade items enclosed within this packaging unit.
            Describes which other trade items are physically contained in this package.
            **ETIM xChange**: `TradeItemEnclosed[]`
            **Path**: `Supplier[].Product[].TradeItem[].PackagingUnit[].TradeItemEnclosed[]`
          items:
            $ref: '#/components/schemas/TradeItemEnclosed'
          examples:
            - - enclosedSupplierItemNumber: WIDGET-001
                enclosedManufacturerItemNumber: MFG-WIDGET-001
                enclosedItemGtins:
                  - '4012345678901'
                enclosedItemQuantity: 5
            - null
      examples:
        - supplierPackagingNumber: PKG-001
          manufacturerPackagingNumber: null
          packagingGtins:
            - '04012345678901'
          packagingTypeCode: BX
          packagingUnitName: Box
          packagingQuantity: 10
          tradeItemPrimaryPackaging: false
          packagingGs1Code128: null
          grossLength: 40
          grossWidth: 30
          grossHeight: 20
          grossDiameter: null
          grossDimensionUnit: CMT
          grossWeight: 5000
          grossWeightUnit: GRM
          tradeItemEnclosed:
            - enclosedSupplierItemNumber: WIDGET-001
              enclosedManufacturerItemNumber: MFG-WIDGET-001
              enclosedItemGtins:
                - '4012345678901'
              enclosedItemQuantity: 5
            - enclosedSupplierItemNumber: SCREW-M8-50
              enclosedManufacturerItemNumber: null
              enclosedItemGtins: null
              enclosedItemQuantity: 100
    ItemCountrySpecificField:
      type: object
      description: |
        Country-specific custom fields for trade items allowing extensibility for market-specific requirements.
        Extracted from ETIM xChange `TradeItem.ItemCountrySpecificFields[]` structure.
      required:
        - csItemCharacteristicCode
      properties:
        csItemCharacteristicCode:
          type: string
          description: |
            Unique code identifying the country-specific characteristic.
            **ETIM xChange**: `CSItemCharacteristicCode`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicCode`
          minLength: 1
          maxLength: 60
          examples:
            - CS_ENERGY_CLASS
            - CS_WARRANTY_MONTHS
        csItemCharacteristicName:
          type:
            - string
            - 'null'
          description: |
            Human-readable name of the country-specific characteristic. Flattened from multilingual array.
            **ETIM xChange**: `CSItemCharacteristicName[].CSItemCharacteristicName`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicName[].CSItemCharacteristicName`
          minLength: 1
          maxLength: 255
          examples:
            - Energy efficiency class
            - Warranty period in months
            - null
        csItemCharacteristicValueBoolean:
          type:
            - boolean
            - 'null'
          description: |
            Boolean value for the country-specific characteristic.
            **ETIM xChange**: `CSItemCharacteristicValueBoolean`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicValueBoolean`
          examples:
            - true
            - false
            - null
        csItemCharacteristicValueNumeric:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Numeric value for the country-specific characteristic (converted from ETIM xChange string to number).
            **ETIM xChange**: `CSItemCharacteristicValueNumeric` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicValueNumeric`
          multipleOf: 0.0001
          minimum: -999999999999.9999
          maximum: 999999999999.9999
          examples:
            - 24
            - 12.5
            - null
        csItemCharacteristicValueRangeLower:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Lower bound of numeric range value (converted from ETIM xChange string to number).
            **ETIM xChange**: `CSItemCharacteristicValueRangeLower` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicValueRangeLower`
          multipleOf: 0.0001
          minimum: -999999999999.9999
          maximum: 999999999999.9999
          examples:
            - 10
            - null
        csItemCharacteristicValueRangeUpper:
          type:
            - number
            - 'null'
          format: decimal
          description: |
            Upper bound of numeric range value (converted from ETIM xChange string to number).
            **ETIM xChange**: `CSItemCharacteristicValueRangeUpper` (string with pattern)
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicValueRangeUpper`
          multipleOf: 0.0001
          minimum: -999999999999.9999
          maximum: 999999999999.9999
          examples:
            - 20
            - null
        csItemCharacteristicValueString:
          type:
            - string
            - 'null'
          description: |
            String value for the country-specific characteristic. Flattened from multilingual array.
            **ETIM xChange**: `CSItemCharacteristicValueString[].CSItemCharacteristicValueString`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicValueString[].CSItemCharacteristicValueString`
          minLength: 1
          maxLength: 4000
          examples:
            - Energy class A++
            - Special certification required
            - null
        csItemCharacteristicValueSet:
          type:
            - array
            - 'null'
          description: |
            Array of string values for multi-value characteristics. Flattened from multilingual array.
            **ETIM xChange**: `CSItemCharacteristicValueSet[].CSItemCharacteristicValueSet[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicValueSet[].CSItemCharacteristicValueSet[]`
          uniqueItems: true
          items:
            type: string
            minLength: 1
            maxLength: 255
          examples:
            - - Value1
              - Value2
              - Value3
            - null
        csItemCharacteristicValueSelect:
          type:
            - string
            - 'null'
          description: |
            Single selection value code from a predefined list.
            **ETIM xChange**: `CSItemCharacteristicValueSelect`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicValueSelect`
          minLength: 1
          maxLength: 60
          examples:
            - OPTION_A
            - null
        csItemCharacteristicMultivalueSelect:
          type:
            - array
            - 'null'
          description: |
            Multiple selection value codes from a predefined list.
            **ETIM xChange**: `CSItemCharacteristicMultivalueSelect[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicMultivalueSelect[]`
          uniqueItems: true
          items:
            type: string
            minLength: 1
            maxLength: 60
          examples:
            - - OPTION_A
              - OPTION_B
            - null
        csItemCharacteristicValueUnitCode:
          type:
            - string
            - 'null'
          description: |
            Unit code for the characteristic value.
            **ETIM xChange**: `CSItemCharacteristicValueUnitCode`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicValueUnitCode`
          minLength: 1
          maxLength: 3
          examples:
            - MTR
            - KGM
            - null
        csItemCharacteristicReferenceGtins:
          type:
            - array
            - 'null'
          description: |
            Array of GTINs referenced by this characteristic.
            **ETIM xChange**: `CSItemCharacteristicReferenceGtin[]`
            **Path**: `Supplier[].Product[].TradeItem[].ItemCountrySpecificFields[].CSItemCharacteristicReferenceGtin[]`
          uniqueItems: true
          items:
            $ref: '#/components/schemas/Gtin'
          examples:
            - - '4012345678901'
            - null
      examples:
        - csItemCharacteristicCode: CS_WARRANTY_MONTHS
          csItemCharacteristicName: Warranty period in months
          csItemCharacteristicValueBoolean: null
          csItemCharacteristicValueNumeric: 24
          csItemCharacteristicValueRangeLower: null
          csItemCharacteristicValueRangeUpper: null
          csItemCharacteristicValueString: null
          csItemCharacteristicValueSet: null
          csItemCharacteristicValueSelect: null
          csItemCharacteristicMultivalueSelect: null
          csItemCharacteristicValueUnitCode: null
          csItemCharacteristicReferenceGtins: null
  parameters:
    SupplierIdGln:
      $ref: '#/components/parameters/supplier-id-gln-filter'
    SupplierIdGlnPath:
      $ref: '#/components/parameters/supplier-id-gln'
    SupplierItemNumberPath:
      $ref: '#/components/parameters/supplier-item-number'
    Cursor:
      $ref: '#/components/parameters/cursor'
    Limit:
      $ref: '#/components/parameters/limit'
    SelectionId:
      $ref: '#/components/parameters/selection-id'
    MutationDateTime:
      $ref: '#/components/parameters/mutation-date-time'
    Language:
      $ref: '#/components/parameters/language'
    supplier-id-gln:
      name: supplierIdGln
      in: path
      description: |
        Global Location Number (GLN) of the supplier. Must be a valid 13-digit GLN.
        Part of the composite key for identifying a unique trade item.
      required: true
      schema:
        type: string
        pattern: ^[0-9]{13}$
        minLength: 13
        maxLength: 13
        description: 13-digit Global Location Number
      example: '1234567890123'
    supplier-item-number:
      name: supplierItemNumber
      in: path
      description: |
        Supplier's unique item number. Must be 1-35 characters.
        Part of the composite key for identifying a unique trade item.
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 35
        description: Supplier's item identifier
      example: ART-12345
    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
    supplier-id-gln-filter:
      name: supplierIdGln
      in: query
      description: Filter trade items by supplier's Global Location Number (GLN)
      required: false
      schema:
        $ref: '#/components/schemas/Gln'
      examples:
        supplierIdGlnExample:
          value: '4012345000016'
          summary: Example supplier ID GLN
    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'
  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:tradeitems: Grants read access to trade items
            write:tradeitems: Grants write access to trade items
x-tagGroups:
  - name: Trade Items
    tags:
      - TradeItems single
      - TradeItems bulk
