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

# Browse related product families

> Lists reviewed families from one immutable publication revision. A family groups related source SKUs but never combines their price, lifecycle, or inventory observations.



## OpenAPI

````yaml /openapi/v1.yaml get /product-families
openapi: 3.1.0
info:
  title: Independent Utah DABS API
  version: 1.0.0
  summary: Database-backed product, store, and reported-inventory reads
  description: >
    Version 1 pilot contract. All requests read a locally published database
    revision;

    no public request waits for or triggers Utah DABS. Reported quantities are

    observations, not purchase guarantees. This service is independent and is
    not

    affiliated with or endorsed by Utah DABS. The current local seed contains

    historical inventory fixtures; clients must inspect response warnings and

    coverage metadata.
servers:
  - url: http://127.0.0.1:5185/v1
    description: Local development only; set MINTLIFY_API_BASE_URL before publishing
security: []
tags:
  - name: Products
  - name: Brands
  - name: Product families
  - name: Changes
  - name: Exports
  - name: Stores
  - name: Availability
  - name: Metadata
paths:
  /product-families:
    get:
      tags:
        - Product families
      summary: Browse related product families
      description: >-
        Lists reviewed families from one immutable publication revision. A
        family groups related source SKUs but never combines their price,
        lifecycle, or inventory observations.
      operationId: listProductFamilies
      parameters:
        - $ref: '#/components/parameters/FamilyQuery'
        - $ref: '#/components/parameters/BrandIds'
        - $ref: '#/components/parameters/CategoryIds'
        - $ref: '#/components/parameters/RelationshipType'
        - $ref: '#/components/parameters/FamilySort'
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Cursor'
        - $ref: '#/components/parameters/IfNoneMatch'
        - $ref: '#/components/parameters/IfModifiedSince'
      responses:
        '200':
          description: Deterministically paginated product-family summaries.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Last-Modified:
              $ref: '#/components/headers/LastModified'
            Cache-Control:
              $ref: '#/components/headers/DetailCacheControl'
            X-Publication-Revision:
              $ref: '#/components/headers/PublicationRevision'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductFamilyListResponse'
        '304':
          $ref: '#/components/responses/NotModified'
        '400':
          $ref: '#/components/responses/BadRequest'
        '410':
          $ref: '#/components/responses/CursorExpired'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/Unavailable'
components:
  parameters:
    FamilyQuery:
      name: q
      in: query
      description: Case-insensitive family name, slug, or reviewed brand search.
      schema:
        type: string
        minLength: 1
        maxLength: 200
    BrandIds:
      name: brand_ids
      in: query
      style: form
      explode: false
      description: >-
        Comma-separated reviewed Nektir brand UUIDs; OR semantics within this
        filter and AND semantics with other filter groups. Unresolved products
        do not match.
      schema:
        type: array
        maxItems: 25
        uniqueItems: true
        items:
          type: string
          format: uuid
    CategoryIds:
      name: category_ids
      in: query
      style: form
      explode: false
      description: >-
        Comma-separated API category IDs; OR semantics. Selecting a parent
        category includes products assigned to any active descendant category.
      schema:
        type: array
        maxItems: 20
        uniqueItems: true
        items:
          type: string
          pattern: ^cat_[a-z0-9_]+$
    RelationshipType:
      name: relationship_type
      in: query
      style: form
      explode: false
      description: >-
        Comma-separated reviewed relationships between products and their
        family.
      schema:
        type: array
        maxItems: 4
        uniqueItems: true
        items:
          type: string
          enum:
            - expression
            - package_variant
            - successor
            - other
    FamilySort:
      name: sort
      in: query
      schema:
        type: string
        enum:
          - name
          - '-name'
        default: name
    Limit:
      name: limit
      in: query
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 25
    Cursor:
      name: cursor
      in: query
      description: >-
        Signed opaque keyset cursor, valid for 15 minutes and only with the
        original query.
      schema:
        type: string
        maxLength: 2048
    IfNoneMatch:
      name: If-None-Match
      in: header
      description: Strong entity tag from an earlier response.
      schema:
        type: string
    IfModifiedSince:
      name: If-Modified-Since
      in: header
      description: HTTP-date fallback validator. ETag takes precedence.
      schema:
        type: string
  headers:
    ETag:
      description: >-
        Strong validator for the response representation. A new publication may
        retain the validator when this response is unchanged.
      schema:
        type: string
      example: '"v1-018f2fd0-a3d4-7d20-9c11-9482722f6b26-a91c"'
    LastModified:
      description: >-
        Newest relevant publication time in HTTP-date format; not an upstream
        update time.
      schema:
        type: string
      example: Tue, 15 Sep 2026 16:31:00 GMT
    DetailCacheControl:
      schema:
        type: string
      example: public, max-age=60, stale-while-revalidate=300
    PublicationRevision:
      description: Immutable API publication revision used for this representation.
      schema:
        type: string
        format: uuid
    RetryAfter:
      description: Seconds until retry or an HTTP-date.
      schema:
        type: string
    RequestId:
      description: >-
        Server-generated identifier for correlating a response with private
        operational logs.
      schema:
        type: string
        format: uuid
  schemas:
    ProductFamilyListResponse:
      type: object
      additionalProperties: false
      required:
        - data
        - meta
        - links
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ProductFamilySummary'
        meta:
          $ref: '#/components/schemas/PagedMeta'
        links:
          $ref: '#/components/schemas/Links'
    ProductFamilySummary:
      type: object
      additionalProperties: false
      required:
        - id
        - slug
        - name
        - brand
        - brand_id
        - member_count
        - category_ids
        - price_range
        - inventory_retrieved_at
      properties:
        id:
          type: string
          format: uuid
        slug:
          type: string
        name:
          type: string
        brand:
          type:
            - string
            - 'null'
        brand_id:
          type:
            - string
            - 'null'
          format: uuid
        member_count:
          type: integer
          minimum: 1
        category_ids:
          type: array
          uniqueItems: true
          items:
            type: string
            pattern: ^cat_[a-z0-9_]+$
        price_range:
          oneOf:
            - $ref: '#/components/schemas/ProductFamilyPriceRange'
            - type: 'null'
        inventory_retrieved_at:
          type:
            - string
            - 'null'
          format: date-time
    PagedMeta:
      type: object
      additionalProperties: false
      required:
        - page
        - warnings
      properties:
        page:
          $ref: '#/components/schemas/PageMeta'
        warnings:
          type: array
          items:
            $ref: '#/components/schemas/Warning'
    Links:
      type: object
      additionalProperties: false
      required:
        - self
        - next
      properties:
        self:
          type: string
          format: uri-reference
        next:
          type:
            - string
            - 'null'
          format: uri-reference
    Problem:
      type: object
      additionalProperties: false
      required:
        - type
        - title
        - status
        - detail
        - instance
        - code
        - request_id
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
          minimum: 400
          maximum: 599
        detail:
          type: string
        instance:
          type: string
          format: uri-reference
        code:
          type: string
        request_id:
          type: string
          format: uuid
        invalid_params:
          type: array
          items:
            $ref: '#/components/schemas/InvalidParameter'
    ProductFamilyPriceRange:
      type: object
      additionalProperties: false
      required:
        - currency
        - minimum_amount_minor
        - maximum_amount_minor
      properties:
        currency:
          type: string
          const: USD
        minimum_amount_minor:
          type:
            - integer
            - 'null'
          minimum: 0
        maximum_amount_minor:
          type:
            - integer
            - 'null'
          minimum: 0
    PageMeta:
      type: object
      additionalProperties: false
      required:
        - has_more
        - next_cursor
      properties:
        has_more:
          type: boolean
        next_cursor:
          type:
            - string
            - 'null'
        cursor_expires_at:
          type: string
          format: date-time
          description: Present only when `next_cursor` is non-null.
    Warning:
      type: object
      additionalProperties: false
      description: >-
        Machine-readable data qualification. Current codes include FIXTURE_DATA,
        INVENTORY_COVERAGE_PARTIAL, SOURCE_REFRESH_DELAYED,
        UPSTREAM_PRODUCT_UNAVAILABLE, SOURCE_SCHEMA_QUARANTINED, and
        CATALOG_BATCH_OLD.
      required:
        - code
      properties:
        code:
          type: string
          examples:
            - INVENTORY_COVERAGE_PARTIAL
    InvalidParameter:
      type: object
      additionalProperties: false
      required:
        - name
        - reason
      properties:
        name:
          type: string
        reason:
          type: string
  responses:
    NotModified:
      description: Representation has not changed for the supplied validator.
      headers:
        ETag:
          $ref: '#/components/headers/ETag'
        Cache-Control:
          description: Cache policy for the validated representation.
          schema:
            type: string
        X-Publication-Revision:
          $ref: '#/components/headers/PublicationRevision'
    BadRequest:
      description: Invalid parameters, incompatible scope, or cursor/query mismatch.
      headers:
        Cache-Control:
          schema:
            type: string
          example: no-store
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    CursorExpired:
      description: Cursor expired or its publication revision was retired.
      headers:
        Cache-Control:
          schema:
            type: string
          example: no-store
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    RateLimited:
      description: Public read-rate limit exceeded.
      headers:
        Cache-Control:
          schema:
            type: string
          example: no-store
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    InternalError:
      description: >-
        An unexpected server failure. Details are withheld; report the response
        request identifier.
      headers:
        Cache-Control:
          schema:
            type: string
          example: no-store
        X-Request-ID:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Unavailable:
      description: No safe published database revision is currently readable.
      headers:
        Cache-Control:
          schema:
            type: string
          example: no-store
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'

````