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

# List products in a workspace

> Retrieve a paginated list of products within a specific workspace.

    ## Overview

    This endpoint returns products from a workspace, with support for pagination and optional search filtering.
    Products are the main organizational unit that contains items and properties.

    ## Search Functionality

    Use the `q` parameter to filter products by name:
    - Case-insensitive partial match
    - Searches within product names
    - Example: `q=engine` will match "Engine Specifications", "Engine Design", etc.



## OpenAPI

````yaml /openapi.json get /v1/public/products
openapi: 3.1.0
info:
  title: Poelis Public API
  description: |2-

            Poelis Public API - REST endpoints for external clients and integrations.
            
            ## Authentication
            
            All endpoints require an API key in the `Authorization` header:
            ```
            Authorization: Bearer poelis_api_...
            ```
            
            Get your API key from the web application's API Keys section.
            
            ## Rate Limiting
            
            API requests are rate-limited per organization. Contact support for higher limits.
            
            ## Support
            
            For questions or issues, contact support@poelis.com
            
  version: 1.0.0
servers:
  - url: https://api.poelis.com
    description: Production
  - url: http://localhost:8000
    description: Local
security: []
paths:
  /v1/public/products:
    get:
      tags:
        - Products
      summary: List products in a workspace
      description: |-
        Retrieve a paginated list of products within a specific workspace.

            ## Overview

            This endpoint returns products from a workspace, with support for pagination and optional search filtering.
            Products are the main organizational unit that contains items and properties.

            ## Search Functionality

            Use the `q` parameter to filter products by name:
            - Case-insensitive partial match
            - Searches within product names
            - Example: `q=engine` will match "Engine Specifications", "Engine Design", etc.
      operationId: list_products_v1_public_products_get
      parameters:
        - name: workspace_id
          in: query
          required: true
          schema:
            type: string
            description: >-
              The unique identifier (UUID) of the workspace to list products
              from
            examples:
              - 550e8400-e29b-41d4-a716-446655440000
            title: Workspace Id
          description: The unique identifier (UUID) of the workspace to list products from
        - $ref: '#/components/parameters/Query'
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Offset'
      responses:
        '200':
          description: >-
            Paginated list of products in the workspace. Each product includes
            partNumber, owner, createdBy, updatedBy (id, userName, imageUrl),
            createdAt, and updatedAt (ISO 8601) when available.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicProductsResponse'
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
        '400':
          description: Bad Request
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
        '401':
          description: Unauthorized - Invalid or missing API key
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error: unauthorized
                message: Invalid or missing API key
        '403':
          description: Forbidden - Access denied
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error: forbidden
                message: Access denied
        '404':
          description: Not found
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error: not_found
                message: Not found
        '422':
          description: Validation error - Invalid request body or parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error: validation_error
                message: Invalid data format
                details:
                  errors:
                    - loc:
                        - body
                        - field_name
                      msg: field required
                      type: value_error.missing
        '429':
          description: Too many requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error: rate_limit_exceeded
                message: Too many requests
      security:
        - API Key: []
components:
  parameters:
    Query:
      name: q
      in: query
      required: false
      description: Optional search query to filter results.
      schema:
        type: string
    Limit:
      name: limit
      in: query
      required: false
      description: Maximum number of items to return per page. Must be between 1 and 200.
      schema:
        type: integer
        default: 50
        minimum: 1
        maximum: 200
      example: 50
    Offset:
      name: offset
      in: query
      required: false
      description: >-
        Number of items to skip from the beginning of the result set. Used for
        pagination.
      schema:
        type: integer
        default: 0
        minimum: 0
      example: 0
  schemas:
    PublicProductsResponse:
      properties:
        items:
          items:
            $ref: '#/components/schemas/PublicProduct'
          type: array
          title: Items
        count:
          type: integer
          title: Count
      type: object
      required:
        - items
        - count
      title: PublicProductsResponse
      description: Response payload for listing products.
      example:
        count: 2
        items:
          - archived: false
            baseline_version_number: 5
            createdBy:
              id: auth0|550e8400-e29b-41d4-a716-446655440000
              imageUrl: https://example.com/avatar.png
              userName: Jane Doe
            excludedStatusIds: []
            id: 660e8400-e29b-41d4-a716-446655440000
            name: Jet Engine Specifications
            owner:
              id: auth0|550e8400-e29b-41d4-a716-446655440000
              imageUrl: https://example.com/avatar.png
              userName: Jane Doe
            part_number: JE-1000-A
            readable_id: jet-engine-specs
            status:
              color: '#3b82f6'
              groupKey: started
              id: 770e8400-e29b-41d4-a716-446655440999
              name: In Progress
            workspace_id: 550e8400-e29b-41d4-a716-446655440000
          - createdBy:
              id: auth0|550e8400-e29b-41d4-a716-446655440000
              imageUrl: https://example.com/avatar.png
              userName: Jane Doe
            id: 660e8400-e29b-41d4-a716-446655440001
            name: Turbine Blade Design
            owner:
              id: auth0|550e8400-e29b-41d4-a716-446655440000
              imageUrl: https://example.com/avatar.png
              userName: Jane Doe
            readable_id: turbine-blade-design
            workspace_id: 550e8400-e29b-41d4-a716-446655440000
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Machine-readable error code (e.g. validation_error, item_not_found).
        message:
          type: string
          description: Human-readable error message.
        details:
          type: object
          description: >-
            Additional error context (optional). For validation errors, contains
            a list of field-level issues.
          nullable: true
      required:
        - error
        - message
    PublicProduct:
      properties:
        id:
          type: string
          title: Id
        readable_id:
          type: string
          title: Readable Id
          description: Human-readable product ID
        workspace_id:
          type: string
          title: Workspace Id
          description: Workspace this product belongs to
        name:
          type: string
          title: Name
          description: Product name
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: Product description
        part_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Part Number
          description: >-
            Active product part number, when assigned. Uniqueness is enforced
            organization-wide; format is validated when the product has rule
            configuration in the app.
        baseline_version_number:
          anyOf:
            - type: integer
            - type: 'null'
          title: Baseline Version Number
          description: User-selected baseline product version number.
        archived:
          type: boolean
          title: Archived
          description: Whether the product is archived or not.
          default: false
        status:
          anyOf:
            - $ref: '#/components/schemas/PublicProductStatus'
            - type: 'null'
          description: >-
            Current workflow status for this product. Null when no status is
            set.
        excludedStatusIds:
          items:
            type: string
          type: array
          title: Excludedstatusids
          description: Workspace-level status IDs that are hidden for this product.
        owner:
          anyOf:
            - $ref: '#/components/schemas/PublicUser'
            - type: 'null'
          description: Product owner. Null when not set.
        createdBy:
          anyOf:
            - $ref: '#/components/schemas/PublicUser'
            - type: 'null'
          description: User who created the product.
        createdAt:
          anyOf:
            - type: string
            - type: 'null'
          title: Createdat
          description: ISO 8601 creation timestamp
        updatedAt:
          anyOf:
            - type: string
            - type: 'null'
          title: Updatedat
          description: ISO 8601 last-update timestamp
        updatedBy:
          anyOf:
            - $ref: '#/components/schemas/PublicUser'
            - type: 'null'
          description: User who last updated the product
      type: object
      required:
        - id
        - readable_id
        - workspace_id
        - name
      title: PublicProduct
      description: Public representation of a product.
      example:
        archived: false
        baseline_version_number: 5
        createdBy:
          id: auth0|550e8400-e29b-41d4-a716-446655440000
          imageUrl: https://example.com/avatar.png
          userName: Jane Doe
        excludedStatusIds: []
        id: 660e8400-e29b-41d4-a716-446655440000
        name: Jet Engine Specifications
        owner:
          id: auth0|550e8400-e29b-41d4-a716-446655440000
          imageUrl: https://example.com/avatar.png
          userName: Jane Doe
        part_number: JE-1000-A
        readable_id: jet-engine-specs
        status:
          color: '#3b82f6'
          groupKey: started
          id: 770e8400-e29b-41d4-a716-446655440999
          name: In Progress
        workspace_id: 550e8400-e29b-41d4-a716-446655440000
    PublicProductStatus:
      properties:
        id:
          type: string
          title: Id
        name:
          type: string
          title: Name
        color:
          type: string
          title: Color
        groupKey:
          type: string
          title: Groupkey
          description: >-
            Status group key: one of 'unstarted', 'started', 'completed',
            'canceled'.
      type: object
      required:
        - id
        - name
        - color
        - groupKey
      title: PublicProductStatus
      description: Public representation of a product workflow status.
    PublicUser:
      properties:
        id:
          type: string
          title: Id
          description: User ID
        userName:
          type: string
          title: Username
          description: Display name
        imageUrl:
          anyOf:
            - type: string
            - type: 'null'
          title: Imageurl
          description: Avatar URL
      type: object
      required:
        - id
        - userName
      title: PublicUser
      description: >-
        User representation in public API responses (owner, createdBy,
        updatedBy).
      example:
        id: auth0|550e8400-e29b-41d4-a716-446655440000
        imageUrl: https://example.com/avatar.png
        userName: Jane Doe
  headers:
    RequestId:
      description: >-
        Request correlation ID. Echoes the incoming `x-request-id` header or a
        server-generated ID.
      schema:
        type: string
    RateLimitLimit:
      description: Request limit for the current rate limit window.
      schema:
        type: integer
    RateLimitRemaining:
      description: Remaining requests in the current rate limit window.
      schema:
        type: integer
    RateLimitReset:
      description: Unix timestamp (seconds) when the current rate limit window resets.
      schema:
        type: integer
  securitySchemes:
    API Key:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: 'Enter your API key. Example: Bearer poelis_api_...'

````