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

# Search Projects



## OpenAPI

````yaml POST /api/v1/ops/workspaces/{workspaceId}/projects
openapi: 3.1.0
info:
  title: Xenia Team API - Search Projects
  version: 1.0.0
  description: >-
    Filtered, sorted and offset-paged project search. Despite being a POST this
    is a read — it creates nothing. Returns a `meta` object alongside `data`
    carrying the total number of matching projects and the paging the query
    actually ran with; this is the only project route that does.
servers:
  - url: https://api.xenia.team
security: []
paths:
  /api/v1/ops/workspaces/{workspaceId}/projects:
    post:
      tags:
        - Projects
      summary: Search Projects
      description: >-
        Returns a filtered page of projects. All body fields are optional and
        unknown fields are ignored (there is no request-body validator on this
        route).
      parameters:
        - name: workspaceId
          in: path
          required: true
          description: UUID of the workspace. Must be the workspace the API key belongs to.
          schema:
            type: string
            format: uuid
            example: cb363f7e-c52a-4478-911d-f6a6f791090e
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                offset:
                  type: integer
                  default: 0
                  description: Row offset to start from.
                limit:
                  type: integer
                  default: 10
                  description: Maximum rows to return.
                searchText:
                  type: string
                  default: ''
                  description: Case-insensitive match on the project title.
                sortField:
                  type: string
                  default: createdAt
                  description: Column to sort by.
                sortOrder:
                  type: string
                  enum:
                    - ASC
                    - DESC
                  default: DESC
                status:
                  type: string
                  enum:
                    - ALL
                    - ACTIVE
                    - PAUSED
                    - EXPIRED
                  default: ALL
                  description: >-
                    Lifecycle filter. `PAUSED` matches projects paused via the
                    toggle-pause endpoint; `EXPIRED` matches projects whose
                    schedules have ended.
                advanceFilters:
                  type: object
                  nullable: true
                  description: >-
                    Optional additional filter object, same shape the task list
                    endpoints accept.
                  default: null
            example:
              offset: 0
              limit: 25
              searchText: safety
              status: ACTIVE
              sortField: createdAt
              sortOrder: DESC
      responses:
        '200':
          description: Projects retrieved successfully, with pagination metadata.
          content:
            application/json:
              example:
                data:
                  - id: c7966d63-52ce-4967-b30a-16aaa9e806b5
                    title: Monthly Safety Walk
                    isPaused: false
                    type: role
                    state: ready
                    entityIds:
                      - 7481ca15-cdb1-4e0f-a936-f8f88a56e989
                    isLocationAutoTag: true
                    isSchedulesProject: true
                    assigneesRoles:
                      creationType: role
                      roles:
                        - 7481ca15-cdb1-4e0f-a936-f8f88a56e989
                      locations: []
                      locationGroups: []
                    metadata: {}
                    createdAt: '2026-07-30T18:47:09.085Z'
                    updatedAt: '2026-07-30T18:47:09.085Z'
                extra_meta: {}
                meta:
                  total: 161
                  filtered: 1
                  offset: 0
                  limit: 25
                  searchText: safety
                  sortField: createdAt
                  sortOrder: DESC
        '401':
          description: >-
            Unauthorized - Invalid client credentials, or the key does not
            belong to this workspace.
        '403':
          description: >-
            Forbidden - API key not authorized for this route, the role lacks
            the required permission, the workspace does not have the Projects
            feature, or the project id is unknown to the caller. Note an unknown
            or deleted projectId also returns 403, not 404: the project access
            check runs before the handler and denies when it cannot load the
            project.
        '500':
          description: Internal Server Error.
      security:
        - clientKey: []
          clientSecret: []
components:
  securitySchemes:
    clientKey:
      type: apiKey
      in: header
      name: x-client-key
    clientSecret:
      type: apiKey
      in: header
      name: x-client-secret

````