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

# List a product's references, with positions

> The key-scoped reference view: `{ <attribute-key>: { total, has_more, items: [{id, type, label, position}] } }`. Forward list references return the same complete membership that embeds in `attributes`, plus explicit `position`. INVERSE references — which never embed in `attributes` because they are unbounded — are readable ONLY here: pass `?attribute=<key>` and page with `limit`/`offset` (or traverse from the other side with `filter[<forward-key>]=<id>`).



## OpenAPI

````yaml https://www.merchkit.com/api/v1/openapi get /products/{id}/references
openapi: 3.1.0
info:
  title: Merchkit API
  version: 1.0.0
  description: >-
    Operate your Merchkit PIM programmatically. Products, images, vendors,
    categories, and data sources are all "entities" in one uniform shape: system
    fields (`id`, `type`, `label`, `parent_id`, timestamps) at the top level and
    every customer-defined key — scalars AND references — in a sparse
    `attributes` map. References read as labeled stubs `{id, type, label}` and
    write as bare UUIDs or `{id}` objects ("write what you read"). UUIDs are the
    only path identifiers; find by your own key with a filter (`GET
    /products?filter[sku]=ARIA-DT-72`) or write by it with `POST
    /{resource}/upsert` and `/batch` (products, images, vendors, and categories
    only — sources have neither route; they are created by the async `POST
    /sources` job pipeline). Start every integration with `GET
    /attributes?type=product` to learn your keys. Completeness is per-channel.
    All errors share one envelope (see the `Error` schema). Authenticate with a
    workspace-scoped API key: `Authorization: Bearer mk_live_...`. See /llms.txt
    for an agent guide.
servers:
  - url: https://www.merchkit.com/api/v1
    description: Merchkit API v1
security:
  - ApiKeyAuth: []
paths:
  /products/{id}/references:
    parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: The resource UUID.
    get:
      summary: List a product's references, with positions
      description: >-
        The key-scoped reference view: `{ <attribute-key>: { total, has_more,
        items: [{id, type, label, position}] } }`. Forward list references
        return the same complete membership that embeds in `attributes`, plus
        explicit `position`. INVERSE references — which never embed in
        `attributes` because they are unbounded — are readable ONLY here: pass
        `?attribute=<key>` and page with `limit`/`offset` (or traverse from the
        other side with `filter[<forward-key>]=<id>`).
      operationId: listProductReferences
      parameters:
        - name: attribute
          in: query
          schema:
            type: string
          description: >-
            A reference attribute key. Required to read an inverse reference;
            omit for all forward reference keys.
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 200
            default: 50
          description: Page size, 1–200 (default 50).
        - name: offset
          in: query
          schema:
            type: integer
            minimum: 0
            default: 0
          description: Zero-based offset, echoed back in `pagination.offset`.
      responses:
        '200':
          description: References grouped by attribute key.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    additionalProperties:
                      $ref: '#/components/schemas/ReferencesPage'
              example:
                data:
                  gallery_images:
                    total: 5
                    has_more: false
                    items:
                      - id: f0a1b2c3-d4e5-4f60-8a7b-9c0d1e2f3a4b
                        type: image
                        label: aria-hero.jpg
                        position: 0
                      - id: f0a2c3d4-e5f6-4a70-9b8c-0d1e2f3a4b5c
                        type: image
                        label: aria-detail.jpg
                        position: 1
                      - id: f0a3d4e5-f6a7-4b80-8c9d-1e2f3a4b5c6d
                        type: image
                        label: aria-side.jpg
                        position: 2
                      - id: f0a4e5f6-a7b8-4c90-9dae-2f3a4b5c6d7e
                        type: image
                        label: aria-lifestyle.jpg
                        position: 3
                      - id: f0a5f6a7-b8c9-4da0-8ebf-3a4b5c6d7e8f
                        type: image
                        label: aria-packshot.jpg
                        position: 4
        '404':
          description: Product or reference attribute not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    ReferencesPage:
      type: object
      description: One reference attribute's membership, with positions.
      required:
        - total
        - has_more
        - items
      properties:
        total:
          type: integer
        has_more:
          type: boolean
        items:
          type: array
          items:
            type: object
            required:
              - id
              - type
              - label
              - position
            properties:
              id:
                type: string
                format: uuid
              type:
                type: string
              label:
                type:
                  - string
                  - 'null'
              position:
                type:
                  - integer
                  - 'null'
                description: Order within the reference list.
    Error:
      type: object
      description: >-
        The one error envelope every non-2xx response uses. `documentation_url`
        links to the code's section of the error docs.
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
            - is_retriable
          properties:
            code:
              type: string
              enum:
                - unauthorized
                - insufficient_scope
                - forbidden
                - not_found
                - validation_failed
                - rate_limited
                - conflict
                - internal_error
            message:
              type: string
            documentation_url:
              type: string
              format: uri
              description: https://docs.merchkit.com/developers/errors#<code>
            is_retriable:
              type: boolean
              description: >-
                Only `rate_limited` and `internal_error` are retriable.
                Deterministic client errors (validation, not-found, conflict)
                return a 4xx and are never retriable.
            retry_after_seconds:
              type:
                - integer
                - 'null'
            alternative_action:
              type: string
              description: What to do instead, when there is a better call.
            request_id:
              type: string
            field_errors:
              type: array
              items:
                $ref: '#/components/schemas/FieldError'
      example:
        error:
          code: validation_failed
          message: 'Unknown attribute key(s): colour.'
          documentation_url: https://docs.merchkit.com/developers/errors#validation_failed
          is_retriable: false
          retry_after_seconds: null
          alternative_action: List valid attribute keys via GET /v1/attributes?type=product.
          request_id: req_01j9x2k8
          field_errors:
            - field: colour
              issue: not_a_defined_attribute
    FieldError:
      type: object
      required:
        - field
        - issue
      properties:
        field:
          type: string
        issue:
          type: string
          description: Machine-readable issue code, e.g. `not_a_defined_attribute`.
        acceptable_values:
          type: array
          items:
            type: string
          description: 'For select-value violations: the allowed values.'
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      description: >-
        Workspace-scoped API key. Available scopes:

        - `read:products`: List and read products, including variants,
        references, and completeness.

        - `write:products`: Create, update, and upsert products and their
        attribute values.

        - `delete:products`: Delete products.

        - `read:images`: List and read images.

        - `write:images`: Create, update, and upsert images and their attribute
        values.

        - `delete:images`: Delete images.

        - `read:vendors`: List and read vendors.

        - `write:vendors`: Create, update, and upsert vendors and their
        attribute values.

        - `delete:vendors`: Delete vendors.

        - `read:categories`: List and read categories.

        - `write:categories`: Create, update, and upsert categories and their
        attribute values.

        - `delete:categories`: Delete categories.

        - `read:sources`: List and read data sources, including scraped content.

        - `write:sources`: Create data sources (triggers processing) and update
        their attribute values.

        - `delete:sources`: Delete data sources.

        - `read:attributes`: List and read attribute definitions.

        - `write:attributes`: Create and update attribute definitions.

        - `read:views`: List and read saved grid views (MCP surface).

        - `write:views`: Create and update grid views (MCP surface).

        - `read:channels`: Read the enabled channel catalog.

        - `read:events`: Read the workspace change feed and per-entity events.

        - `read:jobs`: List and poll asynchronous job status.

````