openapi: 3.0.0
paths:
  /:
    get:
      operationId: DocsController_index
      parameters: []
      responses:
        '200':
          description: ''
      tags:
        - Docs
  /api/v1/health:
    get:
      operationId: HealthController_getHealth
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthReportDto'
        '503':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthReportDto'
      summary: Get aggregate service readiness
      tags:
        - Health
  /api/v1/health/live:
    get:
      operationId: HealthController_getLiveness
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LivenessReportDto'
      summary: Check whether the process is alive
      tags:
        - Health
  /api/v1/health/ready:
    get:
      operationId: HealthController_getReadiness
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthReportDto'
        '503':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthReportDto'
      summary: Check database and Redis readiness
      tags:
        - Health
  /api/v1/meta:
    get:
      operationId: MetaController_getMeta
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/MetaResponseDto'
      summary: Get service metadata and version
      tags:
        - Meta
  /api/v1/meta/countries:
    get:
      operationId: MetaController_getCountries
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/CountryOptionDto'
      summary: Get supported countries
      tags:
        - Meta
  /api/v1/meta/organization-types:
    get:
      operationId: MetaController_getOrganizationTypes
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/MetaOptionDto'
      summary: Get supported organization types
      tags:
        - Meta
  /api/v1/meta/brand-categories:
    get:
      operationId: MetaController_getBrandCategories
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/MetaOptionDto'
      summary: Get supported brand categories
      tags:
        - Meta
  /api/v1/meta/legal-identities:
    get:
      operationId: MetaController_getLegalIdentities
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/MetaOptionDto'
      summary: Get supported legal identities
      tags:
        - Meta
  /api/v1/meta/currencies:
    get:
      operationId: MetaController_getCurrencies
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/CurrencyOptionDto'
      summary: Get supported currencies
      tags:
        - Meta
  /api/v1/auth/register:
    post:
      operationId: AuthController_registerUser
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegisterUserDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/PublicUserResponseDto'
      summary: Register a user account
      tags:
        - Auth
  /api/v1/auth/register/organization:
    post:
      operationId: AuthController_registerOrganization
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegisterOrganizationDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/OrganizationRegistrationResponseDto
      summary: Register an organization account
      tags:
        - Auth
  /api/v1/auth/login:
    post:
      operationId: AuthController_login
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LoginDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/TokenResponseDto'
      summary: Login with email or username
      tags:
        - Auth
  /api/v1/auth/refresh:
    post:
      operationId: AuthController_refresh
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefreshTokenDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/TokenResponseDto'
      summary: Rotate refresh and access tokens
      tags:
        - Auth
  /api/v1/auth/logout:
    post:
      operationId: AuthController_logout
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LogoutDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      summary: Logout the supplied refresh-token session
      tags:
        - Auth
  /api/v1/auth/me:
    get:
      operationId: AuthController_me
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/PublicUserResponseDto'
      security:
        - bearer: []
      summary: Get the authenticated user
      tags:
        - Auth
  /api/v1/auth/email/verify:
    post:
      operationId: AuthController_verifyEmail
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VerifyEmailCodeDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/EmailVerificationResponseDto'
      summary: Verify email with a six-digit code
      tags:
        - Auth
  /api/v1/auth/email/resend:
    post:
      operationId: AuthController_resendEmailCode
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResendEmailCodeDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      summary: Resend an email verification code
      tags:
        - Auth
  /api/v1/auth/password/forgot:
    post:
      operationId: AuthController_forgotPassword
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ForgotPasswordDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      summary: Request a password reset code
      tags:
        - Auth
  /api/v1/auth/password/reset:
    post:
      operationId: AuthController_resetPassword
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResetPasswordDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      summary: Reset a password with a six-digit code
      tags:
        - Auth
  /api/v1/auth/email/change-unverified:
    patch:
      operationId: AuthController_changeUnverifiedEmail
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChangeUnverifiedEmailDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/PublicUserResponseDto'
      summary: Change an unverified account email
      tags:
        - Auth
  /api/v1/auth/pin/status:
    get:
      operationId: PinController_getStatus
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PinStatusResponseDto'
      security:
        - bearer: []
      summary: Get the current user PIN status
      tags:
        - Auth PIN
  /api/v1/auth/pin/setup:
    post:
      operationId: PinController_setup
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SetupPinDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PinSetupResponseDto'
      security:
        - bearer: []
      summary: Set up the security PIN
      tags:
        - Auth PIN
  /api/v1/auth/pin/verify:
    post:
      operationId: PinController_verify
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VerifyPinDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PinVerificationResponseDto'
      security:
        - bearer: []
      summary: Verify the security PIN
      tags:
        - Auth PIN
  /api/v1/auth/pin/change:
    post:
      operationId: PinController_changePin
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChangePinDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PinChangeResponseDto'
      security:
        - bearer: []
      summary: Change the security PIN
      tags:
        - Auth PIN
  /api/v1/auth/pin/reset/request:
    post:
      operationId: PinController_requestReset
      parameters: []
      responses:
        '200':
          description: ''
      security:
        - bearer: []
      summary: Request a PIN reset code
      tags:
        - Auth PIN
  /api/v1/auth/pin/reset:
    post:
      operationId: PinController_resetPin
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResetPinDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PinResetResponseDto'
      security:
        - bearer: []
      summary: Reset the security PIN
      tags:
        - Auth PIN
  /api/v1/auth/organization-context:
    get:
      operationId: OrganizationContextController_getContext
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationContextResponseDto'
      security:
        - bearer: []
      summary: Get the current user organization context
      tags:
        - Auth Organization Context
  /api/v1/auth/organization-context/default-workspace:
    patch:
      operationId: OrganizationContextController_updateDefaultWorkspace
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
                - type: object
                  required:
                    - type
                  properties:
                    type:
                      type: string
                      enum:
                        - personal
                  additionalProperties: false
                - type: object
                  required:
                    - type
                    - organizationId
                  properties:
                    type:
                      type: string
                      enum:
                        - organization
                    organizationId:
                      type: string
                      format: uuid
                  additionalProperties: false
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationDefaultWorkspaceResponseDto'
      security:
        - bearer: []
      summary: Update the default workspace
      tags:
        - Auth Organization Context
  /api/v1/auth/sessions:
    get:
      operationId: AuthSessionsController_list
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SessionResponseDto'
      security:
        - bearer: []
      summary: List current user sessions and devices
      tags:
        - Auth Sessions
  /api/v1/auth/sessions/current:
    get:
      operationId: AuthSessionsController_current
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionResponseDto'
      security:
        - bearer: []
      summary: Get the current session and device
      tags:
        - Auth Sessions
  /api/v1/auth/sessions/others:
    delete:
      operationId: AuthSessionsController_revokeOthers
      parameters: []
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RevokeOtherSessionsResponseDto'
      security:
        - bearer: []
      summary: Revoke all other sessions and devices
      tags:
        - Auth Sessions
  /api/v1/auth/sessions/{sessionId}:
    delete:
      operationId: AuthSessionsController_revokeOne
      parameters:
        - name: sessionId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RevokeSessionResponseDto'
      security:
        - bearer: []
      summary: Revoke one session or device
      tags:
        - Auth Sessions
  /api/v1/organizations:
    post:
      description: >-
        Creates a new organization workspace and makes the authenticated user
        its owner.
      operationId: OrganizationsController_createOrganization
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrganizationDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/CreateOrganizationResponseDto'
      security:
        - bearer: []
      summary: Create an organization for the authenticated user
      tags:
        - Organizations
  /api/v1/organizations/{organizationId}/access-context:
    get:
      operationId: OrganizationAccessContextController_getAccessContext
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/OrganizationAccessContextResponseDto
      security:
        - bearer: []
      summary: Get current user organization access context
      tags:
        - Organization Access
  /api/v1/organizations/{organizationId}/invitations:
    post:
      operationId: OrganizationInvitationsController_create
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrganizationInvitationDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Invite a user to an organization
      tags:
        - Organization Invitations
    get:
      operationId: OrganizationInvitationsController_list
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: page
          required: false
          in: query
          description: Page number.
          schema:
            minimum: 1
            default: 1
            example: 1
            type: number
        - name: limit
          required: false
          in: query
          description: Number of records per page.
          schema:
            minimum: 1
            maximum: 100
            default: 20
            example: 20
            type: number
        - name: sortOrder
          required: false
          in: query
          schema:
            default: desc
            type: string
            enum:
              - asc
              - desc
        - name: status
          required: false
          in: query
          description: Filter invitations by their effective invitation status.
          schema:
            type: string
            enum:
              - pending
              - accepted
              - declined
              - cancelled
              - expired
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: List organization invitations
      tags:
        - Organization Invitations
  /api/v1/organizations/{organizationId}/invitations/{invitationId}/resend:
    post:
      operationId: OrganizationInvitationsController_resend
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: invitationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Resend an organization invitation
      tags:
        - Organization Invitations
  /api/v1/organizations/{organizationId}/invitations/{invitationId}:
    delete:
      operationId: OrganizationInvitationsController_cancel
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: invitationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Cancel an organization invitation
      tags:
        - Organization Invitations
  /api/v1/organization-invitations/verify-code:
    post:
      operationId: OrganizationInvitationActionsController_verifyCode
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VerifyOrganizationInvitationCodeDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      summary: Verify an organization invitation code
      tags:
        - Organization Invitation Actions
  /api/v1/organization-invitations/accept:
    post:
      operationId: OrganizationInvitationActionsController_acceptByProof
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AcceptOrganizationInvitationByProofDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Accept an invitation using a verified invitation proof
      tags:
        - Organization Invitation Actions
  /api/v1/organization-invitations/decline:
    post:
      operationId: OrganizationInvitationActionsController_declineByProof
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrganizationInvitationProofDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      summary: Decline an invitation using a verified invitation proof
      tags:
        - Organization Invitation Actions
  /api/v1/organization-invitations/{token}:
    get:
      operationId: OrganizationInvitationActionsController_preview
      parameters:
        - name: token
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      summary: Preview an organization invitation
      tags:
        - Organization Invitation Actions
  /api/v1/organization-invitations/{token}/accept:
    post:
      operationId: OrganizationInvitationActionsController_accept
      parameters:
        - name: token
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AcceptOrganizationInvitationDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Accept an organization invitation from its email link
      tags:
        - Organization Invitation Actions
  /api/v1/organization-invitations/{token}/decline:
    post:
      operationId: OrganizationInvitationActionsController_decline
      parameters:
        - name: token
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      summary: Decline an organization invitation from its email link
      tags:
        - Organization Invitation Actions
  /api/v1/me/organization-invitations:
    get:
      operationId: MyOrganizationInvitationsController_list
      parameters:
        - name: page
          required: false
          in: query
          description: Page number.
          schema:
            minimum: 1
            default: 1
            example: 1
            type: number
        - name: limit
          required: false
          in: query
          description: Number of records per page.
          schema:
            minimum: 1
            maximum: 100
            default: 20
            example: 20
            type: number
        - name: sortOrder
          required: false
          in: query
          schema:
            default: desc
            type: string
            enum:
              - asc
              - desc
        - name: status
          required: false
          in: query
          description: Filter invitations by their effective invitation status.
          schema:
            type: string
            enum:
              - pending
              - accepted
              - declined
              - cancelled
              - expired
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: List organization invitations for the current user
      tags:
        - My Organization Invitations
  /api/v1/me/organization-invitations/{invitationId}/accept:
    post:
      operationId: MyOrganizationInvitationsController_accept
      parameters:
        - name: invitationId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AcceptOrganizationInvitationDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Accept one of the current user organization invitations
      tags:
        - My Organization Invitations
  /api/v1/me/organization-invitations/{invitationId}/decline:
    post:
      operationId: MyOrganizationInvitationsController_decline
      parameters:
        - name: invitationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Decline one of the current user organization invitations
      tags:
        - My Organization Invitations
  /api/v1/organizations/{organizationId}/members:
    get:
      operationId: OrganizationMembersController_listMembers
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: page
          required: false
          in: query
          description: Page number.
          schema:
            minimum: 1
            default: 1
            example: 1
            type: number
        - name: limit
          required: false
          in: query
          description: Number of records per page.
          schema:
            minimum: 1
            maximum: 100
            default: 20
            example: 20
            type: number
        - name: sortOrder
          required: false
          in: query
          schema:
            default: desc
            type: string
            enum:
              - asc
              - desc
        - name: search
          required: false
          in: query
          description: Search by member username, first name, last name, or email address.
          schema:
            example: chidi
            type: string
        - name: status
          required: false
          in: query
          description: Filter members by membership status.
          schema:
            type: string
            enum:
              - active
              - invited
              - suspended
              - removed
        - name: roleId
          required: false
          in: query
          description: Filter members by organization role.
          schema:
            format: uuid
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/OrganizationMemberResponseDto'
      security:
        - bearer: []
      summary: List organization members
      tags:
        - Organization Members
  /api/v1/organizations/{organizationId}/members/{membershipId}:
    get:
      operationId: OrganizationMembersController_getMember
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: membershipId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/OrganizationMemberResponseDto'
      security:
        - bearer: []
      summary: Get an organization member
      tags:
        - Organization Members
    delete:
      operationId: OrganizationMembersController_removeMember
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: membershipId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/OrganizationMemberRemovalResponseDto
      security:
        - bearer: []
      summary: Remove an organization member
      tags:
        - Organization Members
  /api/v1/organizations/{organizationId}/members/{membershipId}/role:
    patch:
      operationId: OrganizationMembersController_updateMemberRole
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: membershipId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateOrganizationMemberRoleDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/OrganizationMemberResponseDto'
      security:
        - bearer: []
      summary: Update an organization member role
      tags:
        - Organization Members
  /api/v1/organizations/{organizationId}/members/{membershipId}/status:
    patch:
      operationId: OrganizationMembersController_updateMemberStatus
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: membershipId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateOrganizationMemberStatusDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/OrganizationMemberResponseDto'
      security:
        - bearer: []
      summary: Suspend or reactivate an organization member
      tags:
        - Organization Members
  /api/v1/organizations/{organizationId}/leave:
    post:
      operationId: OrganizationMembershipActionsController_leaveOrganization
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/OrganizationLeaveResponseDto'
      security:
        - bearer: []
      summary: Leave an organization
      tags:
        - Organization Membership
  /api/v1/organizations/{organizationId}/ownership/transfer:
    post:
      operationId: OrganizationOwnershipController_transferOwnership
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferOrganizationOwnershipDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/OrganizationOwnershipTransferResponseDto
      security:
        - bearer: []
      summary: Transfer organization ownership to another member
      tags:
        - Organization Ownership
  /api/v1/organizations/{organizationId}/roles:
    get:
      operationId: OrganizationRolesController_listRoles
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/OrganizationRoleResponseDto'
      security:
        - bearer: []
      summary: List organization roles
      tags:
        - Organization Roles
    post:
      operationId: OrganizationRolesController_createRole
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrganizationRoleDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/OrganizationRoleResponseDto'
      security:
        - bearer: []
      summary: Create an organization role
      tags:
        - Organization Roles
  /api/v1/organizations/{organizationId}/roles/{roleId}:
    get:
      operationId: OrganizationRolesController_getRole
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: roleId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/OrganizationRoleResponseDto'
      security:
        - bearer: []
      summary: Get an organization role
      tags:
        - Organization Roles
    patch:
      operationId: OrganizationRolesController_updateRole
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: roleId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateOrganizationRoleDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/OrganizationRoleResponseDto'
      security:
        - bearer: []
      summary: Update an organization role
      tags:
        - Organization Roles
    delete:
      operationId: OrganizationRolesController_deleteRole
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: roleId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/OrganizationRoleDeletionResponseDto
      security:
        - bearer: []
      summary: Delete an organization role
      tags:
        - Organization Roles
  /api/v1/organizations/{organizationId}/roles/{roleId}/permissions:
    put:
      operationId: OrganizationRolesController_replaceRolePermissions
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: roleId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateOrganizationRolePermissionsDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/OrganizationRoleResponseDto'
      security:
        - bearer: []
      summary: Replace an organization role permission set
      tags:
        - Organization Roles
  /api/v1/organizations/{organizationId}/permissions:
    get:
      operationId: OrganizationPermissionsController_listPermissions
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/OrganizationPermissionResponseDto
      security:
        - bearer: []
      summary: List permissions available to organization roles
      tags:
        - Organization Permissions
  /api/v1/organizations/{organizationId}/smart-wallet/owner-candidates:
    get:
      operationId: OrganizationSmartWalletController_listOwnerCandidates
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: chainId
          required: false
          in: query
          schema:
            minimum: 1
            example: 11155111
            type: number
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/SmartWalletSignerCandidateResponseDto
      security:
        - bearer: []
      summary: List organization members with eligible smart-wallet signer wallets
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/delegate-candidates:
    get:
      operationId: OrganizationSmartWalletController_listDelegateCandidates
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: chainId
          required: false
          in: query
          schema:
            minimum: 1
            example: 11155111
            type: number
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: >-
                            #/components/schemas/SmartWalletSignerCandidateResponseDto
      security:
        - bearer: []
      summary: List organization members with eligible delegate signer wallets
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet:
    post:
      operationId: OrganizationSmartWalletController_create
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrganizationSmartWalletDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/OrganizationSmartWalletResponseDto
      security:
        - bearer: []
      summary: Create an organization smart wallet
      tags:
        - Organization Smart Wallet
    get:
      operationId: OrganizationSmartWalletController_get
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/OrganizationSmartWalletResponseDto
      security:
        - bearer: []
      summary: Get the organization smart wallet
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/status:
    get:
      operationId: OrganizationSmartWalletController_getStatus
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletStatusResponseDto'
      security:
        - bearer: []
      summary: Get smart wallet status for polling
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/deployment-intents/{deploymentIntentId}/execute:
    post:
      operationId: OrganizationSmartWalletController_executeDeploymentIntent
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: deploymentIntentId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Execute the organization Safe deployment intent
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/modules/delegated-spending/enable:
    post:
      operationId: OrganizationSmartWalletController_enableDelegatedSpendingModule
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Enable delegated spending for the smart wallet
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/modules/delegated-spending/disable:
    post:
      operationId: OrganizationSmartWalletController_disableDelegatedSpendingModule
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Disable delegated spending for the smart wallet
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/owners:
    get:
      operationId: OrganizationSmartWalletController_listOwners
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: List smart wallet owners
      tags:
        - Organization Smart Wallet
    post:
      operationId: OrganizationSmartWalletController_addOwner
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddSmartWalletOwnerDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Request adding an owner to the smart wallet
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/owners/{ownerId}:
    delete:
      operationId: OrganizationSmartWalletController_removeOwner
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: ownerId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Request removing an owner from the smart wallet
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/threshold-change:
    post:
      operationId: OrganizationSmartWalletController_changeThreshold
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChangeSmartWalletThresholdDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Request a smart wallet threshold change
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/safe-requests/{safeRequestId}:
    get:
      operationId: OrganizationSmartWalletController_getSafeRequest
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: safeRequestId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Get a Safe transaction request
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/safe-requests/{safeRequestId}/execute:
    post:
      operationId: OrganizationSmartWalletController_executeSafeRequest
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: safeRequestId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Execute a threshold-ready Safe request
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/contract-calls/{contractCallId}:
    get:
      operationId: OrganizationSmartWalletController_getContractCall
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: contractCallId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Get a Wallet Service contract-call status
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/delegates:
    get:
      operationId: OrganizationSmartWalletController_listDelegates
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: List organization smart-wallet delegates
      tags:
        - Organization Smart Wallet
    post:
      operationId: OrganizationSmartWalletController_addDelegate
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddSmartWalletDelegateDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Add a delegate to the smart wallet
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/delegates/{delegateId}/policy:
    patch:
      operationId: OrganizationSmartWalletController_updateDelegatePolicy
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: delegateId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSmartWalletDelegatePolicyDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Set the delegate LBT spending policy
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/delegates/{delegateId}/targets:
    get:
      operationId: OrganizationSmartWalletController_listDelegateTargets
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: delegateId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: List delegate allowed targets
      tags:
        - Organization Smart Wallet
    post:
      operationId: OrganizationSmartWalletController_addDelegateTarget
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: delegateId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddSmartWalletDelegateTargetDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Add a delegate allowed target
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/delegates/{delegateId}/disable:
    post:
      operationId: OrganizationSmartWalletController_disableDelegate
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: delegateId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Disable a smart wallet delegate
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/delegates/{delegateId}/targets/{targetId}:
    delete:
      operationId: OrganizationSmartWalletController_removeDelegateTarget
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: delegateId
          required: true
          in: path
          schema:
            type: string
        - name: targetId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Remove an allowed target from a billing delegate
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/delegated-payment-intents:
    post:
      operationId: OrganizationSmartWalletController_createDelegatedPaymentIntent
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDelegatedPaymentIntentDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Create an LBT delegated payment intent
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/delegated-payment-intents/{intentId}:
    get:
      operationId: OrganizationSmartWalletController_getDelegatedPaymentIntent
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: intentId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Get a delegated payment intent
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/owner-payment-requests:
    post:
      operationId: OrganizationSmartWalletController_createOwnerPaymentRequest
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: idempotency-key
          required: true
          in: header
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOwnerPaymentRequestDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/SmartWalletSafeRequestResponseDto'
      security:
        - bearer: []
      summary: Create an LBT owner-approved payment request
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/smart-wallet/sync:
    post:
      operationId: OrganizationSmartWalletController_sync
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiSuccessResponseDto'
                  - type: object
                    properties:
                      data:
                        nullable: true
                        example: null
      security:
        - bearer: []
      summary: Synchronize smart wallet state from chain
      tags:
        - Organization Smart Wallet
  /api/v1/organizations/{organizationId}/collections:
    post:
      operationId: OrganizationCollectionsController_create
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrganizationCollectionDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectionResponseDto'
      security:
        - bearer: []
      summary: Create a collection for an organization
      tags:
        - Organization Collections
    get:
      operationId: OrganizationCollectionsController_findAll
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CollectionListItemDto'
      security:
        - bearer: []
      summary: List collections for an organization
      tags:
        - Organization Collections
  /api/v1/organizations/{organizationId}/collections/{collectionId}:
    get:
      operationId: OrganizationCollectionsController_findOne
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: collectionId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectionResponseDto'
      security:
        - bearer: []
      summary: Get an organization collection
      tags:
        - Organization Collections
  /api/v1/organizations/{organizationId}/collectibles:
    get:
      operationId: OrganizationCollectiblesController_findAll
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CollectibleListItemDto'
      security:
        - bearer: []
      summary: List collectibles for an organization
      tags:
        - Organization Collectibles
    post:
      operationId: OrganizationCollectiblesController_create
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrganizationCollectibleDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectibleResponseDto'
      security:
        - bearer: []
      summary: Create an organization collectible
      tags:
        - Organization Collectibles
  /api/v1/organizations/{organizationId}/collectibles/{collectibleId}:
    get:
      operationId: OrganizationCollectiblesController_findOne
      parameters:
        - name: organizationId
          required: true
          in: path
          schema:
            type: string
        - name: collectibleId
          required: true
          in: path
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectibleResponseDto'
      security:
        - bearer: []
      summary: Get an organization collectible
      tags:
        - Organization Collectibles
info:
  title: HOL Wallet User API
  description: >-
    lbt-hol-api provides authentication, organization, collection, and
    collectible APIs for HOL Wallet.
  version: 0.0.1
  contact: {}
tags: []
servers: []
components:
  securitySchemes:
    bearer:
      scheme: bearer
      bearerFormat: JWT
      type: http
  schemas:
    ServiceHealthDto:
      type: object
      properties:
        name:
          type: string
          example: lbt-user-api
        env:
          type: string
          example: production
        version:
          type: string
          example: 1.0.0
      required:
        - name
        - env
        - version
    ComponentHealthDto:
      type: object
      properties:
        status:
          type: string
          enum:
            - up
            - down
          example: up
        details:
          type: object
          additionalProperties: true
          example:
            isInitialized: true
      required:
        - status
    HealthChecksDto:
      type: object
      properties:
        app:
          $ref: '#/components/schemas/ComponentHealthDto'
        db:
          $ref: '#/components/schemas/ComponentHealthDto'
        redis:
          $ref: '#/components/schemas/ComponentHealthDto'
      required:
        - app
        - db
        - redis
    HealthReportDto:
      type: object
      properties:
        status:
          type: string
          enum:
            - up
            - down
          example: up
        timestamp:
          type: string
          example: '2026-07-30T14:00:00.000Z'
        service:
          $ref: '#/components/schemas/ServiceHealthDto'
        checks:
          $ref: '#/components/schemas/HealthChecksDto'
      required:
        - status
        - timestamp
        - service
        - checks
    LivenessReportDto:
      type: object
      properties:
        status:
          type: string
          enum:
            - up
          example: up
        timestamp:
          type: string
          example: '2026-07-30T14:00:00.000Z'
        uptimeSeconds:
          type: number
          example: 123.4
      required:
        - status
        - timestamp
        - uptimeSeconds
    ApiSuccessResponseDto:
      type: object
      properties:
        success:
          type: boolean
          example: true
        message:
          type: string
          example: Request successful.
        data:
          type: object
          nullable: true
        meta:
          type: object
          nullable: true
        requestId:
          type: object
          nullable: true
          example: 0f25c2d8-7056-4a8e-935f-2c923f11315a
        timestamp:
          type: string
          example: '2026-07-30T12:00:00.000Z'
      required:
        - success
        - message
        - data
        - requestId
        - timestamp
    MetaResponseDto:
      type: object
      properties:
        name:
          type: string
          example: lbt-user-api
        env:
          type: string
          example: production
        version:
          type: string
          example: 1.0.0
        gitSha:
          type: object
          example: c0ffee1
          nullable: true
        timestamp:
          type: string
          example: '2026-07-30T14:00:00.000Z'
      required:
        - name
        - env
        - version
        - gitSha
        - timestamp
    CountryOptionDto:
      type: object
      properties:
        code:
          type: string
          example: GB
          minLength: 2
          maxLength: 2
        name:
          type: string
          example: United Kingdom
      required:
        - code
        - name
    MetaOptionDto:
      type: object
      properties:
        value:
          type: string
          example: merchant
        label:
          type: string
          example: Merchant
      required:
        - value
        - label
    CurrencyOptionDto:
      type: object
      properties:
        value:
          type: string
          example: GBP
          description: ISO-style three-character currency code used by API requests.
        label:
          type: string
          example: British Pound Sterling
        symbol:
          type: object
          example: £
          nullable: true
        decimalPlaces:
          type: number
          example: 2
          minimum: 0
      required:
        - value
        - label
        - decimalPlaces
    DefaultWorkspaceResponseDto:
      type: object
      properties:
        type:
          type: string
          enum:
            - personal
            - organization
        organizationId:
          type: object
          nullable: true
      required:
        - type
        - organizationId
    PublicUserResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        username:
          type: string
        firstName:
          type: string
        lastName:
          type: string
        email:
          type: string
          format: email
        emailVerified:
          type: boolean
        primaryRole:
          type: string
          enum:
            - user
            - admin
            - superadmin
        roles:
          type: array
          items:
            type: string
            enum:
              - user
              - admin
              - superadmin
        status:
          type: string
          enum:
            - pending
            - active
            - suspended
            - disabled
        defaultWorkspace:
          $ref: '#/components/schemas/DefaultWorkspaceResponseDto'
      required:
        - id
        - username
        - firstName
        - lastName
        - email
        - emailVerified
        - primaryRole
        - roles
        - status
        - defaultWorkspace
    RegisterUserDto:
      type: object
      properties:
        username:
          type: string
          example: johndoe
          minLength: 3
          maxLength: 40
          description: Unique lowercase username using letters, numbers, and underscores.
        firstName:
          type: string
          example: John
          minLength: 2
          maxLength: 80
        lastName:
          type: string
          example: Doe
          minLength: 2
          maxLength: 80
        email:
          type: string
          example: john@example.com
          maxLength: 254
        password:
          type: string
          example: StrongPassword1!
          format: password
          writeOnly: true
        confirmPassword:
          type: string
          example: StrongPassword1!
          format: password
          writeOnly: true
        countryCode:
          type: string
          example: GB
          minLength: 2
          maxLength: 2
        referralCode:
          type: string
          example: REF123
          maxLength: 40
        currencyCode:
          type: string
          example: GBP
          description: >-
            Three-character currency code. Must be an active platform-supported
            currency.
      required:
        - username
        - firstName
        - lastName
        - email
        - password
        - confirmPassword
        - countryCode
    RegisteredOrganizationResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
        organizationType:
          type: string
          enum:
            - merchant
            - cinema
            - restaurant
            - school
            - church
            - event_organiser
            - charity
            - hotel
            - supermarket
            - creator
            - brand
            - reseller_business
            - enterprise_partner
            - other
        status:
          type: string
          enum:
            - pending
            - active
            - suspended
            - disabled
            - archived
        kycStatus:
          type: string
          enum:
            - not_required
            - pending
            - approved
            - rejected
      required:
        - id
        - name
        - slug
        - organizationType
        - status
        - kycStatus
    OrganizationMembershipResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        role:
          type: string
        status:
          type: string
          enum:
            - active
            - invited
            - suspended
            - removed
      required:
        - id
        - role
        - status
    OrganizationRegistrationResponseDto:
      type: object
      properties:
        user:
          $ref: '#/components/schemas/PublicUserResponseDto'
        organization:
          $ref: '#/components/schemas/RegisteredOrganizationResponseDto'
        membership:
          $ref: '#/components/schemas/OrganizationMembershipResponseDto'
      required:
        - user
        - organization
        - membership
    RegisterOrganizationDto:
      type: object
      properties:
        username:
          type: string
          example: johndoe
          minLength: 3
          maxLength: 40
          description: Unique lowercase username using letters, numbers, and underscores.
        firstName:
          type: string
          example: John
          minLength: 2
          maxLength: 80
        lastName:
          type: string
          example: Doe
          minLength: 2
          maxLength: 80
        email:
          type: string
          example: john@example.com
          maxLength: 254
        password:
          type: string
          example: StrongPassword1!
          format: password
          writeOnly: true
        confirmPassword:
          type: string
          example: StrongPassword1!
          format: password
          writeOnly: true
        countryCode:
          type: string
          example: GB
          minLength: 2
          maxLength: 2
        referralCode:
          type: string
          example: REF123
          maxLength: 40
        currencyCode:
          type: string
          example: GBP
          description: >-
            Three-character currency code. Must be an active platform-supported
            currency.
        organizationName:
          type: string
          example: Filmhouse Cinemas
          minLength: 2
          maxLength: 160
        organizationType:
          type: string
          example: cinema
          enum:
            - merchant
            - cinema
            - restaurant
            - school
            - church
            - event_organiser
            - charity
            - hotel
            - supermarket
            - creator
            - brand
            - reseller_business
            - enterprise_partner
            - other
        country:
          type: string
          example: Nigeria
          maxLength: 80
        city:
          type: string
          example: Lagos
          maxLength: 100
        contactEmail:
          type: string
          example: support@filmhouse.com
          maxLength: 254
        contactPhone:
          type: string
          example: '+2348012345678'
          maxLength: 16
        website:
          type: string
          example: https://filmhouse.example
          maxLength: 2048
        logoUrl:
          type: string
          example: https://example.com/logo.png
          maxLength: 2048
      required:
        - username
        - firstName
        - lastName
        - email
        - password
        - confirmPassword
        - countryCode
        - organizationName
        - organizationType
    TokenResponseDto:
      type: object
      properties:
        accessToken:
          type: string
        refreshToken:
          type: string
        tokenType:
          type: string
          example: Bearer
        expiresIn:
          type: number
          example: 900
          description: Access-token lifetime in seconds.
      required:
        - accessToken
        - refreshToken
        - tokenType
        - expiresIn
    LoginDto:
      type: object
      properties:
        credential:
          type: string
          example: user@example.com
          description: Registered email address or username.
          maxLength: 254
        password:
          type: string
          example: StrongPassword1!
          format: password
          writeOnly: true
          minLength: 8
          maxLength: 128
      required:
        - credential
        - password
    RefreshTokenDto:
      type: object
      properties:
        refreshToken:
          type: string
          example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
          minLength: 20
          writeOnly: true
      required:
        - refreshToken
    LogoutDto:
      type: object
      properties:
        refreshToken:
          type: string
          example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
          minLength: 20
          writeOnly: true
      required:
        - refreshToken
    EmailVerificationResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        emailVerified:
          type: boolean
          example: true
        status:
          type: string
          enum:
            - pending
            - active
            - suspended
            - disabled
      required:
        - id
        - emailVerified
        - status
    VerifyEmailCodeDto:
      type: object
      properties:
        email:
          type: string
          example: user@example.com
          maxLength: 254
        code:
          type: string
          example: '123456'
          minLength: 6
          maxLength: 6
      required:
        - email
        - code
    ResendEmailCodeDto:
      type: object
      properties:
        email:
          type: string
          example: user@example.com
          maxLength: 254
      required:
        - email
    ForgotPasswordDto:
      type: object
      properties:
        email:
          type: string
          example: user@example.com
          maxLength: 254
      required:
        - email
    ResetPasswordDto:
      type: object
      properties:
        email:
          type: string
          example: user@example.com
          maxLength: 254
        code:
          type: string
          example: '123456'
          minLength: 6
          maxLength: 6
          description: Six-digit password reset code.
        newPassword:
          type: string
          example: NewPassword123!
          writeOnly: true
          format: password
        confirmPassword:
          type: string
          example: NewPassword123!
          writeOnly: true
          format: password
      required:
        - email
        - code
        - newPassword
        - confirmPassword
    ChangeUnverifiedEmailDto:
      type: object
      properties:
        credential:
          type: string
          description: Current username or incorrectly entered email address.
          example: john
          maxLength: 254
        password:
          type: string
          description: Current account password.
          example: StrongPassword123!
          format: password
          writeOnly: true
        newEmail:
          type: string
          description: Correct email address.
          example: chidi@example.com
          maxLength: 254
        confirmNewEmail:
          type: string
          description: Confirmation of the correct email address.
          example: chidi@example.com
          maxLength: 254
      required:
        - credential
        - password
        - newEmail
        - confirmNewEmail
    PinStatusResponseDto:
      type: object
      properties:
        hasPin:
          type: boolean
        locked:
          type: boolean
        lockedUntil:
          type: string
          format: date-time
          nullable: true
        lastVerifiedAt:
          type: string
          format: date-time
          nullable: true
      required:
        - hasPin
        - locked
    SetupPinDto:
      type: object
      properties:
        pin:
          type: string
          example: '827391'
          minLength: 6
          maxLength: 6
          description: Numeric security PIN.
          writeOnly: true
      required:
        - pin
    PinSetupResponseDto:
      type: object
      properties:
        hasPin:
          type: boolean
          example: true
        createdAt:
          type: string
          format: date-time
      required:
        - hasPin
        - createdAt
    VerifyPinDto:
      type: object
      properties:
        pin:
          type: string
          example: '827391'
          minLength: 6
          maxLength: 6
          writeOnly: true
        purpose:
          type: string
          example: transferApproval
          enum:
            - transferApproval
            - sensitiveAction
            - marketplacePayment
            - organizationOwnershipTransfer
      required:
        - pin
        - purpose
    PinVerificationResponseDto:
      type: object
      properties:
        verified:
          type: boolean
          example: true
        purpose:
          type: string
          enum:
            - transferApproval
            - sensitiveAction
            - marketplacePayment
            - organizationOwnershipTransfer
        verifiedAt:
          type: string
          format: date-time
          nullable: true
      required:
        - verified
        - purpose
    ChangePinDto:
      type: object
      properties:
        currentPin:
          type: string
          example: '123456'
          description: Current 6 digit PIN.
          minLength: 6
          maxLength: 6
          writeOnly: true
        newPin:
          type: string
          example: '827391'
          description: New 6 digit PIN.
          minLength: 6
          maxLength: 6
          writeOnly: true
      required:
        - currentPin
        - newPin
    PinChangeResponseDto:
      type: object
      properties:
        changed:
          type: boolean
          example: true
        changedAt:
          type: string
          format: date-time
      required:
        - changed
        - changedAt
    ResetPinDto:
      type: object
      properties:
        code:
          type: string
          example: '123456'
          description: Six digit PIN reset code sent to the verified user email.
          minLength: 6
          maxLength: 6
          writeOnly: true
        newPin:
          type: string
          example: '827391'
          description: New six digit security PIN.
          minLength: 6
          maxLength: 6
          writeOnly: true
      required:
        - code
        - newPin
    PinResetResponseDto:
      type: object
      properties:
        reset:
          type: boolean
          example: true
        resetAt:
          type: string
          format: date-time
      required:
        - reset
        - resetAt
    OrganizationDefaultWorkspaceResponseDto:
      type: object
      properties:
        type:
          type: string
          enum:
            - personal
            - organization
        organizationId:
          type: object
          format: uuid
          nullable: true
        organizationName:
          type: object
          nullable: true
        role:
          type: object
          nullable: true
      required:
        - type
    OrganizationContextOrganizationResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
        organizationType:
          type: string
          enum:
            - merchant
            - cinema
            - restaurant
            - school
            - church
            - event_organiser
            - charity
            - hotel
            - supermarket
            - creator
            - brand
            - reseller_business
            - enterprise_partner
            - other
        status:
          type: string
          enum:
            - pending
            - active
            - suspended
            - disabled
            - archived
        country:
          type: object
          nullable: true
        city:
          type: object
          nullable: true
        kycStatus:
          type: string
          enum:
            - not_required
            - pending
            - approved
            - rejected
        logoUrl:
          type: object
          nullable: true
      required:
        - id
        - name
        - slug
        - organizationType
        - status
        - kycStatus
    OrganizationContextRoleResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
        description:
          type: object
          nullable: true
        isSystem:
          type: boolean
        isDefault:
          type: boolean
      required:
        - id
        - name
        - slug
        - isSystem
        - isDefault
    OrganizationContextItemResponseDto:
      type: object
      properties:
        membershipId:
          type: string
          format: uuid
        membershipStatus:
          type: string
          enum:
            - active
            - invited
            - suspended
            - removed
        isOwner:
          type: boolean
        organization:
          $ref: '#/components/schemas/OrganizationContextOrganizationResponseDto'
        role:
          $ref: '#/components/schemas/OrganizationContextRoleResponseDto'
        permissions:
          type: array
          items:
            type: string
      required:
        - membershipId
        - membershipStatus
        - isOwner
        - organization
        - role
        - permissions
    OrganizationContextResponseDto:
      type: object
      properties:
        defaultWorkspace:
          $ref: '#/components/schemas/OrganizationDefaultWorkspaceResponseDto'
        organizations:
          type: array
          items:
            $ref: '#/components/schemas/OrganizationContextItemResponseDto'
      required:
        - defaultWorkspace
        - organizations
    SessionResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        deviceName:
          type: object
          nullable: true
        deviceType:
          type: object
          nullable: true
        userAgent:
          type: object
          nullable: true
        ipAddress:
          type: object
          nullable: true
        lastUsedAt:
          type: string
          format: date-time
          nullable: true
        expiresAt:
          type: string
          format: date-time
        revokedAt:
          type: string
          format: date-time
          nullable: true
        isCurrent:
          type: boolean
        createdAt:
          type: string
          format: date-time
      required:
        - id
        - expiresAt
        - isCurrent
        - createdAt
    RevokeOtherSessionsResponseDto:
      type: object
      properties:
        revokedCount:
          type: number
          example: 2
          minimum: 0
      required:
        - revokedCount
    RevokeSessionResponseDto:
      type: object
      properties:
        revoked:
          type: boolean
          example: true
      required:
        - revoked
    CreatedOrganizationResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
        organizationType:
          type: string
          enum:
            - merchant
            - cinema
            - restaurant
            - school
            - church
            - event_organiser
            - charity
            - hotel
            - supermarket
            - creator
            - brand
            - reseller_business
            - enterprise_partner
            - other
        status:
          type: string
          enum:
            - pending
            - active
            - suspended
            - disabled
            - archived
        kycStatus:
          type: string
          enum:
            - not_required
            - pending
            - approved
            - rejected
        country:
          type: object
          nullable: true
        city:
          type: object
          nullable: true
      required:
        - id
        - name
        - slug
        - organizationType
        - status
        - kycStatus
    CreatedOrganizationOwnerRoleResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
      required:
        - id
        - name
        - slug
    CreatedOrganizationMembershipResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - active
            - invited
            - suspended
            - removed
        role:
          $ref: '#/components/schemas/CreatedOrganizationOwnerRoleResponseDto'
      required:
        - id
        - status
        - role
    CreateOrganizationResponseDto:
      type: object
      properties:
        organization:
          $ref: '#/components/schemas/CreatedOrganizationResponseDto'
        membership:
          $ref: '#/components/schemas/CreatedOrganizationMembershipResponseDto'
        becameDefaultWorkspace:
          type: boolean
          description: >-
            True when the new organization was also set as the user default
            workspace.
      required:
        - organization
        - membership
        - becameDefaultWorkspace
    CreateOrganizationDto:
      type: object
      properties:
        name:
          type: string
          example: Filmhouse Cinemas
          minLength: 2
          maxLength: 160
        organizationType:
          type: string
          example: cinema
          enum:
            - merchant
            - cinema
            - restaurant
            - school
            - church
            - event_organiser
            - charity
            - hotel
            - supermarket
            - creator
            - brand
            - reseller_business
            - enterprise_partner
            - other
        country:
          type: string
          example: Nigeria
          maxLength: 80
        city:
          type: string
          example: Lagos
          maxLength: 100
        contactEmail:
          type: string
          example: support@filmhouse.com
          maxLength: 254
          description: >-
            Organization contact email. Defaults to the authenticated user
            email.
        contactPhone:
          type: string
          example: '+2348012345678'
          maxLength: 16
        website:
          type: string
          example: https://filmhouse.example
          maxLength: 2048
        logoUrl:
          type: string
          example: https://example.com/logo.png
          maxLength: 2048
        setAsDefaultWorkspace:
          type: boolean
          default: false
          description: >-
            When true, the new organization becomes the user default workspace
            immediately.
      required:
        - name
        - organizationType
    OrganizationAccessContextRoleDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
      required:
        - id
        - name
        - slug
    OrganizationAccessContextResponseDto:
      type: object
      properties:
        organizationId:
          type: string
          format: uuid
        membershipId:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - active
            - invited
            - suspended
            - removed
        isOwner:
          type: boolean
        role:
          $ref: '#/components/schemas/OrganizationAccessContextRoleDto'
        permissions:
          example:
            - organization.members.view
            - organization.members.invite
            - organization.members.update
          type: array
          items:
            type: string
      required:
        - organizationId
        - membershipId
        - status
        - isOwner
        - role
        - permissions
    CreateOrganizationInvitationDto:
      type: object
      properties:
        email:
          type: string
          example: john@example.com
        roleId:
          type: string
          example: 8147ddc9-5890-4477-b18f-b81546946709
        message:
          type: string
          example: Welcome to the Haxell rewards team.
      required:
        - email
        - roleId
    VerifyOrganizationInvitationCodeDto:
      type: object
      properties:
        code:
          type: string
          example: AB7K-9Q2M
          description: >-
            Eight-character invitation code from the invitation email. Hyphens
            and spaces are optional.
      required:
        - code
    AcceptOrganizationInvitationByProofDto:
      type: object
      properties:
        setAsDefaultWorkspace:
          type: boolean
          default: false
          description: Whether this organization should become the user default workspace.
        invitationProof:
          type: string
          description: >-
            Short-lived invitation proof returned after successful manual code
            verification.
      required:
        - invitationProof
    OrganizationInvitationProofDto:
      type: object
      properties:
        invitationProof:
          type: string
          description: >-
            Short-lived invitation proof returned after successful manual code
            verification.
      required:
        - invitationProof
    AcceptOrganizationInvitationDto:
      type: object
      properties:
        setAsDefaultWorkspace:
          type: boolean
          default: false
          description: Whether this organization should become the user default workspace.
    OrganizationMemberUserResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        username:
          type: string
          example: chidimez
        firstName:
          type: string
          example: Chidi
        lastName:
          type: string
          example: Umezurike
        email:
          type: string
          format: email
          example: chidi@example.com
        profilePic:
          type: object
          nullable: true
      required:
        - id
        - username
        - firstName
        - lastName
        - email
    OrganizationMemberRoleResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
          example: Manager
        slug:
          type: string
          example: manager
        description:
          type: object
          nullable: true
        isSystem:
          type: boolean
        isDefault:
          type: boolean
      required:
        - id
        - name
        - slug
        - isSystem
        - isDefault
    OrganizationMemberInviterResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        username:
          type: string
          example: chidimez
        firstName:
          type: string
          example: Chidi
        lastName:
          type: string
          example: Umezurike
      required:
        - id
        - username
        - firstName
        - lastName
    OrganizationMemberResponseDto:
      type: object
      properties:
        membershipId:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - active
            - invited
            - suspended
            - removed
        user:
          $ref: '#/components/schemas/OrganizationMemberUserResponseDto'
        role:
          $ref: '#/components/schemas/OrganizationMemberRoleResponseDto'
        isOwner:
          type: boolean
          description: Whether this user is the authoritative owner of the organization.
        invitedBy:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/OrganizationMemberInviterResponseDto'
        createdAt:
          format: date-time
          type: string
        updatedAt:
          format: date-time
          type: string
      required:
        - membershipId
        - organizationId
        - status
        - user
        - role
        - isOwner
        - createdAt
        - updatedAt
    UpdateOrganizationMemberRoleDto:
      type: object
      properties:
        roleId:
          type: string
          format: uuid
          description: Organization role to assign to the member.
      required:
        - roleId
    UpdateOrganizationMemberStatusDto:
      type: object
      properties:
        status:
          type: string
          enum:
            - active
            - suspended
          example: suspended
          description: Activate or suspend the organization membership.
      required:
        - status
    OrganizationMemberRemovalResponseDto:
      type: object
      properties:
        membershipId:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        userId:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - active
            - invited
            - suspended
            - removed
          example: removed
        defaultWorkspaceReset:
          type: boolean
          description: Whether the removed user default workspace was reset to personal.
      required:
        - membershipId
        - organizationId
        - userId
        - status
        - defaultWorkspaceReset
    OrganizationLeaveResponseDto:
      type: object
      properties:
        membershipId:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - active
            - invited
            - suspended
            - removed
          example: removed
        defaultWorkspaceReset:
          type: boolean
          description: Whether the user default workspace was reset to personal.
      required:
        - membershipId
        - organizationId
        - status
        - defaultWorkspaceReset
    OrganizationOwnershipMemberResponseDto:
      type: object
      properties:
        userId:
          type: string
          format: uuid
        membershipId:
          type: string
          format: uuid
        roleId:
          type: string
          format: uuid
        roleName:
          type: string
        roleSlug:
          type: string
      required:
        - userId
        - membershipId
        - roleId
        - roleName
        - roleSlug
    OrganizationOwnershipTransferResponseDto:
      type: object
      properties:
        organizationId:
          type: string
          format: uuid
        previousOwner:
          $ref: '#/components/schemas/OrganizationOwnershipMemberResponseDto'
        newOwner:
          $ref: '#/components/schemas/OrganizationOwnershipMemberResponseDto'
      required:
        - organizationId
        - previousOwner
        - newOwner
    TransferOrganizationOwnershipDto:
      type: object
      properties:
        newOwnerMembershipId:
          type: string
          format: uuid
          description: >-
            Membership ID of the active organization member who will become the
            new owner.
        previousOwnerRoleId:
          type: string
          format: uuid
          description: >-
            Role to assign to the current owner after transfer. If omitted, the
            new owner previous role is assigned to the outgoing owner.
        pin:
          type: string
          example: '827391'
          minLength: 6
          maxLength: 6
          writeOnly: true
          description: Current owner security PIN used to authorize the ownership transfer.
      required:
        - newOwnerMembershipId
        - pin
    OrganizationPermissionResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        key:
          type: string
          example: organization.members.view
        name:
          type: string
          example: View Organization Members
        category:
          type: string
          example: organization
        description:
          type: object
          nullable: true
      required:
        - id
        - key
        - name
        - category
    OrganizationRoleResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
        description:
          type: object
          nullable: true
        isSystem:
          type: boolean
        isDefault:
          type: boolean
        permissions:
          type: array
          items:
            $ref: '#/components/schemas/OrganizationPermissionResponseDto'
        createdAt:
          format: date-time
          type: string
        updatedAt:
          format: date-time
          type: string
      required:
        - id
        - organizationId
        - name
        - slug
        - isSystem
        - isDefault
        - permissions
        - createdAt
        - updatedAt
    CreateOrganizationRoleDto:
      type: object
      properties:
        name:
          type: string
          example: Campaign Manager
        description:
          type: object
          example: Can manage organization campaigns.
          nullable: true
        permissionIds:
          description: Initial organization permission IDs assigned to the role.
          type: array
          items:
            type: string
      required:
        - name
    UpdateOrganizationRoleDto:
      type: object
      properties:
        name:
          type: string
          example: Senior Campaign Manager
        description:
          type: object
          example: Updated role description.
          nullable: true
    UpdateOrganizationRolePermissionsDto:
      type: object
      properties:
        permissionIds:
          description: >-
            Complete set of organization permission IDs that should be assigned
            to the role.
          type: array
          items:
            type: string
      required:
        - permissionIds
    OrganizationRoleDeletionResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        deleted:
          type: boolean
      required:
        - id
        - organizationId
        - deleted
    EligibleSignerWalletResponseDto:
      type: object
      properties:
        walletId:
          type: string
          format: uuid
        address:
          type: string
          example: '0x66D3fb33722E0b66C398DCb61BAA522093eD7A78'
        chain:
          type: string
          example: sepolia
        chainId:
          type: number
          example: 11155111
        label:
          type: object
          nullable: true
          example: Main wallet
        isPrimary:
          type: boolean
          example: true
        verifiedAt:
          type: string
          example: '2026-08-26T13:00:00.000Z'
      required:
        - walletId
        - address
        - chain
        - chainId
        - isPrimary
        - verifiedAt
    SmartWalletSignerCandidateResponseDto:
      type: object
      properties:
        userId:
          type: string
          format: uuid
        organizationMemberId:
          type: string
          format: uuid
        displayName:
          type: string
          example: Chidi Umezurike
        email:
          type: string
          example: chidi@example.com
        roleName:
          type: string
          example: Owner
        eligible:
          type: boolean
          example: true
        eligibleWallets:
          type: array
          items:
            $ref: '#/components/schemas/EligibleSignerWalletResponseDto'
        reason:
          type: object
          nullable: true
          example: No eligible wallet connected
      required:
        - userId
        - organizationMemberId
        - displayName
        - email
        - roleName
        - eligible
        - eligibleWallets
    OrganizationSmartWalletResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        walletType:
          type: string
          enum:
            - safe
        chainId:
          type: number
          example: 11155111
        address:
          type: object
          nullable: true
        predictedAddress:
          type: object
          nullable: true
        safeVersion:
          type: object
          nullable: true
          example: 1.4.1
        status:
          type: string
        threshold:
          type: number
          minimum: 1
        moduleEnabled:
          type: boolean
        moduleAddress:
          type: object
          nullable: true
        moduleVersion:
          type: object
          nullable: true
        moduleEnabledAt:
          type: object
          nullable: true
        deploymentIntentId:
          type: object
          format: uuid
          nullable: true
        deploymentIntentStatus:
          type: object
          nullable: true
        requiredApprovals:
          type: number
          minimum: 0
        currentApprovals:
          type: number
          minimum: 0
        deploymentTxHash:
          type: object
          nullable: true
        deploymentBlockNumber:
          type: object
          nullable: true
        owners:
          type: array
          items:
            type: object
        delegates:
          type: array
          items:
            type: object
        sync:
          type: object
          nullable: true
          additionalProperties: true
        nextAction:
          type: object
          nullable: true
      required:
        - id
        - organizationId
        - walletType
        - chainId
        - status
    SmartWalletOwnerInputDto:
      type: object
      properties:
        userId:
          type: string
          format: uuid
        walletId:
          type: string
          format: uuid
      required:
        - userId
        - walletId
    CreateOrganizationSmartWalletDto:
      type: object
      properties:
        chainId:
          type: number
          example: 11155111
          minimum: 1
          default: 11155111
        walletType:
          type: string
          enum:
            - safe
          default: safe
        safeVersion:
          type: string
          example: 1.4.1
          default: 1.4.1
        owners:
          type: array
          items:
            $ref: '#/components/schemas/SmartWalletOwnerInputDto'
        threshold:
          type: number
          example: 1
          minimum: 1
        enableDelegatedSpendingModule:
          type: boolean
          default: true
      required:
        - owners
        - threshold
    SmartWalletStatusResponseDto:
      type: object
      properties:
        organizationWalletId:
          type: string
          format: uuid
        chainId:
          type: number
          example: 11155111
        address:
          type: object
          nullable: true
        predictedAddress:
          type: object
          nullable: true
        status:
          type: string
        deploymentIntentId:
          type: object
          format: uuid
          nullable: true
        deploymentIntentStatus:
          type: object
          nullable: true
        moduleEnabled:
          type: boolean
        moduleEnabledAt:
          type: object
          nullable: true
        deploymentTxHash:
          type: object
          nullable: true
        deploymentBlockNumber:
          type: object
          nullable: true
        nextAction:
          type: object
          nullable: true
      required:
        - organizationWalletId
        - chainId
        - status
        - moduleEnabled
    SmartWalletSafeRequestResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        organizationWalletId:
          type: string
          format: uuid
        requestType:
          type: string
        status:
          type: string
        requiredThreshold:
          type: number
        requiredApprovals:
          type: number
        collectedSignatures:
          type: number
        currentApprovals:
          type: number
        safeNonce:
          type: object
          nullable: true
        nextAction:
          type: object
          nullable: true
      required:
        - id
        - organizationWalletId
        - requestType
        - status
    AddSmartWalletOwnerDto:
      type: object
      properties:
        userId:
          type: string
          format: uuid
        walletId:
          type: string
          format: uuid
      required:
        - userId
        - walletId
    ChangeSmartWalletThresholdDto:
      type: object
      properties:
        threshold:
          type: number
          example: 2
          minimum: 1
      required:
        - threshold
    AddSmartWalletDelegateDto:
      type: object
      properties:
        userId:
          type: string
          format: uuid
        walletId:
          type: string
          format: uuid
      required:
        - userId
        - walletId
    UpdateSmartWalletDelegatePolicyDto:
      type: object
      properties:
        perTransactionLimitRaw:
          type: string
          example: '50000000000000000000'
        periodLimitRaw:
          type: string
          example: '200000000000000000000'
        periodSeconds:
          type: number
          example: 86400
          minimum: 1
        effectiveFrom:
          type: object
          nullable: true
          format: date-time
        effectiveUntil:
          type: object
          nullable: true
          format: date-time
      required:
        - perTransactionLimitRaw
        - periodLimitRaw
        - periodSeconds
    AddSmartWalletDelegateTargetDto:
      type: object
      properties:
        targetAddress:
          type: string
          example: '0x66D3fb33722E0b66C398DCb61BAA522093eD7A78'
        targetType:
          type: string
          enum:
            - vendor
            - collection
            - treasury
            - custom
          example: vendor
        label:
          type: object
          nullable: true
          example: Approved vendor
      required:
        - targetAddress
        - targetType
    CreateDelegatedPaymentIntentDto:
      type: object
      properties:
        delegateId:
          type: string
          format: uuid
        targetAddress:
          type: string
          example: '0x66D3fb33722E0b66C398DCb61BAA522093eD7A78'
        amountRaw:
          type: string
          example: '10000000000000000000'
        contextType:
          type: object
          nullable: true
          example: collection_mint
        contextId:
          type: object
          nullable: true
          format: uuid
      required:
        - delegateId
        - targetAddress
        - amountRaw
    CreateOwnerPaymentRequestDto:
      type: object
      properties:
        toAddress:
          type: string
          example: '0x66D3fb33722E0b66C398DCb61BAA522093eD7A78'
        amountRaw:
          type: string
          example: '10000000000000000000'
        contextType:
          type: object
          nullable: true
          example: collection_mint
        contextId:
          type: object
          nullable: true
          format: uuid
      required:
        - toAddress
        - amountRaw
    CreateOrganizationCollectionDto:
      type: object
      properties:
        name:
          type: string
          example: Bole Festival
          minLength: 2
          maxLength: 120
        description:
          type: string
          maxLength: 1000
        imageUrl:
          type: string
          maxLength: 2048
        priceMinor:
          type: number
          example: 250000
          minimum: 0
        currency:
          type: string
          example: USD
          minLength: 3
          maxLength: 3
        quantity:
          type: number
          example: 100
          minimum: 1
          maximum: 1000000
        usageLimit:
          type: number
          minimum: 1
          maximum: 1000000
        expiresAt:
          type: string
          format: date-time
        collectionType:
          type: string
          enum:
            - ticket
            - voucher
            - gift_card
            - discount
          example: voucher
        collectibleType:
          type: string
          enum:
            - ticket
            - voucher
            - gift_card
            - discount
          example: voucher
      required:
        - name
        - priceMinor
        - currency
        - quantity
        - collectionType
    CollectionTemplateResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        templateSlug:
          type: string
        type:
          type: string
          enum:
            - ticket
            - voucher
            - gift_card
            - discount
        isPrimary:
          type: boolean
      required:
        - id
        - templateSlug
        - type
        - isPrimary
    CollectionResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
        imageUrl:
          type: object
          nullable: true
        priceMinor:
          type: number
          minimum: 0
        currency:
          type: string
        quantity:
          type: number
          minimum: 1
        collectionType:
          type: string
          enum:
            - ticket
            - voucher
            - gift_card
            - discount
        usageLimit:
          type: object
          nullable: true
        expiresAt:
          type: object
          nullable: true
        createdAt:
          type: string
          format: date-time
        description:
          type: object
          nullable: true
        templates:
          type: array
          items:
            $ref: '#/components/schemas/CollectionTemplateResponseDto'
      required:
        - id
        - organizationId
        - name
        - slug
        - priceMinor
        - currency
        - quantity
        - collectionType
        - createdAt
        - templates
    CollectionListItemDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        name:
          type: string
        slug:
          type: string
        imageUrl:
          type: object
          nullable: true
        priceMinor:
          type: number
          minimum: 0
        currency:
          type: string
        quantity:
          type: number
          minimum: 1
        collectionType:
          type: string
          enum:
            - ticket
            - voucher
            - gift_card
            - discount
        usageLimit:
          type: object
          nullable: true
        expiresAt:
          type: object
          nullable: true
        createdAt:
          type: string
          format: date-time
      required:
        - id
        - organizationId
        - name
        - slug
        - priceMinor
        - currency
        - quantity
        - collectionType
        - createdAt
    CollectibleListItemDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        collectionId:
          type: string
          format: uuid
        templateSlug:
          type: string
        type:
          type: string
          enum:
            - ticket
            - voucher
            - gift_card
            - discount
        isPrimary:
          type: boolean
        imageUrl:
          type: object
          nullable: true
        priceMinor:
          type: number
          minimum: 0
        currency:
          type: string
        quantity:
          type: number
          minimum: 1
        usageLimit:
          type: object
          nullable: true
        expiresAt:
          type: object
          nullable: true
        createdAt:
          type: string
          format: date-time
      required:
        - id
        - organizationId
        - collectionId
        - templateSlug
        - type
        - isPrimary
        - priceMinor
        - currency
        - quantity
        - createdAt
    CollectibleResponseDto:
      type: object
      properties:
        id:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        collectionId:
          type: string
          format: uuid
        templateSlug:
          type: string
        type:
          type: string
          enum:
            - ticket
            - voucher
            - gift_card
            - discount
        isPrimary:
          type: boolean
        imageUrl:
          type: object
          nullable: true
        priceMinor:
          type: number
          minimum: 0
        currency:
          type: string
        quantity:
          type: number
          minimum: 1
        usageLimit:
          type: object
          nullable: true
        expiresAt:
          type: object
          nullable: true
        createdAt:
          type: string
          format: date-time
        name:
          type: object
          nullable: true
        description:
          type: object
          nullable: true
      required:
        - id
        - organizationId
        - collectionId
        - templateSlug
        - type
        - isPrimary
        - priceMinor
        - currency
        - quantity
        - createdAt
    CreateOrganizationCollectibleDto:
      type: object
      properties:
        collectionId:
          type: string
          format: uuid
        name:
          type: string
          minLength: 2
          maxLength: 120
        description:
          type: string
          maxLength: 1000
        imageUrl:
          type: string
          maxLength: 2048
        priceMinor:
          type: number
          minimum: 0
        currency:
          type: string
          example: USD
          minLength: 3
          maxLength: 3
        quantity:
          type: number
          minimum: 1
          maximum: 1000000
        usageLimit:
          type: number
          minimum: 1
          maximum: 1000000
        expiresAt:
          type: string
          format: date-time
        collectibleType:
          type: string
          enum:
            - ticket
            - voucher
            - gift_card
            - discount
          example: voucher
      required:
        - collectionId
        - name
        - priceMinor
        - currency
        - quantity
        - collectibleType
