> ## Documentation Index
> Fetch the complete documentation index at: https://socialquery.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# H&M Product Suppliers

> Read H&M’s published global supplier/factory list for a ten-digit article code. Preserves country, supplier and factory identity, business addresses and source-text worker ranges. This does not identify an individual item’s batch or exact factory, and entries may retain last-known information. Uses the public supplier-details service with its PDH fallback for en_us. An absent supplier list returns 404 without net SocialQuery charge. Direct transport can fall back to one fresh basic Firecrawl scrape of the same public JSON service.

Read H\&M's published supplier and factory list for an article. Pass the ten-digit code from the product page as `product_id`, preserving leading zeros, for example `0963662139`. A seven-digit product-family code is not accepted. `language` defaults to `en_us`.

`countries[].suppliers[].factories[]` preserves the source hierarchy and IDs. Factories include their published business address and `workers_range`, retained as source text. A range such as `1001-1500` is not an exact employee count. Country, supplier and factory counts describe entries in the response, not distinct organizations across countries.

The list covers factories that made this article globally. It does not identify which factory made an individual item, its batch, or its label country. H\&M says some entries can retain the last information from a past supplier relationship. Proper names and addresses are returned as the source supplies them.

The adapter calls the public supplier-details service used by H\&M's product UI. For `en_us`, it can use the UI's PDH fallback after a transport failure or primary 403/5xx. Missing lists and inconsistent data are not silently retried as successful empty results. `source` identifies the service that responded; `sources_attempted` records the attempted URLs. If direct requests fail in production, the route uses the existing Firecrawl provider for one fresh basic scrape of the same JSON service. `transport` identifies `direct` or `firecrawl_basic`. Firecrawl metadata must identify that exact URL and a successful JSON response; the same hierarchy validation applies. No new provider credential is needed.

An absent published list returns 404 without a net SocialQuery credit charge. Fresh successful requests use the documented credit price; cached responses and successful idempotent replays are free. This endpoint does not provide inventory, exact headcount or a guarantee of a current supplier relationship.


## OpenAPI

````yaml GET /hm/product/suppliers
openapi: 3.1.0
info:
  title: SocialQuery API
  version: '2026-10-09'
  description: >-
    Documented requests for public-source records. Inspect accepted inputs and
    credit amounts, then verify the selected operation before integrating
    preview coverage.
servers:
  - url: https://socialquery.dev/v1
security:
  - apiKey: []
paths:
  /hm/product/suppliers:
    get:
      tags:
        - Hm
      summary: Hm Product Suppliers
      description: >-
        Read H&M’s published global supplier/factory list for a ten-digit
        article code. Preserves country, supplier and factory identity, business
        addresses and source-text worker ranges. This does not identify an
        individual item’s batch or exact factory, and entries may retain
        last-known information. Uses the public supplier-details service with
        its PDH fallback for en_us. An absent supplier list returns 404 without
        net SocialQuery charge. Direct transport can fall back to one fresh
        basic Firecrawl scrape of the same public JSON service.
      operationId: get_hm_product_suppliers
      parameters:
        - name: product_id
          in: query
          required: true
          example: '0963662139'
          schema:
            type: string
            pattern: ^[0-9]{10}$
          description: >-
            Ten-digit article code from productpage.<article>.html, preserving
            leading zeros.
        - name: language
          in: query
          required: false
          schema:
            type: string
            pattern: ^[a-zA-Z]{2}_[a-zA-Z]{2}$
            default: en_us
          description: >-
            Locale requested from H&M. The locale-agnostic PDH fallback is used
            only for en_us.
        - name: Cache-Control
          in: header
          required: false
          example: no-cache
          schema:
            type: string
        - name: Idempotency-Key
          in: header
          required: false
          example: 7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c
          schema:
            type: string
        - name: X-Max-Credits
          in: header
          required: false
          description: >-
            Optional nonnegative integer cap on the maximum request hold. A live
            request whose hold exceeds this cap returns 422
            CREDIT_BUDGET_EXCEEDED before spending. Metered holds use the
            requested limit; cache hits and successful idempotent replays cost
            zero.
          schema:
            type: integer
            minimum: 0
      responses:
        '200':
          description: >-
            Read H&M’s published global supplier/factory list for a ten-digit
            article code. Preserves country, supplier and factory identity,
            business addresses and source-text worker ranges. This does not
            identify an individual item’s batch or exact factory, and entries
            may retain last-known information. Uses the public supplier-details
            service with its PDH fallback for en_us. An absent supplier list
            returns 404 without net SocialQuery charge.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SocialQueryResponse'
                  - type: object
                    properties:
                      data:
                        type: object
                        properties:
                          product_id:
                            type: string
                          language:
                            type: string
                          countries:
                            type: array
                            items:
                              type: object
                              properties:
                                id:
                                  type: string
                                name:
                                  type: string
                                suppliers:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      id:
                                        type: string
                                      name:
                                        type: string
                                      factories:
                                        type: array
                                        items:
                                          type: object
                                          properties:
                                            id:
                                              type: string
                                            name:
                                              type: string
                                            address:
                                              type:
                                                - string
                                                - 'null'
                                            workers_range:
                                              type:
                                                - string
                                                - 'null'
                                          required:
                                            - id
                                            - name
                                            - address
                                            - workers_range
                                    required:
                                      - id
                                      - name
                                      - factories
                              required:
                                - id
                                - name
                                - suppliers
                          country_count:
                            type: integer
                            minimum: 1
                          supplier_count:
                            type: integer
                            minimum: 1
                          factory_count:
                            type: integer
                            minimum: 1
                          source:
                            type: string
                          sources_attempted:
                            type: array
                            items:
                              type: string
                          coverage_note:
                            type: string
                          transport:
                            enum:
                              - direct
                              - firecrawl_basic
                        required:
                          - product_id
                          - language
                          - countries
                          - country_count
                          - supplier_count
                          - factory_count
                          - source
                          - sources_attempted
                          - coverage_note
                          - transport
        '400':
          $ref: '#/components/responses/Error400'
        '401':
          $ref: '#/components/responses/Error401'
        '402':
          $ref: '#/components/responses/Error402'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '405':
          $ref: '#/components/responses/Error405'
        '409':
          $ref: '#/components/responses/Error409'
        '422':
          $ref: '#/components/responses/Error422'
        '429':
          $ref: '#/components/responses/Error429'
        '500':
          $ref: '#/components/responses/Error500'
        '502':
          $ref: '#/components/responses/Error502'
        '503':
          $ref: '#/components/responses/Error503'
        '504':
          $ref: '#/components/responses/Error504'
components:
  schemas:
    SocialQueryResponse:
      type: object
      required:
        - success
        - platform
        - endpoint
        - credits_used
        - credits_remaining
        - request_id
        - cached
        - data
      properties:
        success:
          type: boolean
          const: true
        platform:
          type: string
        endpoint:
          type: string
        credits_used:
          type: integer
          minimum: 0
        credits_remaining:
          type:
            - integer
            - 'null'
        request_id:
          type: string
        cached:
          type: boolean
        data:
          type: object
          additionalProperties: true
          description: >-
            The selected operation determines the resource fields in this
            object. Source data can omit a metric or report it as null.
    SocialQueryError:
      type: object
      required:
        - success
        - platform
        - endpoint
        - credits_used
        - credits_remaining
        - request_id
        - cached
        - error
      properties:
        success:
          type: boolean
          const: false
        platform:
          type: string
        endpoint:
          type: string
        credits_used:
          type: integer
          minimum: 0
        credits_remaining:
          type:
            - integer
            - 'null'
        request_id:
          type: string
        cached:
          type: boolean
        error:
          type: object
          required:
            - code
            - type
            - message
            - status
            - doc_url
          properties:
            code:
              type: string
            type:
              type: string
            message:
              type: string
            status:
              type: integer
            doc_url:
              type: string
              format: uri
  responses:
    Error400:
      description: Upstream rejected the request.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error401:
      description: Missing, expired, invalid, or revoked API key.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error402:
      description: Insufficient SocialQuery credits.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error403:
      description: Key scope or provider policy denied access.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error404:
      description: Endpoint or upstream resource not found.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error405:
      description: HTTP method is not supported.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error409:
      description: Idempotency conflict or request in progress.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error422:
      description: Invalid parameters.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error429:
      description: Request limit reached.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error500:
      description: Request processing failed.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error502:
      description: Upstream service failed.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error503:
      description: Provider or required service is unavailable.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
    Error504:
      description: Upstream service timed out.
      headers:
        X-Request-Id:
          schema:
            type: string
        X-Credits-Used:
          schema:
            type: integer
        X-Credits-Remaining:
          schema:
            type: string
        X-Cache:
          schema:
            type: string
            enum:
              - HIT
              - MISS
              - BYPASS
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SocialQueryError'
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.