openapi: 3.0.0
info:
  title: Comms Gatekeeper API
  version: 1.0.0
  description: |
    API documentation for the Comms Gatekeeper service.

    ## Overview

    The Comms Gatekeeper API is a comprehensive service that manages communications, voice chats, scene administration, and streaming access for the Decentraland metaverse. It provides the infrastructure for real-time voice communication, scene management, user moderation, and content streaming capabilities.

    ### Core Features

    **Scene Management**
    - Scene adapter connection for LiveKit voice chat rooms
    - Scene administration (add/remove admins)
    - Scene banning system for user moderation

    **Streaming Access**
    - Live streaming key management for scene content creators
    - RTMP streaming URL and key generation
    - Streaming access lifecycle management

    **Voice Communication**
    - Private voice chat sessions between users
    - Community voice chat with speaker management
    - Request-to-speak functionality for moderated discussions
    - Real-time participant management

    **User Management**
    - Private messages token generation
    - Privacy settings management
    - User ban management per scene
    - Scene access control

    ### Authentication

    The API supports three authentication methods:

    - **Signed Fetch (Scene)**: Used for scene-based requests from `decentraland-kernel-scene`
    - **Signed Fetch (Explorer)**: Used for explorer-based requests from `dcl:explorer`
    - **Bearer Token**: Used for service-to-service communication

    Most endpoints require Signed Fetch authentication with a complete identity header chain including scene metadata (sceneId, parcel, realmName).

    ### Base URLs

    - Production: `https://comms-gatekeeper.decentraland.org`
    - Development: `https://comms-gatekeeper.decentraland.zone`
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://comms-gatekeeper.decentraland.org
    description: Production server
  - url: https://comms-gatekeeper.decentraland.zone
    description: Development server
paths:
  /status:
    get:
      operationId: getStatus
      summary: Service status
      description: |
        Returns the current status of the service including version information,
        current timestamp, and commit hash.
        No authentication required.
      security: []
      responses:
        '200':
          description: Status retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_7
                  - version
                  - currentTime
                  - commitHash
                properties: &ref_8
                  version:
                    type: string
                    description: Current version of the service
                  currentTime:
                    type: integer
                    format: int64
                    description: Current timestamp in milliseconds
                  commitHash:
                    type: string
                    description: Git commit hash of the current deployment
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                type: object
                required: &ref_0
                  - error
                properties: &ref_1
                  error:
                    type: string
                    description: Error message describing what went wrong
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Health
  /get-scene-adapter:
    post:
      operationId: getSceneAdapter
      summary: Get scene communication adapter
      description: |
        Generates LiveKit credentials for a user to join a scene's communication room.
        This endpoint handles authentication, blacklist checking, scene ban verification,
        and generates appropriate permissions for the user.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Signed fetch request with scene and user information
      responses:
        '200':
          description: Scene adapter generated successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_9
                  - adapter
                properties: &ref_10
                  adapter:
                    type: string
                    description: LiveKit connection URL for the scene
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid authentication or blacklisted user
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '403':
          description: Forbidden - User is banned from this scene
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '404':
          description: Not found - Realm or scene not found
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Communications
  /scene-participants:
    get:
      operationId: getSceneParticipants
      summary: Get scene participants
      security: []
      description: |
        Retrieves the list of participant wallet addresses connected to a scene or world room.

        **Query Parameters:**
        - `pointer` + `realm_name`: For scene rooms (pointer is the base parcel, e.g., "-7,-2"). The scene ID is resolved from the catalyst. realm_name defaults to "main".
        - `realm_name` alone: Treated as a world name (e.g., "mycoolworld.dcl.eth")

        **Response:**
        Returns an array of wallet addresses (lowercase, 42 characters) of users currently connected to the room. Returns an empty array if the room doesn't exist or has no participants.
      parameters:
        - name: pointer
          in: query
          description: |
            Scene base parcel (e.g., "-7,-2"). The scene ID is resolved from the catalyst using this pointer.
            When provided, realm_name defaults to "main" if not specified.
          required: false
          schema:
            type: string
            pattern: ^-?\d{1,3},-?\d{1,3}$
        - name: realm_name
          in: query
          description: |
            When used with pointer: identifies the realm for scene rooms (default: "main").
            When used alone (without pointer): treated as a world name (must end with .dcl.eth).
          required: false
          schema:
            type: string
      responses:
        '200':
          description: Room participants retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                    example: true
                  data:
                    type: object
                    properties:
                      addresses:
                        type: array
                        items:
                          type: string
                          pattern: ^0x[a-fA-F0-9]{40}$
                        description: List of participant wallet addresses (lowercase)
                        example:
                          - '0x1234567890abcdef1234567890abcdef12345678'
        '400':
          description: Invalid request - must provide either world_name or (pointer + realm_name)
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '404':
          description: No scene found for the provided pointer
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Communications
  /scene-admin:
    get:
      operationId: listSceneAdmins
      summary: List scene administrators
      description: |
        Lists all administrators for a specific scene or world.
        Only scene owners or existing administrators can access this endpoint.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      parameters:
        - name: admin
          in: query
          required: false
          schema:
            type: string
          description: Filter by specific admin address
      responses:
        '200':
          description: Scene administrators retrieved successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  required: &ref_11
                    - admin
                    - name
                    - canBeRemoved
                  properties: &ref_12
                    admin:
                      type: string
                      description: ETH address of the admin
                    name:
                      type: string
                      description: Display name of the admin
                    canBeRemoved:
                      type: boolean
                      description: Whether this admin can be removed (false for land lease owners)
        '400':
          description: Invalid request parameters
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Authentication required or insufficient permissions
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Administration
    post:
      operationId: addSceneAdmin
      summary: Add scene administrator
      description: |
        Adds a new administrator to a scene or world.
        Only scene owners or existing administrators can add new administrators.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties: &ref_13
                admin:
                  type: string
                  description: ETH address of the admin to add
                name:
                  type: string
                  description: Decentraland name of the admin to add
      responses:
        '204':
          description: Scene administrator added successfully
        '400':
          description: Invalid request - Invalid admin address or user already has permissions
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Authentication required or insufficient permissions
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Administration
    delete:
      operationId: removeSceneAdmin
      summary: Remove scene administrator
      description: |
        Removes an administrator from a scene or world.
        Only scene owners or existing administrators can remove administrators.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties: &ref_14
                admin:
                  type: string
                  description: ETH address of the admin to add
      responses:
        '204':
          description: Scene administrator removed successfully
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Authentication required or insufficient permissions
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Administration
  /scene-bans:
    get:
      operationId: listSceneBans
      summary: List scene bans
      description: |
        Lists all banned users for a specific scene or world.
        Only scene owners or administrators can access this endpoint.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
          description: Number of bans per page
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
          description: Number of bans to skip
      responses:
        '200':
          description: Scene bans retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_16
                  - results
                  - total
                  - page
                  - pages
                  - limit
                properties: &ref_17
                  results:
                    type: array
                    items:
                      type: object
                      properties: &ref_15
                        bannedAddress:
                          type: string
                          description: ETH address of the banned user
                        name:
                          type: string
                          description: Name of the banned user
                  total:
                    type: integer
                    description: Total number of bans
                  page:
                    type: integer
                    description: Current page number
                  pages:
                    type: integer
                    description: Total number of pages
                  limit:
                    type: integer
                    description: Number of items per page
        '400':
          description: Invalid request parameters
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Authentication required
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Bans
    post:
      operationId: addSceneBan
      summary: Add scene ban
      description: |
        Bans a user from a specific scene or world.
        Only scene owners or administrators can ban users.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties: &ref_2
                banned_address:
                  type: string
                  description: ETH address of the user to ban
                banned_name:
                  type: string
                  description: Name of the user to ban
      responses:
        '204':
          description: User banned successfully
        '400':
          description: Invalid request - Invalid address or missing required fields
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Authentication required
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Bans
    delete:
      operationId: removeSceneBan
      summary: Remove scene ban
      description: |
        Removes a ban from a user for a specific scene or world.
        Only scene owners or administrators can remove bans.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties: *ref_2
      responses:
        '204':
          description: Ban removed successfully
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Authentication required
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Bans
  /scene-bans/addresses:
    get:
      operationId: listSceneBannedAddresses
      summary: List banned addresses
      description: |
        Lists all banned addresses for a specific scene or world.
        Only scene owners or administrators can access this endpoint.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      responses:
        '200':
          description: Banned addresses retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_18
                  - bannedAddresses
                properties: &ref_19
                  bannedAddresses:
                    type: array
                    items:
                      type: string
                    description: Array of banned ETH addresses
        '401':
          description: Unauthorized - Authentication required
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Bans
  /scene-stream-access:
    get:
      operationId: getSceneStreamAccess
      summary: List scene stream access
      description: |
        Lists streaming access information for a specific scene or world.
        Only scene owners or administrators can access this endpoint.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      responses:
        '200':
          description: Stream access information retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_3
                  - id
                  - place_id
                  - streaming_key
                  - streaming_url
                  - ingress_id
                  - created_at
                  - active
                  - streaming
                  - streaming_start_time
                properties: &ref_4
                  id:
                    type: string
                    description: Unique identifier of the stream access
                  place_id:
                    type: string
                    description: ID of the place
                  streaming_key:
                    type: string
                    description: Streaming key for the stream
                  streaming_url:
                    type: string
                    description: URL for the stream
                  ingress_id:
                    type: string
                    description: LiveKit ingress ID
                  created_at:
                    type: integer
                    format: int64
                    description: Timestamp when the access was created
                  active:
                    type: boolean
                    description: Whether the stream access is active
                  streaming:
                    type: boolean
                    description: Whether the stream is currently active
                  streaming_start_time:
                    type: integer
                    format: int64
                    description: Timestamp when streaming started
        '401':
          description: Unauthorized - Authentication required
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '404':
          description: Stream access not found
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Stream Access
    post:
      operationId: addSceneStreamAccess
      summary: Add scene stream access
      description: |
        Adds streaming access for a specific scene or world.
        Only scene owners or administrators can add stream access.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_20
                - streaming_url
                - streaming_key
                - ingress_id
              properties: &ref_21
                streaming_url:
                  type: string
                  description: URL for the stream
                streaming_key:
                  type: string
                  description: Streaming key for the stream
                ingress_id:
                  type: string
                  description: LiveKit ingress ID
      responses:
        '201':
          description: Stream access added successfully
          content:
            application/json:
              schema:
                type: object
                required: *ref_3
                properties: *ref_4
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Authentication required
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Stream Access
    delete:
      operationId: removeSceneStreamAccess
      summary: Remove scene stream access
      description: |
        Removes streaming access for a specific scene or world.
        Only scene owners or administrators can remove stream access.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      responses:
        '204':
          description: Stream access removed successfully
        '401':
          description: Unauthorized - Authentication required
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '404':
          description: Stream access not found
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Stream Access
    put:
      operationId: resetSceneStreamAccess
      summary: Reset scene stream access
      description: |
        Resets streaming access for a specific scene or world.
        This will stop any active streaming and reset the access configuration.
        Only scene owners or administrators can reset stream access.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      responses:
        '204':
          description: Stream access reset successfully
        '401':
          description: Unauthorized - Authentication required
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '404':
          description: Stream access not found
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Scene Stream Access
  /livekit-webhook:
    post:
      operationId: livekitWebhook
      summary: LiveKit webhook
      description: |
        Webhook endpoint for LiveKit events.
        This endpoint receives events from LiveKit when participants join/leave rooms,
        streaming starts/stops, etc.
        No authentication required - this is a webhook endpoint.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: LiveKit webhook payload (structure depends on webhook type)
              additionalProperties: true
      responses:
        '200':
          description: Webhook processed successfully
        '400':
          description: Invalid webhook payload
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Webhooks
  /private-messages/token:
    get:
      operationId: getPrivateMessagesToken
      summary: Get private messages token
      description: |
        Generates a LiveKit token for accessing private messages.
        This endpoint checks user privacy settings and generates appropriate credentials.
        Requires Signed Fetch authentication from dcl:explorer.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetchExplorer: []
      responses:
        '200':
          description: Private messages token generated successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_22
                  - adapter
                properties: &ref_23
                  adapter:
                    type: string
                    description: LiveKit connection URL for private messages
        '401':
          description: Unauthorized - Invalid authentication or blacklisted user
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Private Messages
  /users/{address}/private-messages-privacy:
    patch:
      operationId: updatePrivateMessagesPrivacy
      summary: Update user private messages privacy
      description: |
        Updates the privacy settings for a user's private messages.
        This affects who can send private messages to the user.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: address
          in: path
          required: true
          schema:
            type: string
          description: ETH address of the user
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_24
                - private_messages_privacy
              properties: &ref_25
                private_messages_privacy:
                  type: string
                  enum:
                    - all
                    - only_friends
                  description: Privacy setting for private messages
      responses:
        '204':
          description: Privacy settings updated successfully
        '400':
          description: Invalid request - Invalid address or privacy setting
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Private Messages
  /users/{address}/voice-chat-status:
    get:
      operationId: getUserVoiceChatStatus
      summary: Get user voice chat status
      description: |
        Checks if a user is currently in a voice chat.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: address
          in: path
          required: true
          schema:
            type: string
          description: ETH address of the user
      responses:
        '200':
          description: Voice chat status retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_5
                  - is_user_in_voice_chat
                properties: &ref_6
                  is_user_in_voice_chat:
                    type: boolean
                    description: Whether the user is currently in a voice chat
        '400':
          description: Invalid request - Invalid address
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Private Voice Chat
  /private-voice-chat:
    post:
      operationId: createPrivateVoiceChat
      summary: Create private voice chat
      description: |
        Creates a private voice chat room for two users.
        Generates LiveKit credentials for both users to join the room.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_26
                - user_addresses
                - room_id
              properties: &ref_27
                user_addresses:
                  type: array
                  items:
                    type: string
                  minItems: 2
                  maxItems: 2
                  description: Array of exactly 2 ETH addresses for the private voice chat
                room_id:
                  type: string
                  description: Unique identifier for the voice chat room
      responses:
        '200':
          description: Private voice chat created successfully
          content:
            application/json:
              schema:
                type: object
                additionalProperties: &ref_28
                  type: object
                  required:
                    - connection_url
                  properties:
                    connection_url:
                      type: string
                      description: LiveKit connection URL for the user
                description: Object with user addresses as keys and connection URLs as values
        '400':
          description: Invalid request - Invalid addresses or room ID
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Private Voice Chat
  /private-voice-chat/{id}:
    delete:
      operationId: deletePrivateVoiceChat
      summary: Delete private voice chat
      description: |
        Ends a private voice chat room.
        This will disconnect all participants from the room.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: Room ID of the private voice chat
      responses:
        '204':
          description: Private voice chat ended successfully
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '404':
          description: Private voice chat not found
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Private Voice Chat
  /users/{userAddress}/community-voice-chat-status:
    get:
      operationId: checkUserCommunityVoiceChatStatus
      summary: Check user community voice chat status
      description: |
        Checks if a user is currently in any community voice chat.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: userAddress
          in: path
          required: true
          schema:
            type: string
          description: ETH address of the user
      responses:
        '200':
          description: Community voice chat status retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: *ref_5
                properties: *ref_6
        '400':
          description: Invalid request - Invalid address
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
  /community-voice-chat:
    post:
      operationId: createOrJoinCommunityVoiceChat
      summary: Create or join community voice chat
      description: |
        Creates a new community voice chat or joins an existing one.
        The user's role in the community determines their permissions in the voice chat.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_32
                - community_id
                - user_address
                - action
              properties: &ref_33
                community_id:
                  type: string
                  description: ID of the community
                user_address:
                  type: string
                  description: ETH address of the user
                action:
                  type: string
                  enum: &ref_29
                    - create
                    - join
                    - request-to-speak
                    - promote-speaker
                    - demote-speaker
                    - kick-player
                  description: Action to perform in community voice chat
                user_role:
                  description: Role of the user in the community (defaults to none)
                  type: string
                  enum: &ref_30
                    - owner
                    - moderator
                    - member
                    - none
                profile_data:
                  description: Optional profile data for the user
                  type: object
                  properties: &ref_31
                    name:
                      type: string
                      description: Display name of the user
                    hasClaimedName:
                      type: boolean
                      description: Whether the user has claimed their name
                    profilePictureUrl:
                      type: string
                      description: URL of the user profile picture
      responses:
        '200':
          description: Community voice chat credentials generated successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_34
                  - connection_url
                properties: &ref_35
                  connection_url:
                    type: string
                    description: LiveKit connection URL for the community voice chat
        '400':
          description: Invalid request - Invalid community ID, address, or action
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
  /community-voice-chat/{communityId}/status:
    get:
      operationId: getCommunityVoiceChatStatus
      summary: Get community voice chat status
      description: |
        Gets the current status of a community voice chat including participant counts.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: communityId
          in: path
          required: true
          schema:
            type: string
          description: ID of the community
      responses:
        '200':
          description: Community voice chat status retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_36
                  - active
                  - participantCount
                  - moderatorCount
                properties: &ref_37
                  active:
                    type: boolean
                    description: Whether the community voice chat is active
                  participantCount:
                    type: integer
                    description: Number of participants in the voice chat
                  moderatorCount:
                    type: integer
                    description: Number of moderators in the voice chat
        '400':
          description: Invalid request - Invalid community ID
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
  /community-voice-chat/active:
    get:
      operationId: getAllActiveCommunityVoiceChats
      summary: Get all active community voice chats
      description: |
        Lists all currently active community voice chats.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      responses:
        '200':
          description: Active community voice chats retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_40
                  - activeChats
                  - total
                properties: &ref_41
                  activeChats:
                    type: array
                    items:
                      type: object
                      required: &ref_38
                        - communityId
                        - participantCount
                        - moderatorCount
                      properties: &ref_39
                        communityId:
                          type: string
                          description: ID of the community
                        participantCount:
                          type: integer
                          description: Number of participants in the voice chat
                        moderatorCount:
                          type: integer
                          description: Number of moderators in the voice chat
                  total:
                    type: integer
                    description: Total number of active community voice chats
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
  /community-voice-chat/status:
    post:
      operationId: getBulkCommunityVoiceChatStatus
      summary: Get bulk community voice chat status
      description: |
        Gets the status of multiple community voice chats in a single request.
        This endpoint is optimized for bulk queries and returns the status for all
        requested communities, including inactive ones.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_42
                - community_ids
              properties: &ref_43
                community_ids:
                  type: array
                  items:
                    type: string
                  description: Array of community IDs to get status for
                  example:
                    - community-1
                    - community-2
                    - community-3
                  minItems: 1
      responses:
        '200':
          description: Bulk community voice chat status retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_46
                  - data
                properties: &ref_47
                  data:
                    type: array
                    items:
                      type: object
                      required: &ref_44
                        - community_id
                        - active
                        - participant_count
                        - moderator_count
                      properties: &ref_45
                        community_id:
                          type: string
                          description: ID of the community
                        active:
                          type: boolean
                          description: Whether the community voice chat is active
                        participant_count:
                          type: integer
                          description: Number of participants in the voice chat
                        moderator_count:
                          type: integer
                          description: Number of moderators in the voice chat
                    description: Array of community voice chat statuses
        '400':
          description: Invalid request - Invalid community IDs or request format
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
  /community-voice-chat/{communityId}/users/{userAddress}/speak-request:
    post:
      operationId: requestToSpeak
      summary: Request to speak
      description: |
        Requests permission to speak in a community voice chat.
        Only listeners can request to speak.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: communityId
          in: path
          required: true
          schema:
            type: string
          description: ID of the community
        - name: userAddress
          in: path
          required: true
          schema:
            type: string
          description: ETH address of the user requesting to speak
      responses:
        '204':
          description: Speak request submitted successfully
        '400':
          description: Invalid request - Invalid community ID or address
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
    delete:
      operationId: rejectSpeakRequest
      summary: Reject speak request
      description: |
        Rejects a user's request to speak in a community voice chat.
        Only moderators can reject speak requests.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: communityId
          in: path
          required: true
          schema:
            type: string
          description: ID of the community
        - name: userAddress
          in: path
          required: true
          schema:
            type: string
          description: ETH address of the user whose speak request is being rejected
      responses:
        '204':
          description: Speak request rejected successfully
        '400':
          description: Invalid request - Invalid community ID or address
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
  /community-voice-chat/{communityId}/users/{userAddress}/speaker:
    post:
      operationId: promoteSpeaker
      summary: Promote to speaker
      description: |
        Promotes a user to speaker in a community voice chat.
        Only moderators can promote users to speakers.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: communityId
          in: path
          required: true
          schema:
            type: string
          description: ID of the community
        - name: userAddress
          in: path
          required: true
          schema:
            type: string
          description: ETH address of the user to promote
      responses:
        '204':
          description: User promoted to speaker successfully
        '400':
          description: Invalid request - Invalid community ID or address
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
    delete:
      operationId: demoteSpeaker
      summary: Demote from speaker
      description: |
        Demotes a speaker to listener in a community voice chat.
        Only moderators can demote speakers.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: communityId
          in: path
          required: true
          schema:
            type: string
          description: ID of the community
        - name: userAddress
          in: path
          required: true
          schema:
            type: string
          description: ETH address of the user to demote
      responses:
        '204':
          description: User demoted from speaker successfully
        '400':
          description: Invalid request - Invalid community ID or address
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
  /community-voice-chat/{communityId}/users/{userAddress}:
    delete:
      operationId: kickPlayer
      summary: Kick player from community voice chat
      description: |
        Kicks a player from a community voice chat.
        Only moderators can kick players.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: communityId
          in: path
          required: true
          schema:
            type: string
          description: ID of the community
        - name: userAddress
          in: path
          required: true
          schema:
            type: string
          description: ETH address of the user to kick
      responses:
        '204':
          description: Player kicked successfully
        '400':
          description: Invalid request - Invalid community ID or address
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
  /community-voice-chat/{communityId}:
    delete:
      operationId: endCommunityVoiceChat
      summary: End community voice chat
      description: |
        Ends a community voice chat, disconnecting all participants.
        Only moderators can end community voice chats.
        Requires Bearer Token authentication.
      security:
        - BearerAuth: []
      parameters:
        - name: communityId
          in: path
          required: true
          schema:
            type: string
          description: ID of the community
      responses:
        '204':
          description: Community voice chat ended successfully
        '400':
          description: Invalid request - Invalid community ID
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Community Voice Chat
  /cast/streamer-token:
    post:
      operationId: getStreamerToken
      summary: Get streamer token
      description: |
        Generates LiveKit credentials for a streamer to broadcast in a scene.
        This endpoint validates a streaming token and provides the necessary
        credentials for a streamer to connect to the LiveKit room and start streaming.
        No authentication required - uses streaming token for validation.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_48
                - token
                - identity
              properties: &ref_49
                token:
                  type: string
                  description: Streaming token for authentication
                identity:
                  type: string
                  description: Display name for the streamer
      responses:
        '200':
          description: Streamer token generated successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_50
                  - url
                  - token
                  - roomId
                  - identity
                properties: &ref_51
                  url:
                    type: string
                    description: LiveKit connection URL
                  token:
                    type: string
                    description: LiveKit JWT token for authentication
                  roomId:
                    type: string
                    description: LiveKit room ID
                  identity:
                    type: string
                    description: Unique internal identity for the streamer
        '400':
          description: Invalid request - Missing required fields
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Invalid or expired streaming token
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Cast 2.0
  /cast/watcher-token:
    post:
      operationId: getWatcherToken
      summary: Get watcher token
      description: |
        Generates LiveKit credentials for a watcher to view streams in a location.
        This endpoint allows users to join as viewers in a specific location (parcel or world)
        and watch active streams. No authentication required.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_52
                - location
                - identity
              properties: &ref_53
                location:
                  type: string
                  description: Location (parcel coordinates or world name)
                  example: 20,-4
                identity:
                  type: string
                  description: Display name for the watcher
      responses:
        '200':
          description: Watcher token generated successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_54
                  - url
                  - token
                  - roomId
                  - identity
                properties: &ref_55
                  url:
                    type: string
                    description: LiveKit connection URL
                  token:
                    type: string
                    description: LiveKit JWT token for authentication
                  roomId:
                    type: string
                    description: LiveKit room ID
                  identity:
                    type: string
                    description: Unique internal identity for the watcher
                  placeName:
                    type: string
                    description: Name of the place being watched
        '400':
          description: Invalid request - Missing required fields
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - No active stream found for location
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Cast 2.0
  /cast/generate-stream-link:
    get:
      operationId: generateStreamLink
      summary: Generate stream link
      description: |
        Generates a unique stream link for a scene that allows streamers to broadcast
        and watchers to view the stream. Only scene administrators can generate stream links.
        The generated link expires after 4 days.
        Requires Signed Fetch authentication from decentraland-kernel-scene.
        Must include the complete identity header chain: x-identity-auth-chain-0, x-identity-auth-chain-1, x-identity-auth-chain-2, x-identity-timestamp, and x-identity-metadata.
      security:
        - SignedFetch: []
      responses:
        '200':
          description: Stream link generated successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_56
                  - streamLink
                  - watcherLink
                  - streamingKey
                  - placeId
                  - placeName
                  - expiresAt
                  - expiresInDays
                properties: &ref_57
                  streamLink:
                    type: string
                    description: URL for streamers to access the stream
                  watcherLink:
                    type: string
                    description: URL for watchers to access the stream
                  streamingKey:
                    type: string
                    description: Unique streaming key for authentication
                  placeId:
                    type: string
                    description: ID of the place
                  placeName:
                    type: string
                    description: Name of the place
                  expiresAt:
                    type: string
                    format: date-time
                    description: Expiration timestamp in ISO format
                  expiresInDays:
                    type: integer
                    description: Number of days until expiration
        '400':
          description: Invalid request - Missing required fields or invalid scene data
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '401':
          description: Unauthorized - Authentication required or insufficient permissions
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Cast 2.0
  /cast/stream-info/{streamingKey}:
    get:
      operationId: getStreamInfo
      summary: Get stream information
      description: |
        Retrieves information about a stream using its streaming key.
        This endpoint provides details about the place, location, and stream status.
        No authentication required.
      security: []
      parameters:
        - name: streamingKey
          in: path
          required: true
          schema:
            type: string
          description: Streaming key for the stream
      responses:
        '200':
          description: Stream information retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required: &ref_58
                  - placeName
                  - placeId
                  - location
                  - isWorld
                properties: &ref_59
                  placeName:
                    type: string
                    description: Name of the place
                  placeId:
                    type: string
                    description: ID of the place
                  location:
                    type: string
                    description: Location identifier (world name or parcel coordinates)
                  isWorld:
                    type: boolean
                    description: Whether this is a world or a parcel
        '400':
          description: Invalid request - Invalid streaming key
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '404':
          description: Stream not found or expired
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                required: *ref_0
                properties: *ref_1
      tags:
        - Cast 2.0
components:
  securitySchemes:
    SignedFetch:
      type: apiKey
      in: header
      name: x-identity
      description: |
        Signed Fetch authentication for scene-based requests.
        Requires a chain of identity headers:
        - x-identity-auth-chain-0: Signer information
        - x-identity-auth-chain-1: Ephemeral key information  
        - x-identity-auth-chain-2: Signed entity information
        - x-identity-timestamp: Request timestamp
        - x-identity-metadata: Request metadata
        Used for authentication from decentraland-kernel-scene.
    SignedFetchExplorer:
      type: apiKey
      in: header
      name: x-identity
      description: |
        Signed Fetch authentication for Explorer-based requests.
        Requires a chain of identity headers:
        - x-identity-auth-chain-0: Signer information
        - x-identity-auth-chain-1: Ephemeral key information  
        - x-identity-auth-chain-2: Signed entity information
        - x-identity-timestamp: Request timestamp
        - x-identity-metadata: Request metadata
        Used for authentication from dcl:explorer.
    BearerAuth:
      type: http
      scheme: bearer
      description: |
        Bearer token authentication for service-to-service communication.
  schemas:
    StatusResponse:
      type: object
      required: *ref_7
      properties: *ref_8
    ErrorResponse:
      type: object
      required: *ref_0
      properties: *ref_1
    SceneAdapterResponse:
      type: object
      required: *ref_9
      properties: *ref_10
    SceneAdmin:
      type: object
      required: *ref_11
      properties: *ref_12
    AddSceneAdminRequest:
      type: object
      properties: *ref_13
    RemoveSceneAdminRequest:
      type: object
      properties: *ref_14
    SceneBan:
      type: object
      properties: *ref_15
    ListSceneBansResponse:
      type: object
      required: *ref_16
      properties: *ref_17
    AddSceneBanRequest:
      type: object
      properties: *ref_2
    SceneBannedAddressesResponse:
      type: object
      required: *ref_18
      properties: *ref_19
    SceneStreamAccess:
      type: object
      required: *ref_3
      properties: *ref_4
    AddSceneStreamAccessRequest:
      type: object
      required: *ref_20
      properties: *ref_21
    LivekitWebhookRequest:
      type: object
      description: LiveKit webhook payload (structure depends on webhook type)
      additionalProperties: true
    PrivateMessagesTokenResponse:
      type: object
      required: *ref_22
      properties: *ref_23
    UpdatePrivateMessagesPrivacyRequest:
      type: object
      required: *ref_24
      properties: *ref_25
    VoiceChatStatusResponse:
      type: object
      required: *ref_5
      properties: *ref_6
    CreatePrivateVoiceChatRequest:
      type: object
      required: *ref_26
      properties: *ref_27
    CreatePrivateVoiceChatResponse:
      type: object
      additionalProperties: *ref_28
      description: Object with user addresses as keys and connection URLs as values
    CommunityVoiceChatAction:
      type: string
      enum: *ref_29
      description: Action to perform in community voice chat
    CommunityRole:
      type: string
      enum: *ref_30
      description: Role of the user in the community
    CommunityVoiceChatUserProfileMetadata:
      type: object
      properties: *ref_31
    CommunityVoiceChatRequest:
      type: object
      required: *ref_32
      properties: *ref_33
    CommunityVoiceChatResponse:
      type: object
      required: *ref_34
      properties: *ref_35
    CommunityVoiceChatStatusResponse:
      type: object
      required: *ref_36
      properties: *ref_37
    ActiveCommunityVoiceChat:
      type: object
      required: *ref_38
      properties: *ref_39
    GetAllActiveCommunityVoiceChatsResponse:
      type: object
      required: *ref_40
      properties: *ref_41
    GetBulkCommunityVoiceChatStatusRequest:
      type: object
      required: *ref_42
      properties: *ref_43
    CommunityVoiceChatStatus:
      type: object
      required: *ref_44
      properties: *ref_45
    GetBulkCommunityVoiceChatStatusResponse:
      type: object
      required: *ref_46
      properties: *ref_47
    StreamerTokenRequest:
      type: object
      required: *ref_48
      properties: *ref_49
    StreamerTokenResponse:
      type: object
      required: *ref_50
      properties: *ref_51
    WatcherTokenRequest:
      type: object
      required: *ref_52
      properties: *ref_53
    WatcherTokenResponse:
      type: object
      required: *ref_54
      properties: *ref_55
    GenerateStreamLinkResponse:
      type: object
      required: *ref_56
      properties: *ref_57
    StreamInfoResponse:
      type: object
      required: *ref_58
      properties: *ref_59
