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

# List my workspaces

> Workspaces the authenticated wallet can access, with role. Wallet-session only — API keys are workspace-scoped and don't list across workspaces.



## OpenAPI

````yaml /openapi.json get /api/v1/workspaces
openapi: 3.0.0
info:
  title: Luxxon API
  description: Programmable vision — on-demand live video feeds
  version: 0.1.0
  contact: {}
servers:
  - url: https://api.luxxon.dev/api/v1
security: []
tags:
  - name: Authentication
    description: SIWE wallet sign-in. Used by the dashboard; API-key callers skip this.
  - name: Me
    description: Identity self-introspection — wallet or API key.
  - name: Workspaces
    description: Tenant root. Coverage area, availability, members.
  - name: API keys
    description: Per-workspace scoped credentials (lxxn_*).
  - name: Pricing
    description: Live rate + optional pre-quoted rate lock.
  - name: Sessions
    description: 'Visual session lifecycle: request → dispatch → authorize → start → end.'
  - name: Wallet
    description: On-chain wallet state and event log for a workspace.
  - name: Settlements
    description: On-chain settlement view per session.
  - name: Health
    description: Proof-of-life. No auth.
  - name: Webhooks
    description: Inbound video events from Cloudflare Stream. Internal.
paths:
  /api/v1/workspaces:
    get:
      tags:
        - Workspaces
      summary: List my workspaces
      description: >-
        Workspaces the authenticated wallet can access, with role.
        Wallet-session only — API keys are workspace-scoped and don't list
        across workspaces.
      operationId: LxWorkspacesController_list
      parameters: []
      responses:
        '200':
          description: Request successful
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/LxSuccessResponseDto'
                  - properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/LxWorkspaceMembershipRowDto'
        '401':
          description: NOT_AUTHENTICATED
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LxErrorResponseDto'
              examples:
                NOT_AUTHENTICATED:
                  summary: NOT_AUTHENTICATED — Session expired or missing
                  value:
                    statusCode: 401
                    code: NOT_AUTHENTICATED
                    message: Session expired or missing
                    detail: not_authenticated:example
                    timestamp: '2026-05-13T12:00:00.000Z'
      security:
        - access-token: []
components:
  schemas:
    LxSuccessResponseDto:
      type: object
      properties:
        statusCode:
          type: number
          example: 200
        message:
          type: string
          example: Request successful
        data:
          type: object
          description: Endpoint-specific payload. See the per-endpoint schema.
        timestamp:
          type: string
          example: '2026-05-13T12:00:00.000Z'
      required:
        - statusCode
        - message
        - data
        - timestamp
    LxWorkspaceMembershipRowDto:
      type: object
      properties:
        id:
          type: string
          example: 5a2b1c0d-4e5f-6a7b-8c9d-0e1f2a3b4c5d
        workspaceId:
          type: string
          example: 8c3a5b6f-1d2e-4f7a-9b8c-d1e2f3a4b5c6
        walletAddress:
          type: string
          example: '0xAbC0000000000000000000000000000000000001'
        role:
          type: string
          enum:
            - OWNER
            - ADMIN
            - VIEWER
          example: OWNER
        createdAt:
          type: string
          example: '2026-05-13T11:30:00.000Z'
        workspace:
          $ref: '#/components/schemas/LxWorkspaceDto'
      required:
        - id
        - workspaceId
        - walletAddress
        - role
        - createdAt
        - workspace
    LxErrorResponseDto:
      type: object
      properties:
        statusCode:
          type: number
          example: 400
        code:
          type: string
          example: INVALID_INPUT
          description: Machine-readable error code — see ErrorCodes.
        message:
          type: string
          example: Invalid request payload
        detail:
          type: string
          example: session:workspaceMismatch
          description: Short, safe-to-expose label scoping the failure site.
        timestamp:
          type: string
          example: '2026-05-13T12:00:00.000Z'
      required:
        - statusCode
        - code
        - message
        - timestamp
    LxWorkspaceDto:
      type: object
      properties:
        id:
          type: string
          example: 8c3a5b6f-1d2e-4f7a-9b8c-d1e2f3a4b5c6
        slug:
          type: string
          example: acme
        name:
          type: string
          example: Acme Visuals
        walletAddress:
          type: string
          example: '0xAbC0000000000000000000000000000000000001'
        roles:
          type: array
          example:
            - CONSUMER
          items:
            type: string
            enum:
              - CONSUMER
              - SUPPLIER
        availabilityState:
          type: string
          enum:
            - OFFLINE
            - ONLINE
            - BUSY
          example: OFFLINE
          description: >-
            Supplier-side dispatcher signal. Settable to ONLINE/OFFLINE via
            PATCH; BUSY is set/cleared by the API on session start/end.
        coverageLat:
          type: number
          nullable: true
          example: 4.711
          description: >-
            Center lat of the supplier's coverage circle. Decimal degrees.
            Required (along with lng + radius) before the workspace can go
            ONLINE.
        coverageLng:
          type: number
          nullable: true
          example: -74.07
          description: Center lng of the supplier's coverage circle. Decimal degrees.
        coverageRadiusMeters:
          type: number
          nullable: true
          example: 500
          description: >-
            Radius in meters. Dispatcher uses ST_DWithin on geography; meters
            are the native unit.
        deviceKind:
          type: string
          enum:
            - PHONE
            - LAPTOP
            - DRONE
            - PTZ
            - FIXED
            - OTHER
          nullable: true
          example: PHONE
          description: >-
            Self-declared producer hardware. Surfaced to consumers for filtering
            + trust framing.
        lastSeenAt:
          type: string
          nullable: true
          example: null
        createdAt:
          type: string
          example: '2026-05-13T11:30:00.000Z'
        createdByWallet:
          type: string
          example: '0xAbC0000000000000000000000000000000000001'
        deletedAt:
          type: string
          nullable: true
          example: null
      required:
        - id
        - slug
        - name
        - walletAddress
        - roles
        - availabilityState
        - coverageLat
        - coverageLng
        - coverageRadiusMeters
        - deviceKind
        - lastSeenAt
        - createdAt
        - createdByWallet
        - deletedAt
  securitySchemes:
    access-token:
      scheme: bearer
      bearerFormat: JWT or lxxn_*
      type: http

````