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

# List Product Profiles

> Returns Product Profiles and their current asynchronous classification state. Request
`fields=conditions,conditions_readable` when a client needs the canonical condition
definition for editing.



## OpenAPI

````yaml GET /v1/inventory/product-profiles
openapi: 3.0.3
info:
  title: ShipStream
  version: '1.0'
  license:
    name: Commercial (Copyright 2025 - All Rights Reserved)
    url: https://shipstream.io
  contact:
    name: ShipStream Support
    email: help@shipstream.io
  termsOfService: https://shipstream.io/legal/api-terms/
servers:
  - url: https://{base_url_domain}/api/global
    description: Direct API Url
    variables:
      base_url_domain:
        default: example.shipstream.app
        description: >-
          The fully qualified domain name for your ShipStream WMS instance. This
          is either a custom domain, or a subdomain of shipstream.app,

          and will be the same as the domain name for the page which you use to
          login to ShipStream WMS.
security:
  - ShipStream_bearerAuth: []
tags:
  - name: Warehouses
    x-displayName: Warehouses
  - name: Products
    x-displayName: Products
  - name: ProductProfiles
    x-displayName: ProductProfiles
  - name: HandlingClasses
    x-displayName: HandlingClasses
  - name: Locations
    x-displayName: Locations
  - name: LocationTags
    x-displayName: LocationTags
  - name: SlotTypes
    x-displayName: SlotTypes
  - name: Levels
    x-displayName: Levels
  - name: HoldReasons
    x-displayName: HoldReasons
  - name: Holds
    x-displayName: Holds
  - name: Replenishment
    x-displayName: Replenishment
  - name: LocationProfiles
    x-displayName: LocationProfiles
  - name: SlottingRules
    x-displayName: SlottingRules
  - name: Deliveries
    description: Every thing about a Delivery Receiving
    x-displayName: Deliveries
  - name: Shipments
    x-displayName: Shipments
  - name: Orders
    x-displayName: Orders
  - name: Retailers
    x-displayName: Retailers
  - name: Users
    x-displayName: Users
  - name: User Roles
    x-displayName: User Roles
  - name: Merchants
    x-displayName: Merchants
  - name: Healthcheck
    x-displayName: Healthcheck
paths:
  /v1/inventory/product-profiles:
    get:
      tags:
        - ProductProfiles
      summary: List Product Profiles
      description: >-
        Returns Product Profiles and their current asynchronous classification
        state. Request

        `fields=conditions,conditions_readable` when a client needs the
        canonical condition

        definition for editing.
      operationId: listProductProfiles
      parameters:
        - $ref: '#/components/parameters/Inventory_API_v1_product-profile-fields'
        - $ref: '#/components/parameters/Inventory_API_v1_product-profile-filter'
        - name: sort
          in: query
          required: false
          schema:
            type: string
          description: |-
            The default sort is ascending by `id`. Available fields are:
              - `id`
              - `name`
              - `code`
              - `matched_count`
              - `updated_at`

            Cursor paging supports only `id` or `-id` sorting.
        - $ref: '#/components/parameters/Inventory_API_v1_count'
        - $ref: '#/components/parameters/Inventory_API_v1_cursor_end'
        - $ref: '#/components/parameters/Inventory_API_v1_cursor_start'
        - name: limit
          in: query
          required: false
          description: Maximum number of Product Profiles to return.
          schema:
            type: integer
            minimum: 1
            maximum: 250
            default: 100
      responses:
        '200':
          description: A cursor-paginated collection of Product Profiles.
          content:
            application/json:
              schema:
                type: object
                properties:
                  collection:
                    type: array
                    items:
                      $ref: '#/components/schemas/Inventory_API_v1_ProductProfile'
                  has_more:
                    $ref: '#/components/schemas/Inventory_API_v1_has_more'
                  next:
                    $ref: '#/components/schemas/Inventory_API_v1_next'
                  previous:
                    $ref: '#/components/schemas/Inventory_API_v1_previous'
                  meta:
                    $ref: '#/components/schemas/Inventory_API_v1_meta'
              example:
                collection:
                  - type: ProductProfile
                    id: 26
                    name: Lightweight Parcel
                    code: lightweight_parcel
                    matched_count: 482
                    classification:
                      status: up_to_date
                      indexed_at: '2026-08-04T09:15:00Z'
                    created_at: '2026-07-15T14:30:00Z'
                    updated_at: '2026-08-04T09:15:00Z'
                has_more: false
                next: null
                previous: null
                meta:
                  processing_time: 0.0062
                  cursor_start: null
                  cursor_end: null
        '400':
          $ref: >-
            #/components/responses/Inventory_API_v1_400-product-profile-bad-request
        '500':
          $ref: '#/components/responses/Inventory_API_v1_500-internal-server-error'
components:
  parameters:
    Inventory_API_v1_product-profile-fields:
      name: fields
      in: query
      required: false
      description: >-
        Select fields of the `ProductProfile` object. See the

        [selecting fields](/global-api/selecting-fields) page for more
        information.
      explode: false
      schema:
        $ref: '#/components/schemas/Inventory_API_v1_product-profile-fields-enum'
    Inventory_API_v1_product-profile-filter:
      name: filter
      in: query
      description: >-
        Using the [filtering syntax](/global-api/filtering-syntax), you may
        filter the results using the following fields:
          - `id`
          - `code`
          - `name`
      style: form
      explode: true
      allowReserved: true
      required: false
      schema:
        type: array
        items:
          type: string
      examples:
        By code:
          summary: Find the Product Profile with a specific stable code.
          value:
            - code:lightweight_parcel
        By name prefix:
          summary: Find Product Profiles whose names start with "Lightweight".
          value:
            - name{start:"Lightweight"}
    Inventory_API_v1_count:
      name: count
      in: query
      description: >-
        If specified as `1`, the `meta.count` property of the response will be
        present and populated with the total count of items

        matching the query before any paging is applied. This is not included by
        default to improve performance in some edge

        cases and is not required to perform paging using the `next` property of
        the response.

        See [paging parameters](/global-api/paging-parameters) for more
        information.
      style: form
      schema:
        type: integer
        minimum: 0
        maximum: 1
    Inventory_API_v1_cursor_end:
      name: cursor_end
      in: query
      description: >-
        A cursor for use in pagination which defines the last `id` of the next
        page of results, non-inclusive.

        See [paging parameters](/global-api/paging-parameters) for more
        information on paging.
      schema:
        type: integer
      style: form
    Inventory_API_v1_cursor_start:
      name: cursor_start
      in: query
      description: >-
        A cursor for use in pagination which defines the starting `id` of the
        next page of results.

        See [paging parameters](/global-api/paging-parameters) for more
        information on paging.
      schema:
        type: integer
      style: form
  schemas:
    Inventory_API_v1_ProductProfile:
      title: ProductProfile
      type: object
      description: >-
        A reusable Product classification whose conditions may match many
        Products. Classification is

        asynchronous: after a create or condition update, poll the resource
        until

        `classification.status` is `up_to_date`. This status confirms that the
        Profile's current

        conditions were classified. Product changes flow through a separate
        asynchronous changelog and

        may not appear immediately in materialized membership.
      properties:
        type:
          type: string
          enum:
            - ProductProfile
          readOnly: true
        id:
          type: integer
          format: int32
          minimum: 1
          readOnly: true
          description: Product Profile ID.
        name:
          type: string
          minLength: 1
          maxLength: 255
          description: Human-readable Product Profile name.
          example: Lightweight Parcel
        code:
          type: string
          maxLength: 64
          pattern: ^[A-Za-z0-9_]+$
          example: lightweight_parcel
          description: >-
            Stable unique code. It may be supplied on create and cannot be
            changed later.
        conditions:
          allOf:
            - $ref: '#/components/schemas/Inventory_API_v1_ConditionTree'
          description: >-
            Canonical Product matching conditions. Request with
            `fields=conditions` when editing.\
              `Optional Field`\
        conditions_readable:
          type: string
          readOnly: true
          description: >-
            Compiled CEL expression corresponding to the canonical conditions.
            Request with

            `fields=conditions_readable` for diagnostics or previews.\
              `Optional Field`\
        matched_count:
          type: integer
          minimum: 0
          readOnly: true
          description: >-
            Number of Products in the most recently completed materialized
            membership.
        classification:
          type: object
          readOnly: true
          properties:
            status:
              type: string
              description: Current state of the asynchronous Product classification.
              enum:
                - up_to_date
                - processing
                - queued
                - failed
                - out_of_date
                - not_indexed
            indexed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Completion time of the most recent successful classification, if
                any.
          required:
            - status
            - indexed_at
          additionalProperties: false
        created_at:
          type: string
          format: date-time
          nullable: true
          readOnly: true
          description: Time when the Product Profile was created.
        updated_at:
          type: string
          format: date-time
          nullable: true
          readOnly: true
          description: Time when the Product Profile was last updated.
      required:
        - type
        - id
      additionalProperties: false
      example:
        type: ProductProfile
        id: 26
        name: Lightweight Parcel
        code: lightweight_parcel
        conditions:
          or:
            - and:
                - <=:
                    - var: weight
                    - value: 15
                      unit: lb
                      base_value: 15
        conditions_readable: ((present(weight) && weight <= 15.0))
        matched_count: 482
        classification:
          status: up_to_date
          indexed_at: '2026-08-04T09:15:00Z'
        created_at: '2026-07-15T14:30:00Z'
        updated_at: '2026-08-04T09:15:00Z'
    Inventory_API_v1_has_more:
      type: boolean
      description: |-
        True if the collection has more items on the next page.
        Use the "next" link to retrieve the next page of results.
    Inventory_API_v1_next:
      type: string
      nullable: true
      description: The resource path for the next page of results if any are expected.
    Inventory_API_v1_previous:
      type: string
      nullable: true
      description: The resource path for the previous page of results if any are expected.
    Inventory_API_v1_meta:
      type: object
      properties:
        processing_time:
          type: number
          description: Total time in which request is processed and response is sent back.
          example: 0.2525252525
        cursor_start:
          type: integer
          description: >-
            A cursor for use in pagination which defines the starting `id` of
            the next page of results.

            See [paging parameters](/global-api/paging-parameters) for more
            information on paging.
          nullable: true
        cursor_end:
          type: integer
          description: >-
            A cursor for use in pagination which defines the last `id` of the
            next page of results, non-inclusive.

            See [paging parameters](/global-api/paging-parameters) for more
            information on paging.
          nullable: true
        count:
          type: integer
          description: >-
            The total number of items matching the query before applying paging
            parameters.

            This field is only present if the query parameter `count=1` is
            present in the request.
      description: Additional metadata pertaining to the response.
    Inventory_API_v1_product-profile-fields-enum:
      title: ProductProfile
      description: >-
        Specify fields of the `ProductProfile` object to include in the
        response.
      type: array
      items:
        type: string
        enum:
          - all
          - name
          - code
          - conditions
          - conditions_readable
          - matched_count
          - classification
          - created_at
          - updated_at
    Inventory_API_v1_ConditionTree:
      oneOf:
        - type: object
          description: Canonical condition tree returned by the API.
          properties:
            or:
              type: array
              minItems: 1
              items:
                $ref: '#/components/schemas/Inventory_API_v1_ConditionGroup'
          required:
            - or
          additionalProperties: false
        - $ref: '#/components/schemas/Inventory_API_v1_ConditionGroup'
      description: >-
        A one-level OR-of-AND condition tree. The server accepts the `{"and":
        [...]}` shorthand

        for a single group and always returns the canonical `{"or": [{"and":
        [...]}]}` form.


        OpenAPI validates the structural envelope. ShipStream remains
        authoritative for available

        Product fields, field/operator compatibility, option values, measurement
        units, raw CEL

        validity, normalization, the limit of 64 condition rows across all
        groups, and the

        65,535-byte compiled-expression limit. Editor clients can

        load the applicable Product field catalogue from

        `GET /api/global/v1/inventory/product-profiles/condition-fields` or

        `GET /api/global/v1/inventory/handling-classes/condition-fields`.
      example:
        or:
          - and:
              - <=:
                  - var: weight
                  - value: 15
                    unit: lb
    Inventory_API_v1_BadRequest:
      type: object
      properties:
        errors:
          type: array
          minItems: 1
          items:
            type: object
            properties:
              type:
                type: string
                description: Machine-readable request error category.
                enum:
                  - parser
                  - parameters
                  - openapi
              message:
                type: string
                description: Human-readable request error summary.
              details:
                type: array
                items:
                  $ref: '#/components/schemas/Inventory_API_v1_Detail'
            additionalProperties: false
      additionalProperties: false
    Inventory_API_v1_ConditionGroup:
      type: object
      properties:
        and:
          type: array
          minItems: 1
          maxItems: 64
          items:
            $ref: '#/components/schemas/Inventory_API_v1_ConditionRow'
      required:
        - and
      additionalProperties: false
    Inventory_API_v1_Detail:
      type: object
      properties:
        key:
          type: string
          description: Request field or dependency represented by the detail.
        message:
          type: string
          description: Human-readable detail value.
      required:
        - key
        - message
      additionalProperties: false
    Inventory_API_v1_ConditionRow:
      type: object
      description: |-
        One predicate or raw CEL expression. Predicate operands are ordered as
        `[{"var": "field_code"}, value]`; expression operands are ordered as
        `[{"cel": "boolean expression"}, true]`.
      minProperties: 1
      maxProperties: 1
      properties:
        <:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        <=:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        '==':
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        '!=':
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        '>':
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        '>=':
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        contains:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        not_contains:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        matches:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        not_matches:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        in:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        not_in:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        contains_any:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        contains_none:
          $ref: '#/components/schemas/Inventory_API_v1_PredicateOperands'
        expr:
          $ref: '#/components/schemas/Inventory_API_v1_ExpressionOperands'
      additionalProperties: false
    Inventory_API_v1_PredicateOperands:
      type: array
      minItems: 2
      maxItems: 2
      items:
        oneOf:
          - $ref: '#/components/schemas/Inventory_API_v1_Variable'
          - $ref: '#/components/schemas/Inventory_API_v1_ConditionValue'
    Inventory_API_v1_ExpressionOperands:
      type: array
      description: >-
        The first item is a CEL expression object and the second item must be
        `true`.
      minItems: 2
      maxItems: 2
      items:
        oneOf:
          - type: object
            properties:
              cel:
                type: string
                minLength: 1
                description: >-
                  Boolean CEL expression evaluated against Product facts.
                  Selector fields that

                  exist only for the consuming resource (such as the Handling
                  Class Product

                  Profile selector, `product_profiles`) are rejected here
                  because the server

                  tracks their references; they may only be used through their
                  structured

                  operators.
                example: present(weight) && weight <= 15.0
            required:
              - cel
            additionalProperties: false
          - type: boolean
            enum:
              - true
    Inventory_API_v1_Variable:
      type: object
      properties:
        var:
          type: string
          minLength: 1
          description: Product condition field code.
          example: weight
      required:
        - var
      additionalProperties: false
    Inventory_API_v1_ConditionValue:
      oneOf:
        - type: string
          minLength: 1
          maxLength: 4096
        - type: number
        - type: boolean
        - type: array
          minItems: 1
          items:
            oneOf:
              - type: integer
              - type: string
        - $ref: '#/components/schemas/Inventory_API_v1_MeasurementValue'
    Inventory_API_v1_MeasurementValue:
      type: object
      description: >-
        Measurement input. Clients provide `value` and `unit`; canonical
        responses also contain the

        normalized `base_value` used by the evaluator.
      properties:
        value:
          type: number
          description: Measurement expressed in the submitted unit.
          example: 15
        unit:
          type: string
          minLength: 1
          description: Supported unit code for the condition field.
          example: lb
        base_value:
          type: number
          readOnly: true
          description: Server-normalized measurement in the field's base unit.
          example: 15
      required:
        - value
        - unit
      additionalProperties: false
  responses:
    Inventory_API_v1_400-product-profile-bad-request:
      description: The Product Profile request was invalid and must be corrected.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Inventory_API_v1_BadRequest'
          example:
            errors:
              - type: parameters
                message: The supplied parameters are invalid.
    Inventory_API_v1_500-internal-server-error:
      description: >-
        Internal Server Error - Something wrong happened at server side. Contact
        server administrator for more details.
  securitySchemes:
    ShipStream_bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Generate a JWT access token through a Custom Global Integration and
        provide it with each request in the `Authorization` header prefixed with
        "Bearer" and then a single space.

````