Kumospace Users API

The Users API from Kumospace — 26 operation(s) for users.

OpenAPI Specification

kumospace-users-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: '@kumo/api Account Users API'
  contact: {}
servers:
- url: /
tags:
- name: Users
paths:
  /v1/spaces/{name}/userRoles:
    put:
      operationId: SetUserRole
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiUserRole'
      description: Updates a user's role within the specified space.
      summary: Update a user role.
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: name
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiUpdateUserRoleRequest'
    get:
      operationId: GetUserRoles
      responses:
        '200':
          description: A paginated list of users by role.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedResponse_ApiUserRole_'
      description: Get a paginated list of users by role.
      summary: Get user roles.
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - description: The space.
        in: path
        name: name
        required: true
        schema:
          type: string
      - description: Return users having this role.  If unspecified, returns all users.
        in: query
        name: role
        required: false
        schema: {}
      - description: An opaque cursor used to request the next page of results.  It is provided in the previous response from the api.
        in: query
        name: next
        required: false
        schema:
          type: string
      - description: if specified, returns the spaceMetadata for each userRole
        in: query
        name: includeSpaceMetadata
        required: false
        schema:
          type: boolean
      - description: 'The maximum number of results to return.  max: 30'
        in: query
        name: limit
        required: false
        schema:
          default: 30
          format: int32
          type: integer
          maximum: 30
          minimum: 1
  /v1/spaces/{name}/userRoles/bulk:
    put:
      operationId: SetUserRoleBulk
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                items:
                  $ref: '#/components/schemas/ApiUserRole'
                type: array
      description: Updates multuiple users' roles within the specified space.
      summary: Update users roles in bulk.
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: name
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              items:
                $ref: '#/components/schemas/ApiUpdateUserRoleRequest'
              type: array
  /v1/spaces/{name}/floorRoles:
    put:
      operationId: SetFloorRoles
      responses:
        '204':
          description: No content
      description: Updates an existing space's floor roles. Can only be called by the owner of the space or admins.
      summary: Updates an existing space's floor roles.
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - description: The name of the space.
        in: path
        name: name
        required: true
        schema:
          type: string
      requestBody:
        description: the roles by floor for the user
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiUpdateSpaceFloorRolesRequest'
              description: the roles by floor for the user
  /v1/spaces/{name}/userRole:
    get:
      operationId: GetUserRoleById
      responses:
        '200':
          description: Role information for a single user.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiUserRole'
      description: Get a role information for a single user from their firebase UID
      summary: Get a user role by firebaseID.
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - description: The space.
        in: path
        name: name
        required: true
        schema:
          type: string
      - description: The requested user's firebase UID.
        in: query
        name: userId
        required: true
        schema:
          type: string
  /v1/users/me/recentSpaces:
    get:
      operationId: GetUserRecentSpaces
      responses:
        '200':
          description: A paginated list of users recently visited spaces
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedResponse_ApiRecentlyVisitedSpace_'
      description: Get a paginated list of the users recently visited spaces
      summary: Get user recently visited spaces.
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: query
        name: limit
        required: false
        schema:
          default: 30
          format: double
          type: number
      - in: query
        name: excludeDemo
        required: false
        schema:
          type: boolean
  /v1/users/me/recentSpaces/{name}:
    get:
      operationId: GetUserRecentSpace
      responses:
        '200':
          description: Info about a user's recently visited space
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiRecentlyVisitedSpace'
      description: Get info about a user's recently visted space
      summary: Get info about a user's recently visited space.
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: name
        required: true
        schema:
          type: string
  /v1/users/me/defaultSpace:
    get:
      operationId: GetUserDefaultSpace
      responses:
        '200':
          description: The name of the user's default space
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDefaultSpaceResponse'
      description: Get the default space for the user that should be auto joined on desktop
      summary: Get user default space.
      tags:
      - Users
      security:
      - firebase: []
      parameters: []
  /v1/users/fcmToken:
    post:
      operationId: AddFcmToken
      responses:
        '204':
          description: No content
      summary: Mobile users will send their FCM token for us to send push notifs
      tags:
      - Users
      security:
      - firebase: []
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiFcmTokenRequest'
  /v1/users/fcmToken/{fcmToken}:
    delete:
      operationId: RemoveFcmToken
      responses:
        '204':
          description: No content
      summary: 'De-associate FCM token from user when they logout of mobile

        This is to prevent users from sharing fcm tokens when logging in/out of one device'
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: fcmToken
        required: true
        schema:
          type: string
  /v1/userInvitations/space/{spaceName}:
    get:
      operationId: GetInvitationsForSpace
      responses:
        '200':
          description: A list of all invitations sent for a certain space
          content:
            application/json:
              schema:
                items:
                  $ref: '#/components/schemas/UserInvitation'
                type: array
      description: Get a list of all invitations for a certain space
      summary: Get all invitations sent for a certain space
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: spaceName
        required: true
        schema:
          type: string
  /v1/invitations/{id}:
    get:
      operationId: GetExpiringInviteInfo
      responses:
        '200':
          description: the expiring invitation object
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DbExpiringInvitation'
      summary: Get expiring invitation details for the given id
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: id
        required: true
        schema:
          type: string
  /v1/invitations:
    post:
      operationId: CreateExpiringInvitation
      responses:
        '200':
          description: the expiring invitation object
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DbExpiringInvitation'
      summary: Create an expiring guest invitation
      tags:
      - Users
      security:
      - firebase: []
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiCreateExpiringInvitationRequest'
  /v1/userInvitations:
    post:
      operationId: CreateUserInvitation
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiCreateUserInvitationResponse'
      summary: Create and send a user invitation
      tags:
      - Users
      security:
      - firebase: []
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiCreateUserInvitationRequest'
  /v1/userInvitations/{invitationId}:
    put:
      operationId: UpdateUserInvitation
      responses:
        '204':
          description: No content
      summary: Create and send a user invitation
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: invitationId
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiUpdateUserInvitation'
    delete:
      operationId: DeleteUserInvitation
      responses:
        '204':
          description: No content
      summary: Delete a user invitation
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: invitationId
        required: true
        schema:
          type: string
  /v1/userInvitations/bulk:
    post:
      operationId: CreateUserInvitationsBulk
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiCreateUserInvitationBulk'
      summary: Create and send bulk user invitations
      tags:
      - Users
      security:
      - firebase: []
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiCreateUserInvitationBulkRequest'
  /v1/userInvitations/{invitationId}/resend:
    post:
      operationId: ResendInviteEmail
      responses:
        '204':
          description: No content
      summary: Resend
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: invitationId
        required: true
        schema:
          type: string
  /v1/users/me/profile/form:
    post:
      operationId: SaveUserIntakeProfileForm
      responses:
        '204':
          description: No content
      summary: 'Saves onboarding intake form for the user. This form will

        answer questions like who they are in their company and what they plan

        to do with Kumospace more deeply'
      tags:
      - Users
      security:
      - firebase: []
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiUserIntakeProfileForm'
  /v1/users/me/profile/form/{spaceName}/response-required:
    get:
      operationId: GetUserIntakeProfileFormStatus
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiIntakeFormStatusResponse'
      summary: Gets onboarding intake form for the user.
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: spaceName
        required: true
        schema:
          type: string
  /v1/users/me/profile/{spaceName}:
    put:
      operationId: UpdateUserProfile
      responses:
        '204':
          description: No content
      description: Update a user's profile for a space
      summary: Updates a user's space-specific profile information
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: spaceName
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DbUserSpaceProfile'
  /v1/users/me:
    put:
      operationId: UpdateUser
      responses:
        '204':
          description: No content
      description: Update a user
      summary: Updates a user's information
      tags:
      - Users
      security:
      - firebase: []
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiUpdateUserRequest'
  /v1/users/{userId}/publicInfo:
    get:
      operationId: GetUserPublicInfo
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiUserPublicInfo'
      summary: Gets a user's public information
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: userId
        required: true
        schema:
          type: string
  /v1/users/{userId}/hipaaCompliant:
    get:
      operationId: IsUserHipaaCompliant
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: boolean
      summary: Checks if a the user is a owner/member of a HIPAA space
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: userId
        required: true
        schema:
          type: string
  /v1/users/me/spaces/{spaceName}/kiosks:
    get:
      operationId: GetSeenKiosks
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                items:
                  type: string
                type: array
      description: Get user seen kiosks
      summary: Get which kiosks a user has seen in a given space
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: spaceName
        required: true
        schema:
          type: string
    put:
      operationId: UpdateSeenKiosks
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                items:
                  type: string
                type: array
      description: Update user seen kiosks
      summary: Update which kiosks a user has seen in a given space
      tags:
      - Users
      security:
      - firebase: []
      parameters:
      - in: path
        name: spaceName
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApiUpdateSeenKiosksRequest'
  /v1/users/me/sendVerificationEmail:
    post:
      operationId: SendVerificationEmail
      responses:
        '204':
          description: No content
      summary: Send verification email for user.
      tags:
      - Users
      security:
      - firebase: []
      parameters: []
  /v1/users/me/bugReport:
    post:
      operationId: HandleBugReport
      responses:
        '204':
          description: No content
      tags:
      - Users
      deprecated: true
      security:
      - firebase: []
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserFeedbackEvent'
  /v1/users/me/feedback:
    post:
      operationId: HandleUserFeedback
      responses:
        '204':
          description: No content
      tags:
      - Users
      security:
      - firebase: []
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserFeedbackEvent'
components:
  schemas:
    Email:
      type: string
      description: Pattern for email
      pattern: ^[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$
    UserFeedbackEvent:
      properties:
        type:
          type: string
          enum:
          - bugReport
          - featureRequest
        event_id:
          type: string
        name:
          type: string
        email:
          type: string
        comments:
          type: string
      required:
      - type
      - event_id
      - name
      - email
      - comments
      type: object
      additionalProperties: false
    DbInviteStatus:
      enum:
      - pending
      - error
      - completed
      type: string
    UserRole:
      description: The user's role and permissions within a space.
      enum:
      - admin
      - banned
      - cohost
      - guest
      - member
      - floorManager
      type: string
    ExpiryDuration.hour:
      enum:
      - hour
      type: string
    PaginatedResponse_ApiUserRole_:
      description: A page of items.  Useful for breaking up a large dataset into smaller chunks.
      properties:
        items:
          items:
            $ref: '#/components/schemas/ApiUserRole'
          type: array
          description: The page of items.
        metadata:
          properties:
            count:
              type: number
              format: double
              description: The number of items sent.
            next:
              type: string
              description: 'A pagination cursor.  If specified, there is another page of results that

                can be requested by appending this value as a query parameter called

                "next".'
          required:
          - count
          type: object
          description: 'Metadata about the page of items.  Contains a pagination cursor called

            "next" if there is another page of items.'
      required:
      - items
      - metadata
      type: object
      additionalProperties: false
    ApiUserIntakeProfileFormOthers:
      properties:
        companyName:
          type: string
        marketingSource:
          type: string
        useGoal:
          type: string
        currentRole:
          type: string
        workKind:
          type: string
        companySize:
          type: string
        relatedSpaceName:
          type: string
      required:
      - marketingSource
      - currentRole
      - workKind
      - companySize
      type: object
    ApiCreateUserInvitationResponse:
      properties:
        isAccepted:
          type: boolean
          description: Whether the invite has already been accepted
        displayName:
          type: string
        email:
          type: string
        userId:
          type: string
        role:
          $ref: '#/components/schemas/UserRole'
        inviteId:
          type: string
      required:
      - isAccepted
      - email
      - userId
      - role
      - inviteId
      type: object
    DbRecentlyVisitedSpace:
      properties:
        kiosks:
          items:
            type: string
          type: array
        profile:
          $ref: '#/components/schemas/DbUserSpaceProfile'
        lastRoomId:
          type: string
        cachedSpaceName:
          type: string
        timeZone:
          type: string
        lastSeenAt:
          type: number
          format: double
        visitedAt:
          type: number
          format: double
      type: object
    PaginatedResponse_ApiRecentlyVisitedSpace_:
      description: A page of items.  Useful for breaking up a large dataset into smaller chunks.
      properties:
        items:
          items:
            $ref: '#/components/schemas/ApiRecentlyVisitedSpace'
          type: array
          description: The page of items.
        metadata:
          properties:
            count:
              type: number
              format: double
              description: The number of items sent.
            next:
              type: string
              description: 'A pagination cursor.  If specified, there is another page of results that

                can be requested by appending this value as a query parameter called

                "next".'
          required:
          - count
          type: object
          description: 'Metadata about the page of items.  Contains a pagination cursor called

            "next" if there is another page of items.'
      required:
      - items
      - metadata
      type: object
      additionalProperties: false
    ApiUserPublicInfo:
      properties:
        displayName:
          type: string
        avatarUrl:
          type: string
      required:
      - displayName
      type: object
      additionalProperties: false
    ClientUserRole:
      anyOf:
      - $ref: '#/components/schemas/UserRole'
      - type: string
        enum:
        - owner
    ApiDefaultSpaceResponse:
      properties:
        defaultSpace:
          type: string
      type: object
    ApiUpdateSpaceFloorRolesRequest:
      description: A request to update an existing space's floor roles for a user.
      properties:
        userId:
          type: string
        roles:
          properties: {}
          additionalProperties:
            $ref: '#/components/schemas/FloorRole'
          type: object
      required:
      - userId
      - roles
      type: object
      additionalProperties: false
    ApiUserIntakeProfileFormFriendsAndFamily:
      properties:
        marketingSource:
          type: string
        useGoal:
          type: string
        expectedGuests:
          type: string
        intendedUse:
          type: string
        relatedSpaceName:
          type: string
      required:
      - marketingSource
      - useGoal
      - expectedGuests
      - intendedUse
      type: object
    firestore.Timestamp:
      description: 'A Timestamp represents a point in time independent of any time zone or

        calendar, represented as seconds and fractions of seconds at nanosecond

        resolution in UTC Epoch time. It is encoded using the Proleptic Gregorian

        Calendar which extends the Gregorian calendar backwards to year one. It is

        encoded assuming all minutes are 60 seconds long, i.e. leap seconds are

        "smeared" so that no leap second table is needed for interpretation. Range

        is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.'
      properties:
        seconds:
          type: number
          format: double
          description: The number of seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z.
        nanoseconds:
          type: number
          format: double
          description: The non-negative fractions of a second at nanosecond resolution.
      required:
      - seconds
      - nanoseconds
      type: object
      additionalProperties: false
    ApiUserIntakeProfileForm:
      anyOf:
      - $ref: '#/components/schemas/ApiUserIntakeProfileFormEducation'
      - $ref: '#/components/schemas/ApiUserIntakeProfileFormFriendsAndFamily'
      - $ref: '#/components/schemas/ApiUserIntakeProfileFormOthers'
      - $ref: '#/components/schemas/ApiUserIntakeProfileFormEvents'
    UserInvitationEmailSend:
      properties:
        senderUid:
          type: string
        sentAt:
          allOf:
          - $ref: '#/components/schemas/firestore.Timestamp'
          nullable: true
        id:
          type: string
      required:
      - senderUid
      - sentAt
      - id
      type: object
    ApiUpdateUserRequest:
      properties:
        defaultSpace:
          type: string
          description: The space the user wants to automatically join in the desktop app.
        displayName:
          type: string
          description: The user's display name.
          minLength: 1
      type: object
    ExpiryDuration.week:
      enum:
      - week
      type: string
    ApiIntakeFormStatusResponse:
      properties:
        needsToAnswer:
          type: boolean
      required:
      - needsToAnswer
      type: object
    DbUserSpaceProfile:
      properties:
        description:
          type: string
        jobTitle:
          type: string
        phoneNumber:
          type: string
        name:
          type: string
      type: object
    ExpiryDuration.oneMonth:
      enum:
      - oneMonth
      type: string
    ApiRecentlyVisitedSpace:
      allOf:
      - $ref: '#/components/schemas/DbRecentlyVisitedSpace'
      - properties:
          spaceId:
            type: string
        required:
        - spaceId
        type: object
    ApiCreateExpiringInvitationRequest:
      properties:
        expiringTimeSelected:
          $ref: '#/components/schemas/ValidExpiryDuration'
          description: The duration the link will be active, in english
        zoneId:
          type: string
          description: If specified, invitation will direct user into the given zone
        roomId:
          type: string
          description: If specified, invitation will direct user into the given room
        spaceName:
          type: string
          description: The space name
      required:
      - expiringTimeSelected
      - spaceName
      type: object
    ApiUserIntakeProfileFormEvents:
      properties:
        marketingSource:
          type: string
        workKind:
          type: string
        eventType:
          type: string
        expectedGuests:
          type: string
        relatedSpaceName:
          type: string
      required:
      - marketingSource
      - workKind
      - eventType
      - expectedGuests
      type: object
    ExpiryDuration.day:
      enum:
      - day
      type: string
    FloorRole:
      enum:
      - floorManager
      type: string
    ApiUpdateUserRoleRequest:
      allOf:
      - properties:
          role:
            $ref: '#/components/schemas/UserRole'
            description: The new role.
        required:
        - role
        type: object
      - anyOf:
        - properties:
            userId:
              type: string
              description: The user's firebase id.
              minLength: 1
          required:
          - userId
          type: object
        - properties:
            email:
              $ref: '#/components/schemas/Email'
              description: The user's email address.
          required:
          - email
          type: object
      description: A request to update a user's role within a space.
    CustomerIoMessageStatus:
      enum:
      - drafted
      - queued
      - attempted
      - failed
      - sent
      - opened
      - clicked
      - converted
      - bounced
      - suppressed
      - spammed
      - unsubscribed
      type: string
    ApiCreateUserInvitationRequest:
      properties:
        floorRoles:
          properties: {}
          additionalProperties:
            $ref: '#/components/schemas/FloorRole'
          type: object
          description: An optional map of the user's floor roles by floor id
        role:
          $ref: '#/components/schemas/UserRole'
          description: The user's role
        spaceName:
          type: string
          description: The space name
          minLength: 6
          maxLength: 20
          pattern: ^[0-9a-z\-_]{6,20}$
        email:
          $ref: '#/components/schemas/Email'
          description: The email of the user being invited
      required:
      - role
      - spaceName
      - email
      type: object
    ApiUpdateUserInvitation:
      properties:
        role:
          $ref: '#/components/schemas/UserRole'
      required:
      - role
      type: object
    ApiFcmTokenRequest:
      properties:
        fcmToken:
          type: string
          description: The fcm token for one of the user's mobile devices
      required:
      - fcmToken
      type: object
    DbExpiringInvitation:
      properties:
        expiringTimeSelected:
          $ref: '#/components/schemas/ValidExpiryDuration'
        expiresAt:
          type: number
          format: double
        createdAt:
          type: number
          format: double
        creatorId:
          type: string
        zoneId:
          type: string
        roomId:
          type: string
        spaceName:
          type: string
        id:
          type: string
      required:
      - expiringTimeSelected
      - expiresAt
      - createdAt
      - creatorId
      - spaceName
      - id
      type: object
    ExpiryDuration.twoWeeks:
      enum:
      - twoWeeks
      type: string
    ApiUserRole:
      properties:
        spaceMetadata:
          $ref: '#/components/schemas/SpaceMetadata'
        role:
          $ref: '#/components/schemas/ClientUserRole'
        avatarUrl:
          type: string
        displayName:
          type: string
        email:
          type: string
        userId:
          type: string
      required:
      - role
      - userId
      type: object
    ApiUserIntakeProfileFormEducation:
      properties:
        marketingSource:
          type: string
        useGoal:
          type: string
        currentRole:
          type: string
        relatedSpaceName:
          type: string
      required:
      - marketingSource
      - useGoal
      - currentRole
      type: object
    ApiCreateUserInvitationBulk:
      properties:
        invitations:
          items:
            $ref: '#/components/schemas/ApiCreateUserInvitationResponse'
          type: array
      required:
      - invitations
      type: object
    ValidExpiryDuration:
      anyOf:
      - $ref: '#/components/schemas/ExpiryDuration.hour'
      - $ref: '#/components/schemas/ExpiryDuration.day'
      - $ref: '#/components/schemas/ExpiryDuration.week'
      - $ref: '#/components/schemas/ExpiryDuration.twoWeeks'
      - $ref: '#/components/schemas/ExpiryDuration.oneMonth'
    ApiCreateUserInvitationBulkRequest:
      properties:
        usedCsv:
          type: boolean
          description: Whether the source of the emails was a CSV or not
        spaceName:
          type: string
          description: The space name
          minLength: 6
          maxLength: 20
          pattern: ^[0-9a-z\-_]{6,20}$
        emails:
          items:
            $ref: '#/components/schemas/Email'
          type: array
          description: List of email(s)
          minLength: 1
          maxLength: 2000
      required:
      - usedCsv
      - spaceName
      - emails
      type: object
    ApiUpdateSeenKiosksRequest:
      properties:
        seenKiosks:
          items:
            type: string
          type: array
          description: List of kiosk types to add into the user's seen kiosks list
      required:
      - seenKiosks
      type: object
    SpaceMetadata:
      $ref: '#/components/schemas/DbRecentlyVisitedSpace'
    UserInvitation:
      properties:
        usedCsv:
          type: boolean
        isBulk:
          type: boolean
        isDeleted:
          type: boolean
        createdAt:
          $ref: '#/components/schemas/firestore.Timestamp'
        acceptedAt:
          

# --- truncated at 32 KB (33 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kumospace/refs/heads/main/openapi/kumospace-users-api-openapi.yml