openapi: 3.0.0
paths:
  /api/v1/clients:
    post:
      description: >-
        Creates a new client organization under the authenticated partner
        organization.
                    Requires a `name` (unique within the partner) and an optional `notes` field (max 200 characters).
      operationId: LmpApiClientsController_createClient
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LmpApiCreateClientRequestDto'
      responses:
        '201':
          description: Client created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiCreateClientResponseDto'
        '400':
          description: Validation error or business constraint violated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiValidationErrorResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
      security:
        - lmp-api-key: []
      summary: Create client
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
    get:
      description: >-
        Returns a paginated list of client organizations belonging to the
        authenticated partner.
      operationId: LmpApiClientsController_listClients
      parameters:
        - name: root
          required: false
          in: query
          allOf:
            - type: object
              properties:
                p:
                  default: 1
                  anyOf:
                    - type: string
                    - type: number
                l:
                  default: 100
                  anyOf:
                    - type: string
                    - type: number
                s:
                  default: '-createdAt'
                  type: string
                  enum:
                    - createdAt
                    - '-createdAt'
            - type: object
              properties: {}
          x-nestjs_zod-unwrap-root: true
          x-nestjs_zod-empty-type: true
          schema: {}
        - name: p
          required: false
          in: query
          description: Page number.
          schema:
            type: number
        - name: l
          required: false
          in: query
          description: Page size (max 300). Default is 100.
          schema:
            type: number
        - name: s
          required: false
          in: query
          description: Sort field. Prefix with `-` for descending.
          schema:
            enum:
              - createdAt
              - '-createdAt'
            type: string
      responses:
        '200':
          description: Paginated list of clients.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiClientsListResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
      security:
        - lmp-api-key: []
      summary: List clients
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}:
    delete:
      description: |-
        Deletes a client organization belonging to the authenticated partner.
                    All workspaces and filespaces under the client are permanently removed.
                    The client must be in a deletable state (no active contract or no workspaces).
      operationId: LmpApiClientsController_deleteClient
      parameters:
        - name: clientId
          required: true
          in: path
          schema:
            type: string
      responses:
        '204':
          description: Client deleted.
        '400':
          description: Deletion constraint violated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Client organization not found or does not belong to this partner.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
      security:
        - lmp-api-key: []
      summary: Delete client
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
    get:
      description: >-
        Returns a single client organization belonging to the authenticated
        partner.
      operationId: LmpApiClientsController_getClient
      parameters:
        - name: clientId
          required: true
          in: path
          description: Client organization ID.
          schema:
            type: string
      responses:
        '200':
          description: Client organization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiClientDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: >-
            Client organization not found or does not belong to the
            authenticated partner.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
      security:
        - lmp-api-key: []
      summary: Get client
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/usage/current:
    get:
      description: |-
        Returns the client organization's usage for the current billing period.
                    Available for VAR clients only. Includes member counts, per-provider storage usage (GB),
                    and optional LucidLink Connect and TeamCache metrics when included in the contract.
      operationId: LmpApiClientsController_getCurrentUsage
      parameters:
        - name: clientId
          required: true
          in: path
          description: Client organization ID.
          schema:
            type: string
      responses:
        '200':
          description: Current billing period usage.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiCurrentUsageDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: >-
            Client organization not found, does not belong to this partner, or
            has no active contract.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
      security:
        - lmp-api-key: []
      summary: Get client current usage
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/usage:
    get:
      description: |-
        Returns paginated storage usage records for a client organization.
                    Each record captures per-filespace storage measurements (object store and S3) at a given moment.
                    Filter by storage type (`aws`, `custom`, `wasabi`, `ibm`, `llc`) and date range (ISO 8601 datetimes).
                    Data is retained for 2 months; a date range entirely outside that window returns a BadRequest(400).
      operationId: LmpApiClientsController_getUsage
      parameters:
        - name: clientId
          required: true
          in: path
          description: Client organization ID.
          schema:
            type: string
        - name: root
          required: false
          in: query
          allOf:
            - type: object
              properties:
                p:
                  default: 1
                  anyOf:
                    - type: string
                    - type: number
                l:
                  default: 100
                  anyOf:
                    - type: string
                    - type: number
                s:
                  default: createdAt
                  type: string
                  enum:
                    - createdAt
                    - '-createdAt'
            - type: object
              properties:
                type:
                  type: string
                  enum:
                    - aws
                    - custom
                    - wasabi
                    - ibm
                    - llc
                start:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                end:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
              required:
                - type
                - start
                - end
          x-nestjs_zod-unwrap-root: true
          x-nestjs_zod-empty-type: true
          schema: {}
        - name: type
          required: true
          in: query
          description: Storage type to filter by.
          schema:
            enum:
              - aws
              - custom
              - wasabi
              - ibm
              - llc
            type: string
        - name: start
          required: true
          in: query
          description: >-
            Start of the date range (ISO 8601 with timezone offset, e.g.
            2026-04-21T15:22:00.000Z).
          schema:
            example: '2026-04-21T15:22:00.000Z'
            type: string
        - name: end
          required: true
          in: query
          description: >-
            End of the date range (ISO 8601 with timezone offset, e.g.
            2026-05-21T15:22:00.000Z).
          schema:
            example: '2026-05-21T15:22:00.000Z'
            type: string
        - name: p
          required: false
          in: query
          description: Page number.
          schema:
            type: number
        - name: l
          required: false
          in: query
          description: Page size (max 300). Default is 100.
          schema:
            type: number
        - name: s
          required: false
          in: query
          description: Sort field. Prefix with `-` for descending.
          schema:
            enum:
              - createdAt
              - '-createdAt'
            type: string
      responses:
        '200':
          description: Paginated storage usage records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiStorageUsageResponseDto'
        '400':
          description: Date range or storage type invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Client organization not found or does not belong to this partner.
      security:
        - lmp-api-key: []
      summary: Get client storage usage
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/ping:
    get:
      description: >-
        Verifies the API key is valid and returns the authenticated partner
        organization details.
      operationId: LmpApiController_ping
      parameters: []
      responses:
        '200':
          description: API key is valid.
          content:
            application/json:
              schema:
                properties:
                  organizationId:
                    type: string
                  organizationName:
                    type: string
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
      security:
        - lmp-api-key: []
      summary: Ping
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/workspaces/{workspaceId}/filespaces:
    get:
      description: |-
        Returns a paginated list of filespaces in the specified workspace.
                    The workspace must belong to a client organization owned by the authenticated partner.
      operationId: LmpApiFilespaceController_listFilespaces
      parameters:
        - name: workspaceId
          required: true
          in: path
          description: Workspace ID.
          schema:
            type: string
        - name: root
          required: false
          in: query
          allOf:
            - type: object
              properties:
                p:
                  default: 1
                  anyOf:
                    - type: string
                    - type: number
                l:
                  default: 100
                  anyOf:
                    - type: string
                    - type: number
                s:
                  default: '-createdAt'
                  type: string
                  enum:
                    - createdAt
                    - '-createdAt'
            - type: object
              properties: {}
          x-nestjs_zod-unwrap-root: true
          x-nestjs_zod-empty-type: true
          schema: {}
        - name: clientId
          required: true
          in: path
          description: Client organization ID.
          schema:
            type: string
        - name: p
          required: false
          in: query
          description: Page number.
          schema:
            type: number
        - name: l
          required: false
          in: query
          description: Page size (max 300). Default is 100.
          schema:
            type: number
        - name: s
          required: false
          in: query
          description: Sort field. Prefix with `-` for descending.
          schema:
            enum:
              - createdAt
              - '-createdAt'
            type: string
      responses:
        '200':
          description: Paginated list of filespaces.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiFilespaceListResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: >-
            Client or workspace not found, or workspace does not belong to this
            client.
      security:
        - lmp-api-key: []
      summary: List filespaces
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/workspaces/{workspaceId}/filespaces/{filespaceId}:
    get:
      description: |-
        Returns details of a filespace in the specified workspace.
                    The workspace must belong to a client organization owned by the authenticated partner.
      operationId: LmpApiFilespaceController_getFilespace
      parameters:
        - name: filespaceId
          required: true
          in: path
          description: Filespace ID.
          schema:
            type: string
        - name: clientId
          required: true
          in: path
          description: Client organization ID.
          schema:
            type: string
        - name: workspaceId
          required: true
          in: path
          description: Workspace ID.
          schema:
            type: string
      responses:
        '200':
          description: Filespace details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiFilespaceDetailsResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Client, workspace, or filespace not found.
      security:
        - lmp-api-key: []
      summary: Get filespace details
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/workspaces/{workspaceId}/filespaces/{filespaceId}/usage:
    get:
      description: >-
        Returns paginated storage usage records for a specific filespace
        belonging to a client's workspace.
                    Each record captures per-filespace storage measurements at a given moment.
                    Filter by storage type (`aws`, `custom`, `wasabi`, `ibm`, `llc`) and date range (ISO 8601 datetimes with timezone offset).
                    Data is retained for 2 months; a date range entirely outside that window returns a BadRequest(400).
      operationId: LmpApiFilespaceController_getFilespaceUsage
      parameters:
        - name: filespaceId
          required: true
          in: path
          description: Filespace ID.
          schema:
            type: string
        - name: root
          required: false
          in: query
          allOf:
            - type: object
              properties:
                p:
                  default: 1
                  anyOf:
                    - type: string
                    - type: number
                l:
                  default: 100
                  anyOf:
                    - type: string
                    - type: number
                s:
                  default: createdAt
                  type: string
                  enum:
                    - createdAt
                    - '-createdAt'
            - type: object
              properties:
                type:
                  type: string
                  enum:
                    - aws
                    - custom
                    - wasabi
                    - ibm
                    - llc
                start:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                end:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
              required:
                - type
                - start
                - end
          x-nestjs_zod-unwrap-root: true
          x-nestjs_zod-empty-type: true
          schema: {}
        - name: clientId
          required: true
          in: path
          description: Client organization ID.
          schema:
            type: string
        - name: workspaceId
          required: true
          in: path
          description: Workspace ID.
          schema:
            type: string
        - name: type
          required: true
          in: query
          description: Storage type to filter by.
          schema:
            enum:
              - aws
              - custom
              - wasabi
              - ibm
              - llc
            type: string
        - name: start
          required: true
          in: query
          description: >-
            Start of the date range (ISO 8601 with timezone offset, e.g.
            2026-04-21T15:22:00.000Z).
          schema:
            example: '2026-04-21T15:22:00.000Z'
            type: string
        - name: end
          required: true
          in: query
          description: >-
            End of the date range (ISO 8601 with timezone offset, e.g.
            2026-05-21T15:22:00.000Z).
          schema:
            example: '2026-05-21T15:22:00.000Z'
            type: string
        - name: p
          required: false
          in: query
          description: Page number.
          schema:
            type: number
        - name: l
          required: false
          in: query
          description: Page size (max 300). Default is 100.
          schema:
            type: number
        - name: s
          required: false
          in: query
          description: Sort field. Prefix with `-` for descending.
          schema:
            enum:
              - createdAt
              - '-createdAt'
            type: string
      responses:
        '200':
          description: Paginated filespace storage usage records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiFilespaceUsageDto'
        '400':
          description: Date range or storage type invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: >-
            Filespace not found or does not belong to this partner's client
            workspace.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
      security:
        - lmp-api-key: []
      summary: Get filespace storage usage
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/me:
    get:
      description: >-
        Returns the authenticated partner organization details associated with
        the API key.
      operationId: LmpApiMeController_getMe
      parameters: []
      responses:
        '200':
          description: Partner organization details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiMeResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
      security:
        - lmp-api-key: []
      summary: Get partner organization details
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/me/usage/current:
    get:
      description: |-
        Returns the MSP channel partner's usage for the current billing period.
                    Available for MSP channel partners only — VAR resellers receive a 400.
                    Includes member counts, per-provider storage usage (GB),
                    and optional LucidLink Connect and TeamCache metrics when included in the contract.
      operationId: LmpApiMeController_getCurrentUsage
      parameters: []
      responses:
        '200':
          description: Current billing period usage.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiCurrentUsageDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: No active contract.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
      security:
        - lmp-api-key: []
      summary: Get MSP channel partner current usage
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/members:
    post:
      description: |-
        Adds a member by email to the specified client organization.
                    The first member added to an organization is automatically set as the owner.
      operationId: LmpApiMembersController_addMember
      parameters:
        - name: clientId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LmpApiAddClientMemberRequestDto'
      responses:
        '201':
          description: Member added.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiClientMemberResponseDto'
        '400':
          description: |-
            Validation error. Possible error codes:
                        partnerOrganization.member.alreadyExists (email already a member of this organization).
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Client organization not found or does not belong to this partner.
      security:
        - lmp-api-key: []
      summary: Add a member to a client organization
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
    get:
      description: >-
        Returns a paginated list of members of the specified client
        organization.
      operationId: LmpApiMembersController_listMembers
      parameters:
        - name: clientId
          required: true
          in: path
          schema:
            type: string
        - name: root
          required: false
          in: query
          allOf:
            - type: object
              properties:
                p:
                  default: 1
                  anyOf:
                    - type: string
                    - type: number
                l:
                  default: 100
                  anyOf:
                    - type: string
                    - type: number
                s:
                  default: '-createdAt'
                  type: string
                  enum:
                    - createdAt
                    - '-createdAt'
            - type: object
              properties: {}
          x-nestjs_zod-unwrap-root: true
          x-nestjs_zod-empty-type: true
          schema: {}
        - name: p
          required: false
          in: query
          description: Page number.
          schema:
            type: number
        - name: l
          required: false
          in: query
          description: Page size (max 300). Default is 100.
          schema:
            type: number
        - name: s
          required: false
          in: query
          description: Sort field. Prefix with `-` for descending.
          schema:
            enum:
              - createdAt
              - '-createdAt'
            type: string
      responses:
        '200':
          description: Paginated list of members.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiListClientMembersResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Client organization not found or does not belong to this partner.
      security:
        - lmp-api-key: []
      summary: List members of a client organization
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/members/owner:
    get:
      description: Returns the owner member of the specified client organization.
      operationId: LmpApiMembersController_getOwner
      parameters:
        - name: clientId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: Owner member details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiClientMemberResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: >-
            Client organization not found, does not belong to this partner, or
            has no owner.
      security:
        - lmp-api-key: []
      summary: Get owner of a client organization
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/members/{accountId}:
    get:
      description: Returns details of a specific member of the client organization.
      operationId: LmpApiMembersController_getMember
      parameters:
        - name: clientId
          required: true
          in: path
          schema:
            type: string
        - name: accountId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: Member details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiClientMemberResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Client organization or member not found.
      security:
        - lmp-api-key: []
      summary: Get a member of a client organization by account ID
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
    delete:
      description: |-
        Removes a member from the specified client organization.
                    Removing the owner is not permitted (errorCode: partnerOrganization.member.removeOwner).
      operationId: LmpApiMembersController_deleteMember
      parameters:
        - name: clientId
          required: true
          in: path
          schema:
            type: string
        - name: accountId
          required: true
          in: path
          schema:
            type: string
      responses:
        '204':
          description: Member removed.
        '400':
          description: |-
            Business constraint violated. Possible error codes:
                        partnerOrganization.member.removeOwner (cannot remove the owner of an organization).
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Client organization or member not found.
      security:
        - lmp-api-key: []
      summary: Remove a member from a client organization
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/workspaces:
    get:
      description: |-
        Lists all workspaces belonging to a specific client organization.
                      Returns paginated results with workspace details including id, name and createdAt.
                      Requires the client to belong to the authenticated partner organization.
      operationId: LmpApiWorkspacesController_listWorkspaces
      parameters:
        - name: clientId
          required: true
          in: path
          description: Client organization ID.
          schema:
            type: string
        - name: root
          required: false
          in: query
          allOf:
            - type: object
              properties:
                p:
                  default: 1
                  anyOf:
                    - type: string
                    - type: number
                l:
                  default: 100
                  anyOf:
                    - type: string
                    - type: number
                s:
                  default: '-createdAt'
                  type: string
                  enum:
                    - createdAt
                    - '-createdAt'
            - type: object
              properties: {}
          x-nestjs_zod-unwrap-root: true
          x-nestjs_zod-empty-type: true
          schema: {}
        - name: p
          required: false
          in: query
          description: Page number.
          schema:
            type: number
        - name: l
          required: false
          in: query
          description: Page size (max 300). Default is 100.
          schema:
            type: number
        - name: s
          required: false
          in: query
          description: Sort field. Prefix with `-` for descending.
          schema:
            enum:
              - createdAt
              - '-createdAt'
            type: string
      responses:
        '200':
          description: Client workspaces retrieved successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiWorkspacesListResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Client organization not found or does not belong to this partner.
      security:
        - lmp-api-key: []
      summary: List client workspaces
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/workspaces/{workspaceId}:
    get:
      description: |-
        Returns basic details for a specific workspace.
                            The workspace must belong to a client organization under the authenticated reseller.
      operationId: LmpApiWorkspacesController_getWorkspaceDetails
      parameters:
        - name: clientId
          required: true
          in: path
          description: Client organization ID
          schema:
            type: string
        - name: workspaceId
          required: true
          in: path
          description: Workspace ID
          schema:
            type: string
      responses:
        '200':
          description: Workspace details retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiWorkspaceDetailsDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Workspace not found or does not belong to this partner
      security:
        - lmp-api-key: []
      summary: Get workspace details
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/workspaces/{workspaceId}/usage:
    get:
      description: >-
        Returns paginated storage usage records for a specific workspace
        belonging to a client.
                    Each record captures per-filespace storage measurements at a given moment.
                    Filter by storage type (`aws`, `custom`, `wasabi`, `ibm`, `llc`) and date range (ISO 8601 datetimes with timezone offset).
                    Data is retained for 2 months; a date range entirely outside that window returns a BadRequest(400).
      operationId: LmpApiWorkspacesController_getWorkspaceUsage
      parameters:
        - name: workspaceId
          required: true
          in: path
          description: Workspace ID.
          schema:
            type: string
        - name: root
          required: false
          in: query
          allOf:
            - type: object
              properties:
                p:
                  default: 1
                  anyOf:
                    - type: string
                    - type: number
                l:
                  default: 100
                  anyOf:
                    - type: string
                    - type: number
                s:
                  default: createdAt
                  type: string
                  enum:
                    - createdAt
                    - '-createdAt'
            - type: object
              properties:
                type:
                  type: string
                  enum:
                    - aws
                    - custom
                    - wasabi
                    - ibm
                    - llc
                start:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                end:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
              required:
                - type
                - start
                - end
          x-nestjs_zod-unwrap-root: true
          x-nestjs_zod-empty-type: true
          schema: {}
        - name: clientId
          required: true
          in: path
          description: Client organization ID.
          schema:
            type: string
        - name: type
          required: true
          in: query
          description: Storage type to filter by.
          schema:
            enum:
              - aws
              - custom
              - wasabi
              - ibm
              - llc
            type: string
        - name: start
          required: true
          in: query
          description: >-
            Start of the date range (ISO 8601 with timezone offset, e.g.
            2026-04-21T15:22:00.000Z).
          schema:
            example: '2026-04-21T15:22:00.000Z'
            type: string
        - name: end
          required: true
          in: query
          description: >-
            End of the date range (ISO 8601 with timezone offset, e.g.
            2026-05-21T15:22:00.000Z).
          schema:
            example: '2026-05-21T15:22:00.000Z'
            type: string
        - name: p
          required: false
          in: query
          description: Page number.
          schema:
            type: number
        - name: l
          required: false
          in: query
          description: Page size (max 300). Default is 100.
          schema:
            type: number
        - name: s
          required: false
          in: query
          description: Sort field. Prefix with `-` for descending.
          schema:
            enum:
              - createdAt
              - '-createdAt'
            type: string
      responses:
        '200':
          description: Paginated workspace storage usage records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiWorkspaceUsageDto'
        '400':
          description: Date range or storage type invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Workspace not found or does not belong to this partner's client.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
      security:
        - lmp-api-key: []
      summary: Get workspace storage usage
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
  /api/v1/clients/{clientId}/workspaces/{workspaceId}/usage/members:
    get:
      description: >-
        Returns paginated member usage records for a specific workspace
        belonging to a client.
                    Each record captures member counts (total, active, deactivated, pending, guest, SCIM active, SCIM deactivated) at a given moment.
                    Filter by date range (ISO 8601 datetimes with timezone offset).
                    Data is retained for 2 months; a date range entirely outside that window returns a BadRequest(400).
      operationId: LmpApiWorkspacesController_getWorkspaceMembersUsage
      parameters:
        - name: workspaceId
          required: true
          in: path
          description: Workspace ID.
          schema:
            type: string
        - name: root
          required: false
          in: query
          allOf:
            - type: object
              properties:
                p:
                  default: 1
                  anyOf:
                    - type: string
                    - type: number
                l:
                  default: 100
                  anyOf:
                    - type: string
                    - type: number
                s:
                  default: createdAt
                  type: string
                  enum:
                    - createdAt
                    - '-createdAt'
            - type: object
              properties:
                start:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                end:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
              required:
                - start
                - end
          x-nestjs_zod-unwrap-root: true
          x-nestjs_zod-empty-type: true
          schema: {}
        - name: clientId
          required: true
          in: path
          description: Client organization ID.
          schema:
            type: string
        - name: start
          required: true
          in: query
          description: >-
            Start of the date range (ISO 8601 with timezone offset, e.g.
            2026-04-21T15:22:00.000Z).
          schema:
            example: '2026-04-21T15:22:00.000Z'
            type: string
        - name: end
          required: true
          in: query
          description: >-
            End of the date range (ISO 8601 with timezone offset, e.g.
            2026-05-21T15:22:00.000Z).
          schema:
            example: '2026-05-21T15:22:00.000Z'
            type: string
        - name: p
          required: false
          in: query
          description: Page number.
          schema:
            type: number
        - name: l
          required: false
          in: query
          description: Page size (max 300). Default is 100.
          schema:
            type: number
        - name: s
          required: false
          in: query
          description: Sort field. Prefix with `-` for descending.
          schema:
            enum:
              - createdAt
              - '-createdAt'
            type: string
      responses:
        '200':
          description: Paginated workspace members usage records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiWorkspaceMembersUsageDto'
        '400':
          description: Date range invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
        '401':
          description: Missing or invalid API key.
        '403':
          description: >-
            API key is valid but the organization is not allowed to access the
            API.
        '404':
          description: Workspace not found or does not belong to this partner's client.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LmpApiErrorResponseDto'
      security:
        - lmp-api-key: []
      summary: Get workspace members usage
      tags:
        - LucidLink Management Platform (LMP) API
      x-group: LmpPublicApi
info:
  title: LucidLink Management Platform API
  description: REST API for LucidLink Management Platform (LMP)
  version: '1.0'
  contact: {}
tags: []
servers: []
components:
  securitySchemes:
    lmp-api-key:
      type: apiKey
      in: header
      name: Authorization
      description: 'Format: ApiKey <key>'
  schemas:
    LmpApiCreateClientRequestDto:
      type: object
      properties:
        name:
          minLength: 2
          maxLength: 100
          allOf:
            - pattern: ^[\dA-Za-z]
            - pattern: '[\dA-Za-z]$'
            - pattern: ^[\s\w()/-]+$
            - pattern: ^[\dA-Za-z][\s\w()/-]*[\dA-Za-z]$
        notes:
          type: string
          maxLength: 200
      required:
        - name
    LmpApiCreateClientResponseDto:
      type: object
      properties:
        id:
          type: string
          x-nestjs_zod-has-null: true
        name:
          type: string
          x-nestjs_zod-has-null: true
        notes:
          anyOf:
            - type: string
            - type: 'null'
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
      required:
        - id
        - name
        - notes
    LmpApiValidationErrorResponseDto:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              const: validation_error
            message:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  path:
                    type: string
                  message:
                    type: string
                required:
                  - message
          required:
            - type
            - message
            - details
      required:
        - error
    LmpApiErrorResponseDto:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
            message:
              type: string
          required:
            - type
            - message
      required:
        - error
    LmpApiCurrentUsageDto:
      type: object
      properties:
        period:
          type: object
          properties:
            start:
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            end:
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          required:
            - start
            - end
          x-nestjs_zod-has-null: true
        members:
          type: object
          properties:
            prepaid:
              type: number
            peak:
              type: number
            current:
              type: number
            max:
              anyOf:
                - type: number
                - type: 'null'
          required:
            - prepaid
            - peak
            - current
            - max
          x-nestjs_zod-has-null: true
        storage:
          type: object
          properties:
            max:
              anyOf:
                - type: number
                - type: 'null'
            unit:
              type: string
              const: GB
            aws:
              type: object
              properties:
                prepaid:
                  type: number
                used:
                  type: number
                overage:
                  type: number
                current:
                  type: number
              required:
                - prepaid
                - used
                - overage
                - current
            custom:
              type: object
              properties:
                prepaid:
                  type: number
                used:
                  type: number
                overage:
                  type: number
                current:
                  type: number
              required:
                - prepaid
                - used
                - overage
                - current
            ibm:
              type: object
              properties:
                prepaid:
                  type: number
                used:
                  type: number
                overage:
                  type: number
                current:
                  type: number
              required:
                - prepaid
                - used
                - overage
                - current
            wasabi:
              type: object
              properties:
                prepaid:
                  type: number
                used:
                  type: number
                overage:
                  type: number
                current:
                  type: number
              required:
                - prepaid
                - used
                - overage
                - current
          required:
            - max
            - unit
            - aws
            - custom
            - ibm
            - wasabi
          x-nestjs_zod-has-null: true
        lucidLinkConnect:
          type: object
          properties:
            prepaid:
              type: number
            used:
              type: number
            overage:
              type: number
            current:
              type: number
          required:
            - prepaid
            - used
            - overage
            - current
          x-nestjs_zod-has-null: true
        teamCache:
          type: object
          properties:
            installations:
              type: number
          required:
            - installations
          x-nestjs_zod-has-null: true
      required:
        - period
        - members
        - storage
    LmpApiStorageUsageResponseDto:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              filespaceId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              storageSizeMb:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              provider:
                type: string
            required:
              - createdAt
              - filespaceId
              - storageSizeMb
              - provider
        meta:
          type: object
          properties:
            page:
              type: number
            pageSize:
              type: number
            itemCount:
              type: number
            pageCount:
              type: number
          required:
            - page
            - pageSize
            - itemCount
            - pageCount
      required:
        - items
        - meta
    LmpApiClientsListResponseDto:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              type:
                type: string
                enum:
                  - var
                  - msp
                  - msp_central
              id:
                type: string
              name:
                type: string
              owner:
                type: object
                properties:
                  email:
                    anyOf:
                      - type: string
                        format: email
                        pattern: >-
                          ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                      - type: 'null'
                required:
                  - email
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              status:
                default: $unknown
                anyOf:
                  - type: string
                    enum:
                      - new
                      - trial
                      - active
                      - trial_expired
                      - past_due
                      - unpaid
                      - canceled
                      - incomplete
                      - incomplete_expired
                      - contract_expired
                  - type: string
              expirationDate:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                  - type: 'null'
              billingPeriod:
                anyOf:
                  - type: object
                    properties:
                      startDate:
                        type: string
                        format: date-time
                        pattern: >-
                          ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                      endDate:
                        type: string
                        format: date-time
                        pattern: >-
                          ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                    required:
                      - startDate
                      - endDate
                  - type: 'null'
            required:
              - type
              - id
              - name
              - owner
              - createdAt
              - status
          x-nestjs_zod-has-null: true
        meta:
          type: object
          properties:
            page:
              type: number
            pageSize:
              type: number
            itemCount:
              type: number
            pageCount:
              type: number
          required:
            - page
            - pageSize
            - itemCount
            - pageCount
          x-nestjs_zod-has-null: true
      required:
        - items
        - meta
    LmpApiClientDto:
      type: object
      properties:
        type:
          type: string
          enum:
            - var
            - msp
            - msp_central
          x-nestjs_zod-has-null: true
        id:
          type: string
          x-nestjs_zod-has-null: true
        name:
          type: string
          x-nestjs_zod-has-null: true
        owner:
          type: object
          properties:
            email:
              anyOf:
                - type: string
                  format: email
                  pattern: >-
                    ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                - type: 'null'
          required:
            - email
          x-nestjs_zod-has-null: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          x-nestjs_zod-has-null: true
        status:
          default: $unknown
          anyOf:
            - type: string
              enum:
                - new
                - trial
                - active
                - trial_expired
                - past_due
                - unpaid
                - canceled
                - incomplete
                - incomplete_expired
                - contract_expired
            - type: string
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
        expirationDate:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            - type: 'null'
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
        billingPeriod:
          anyOf:
            - type: object
              properties:
                startDate:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                endDate:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              required:
                - startDate
                - endDate
            - type: 'null'
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
      required:
        - type
        - id
        - name
        - owner
        - createdAt
        - status
    LmpApiFilespaceListResponseDto:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              name:
                type: string
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              storage:
                type: object
                properties:
                  owner:
                    default: $unknown
                    anyOf:
                      - type: string
                        enum:
                          - any
                          - lucidlink
                          - customer
                      - type: string
                  provider:
                    type: string
                  region:
                    anyOf:
                      - type: string
                      - type: 'null'
                  blockSize:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                required:
                  - owner
                  - provider
                  - region
                  - blockSize
              filespaceFormat:
                anyOf:
                  - default: $unknown
                    anyOf:
                      - type: string
                        enum:
                          - '1.0'
                          - '2.0'
                          - '2.2'
                          - '3.0'
                          - '3.3'
                          - '3.5'
                          - '3.6'
                          - '3.8'
                          - '3.9'
                      - type: string
                  - type: 'null'
              status:
                default: $unknown
                anyOf:
                  - type: string
                    enum:
                      - WaitingForHubAssignment
                      - WaitingForStorage
                      - Provisioning
                      - ReadyForInitialization
                      - Initialized
                      - Errored
                  - type: string
              suspensionStatus:
                default: $unknown
                anyOf:
                  - type: string
                    enum:
                      - WaitingForSuspension
                      - Suspending
                      - Suspended
                      - SuspensionFailed
                      - WaitingForUnsuspension
                      - WaitingForHubAssignment
                      - WaitingForBackupRestoration
                      - Provisioning
                      - NotSuspended
                      - UnsuspensionFailed
                      - Errored
                  - type: string
            required:
              - id
              - name
              - createdAt
              - storage
              - filespaceFormat
              - status
              - suspensionStatus
          x-nestjs_zod-has-null: true
        meta:
          type: object
          properties:
            page:
              type: number
            pageSize:
              type: number
            itemCount:
              type: number
            pageCount:
              type: number
          required:
            - page
            - pageSize
            - itemCount
            - pageCount
          x-nestjs_zod-has-null: true
      required:
        - items
        - meta
    LmpApiFilespaceDetailsResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          x-nestjs_zod-has-null: true
        name:
          type: string
          x-nestjs_zod-has-null: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          x-nestjs_zod-has-null: true
        storage:
          type: object
          properties:
            owner:
              default: $unknown
              anyOf:
                - type: string
                  enum:
                    - any
                    - lucidlink
                    - customer
                - type: string
            provider:
              type: string
            region:
              anyOf:
                - type: string
                - type: 'null'
            blockSize:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
          required:
            - owner
            - provider
            - region
            - blockSize
          x-nestjs_zod-has-null: true
        filespaceFormat:
          anyOf:
            - default: $unknown
              anyOf:
                - type: string
                  enum:
                    - '1.0'
                    - '2.0'
                    - '2.2'
                    - '3.0'
                    - '3.3'
                    - '3.5'
                    - '3.6'
                    - '3.8'
                    - '3.9'
                - type: string
            - type: 'null'
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
        status:
          default: $unknown
          anyOf:
            - type: string
              enum:
                - WaitingForHubAssignment
                - WaitingForStorage
                - Provisioning
                - ReadyForInitialization
                - Initialized
                - Errored
            - type: string
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
        suspensionStatus:
          default: $unknown
          anyOf:
            - type: string
              enum:
                - WaitingForSuspension
                - Suspending
                - Suspended
                - SuspensionFailed
                - WaitingForUnsuspension
                - WaitingForHubAssignment
                - WaitingForBackupRestoration
                - Provisioning
                - NotSuspended
                - UnsuspensionFailed
                - Errored
            - type: string
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
      required:
        - id
        - name
        - createdAt
        - storage
        - filespaceFormat
        - status
        - suspensionStatus
    LmpApiFilespaceUsageDto:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              filespaceId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              storageSizeMb:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              provider:
                type: string
            required:
              - createdAt
              - filespaceId
              - storageSizeMb
              - provider
        meta:
          type: object
          properties:
            page:
              type: number
            pageSize:
              type: number
            itemCount:
              type: number
            pageCount:
              type: number
          required:
            - page
            - pageSize
            - itemCount
            - pageCount
      required:
        - items
        - meta
    LmpApiMeResponseDto:
      type: object
      properties:
        id:
          type: string
          x-nestjs_zod-has-null: true
        name:
          type: string
          x-nestjs_zod-has-null: true
        owner:
          anyOf:
            - type: object
              properties:
                email:
                  type: string
              required:
                - email
            - type: 'null'
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
        tier:
          anyOf:
            - type: string
            - type: 'null'
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
        supportedBillingModels:
          type: array
          items:
            type: string
          x-nestjs_zod-has-null: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          x-nestjs_zod-has-null: true
        status:
          type: string
          x-nestjs_zod-has-null: true
        expirationDate:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            - type: 'null'
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
        billingPeriod:
          anyOf:
            - type: object
              properties:
                start:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                end:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              required:
                - start
                - end
            - type: 'null'
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
      required:
        - id
        - name
        - owner
        - tier
        - supportedBillingModels
        - createdAt
        - status
    LmpApiAddClientMemberRequestDto:
      type: object
      properties:
        email:
          type: string
          format: email
          pattern: >-
            ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
      required:
        - email
    LmpApiClientMemberResponseDto:
      type: object
      properties:
        id:
          type: string
          x-nestjs_zod-has-null: true
        role:
          type: string
          x-nestjs_zod-has-null: true
        email:
          anyOf:
            - type: string
            - type: 'null'
          x-nestjs_zod-has-null: true
          x-nestjs_zod-empty-type: true
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          x-nestjs_zod-has-null: true
      required:
        - id
        - role
        - email
        - createdAt
    LmpApiListClientMembersResponseDto:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              role:
                type: string
              email:
                anyOf:
                  - type: string
                  - type: 'null'
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            required:
              - id
              - role
              - email
              - createdAt
          x-nestjs_zod-has-null: true
        meta:
          type: object
          properties:
            page:
              type: number
            pageSize:
              type: number
            pageCount:
              type: number
            itemCount:
              type: number
          required:
            - page
            - pageSize
            - pageCount
            - itemCount
          x-nestjs_zod-has-null: true
      required:
        - items
        - meta
    LmpApiWorkspacesListResponseDto:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            required:
              - id
              - name
              - createdAt
        meta:
          type: object
          properties:
            page:
              type: number
            pageSize:
              type: number
            itemCount:
              type: number
            pageCount:
              type: number
          required:
            - page
            - pageSize
            - itemCount
            - pageCount
      required:
        - items
        - meta
    LmpApiWorkspaceDetailsDto:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
      required:
        - id
        - name
        - createdAt
    LmpApiWorkspaceUsageDto:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              filespaceId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              storageSizeMb:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              provider:
                type: string
            required:
              - createdAt
              - filespaceId
              - storageSizeMb
              - provider
        meta:
          type: object
          properties:
            page:
              type: number
            pageSize:
              type: number
            itemCount:
              type: number
            pageCount:
              type: number
          required:
            - page
            - pageSize
            - itemCount
            - pageCount
      required:
        - items
        - meta
    LmpApiWorkspaceMembersUsageDto:
      type: object
      properties:
        items:
          type: array
          items:
            type: object
            properties:
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              total:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              active:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              deactivated:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              pending:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              guests:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              scim:
                type: object
                properties:
                  active:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  deactivated:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                required:
                  - active
                  - deactivated
            required:
              - createdAt
              - total
              - active
              - deactivated
              - pending
              - guests
              - scim
        meta:
          type: object
          properties:
            page:
              type: number
            pageSize:
              type: number
            itemCount:
              type: number
            pageCount:
              type: number
          required:
            - page
            - pageSize
            - itemCount
            - pageCount
      required:
        - items
        - meta
