openapi: 3.0.3
info:
  title: Decentraland Worlds Content Server API
  version: 1.0.0
  description: |
    ## Overview

    The Decentraland Worlds Content Server is a specialized content server that enables users to deploy and manage isolated 3D scenes outside of Genesis City. Each World is a self-contained scene linked to a Decentraland NAME (ENS or DCL domain), providing a personal metaverse space accessible through the Decentraland Explorer.

    ### Key Features

    - **Deploy Scenes**: Upload and manage 3D scenes with full metadata and assets
    - **Access Control**: Configure permissions for deployment, access, and streaming
    - **Content Management**: Store and retrieve scene assets via IPFS-compatible content addressing
    - **Live Data**: Real-time information about active worlds and connected users
    - **Multi-user Support**: Built-in communications adapter integration (LiveKit, WebRTC)

    ### Authentication

    Most write operations require **Signed Fetch** authentication (ADR-44). This involves signing requests with an Ethereum wallet to prove ownership of the world's NAME. Read operations are generally public and don't require authentication.

    ### Getting Started

    1. Acquire a Decentraland NAME (ENS domain like `myname.eth` or DCL name like `myname.dcl.eth`)
    2. Deploy your scene using the `/entities` endpoint with signed authentication
    3. Configure access permissions via `/world/{world_name}/permissions` endpoints
    4. Access your world using the Decentraland Client and running the chat command `/world {your-name}.dcl.eth` or (DEPRECATED) with the web client `https://play.decentraland.org/?realm={your-name}.dcl.eth`

    ### Content Addressing

    All content is addressed by IPFS CIDv1 hashes (e.g., `bafkreiabc123...`). Content is immutable and content-addressed, ensuring integrity and enabling efficient caching and distribution.
  contact:
    name: Decentraland Foundation
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
  - url: https://worlds-content-server.decentraland.org
    description: Production server
  - url: https://worlds-content-server.decentraland.zone
    description: Development server
  - url: http://localhost:3000
    description: Local development server
security:
  - SignedFetch: []
tags:
  - name: Content Server
    description: API endpoints for Decentraland Worlds Content Server
paths:
  /world/{world_name}/about:
    get:
      tags:
        - Content Server
      summary: /world/{world_name}/about
      description: Returns detailed information about a deployed world including scene configuration, comms adapter, and status
      operationId: worldsContentServer_getWorldAbout
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world (e.g., my-name.dcl.eth)
          schema:
            type: string
            example: my-name.dcl.eth
      responses:
        '200':
          description: World information retrieved successfully
          content:
            application/json:
              schema:
                type: object
                description: Detailed information about a world
                properties: &ref_13
                  healthy:
                    type: boolean
                    description: Overall health status
                  acceptingUsers:
                    type: boolean
                    description: Whether the world is accepting new users
                  configurations:
                    type: object
                    properties:
                      networkId:
                        type: integer
                        description: Ethereum network chain ID
                      globalScenesUrn:
                        type: array
                        items:
                          type: string
                        description: URNs of global scenes
                      scenesUrn:
                        type: array
                        items:
                          type: string
                        description: URNs of world scenes
                      realmName:
                        type: string
                        description: Display name of the realm
                      minimap:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          dataImage:
                            type: string
                          estateImage:
                            type: string
                      map:
                        type: object
                        properties:
                          minimapEnabled:
                            type: boolean
                          sizes:
                            type: array
                            items:
                              type: array
                              items:
                                type: integer
                      skybox:
                        type: object
                        properties:
                          fixedHour:
                            type: number
                            nullable: true
                          textures:
                            type: array
                            items:
                              type: string
                  content:
                    type: object
                    properties:
                      synchronizationStatus:
                        type: string
                      healthy:
                        type: boolean
                      publicUrl:
                        type: string
                  lambdas:
                    type: object
                    properties:
                      healthy:
                        type: boolean
                      publicUrl:
                        type: string
                  comms:
                    type: object
                    properties:
                      healthy:
                        type: boolean
                      protocol:
                        type: string
                      adapter:
                        type: string
        '404':
          description: World not found
          content:
            application/json:
              schema:
                type: object
                properties: &ref_0
                  error:
                    type: string
                    description: Error type
                  message:
                    type: string
                    description: Error message
  /world/{world_name}/scenes:
    get:
      tags:
        - Content Server
      summary: GET /world/{world_name}/scenes
      description: |
        Browse scenes in a world. Use query params for filtering and pagination.
        - **Query (x1, x2, y1, y2)**: Bounding box. When provided, all four must be set.
        - **Query (limit, offset)**: Pagination (defaults: limit 100, offset 0).
      operationId: worldsContentServer_getWorldScenes
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
        - name: x1
          in: query
          required: false
          schema:
            type: integer
          description: Bounding box min x (required with x2, y1, y2)
        - name: x2
          in: query
          required: false
          schema:
            type: integer
          description: Bounding box max x (required with x1, y1, y2)
        - name: y1
          in: query
          required: false
          schema:
            type: integer
          description: Bounding box min y (required with x1, x2, y2)
        - name: y2
          in: query
          required: false
          schema:
            type: integer
          description: Bounding box max y (required with x1, x2, y1)
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
          description: Max number of scenes to return (default 100)
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
          description: Number of scenes to skip (default 0)
        - name: authorized_deployer
          in: query
          required: false
          schema:
            type: string
          description: |
            Ethereum address to filter scenes by deployment capabilities.
            Returns scenes from worlds where the specified address is either the owner
            or has been granted deployment permission.
      responses:
        '200':
          description: Scenes and total count
          content:
            application/json:
              schema:
                type: object
                properties:
                  scenes:
                    type: array
                    items:
                      type: object
                      properties:
                        worldName:
                          type: string
                        entityId:
                          type: string
                        deployer:
                          type: string
                        deploymentAuthChain:
                          type: array
                        entity:
                          type: object
                          description: Scene entity metadata
                          properties: &ref_1
                            id:
                              type: string
                              description: Entity ID (IPFS hash)
                            type:
                              type: string
                              description: Entity type (e.g., 'scene')
                            timestamp:
                              type: number
                              description: Unix timestamp in milliseconds
                            pointers:
                              type: array
                              items:
                                type: string
                              description: Pointers (coordinates or names)
                            content:
                              type: array
                              items:
                                type: object
                                properties:
                                  file:
                                    type: string
                                  hash:
                                    type: string
                            metadata:
                              type: object
                              description: Scene metadata
                        parcels:
                          type: array
                          items:
                            type: string
                        size:
                          type: string
                        createdAt:
                          type: string
                          format: date-time
                  total:
                    type: integer
        '400':
          description: Invalid request (e.g. partial bounding box)
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
    post:
      tags:
        - Content Server
      summary: POST /world/{world_name}/scenes
      description: |
        Query scenes with optional coordinate filter in the body. Body is validated; same query params as GET.
        - **Body (coordinates)**: Required key; array can be empty. When non-empty, return only scenes that contain any of these parcel coordinates (e.g. "0,0", "-1,2").
        - **Query (x1, x2, y1, y2)**: Bounding box. When provided, all four must be set.
        - **Query (limit, offset)**: Pagination (defaults: limit 100, offset 0).
      operationId: worldsContentServer_postWorldScenes
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
        - name: x1
          in: query
          required: false
          schema:
            type: integer
          description: Bounding box min x (required with x2, y1, y2)
        - name: x2
          in: query
          required: false
          schema:
            type: integer
          description: Bounding box max x (required with x1, y1, y2)
        - name: y1
          in: query
          required: false
          schema:
            type: integer
          description: Bounding box min y (required with x1, x2, y2)
        - name: y2
          in: query
          required: false
          schema:
            type: integer
          description: Bounding box max y (required with x1, x2, y1)
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
          description: Max number of scenes to return (default 100)
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
          description: Number of scenes to skip (default 0)
        - name: authorized_deployer
          in: query
          required: false
          schema:
            type: string
          description: |
            Ethereum address to filter scenes by deployment capabilities.
            Returns scenes from worlds where the specified address is either the owner
            or has been granted deployment permission.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Body for POST /world/{world_name}/scenes.
              properties: &ref_20
                coordinates:
                  type: array
                  items:
                    type: string
                    pattern: ^-?\d+,-?\d+$
                    description: Parcel coordinate (e.g. "0,0", "-1,2")
                  description: Return only scenes that contain any of these coordinates
              required: &ref_21
                - coordinates
              additionalProperties: false
      responses:
        '200':
          description: Scenes and total count
          content:
            application/json:
              schema:
                type: object
                properties:
                  scenes:
                    type: array
                    items:
                      type: object
                      properties:
                        worldName:
                          type: string
                        entityId:
                          type: string
                        deployer:
                          type: string
                        deploymentAuthChain:
                          type: array
                        entity:
                          type: object
                          description: Scene entity metadata
                          properties: *ref_1
                        parcels:
                          type: array
                          items:
                            type: string
                        size:
                          type: string
                        createdAt:
                          type: string
                          format: date-time
                  total:
                    type: integer
        '400':
          description: Invalid request (e.g. invalid coordinate format, partial bounding box)
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /world/{world_name}/scenes/{coordinate}:
    delete:
      tags:
        - Content Server
      summary: DELETE /world/{world_name}/scenes/{coordinate}
      description: Undeploy a single scene at the given parcel coordinate. Requires signed fetch and world ownership (or world-wide deployment permission).
      operationId: worldsContentServer_undeployScene
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
        - name: coordinate
          in: path
          required: true
          description: Parcel coordinate (e.g. 0,0 or -1,2)
          schema:
            type: string
            pattern: ^-?\d+,-?\d+$
      responses:
        '200':
          description: Scene undeployed successfully
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '404':
          description: World or scene not found
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /entities:
    post:
      tags:
        - Content Server
      summary: /entities
      description: |
        Deploy a new scene to a world. The deployment must include entity metadata and all content files.
        Requires authentication via auth chain.
      operationId: worldsContentServer_deployEntity
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - entityId
              properties:
                entityId:
                  type: string
                  description: The entity ID (IPFS hash)
                  example: bafkreiabi74jam7uh5gmm6x4hox664j53bmt7dy4alrltkhyj3ozcxs2iu
              additionalProperties:
                type: string
                format: binary
                description: Content files referenced by the entity
      responses:
        '200':
          description: Entity deployed successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  creationTimestamp:
                    type: number
                    description: Unix timestamp in milliseconds
                  message:
                    type: string
                    description: Deployment confirmation message
        '400':
          description: Invalid request or deployment failed validation
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /entities/{world_name}:
    delete:
      tags:
        - Content Server
      summary: /entities/{world_name}
      description: Remove a deployed scene from a world. Requires signed fetch authentication.
      operationId: worldsContentServer_undeployEntity
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world to undeploy
          schema:
            type: string
            example: my-name.dcl.eth
      responses:
        '200':
          description: Entity undeployed successfully
        '401':
          description: Unauthorized - invalid signature
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '404':
          description: World not found
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /entities/active:
    post:
      tags:
        - Content Server
      summary: /entities/active
      description: Retrieve information about active entities based on provided pointers
      operationId: worldsContentServer_getActiveEntities
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                pointers:
                  type: array
                  items:
                    type: string
                  description: List of pointers to query
      responses:
        '200':
          description: Active entities retrieved successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  description: Scene entity metadata
                  properties: *ref_1
  /available-content:
    get:
      tags:
        - Content Server
      summary: /available-content
      description: Retrieve list of available content hashes
      operationId: worldsContentServer_getAvailableContent
      responses:
        '200':
          description: Available content retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  cid:
                    type: array
                    items:
                      type: string
  /ipfs/{hashId}:
    get:
      tags:
        - Content Server
      summary: /ipfs/{hashId}
      description: Retrieve a content file by its IPFS hash
      operationId: worldsContentServer_getContentFileIpfs
      parameters:
        - name: hashId
          in: path
          required: true
          description: IPFS hash of the content file
          schema:
            type: string
            example: bafkreiabi74jam7uh5gmm6x4hox664j53bmt7dy4alrltkhyj3ozcxs2iu
      responses:
        '200':
          description: Content file retrieved successfully
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
        '404':
          description: Content not found
    head:
      tags:
        - Content Server
      summary: /ipfs/{hashId}
      description: Check if a content file exists without retrieving it
      operationId: worldsContentServer_headContentFileIpfs
      parameters:
        - name: hashId
          in: path
          required: true
          description: IPFS hash of the content file
          schema:
            type: string
      responses:
        '200':
          description: Content exists
        '404':
          description: Content not found
  /contents/{hashId}:
    get:
      tags:
        - Content Server
      summary: /contents/{hashId}
      description: Retrieve a content file by its hash
      operationId: worldsContentServer_getContentFile
      parameters:
        - name: hashId
          in: path
          required: true
          description: Hash of the content file
          schema:
            type: string
            example: bafkreiabi74jam7uh5gmm6x4hox664j53bmt7dy4alrltkhyj3ozcxs2iu
      responses:
        '200':
          description: Content file retrieved successfully
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
        '404':
          description: Content not found
    head:
      tags:
        - Content Server
      summary: /contents/{hashId}
      description: Check if a content file exists without retrieving it
      operationId: worldsContentServer_headContentFile
      parameters:
        - name: hashId
          in: path
          required: true
          description: Hash of the content file
          schema:
            type: string
      responses:
        '200':
          description: Content exists
        '404':
          description: Content not found
  /world/{world_name}/permissions:
    get:
      tags:
        - Content Server
      summary: /world/{world_name}/permissions
      description: Retrieve the permissions configuration for a world
      operationId: worldsContentServer_getPermissions
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
      responses:
        '200':
          description: Permissions retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  permissions:
                    type: object
                    description: World permissions configuration
                    properties: &ref_14
                      deployment:
                        type: object
                        properties: &ref_2
                          type:
                            type: string
                            enum:
                              - allow-list
                          wallets:
                            type: array
                            items:
                              type: string
                            description: List of Ethereum addresses
                          communities:
                            type: array
                            items:
                              type: string
                            description: List of community IDs. Users who are members of any of these communities will have access. Maximum 50 communities allowed.
                            maxItems: 50
                        required: &ref_3
                          - type
                          - wallets
                      access:
                        oneOf:
                          - type: object
                            properties: &ref_4
                              type:
                                type: string
                                enum:
                                  - unrestricted
                            required: &ref_5
                              - type
                          - type: object
                            properties: *ref_2
                            required: *ref_3
                          - type: object
                            properties: &ref_6
                              type:
                                type: string
                                enum:
                                  - shared-secret
                              secret:
                                type: string
                                description: Hashed secret (only set on creation, not returned in GET)
                            required: &ref_7
                              - type
                          - type: object
                            properties: &ref_8
                              type:
                                type: string
                                enum:
                                  - nft-ownership
                              nft:
                                type: string
                                description: NFT contract address and token ID
                            required: &ref_9
                              - type
                              - nft
                      streaming:
                        oneOf:
                          - type: object
                            properties: *ref_4
                            required: *ref_5
                          - type: object
                            properties: *ref_2
                            required: *ref_3
                  owner:
                    type: string
                    description: Ethereum address of the world owner
                    example: '0x1234567890123456789012345678901234567890'
                  summary:
                    type: object
                    description: Per-address permission summary (address -> list of { permission, world_wide, parcel_count? })
                    additionalProperties:
                      type: array
                      items:
                        type: object
                        properties:
                          permission:
                            type: string
                          world_wide:
                            type: boolean
                          parcel_count:
                            type: integer
  /world/{world_name}/permissions/{permission_name}:
    post:
      tags:
        - Content Server
      summary: /world/{world_name}/permissions/{permission_name}
      description: |
        Set the permission type for a specific permission (deployment, access, or streaming).
        Requires signed fetch and world ownership.

        **Auth chain metadata (not HTTP body):** The permission configuration is **not** sent as a POST body.
        It is sent as **signed request metadata** (auth chain) per Signed Fetch (ADR-44). The client signs
        a payload whose structure matches the schema below; the server reads that payload from the auth
        chain, not from the request body. Do not send a body for this request—use the schema only as
        the expected format of the **auth chain metadata**.
      operationId: worldsContentServer_postPermission
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
        - name: permission_name
          in: path
          required: true
          description: The permission to configure
          schema:
            type: string
            enum:
              - deployment
              - access
              - streaming
      requestBody:
        required: false
        description: |
          **Not sent as HTTP body.** This schema describes the **auth chain metadata** format (the signed
          payload in Signed Fetch / ADR-44). Clients must include a payload with this structure in the
          signed request metadata; the server does not read or expect an HTTP body for this operation.
        content:
          application/json:
            schema:
              oneOf:
                - type: object
                  properties: *ref_4
                  required: *ref_5
                - type: object
                  properties: *ref_2
                  required: *ref_3
                - type: object
                  properties: *ref_6
                  required: *ref_7
                - type: object
                  properties: *ref_8
                  required: *ref_9
      responses:
        '204':
          description: Permission configured successfully
        '400':
          description: Invalid permission configuration
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /world/{world_name}/permissions/access/communities/{communityId}:
    put:
      tags:
        - Content Server
      summary: Add community to access allow-list
      description: |
        Add a single community to the world's access allow-list. The world must have allow-list access type.
        The signer must be a member of the community being added (validated via social service).
      operationId: worldsContentServer_putAccessCommunity
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
        - name: communityId
          in: path
          required: true
          description: Community ID to add to the allow-list
          schema:
            type: string
      responses:
        '204':
          description: Community added successfully
        '400':
          description: Invalid request, world not allow-list, signer not a member of the community, or allow-list limit exceeded
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
    delete:
      tags:
        - Content Server
      summary: Remove community from access allow-list
      description: Remove a single community from the world's access allow-list. The world must have allow-list access type.
      operationId: worldsContentServer_deleteAccessCommunity
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
        - name: communityId
          in: path
          required: true
          description: Community ID to remove from the allow-list
          schema:
            type: string
      responses:
        '204':
          description: Community removed successfully
        '400':
          description: Invalid request or world not configured as allow-list
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /world/{world_name}/permissions/{permission_name}/{address}:
    put:
      tags:
        - Content Server
      summary: /world/{world_name}/permissions/{permission_name}/{address}
      description: Add an Ethereum address to the allow list for a specific permission. Requires signed fetch and world ownership.
      operationId: worldsContentServer_putPermissionAddress
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
        - name: permission_name
          in: path
          required: true
          description: The permission to modify
          schema:
            type: string
            enum:
              - deployment
              - access
              - streaming
        - name: address
          in: path
          required: true
          description: Ethereum address to add
          schema:
            type: string
            example: '0x1234567890123456789012345678901234567890'
      responses:
        '204':
          description: Address added successfully
        '400':
          description: Invalid request or permission not configured as allow-list
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
    delete:
      tags:
        - Content Server
      summary: /world/{world_name}/permissions/{permission_name}/{address}
      description: Remove an Ethereum address from the allow list for a specific permission. Requires signed fetch and world ownership.
      operationId: worldsContentServer_deletePermissionAddress
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
        - name: permission_name
          in: path
          required: true
          description: The permission to modify
          schema:
            type: string
            enum:
              - deployment
              - access
              - streaming
        - name: address
          in: path
          required: true
          description: Ethereum address to remove
          schema:
            type: string
            example: '0x1234567890123456789012345678901234567890'
      responses:
        '204':
          description: Address removed successfully
        '400':
          description: Invalid request or address not in allow list
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /world/{world_name}/permissions/{permission_name}/address/{address}/parcels:
    get:
      tags:
        - Content Server
      summary: GET /world/{world_name}/permissions/{permission_name}/address/{address}/parcels
      description: |
        Get paginated parcels for a specific address and permission (deployment or streaming).
        Use query params limit/offset for pagination. Optional bounding box filter via x1, y1, x2, y2 (all four required if used).
      operationId: worldsContentServer_getAllowedParcelsForPermission
      parameters:
        - name: world_name
          in: path
          required: true
          schema:
            type: string
            example: my-name.dcl.eth
        - name: permission_name
          in: path
          required: true
          schema:
            type: string
            enum:
              - deployment
              - streaming
        - name: address
          in: path
          required: true
          schema:
            type: string
            example: '0x1234567890123456789012345678901234567890'
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
        - name: x1
          in: query
          required: false
          schema:
            type: integer
          description: Bounding box min x (required with x2, y1, y2)
        - name: y1
          in: query
          required: false
          schema:
            type: integer
        - name: x2
          in: query
          required: false
          schema:
            type: integer
        - name: y2
          in: query
          required: false
          schema:
            type: integer
      responses:
        '200':
          description: Parcels and total count
          content:
            application/json:
              schema:
                type: object
                properties:
                  total:
                    type: integer
                  parcels:
                    type: array
                    items:
                      type: string
                      pattern: ^-?\\d+,-?\\d+$
        '400':
          description: Invalid request (e.g. invalid address, partial bounding box)
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
    post:
      tags:
        - Content Server
      summary: POST /world/{world_name}/permissions/{permission_name}/address/{address}/parcels
      description: Add parcels to an existing permission for an address (deployment or streaming). Requires signed fetch and world ownership. Request body is JSON with parcels array.
      operationId: worldsContentServer_postPermissionParcels
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          schema:
            type: string
            example: my-name.dcl.eth
        - name: permission_name
          in: path
          required: true
          schema:
            type: string
            enum:
              - deployment
              - streaming
        - name: address
          in: path
          required: true
          schema:
            type: string
            example: '0x1234567890123456789012345678901234567890'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Request body for adding or removing parcels to/from a permission (POST/DELETE address parcels).
              properties: &ref_10
                parcels:
                  type: array
                  items:
                    type: string
                    pattern: ^-?\\d+,-?\\d+$
                    description: Parcel coordinate (e.g. "0,0", "-1,2")
                  minItems: 1
                  maxItems: 500
              required: &ref_11
                - parcels
              additionalProperties: false
      responses:
        '204':
          description: Parcels added successfully
        '400':
          description: Invalid request (e.g. invalid parcels)
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
    delete:
      tags:
        - Content Server
      summary: DELETE /world/{world_name}/permissions/{permission_name}/address/{address}/parcels
      description: Remove parcels from an existing permission for an address. Requires signed fetch and world ownership. Request body is JSON with parcels array.
      operationId: worldsContentServer_deletePermissionParcels
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          schema:
            type: string
            example: my-name.dcl.eth
        - name: permission_name
          in: path
          required: true
          schema:
            type: string
            enum:
              - deployment
              - streaming
        - name: address
          in: path
          required: true
          schema:
            type: string
            example: '0x1234567890123456789012345678901234567890'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Request body for adding or removing parcels to/from a permission (POST/DELETE address parcels).
              properties: *ref_10
              required: *ref_11
              additionalProperties: false
      responses:
        '204':
          description: Parcels removed successfully
        '400':
          description: Invalid request (e.g. invalid parcels)
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /world/{world_name}/settings:
    get:
      tags:
        - Content Server
      summary: /world/{world_name}/settings
      description: Retrieve the settings configuration for a world, including spawn coordinates
      operationId: worldsContentServer_getWorldSettings
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
      responses:
        '200':
          description: World settings retrieved successfully
          content:
            application/json:
              schema:
                type: object
                description: World settings configuration that defines how the world behaves and appears in Places
                properties: &ref_12
                  title:
                    type: string
                    description: The title of the world displayed in Places
                    example: My Awesome World
                    nullable: true
                  description:
                    type: string
                    description: A description of the world displayed in Places
                    example: A beautiful world with amazing experiences
                    nullable: true
                  contentRating:
                    type: string
                    description: Content rating for the world
                    example: T
                    nullable: true
                  spawnCoordinates:
                    type: string
                    description: |
                      The parcel coordinate where players will spawn.
                      Must be within the world shape rectangle (the bounding box covering all deployed scene parcels).
                      Does not need to be on a specific scene parcel, just anywhere within the rectangle.
                      Supports both positive and negative coordinates (e.g., "10,20" or "-5,-10").
                    pattern: ^-?\d+,-?\d+$
                    example: 10,20
                    nullable: true
                  skyboxTime:
                    type: number
                    description: Fixed skybox time (0-24 hours). Null to use dynamic day/night cycle.
                    example: 12.5
                    nullable: true
                  categories:
                    type: array
                    items:
                      type: string
                    description: Categories/tags for the world
                    example:
                      - game
                      - adventure
                    nullable: true
                  singlePlayer:
                    type: boolean
                    description: Whether the world is single player only
                    example: false
                    nullable: true
                  showInPlaces:
                    type: boolean
                    description: Whether the world should be shown in Places
                    example: true
                    nullable: true
                  thumbnailUrl:
                    type: string
                    description: URL of the world thumbnail image
                    example: https://worlds-content-server.decentraland.org/contents/world-thumbnails/my-world.dcl.eth/abc123
                    nullable: true
        '404':
          description: World not found
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
    put:
      tags:
        - Content Server
      summary: /world/{world_name}/settings
      description: |
        Update world settings via multipart/form-data. Requires signed fetch and world ownership.
        All fields are optional to allow partial updates.

        Settings include title, description, content rating, spawn coordinates, skybox time,
        categories, single player mode, show in places, and a thumbnail image.

        For spawn coordinates, they must be within the world shape rectangle if the world has deployed scenes.
        Worlds without deployments can have most settings pre-defined (except spawn coordinates).

        **Clearing nullable fields:**
        - Send `skybox_time` with the string value `"null"` to reset skybox time (use dynamic day/night cycle).
        - Send `categories` with the string value `"null"` to clear all categories (stores an empty array).

        **Validation:**
        - `title` must be between 3 and 100 characters. Empty strings are rejected with a 400 error.
        - `description` must be between 3 and 1000 characters. Empty strings are rejected with a 400 error.
      operationId: worldsContentServer_updateWorldSettings
      security:
        - SignedFetch: []
      parameters:
        - name: world_name
          in: path
          required: true
          description: The name of the world
          schema:
            type: string
            example: my-name.dcl.eth
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: World title. Must be between 3 and 100 characters. Empty strings are rejected.
                  minLength: 3
                  maxLength: 100
                description:
                  type: string
                  description: World description. Must be between 3 and 1000 characters. Empty strings are rejected.
                  minLength: 3
                  maxLength: 1000
                content_rating:
                  type: string
                  description: Content rating
                spawn_coordinates:
                  type: string
                  description: Spawn coordinates (e.g., "10,20")
                  pattern: ^-?\d+,-?\d+$
                skybox_time:
                  type: string
                  description: Fixed skybox time as a number string, or the string "null" to reset to dynamic day/night cycle
                categories:
                  type: string
                  description: Category values as repeated multipart fields, or the string "null" to clear all categories (stores an empty array)
                single_player:
                  type: string
                  description: Single player mode ("true" or "false")
                show_in_places:
                  type: string
                  description: Show in places ("true" or "false")
                thumbnail:
                  type: string
                  format: binary
                  description: Thumbnail image file (max 1MB)
      responses:
        '200':
          description: World settings updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: World settings updated successfully
                  settings:
                    type: object
                    description: World settings configuration that defines how the world behaves and appears in Places
                    properties: *ref_12
        '400':
          description: Invalid request - validation failed (e.g., spawn coordinates outside world bounds)
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '401':
          description: Unauthorized - invalid signature
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '403':
          description: Forbidden - user does not own the world name
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /worlds:
    get:
      tags:
        - Content Server
      summary: GET /worlds
      description: |
        Retrieve a paginated list of worlds with optional search, sorting, and authorized deployer filtering.

        This endpoint supports:
        - **Pagination**: Use `limit` and `offset` query parameters
        - **Search**: Full-text search across world name, title, and description
        - **Sorting**: Sort by world name or last deployment time
        - **Authorized deployer filtering**: Filter by worlds where an address can deploy (is owner or has deployment permission)
      operationId: worldsContentServer_getWorlds
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            default: 100
          description: Maximum number of worlds to return (default 100)
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
          description: Number of worlds to skip (default 0)
        - name: search
          in: query
          required: false
          schema:
            type: string
          description: |
            Full-text search query. Searches across world name (highest priority), 
            title (medium priority), and description (lowest priority).
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - name
              - last_deployed_at
            default: name
          description: Field to sort by (default "name")
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
            default: asc
          description: Sort direction (default "asc")
        - name: authorized_deployer
          in: query
          required: false
          schema:
            type: string
          description: |
            Ethereum address to filter worlds by deployment capabilities.
            Returns worlds where the specified address is either the owner
            or has been granted deployment permission.
        - name: has_deployed_scenes
          in: query
          required: false
          schema:
            type: boolean
          description: |
            Filter worlds by whether they have deployed scenes.
            When true, returns only worlds with at least one deployed scene.
            When false, returns only worlds with no deployed scenes.
            When not provided, returns all worlds regardless of deployment status.
      responses:
        '200':
          description: Paginated list of worlds
          content:
            application/json:
              schema:
                type: object
                description: Paginated response containing worlds information
                properties: &ref_22
                  worlds:
                    type: array
                    items:
                      type: object
                      description: Information about a world including settings and deployment status
                      properties: &ref_24
                        name:
                          type: string
                          description: The world name (ENS or DCL domain)
                          example: my-world.dcl.eth
                        owner:
                          type: string
                          description: Ethereum address of the world owner
                          example: '0x1234567890123456789012345678901234567890'
                        title:
                          type: string
                          nullable: true
                          description: The title of the world
                          example: My Awesome World
                        description:
                          type: string
                          nullable: true
                          description: A description of the world
                          example: A beautiful virtual world
                        shape:
                          type: object
                          nullable: true
                          description: |
                            The bounding rectangle of the world in parcel coordinates.
                            Null if the world has no deployed scenes.
                          properties:
                            x1:
                              type: integer
                              description: Minimum x coordinate
                              example: 0
                            x2:
                              type: integer
                              description: Maximum x coordinate
                              example: 2
                            y1:
                              type: integer
                              description: Minimum y coordinate
                              example: 0
                            y2:
                              type: integer
                              description: Maximum y coordinate
                              example: 1
                        content_rating:
                          type: string
                          nullable: true
                          description: Content rating for the world
                          example: T
                        spawn_coordinates:
                          type: string
                          nullable: true
                          description: The parcel coordinate where players will spawn
                          pattern: ^-?\d+,-?\d+$
                          example: 10,20
                        skybox_time:
                          type: number
                          nullable: true
                          description: Fixed skybox time (0-24 hours)
                          example: 12
                        categories:
                          type: array
                          nullable: true
                          items:
                            type: string
                          description: Categories/tags for the world
                          example:
                            - game
                            - adventure
                        single_player:
                          type: boolean
                          nullable: true
                          description: Whether the world is single player only
                          example: false
                        show_in_places:
                          type: boolean
                          nullable: true
                          description: Whether the world should be shown in Places
                          example: true
                        thumbnail_hash:
                          type: string
                          nullable: true
                          description: IPFS hash of the world thumbnail image
                          example: bafkreiabi74jam7uh5gmm6x4hox664j53bmt7dy4alrltkhyj3ozcxs2iu
                        last_deployed_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: |
                            ISO 8601 timestamp of the last scene deployment.
                            Null if the world has no deployed scenes.
                          example: '2024-01-15T10:30:00.000Z'
                        blocked_since:
                          type: string
                          format: date-time
                          nullable: true
                          description: |
                            ISO 8601 timestamp when the world owner was blocked.
                            Null if the owner is not blocked.
                          example: null
                        deployed_scenes:
                          type: integer
                          description: The number of scenes deployed to the world
                          example: 2
                      required: &ref_25
                        - name
                        - owner
                        - title
                        - description
                        - shape
                        - content_rating
                        - spawn_coordinates
                        - skybox_time
                        - categories
                        - single_player
                        - show_in_places
                        - thumbnail_hash
                        - last_deployed_at
                        - blocked_since
                        - deployed_scenes
                    description: List of worlds
                  total:
                    type: integer
                    description: Total number of worlds matching the query (for pagination)
                required: &ref_23
                  - worlds
                  - total
              example:
                worlds:
                  - name: my-world.dcl.eth
                    owner: '0x1234567890123456789012345678901234567890'
                    title: My Awesome World
                    description: A beautiful virtual world
                    shape:
                      x1: 0
                      x2: 2
                      y1: 0
                      y2: 1
                    content_rating: T
                    spawn_coordinates: 1,1
                    skybox_time: 12
                    categories:
                      - game
                      - adventure
                    single_player: false
                    show_in_places: true
                    thumbnail_hash: bafkreiabi74jam7uh5gmm6x4hox664j53bmt7dy4alrltkhyj3ozcxs2iu
                    last_deployed_at: '2024-01-15T10:30:00.000Z'
                    blocked_since: null
                  - name: empty-world.dcl.eth
                    owner: '0xabcdef1234567890abcdef1234567890abcdef12'
                    title: Empty World
                    description: null
                    shape: null
                    content_rating: null
                    spawn_coordinates: null
                    skybox_time: null
                    categories: null
                    single_player: null
                    show_in_places: null
                    thumbnail_hash: null
                    last_deployed_at: null
                    blocked_since: null
                total: 42
        '400':
          description: Invalid request (e.g., invalid sort or order parameter)
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /wallet/{wallet}/stats:
    get:
      tags:
        - Content Server
      summary: /wallet/{wallet}/stats
      description: Retrieve storage statistics for a wallet address
      operationId: worldsContentServer_getWalletStats
      parameters:
        - name: wallet
          in: path
          required: true
          description: Ethereum wallet address
          schema:
            type: string
            example: '0x1234567890123456789012345678901234567890'
      responses:
        '200':
          description: Wallet statistics retrieved successfully
          content:
            application/json:
              schema:
                type: object
                description: Storage statistics for a wallet
                properties: &ref_15
                  wallet:
                    type: string
                    description: Ethereum address
                  dclNames:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                        size:
                          type: string
                          description: Size in bytes as string
                  ensNames:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                        size:
                          type: string
                          description: Size in bytes as string
                  usedSpace:
                    type: string
                    description: Total used space in bytes as string
                  maxAllowedSpace:
                    type: string
                    description: Maximum allowed space in bytes as string
                  blockedSince:
                    type: string
                    format: date-time
                    nullable: true
                    description: ISO timestamp when wallet was blocked
        '400':
          description: Invalid wallet address
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /wallet/{wallet}/connected-world:
    get:
      tags:
        - Content Server
      summary: /wallet/{wallet}/connected-world
      description: Retrieve the world that a wallet is currently connected to
      operationId: worldsContentServer_getWalletConnectedWorld
      parameters:
        - name: wallet
          in: path
          required: true
          description: Ethereum wallet address
          schema:
            type: string
            example: '0x1234567890123456789012345678901234567890'
      responses:
        '200':
          description: Connected world retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  world:
                    type: string
                    description: Name of the connected world
                    nullable: true
  /wallet/contribute:
    get:
      tags:
        - Content Server
      summary: /wallet/contribute
      description: Retrieve list of domains that the authenticated wallet can contribute to. Requires signed fetch.
      operationId: worldsContentServer_getContributableDomains
      security:
        - SignedFetch: []
      responses:
        '200':
          description: Contributable domains retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  domains:
                    type: array
                    items:
                      type: object
                      properties: &ref_16
                        name:
                          type: string
                          description: Domain name
                        user_permissions:
                          type: array
                          items:
                            type: string
                          description: Permissions the user has for this domain
                        owner:
                          type: string
                          description: Owner address
                        size:
                          type: string
                          description: Size in bytes as string
                  count:
                    type: integer
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /status:
    get:
      tags:
        - Content Server
      summary: /status
      description: Retrieve the current status of the content server and communication services
      operationId: worldsContentServer_getStatus
      responses:
        '200':
          description: Server status retrieved successfully
          content:
            application/json:
              schema:
                type: object
                description: Server status information
                properties: &ref_17
                  content:
                    type: object
                    properties:
                      commitHash:
                        type: string
                        description: Git commit hash of deployed version
                      worldsCount:
                        type: object
                        properties:
                          ens:
                            type: integer
                            description: Number of ENS worlds
                          dcl:
                            type: integer
                            description: Number of DCL worlds
                  comms:
                    type: object
                    properties:
                      adapterType:
                        type: string
                      statusUrl:
                        type: string
                      commitHash:
                        type: string
                        nullable: true
                      users:
                        type: integer
                        description: Number of connected users
                      rooms:
                        type: integer
                        description: Number of active rooms
                      timestamp:
                        type: number
                        description: Unix timestamp in milliseconds
  /index:
    get:
      tags:
        - Content Server
      summary: /index
      description: Retrieve an index of all deployed worlds (deprecated; prefer /worlds for listing).
      operationId: worldsContentServer_getIndex
      deprecated: true
      responses:
        '200':
          description: Index retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties: &ref_18
                        name:
                          type: string
                          description: World name
                        scenes:
                          type: array
                          items:
                            type: object
                            properties: &ref_19
                              id:
                                type: string
                                description: Scene entity ID
                              title:
                                type: string
                                description: Scene title
                              description:
                                type: string
                                description: Scene description
                              thumbnail:
                                type: string
                                nullable: true
                                description: Thumbnail image hash
                              pointers:
                                type: array
                                items:
                                  type: string
                                description: Scene pointers
                              timestamp:
                                type: number
                                description: Deployment timestamp
                              runtimeVersion:
                                type: string
                                nullable: true
                                description: Scene runtime version
                    description: List of world data with scenes
                  lastUpdated:
                    type: string
                    format: date-time
                    description: ISO 8601 timestamp of last index update
  /live-data:
    get:
      tags:
        - Content Server
      summary: /live-data
      description: Retrieve live data about active worlds and users (from comms adapter status).
      operationId: worldsContentServer_getLiveData
      responses:
        '200':
          description: Live data retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      totalUsers:
                        type: integer
                        description: Total number of connected users
                      perWorld:
                        type: object
                        description: Per-world user counts (keyed by world name)
                        additionalProperties:
                          type: integer
                  lastUpdated:
                    type: string
                    format: date-time
                    description: ISO 8601 timestamp of status snapshot
  /worlds/{worldName}/comms:
    post:
      tags:
        - Content Server
      summary: POST /worlds/{worldName}/comms
      description: |
        Get comms adapter connection string for a world. Requires signed fetch.
        Auth metadata may include optional secret for access. Returns fixedAdapter.
      operationId: worldsContentServer_worldComms
      security:
        - SignedFetch: []
      parameters:
        - name: worldName
          in: path
          required: true
          description: World name (e.g. my-name.dcl.eth)
          schema:
            type: string
      responses:
        '200':
          description: Comms adapter retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  fixedAdapter:
                    type: string
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '404':
          description: World or scene not found
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /worlds/{worldName}/scenes/{sceneId}/comms:
    post:
      tags:
        - Content Server
      summary: POST /worlds/{worldName}/scenes/{sceneId}/comms
      description: |
        Get comms adapter connection string for a specific scene in a world. Requires signed fetch.
        Auth metadata may include optional secret for access. Returns fixedAdapter.
      operationId: worldsContentServer_worldSceneComms
      security:
        - SignedFetch: []
      parameters:
        - name: worldName
          in: path
          required: true
          schema:
            type: string
        - name: sceneId
          in: path
          required: true
          description: Scene entity ID
          schema:
            type: string
      responses:
        '200':
          description: Comms adapter retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  fixedAdapter:
                    type: string
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '404':
          description: World or scene not found
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /get-comms-adapter/{roomId}:
    post:
      tags:
        - Content Server
      summary: /get-comms-adapter/{roomId}
      description: Retrieve communication adapter connection string for a room. Requires signed fetch (auth metadata may include secret for access). Returns fixedAdapter.
      operationId: worldsContentServer_getCommsAdapter
      security:
        - SignedFetch: []
      parameters:
        - name: roomId
          in: path
          required: true
          description: Room identifier (prefix + world name)
          schema:
            type: string
      responses:
        '200':
          description: Adapter information retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  fixedAdapter:
                    type: string
                    description: Connection string for the comms adapter
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '404':
          description: World not found
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /cast-adapter/{roomId}:
    post:
      tags:
        - Content Server
      summary: /cast-adapter/{roomId}
      description: Retrieve LiveKit cast adapter URL and JWT token for a room. Requires signed fetch.
      operationId: worldsContentServer_getCastAdapter
      security:
        - SignedFetch: []
      parameters:
        - name: roomId
          in: path
          required: true
          description: Room identifier (prefix + world name)
          schema:
            type: string
      responses:
        '200':
          description: Cast adapter information retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  url:
                    type: string
                    description: LiveKit WebSocket URL (e.g. wss://host)
                  token:
                    type: string
                    description: JWT token for joining the room
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '404':
          description: World not found
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
  /livekit-webhook:
    post:
      tags:
        - Content Server
      summary: /livekit-webhook
      description: Webhook endpoint for LiveKit events
      operationId: worldsContentServer_livekitWebhook
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: LiveKit webhook payload
      responses:
        '200':
          description: Webhook processed successfully
components:
  securitySchemes:
    SignedFetch:
      type: apiKey
      in: header
      name: X-Identity-Auth-Chain-*
      description: |
        Signed fetch authentication using Decentraland's ADR-44 specification.
        Multiple headers are used to provide the authentication chain.
  schemas:
    About:
      type: object
      description: Detailed information about a world
      properties: *ref_13
    Entity:
      type: object
      description: Scene entity metadata
      properties: *ref_1
    Permissions:
      type: object
      description: World permissions configuration
      properties: *ref_14
    UnrestrictedPermissionSetting:
      type: object
      properties: *ref_4
      required: *ref_5
    AllowListPermissionSetting:
      type: object
      properties: *ref_2
      required: *ref_3
    SharedSecretPermissionSetting:
      type: object
      properties: *ref_6
      required: *ref_7
    NFTOwnershipPermissionSetting:
      type: object
      properties: *ref_8
      required: *ref_9
    PermissionParcelsInput:
      type: object
      description: Request body for adding or removing parcels to/from a permission (POST/DELETE address parcels).
      properties: *ref_10
      required: *ref_11
      additionalProperties: false
    WalletStats:
      type: object
      description: Storage statistics for a wallet
      properties: *ref_15
    ContributorDomain:
      type: object
      properties: *ref_16
    StatusResponse:
      type: object
      description: Server status information
      properties: *ref_17
    WorldsIndex:
      type: object
      description: Index of all deployed worlds
      properties:
        index:
          type: array
          items:
            type: object
            properties: *ref_18
        timestamp:
          type: number
          description: Unix timestamp in milliseconds
    WorldData:
      type: object
      properties: *ref_18
    SceneData:
      type: object
      properties: *ref_19
    WorldStatus:
      type: object
      properties:
        worldName:
          type: string
          description: Name of the world
        users:
          type: integer
          description: Number of users in the world
    ErrorResponse:
      type: object
      properties: *ref_0
    WorldSettings:
      type: object
      description: World settings configuration that defines how the world behaves and appears in Places
      properties: *ref_12
    WorldSettingsInput:
      type: object
      description: |
        Input for updating world settings via multipart/form-data.
        All fields are optional to allow partial updates.

        Note: This is sent as multipart/form-data, not JSON, to support thumbnail file uploads.

        **Clearing nullable fields:**
        - Send `skybox_time` with the string value `"null"` to reset to dynamic day/night cycle.
        - Send `categories` with the string value `"null"` to clear all categories (stores an empty array).
      properties:
        title:
          type: string
          description: The title of the world. Must be between 3 and 100 characters. Empty strings are rejected with a 400 error.
          minLength: 3
          maxLength: 100
        description:
          type: string
          description: A description of the world. Must be between 3 and 1000 characters. Empty strings are rejected with a 400 error.
          minLength: 3
          maxLength: 1000
        content_rating:
          type: string
          description: Content rating for the world
        spawn_coordinates:
          type: string
          description: |
            The parcel coordinate where players will spawn.
            Must be within the world shape rectangle.
          pattern: ^-?\d+,-?\d+$
          example: 10,20
        skybox_time:
          type: string
          description: Fixed skybox time as a number string (0-24 hours). Send the string "null" to reset to dynamic day/night cycle.
          example: '12'
        categories:
          type: string
          description: Category values as repeated multipart fields, or the string "null" to clear all categories (stores an empty array).
          example: art
        single_player:
          type: string
          description: Single player mode ("true" or "false")
          example: 'false'
        show_in_places:
          type: string
          description: Show in places ("true" or "false")
          example: 'true'
        thumbnail:
          type: string
          format: binary
          description: Thumbnail image file (max 1MB)
    GetWorldScenesRequestBody:
      type: object
      description: Body for POST /world/{world_name}/scenes.
      properties: *ref_20
      required: *ref_21
      additionalProperties: false
    WorldsResponse:
      type: object
      description: Paginated response containing worlds information
      properties: *ref_22
      required: *ref_23
    WorldInfo:
      type: object
      description: Information about a world including settings and deployment status
      properties: *ref_24
      required: *ref_25
