openapi: 3.0.3
info:
  title: Builder Server API
  version: 2.10.0
  description: |
    ## Overview

    The Builder Server API provides backend services for the Decentraland Builder application.
    It enables management of scene projects, wearable/emote collections, asset packs, and more.

    ## Authentication

    Most endpoints require authentication using Decentraland's Signed Fetch mechanism (ADR-44).
    Authentication is provided via the `X-Identity-Auth-Chain-*` headers.

    ## Base URL

    The API version prefix is configurable via the `API_VERSION` environment variable (default: `v1`).
    All endpoints are prefixed with `/{API_VERSION}/`.
  contact:
    name: Decentraland Foundation
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
  - url: https://builder-api.decentraland.org/v1
    description: Production environment
    variables: {}
  - url: https://builder-api.decentraland.zone/v1
    description: Development environment
    variables: {}
security:
  - SignedFetch: []
tags:
  - name: App
    description: Application info and health check
  - name: Projects
    description: Scene project management
  - name: Pools
    description: Public scene pools for community sharing
  - name: Pool Groups
    description: Pool categorization and grouping
  - name: Pool Likes
    description: Pool like management
  - name: Collections
    description: Wearable and emote collection management
  - name: Items
    description: Wearable and emote item management
  - name: Curations
    description: Collection and item curation workflow
  - name: Committee
    description: Committee member operations
  - name: Third Party
    description: Third-party collection management
  - name: Rarities
    description: Item rarity definitions
  - name: Forum
    description: Discourse forum integration
  - name: Asset Packs
    description: Asset pack management
  - name: Assets
    description: Individual 3D asset management
  - name: Manifest
    description: Project manifest operations
  - name: Deployments
    description: Scene deployment tracking
  - name: Storage
    description: S3 storage proxy endpoints
  - name: Share
    description: Share link generation
  - name: Analytics
    description: Analytics endpoints
  - name: NFT
    description: NFT-related operations
  - name: LAND
    description: LAND parcel operations
  - name: Newsletter
    description: Newsletter subscription management
paths:
  /info:
    get:
      operationId: getServerInfo
      tags:
        - App
      summary: Get server version
      description: Returns the current server version
      security: []
      responses:
        '200':
          description: Server version information
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties:
                      version:
                        type: string
  /templates:
    get:
      operationId: getProjectTemplates
      tags:
        - Projects
      summary: Get all project templates
      description: Returns all public project templates
      security: []
      responses:
        '200':
          description: List of project templates
          content:
            application/json:
              schema:
                type: object
                properties: &ref_0
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      properties: &ref_1
                        id:
                          type: string
                          format: uuid
                        title:
                          type: string
                        description:
                          type: string
                        thumbnail:
                          type: string
                        scene_id:
                          type: string
                          format: uuid
                        eth_address:
                          type: string
                        cols:
                          type: integer
                        rows:
                          type: integer
                        parcels:
                          type: integer
                        transforms:
                          type: integer
                        gltf_shapes:
                          type: integer
                        nft_shapes:
                          type: integer
                        scripts:
                          type: integer
                        entities:
                          type: integer
                        is_deleted:
                          type: boolean
                        is_public:
                          type: boolean
                        is_template:
                          type: boolean
                        creation_coords:
                          type: string
                        template_status:
                          type: string
                          enum:
                            - active
                            - coming_soon
                        video:
                          type: string
                        created_at:
                          type: string
                          format: date-time
                        updated_at:
                          type: string
                          format: date-time
  /projects:
    get:
      operationId: getProjects
      tags:
        - Projects
      summary: Get all projects
      description: Returns all projects for the authenticated user
      responses:
        '200':
          description: List of projects
          content:
            application/json:
              schema:
                type: object
                properties: *ref_0
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: &ref_2
            application/json:
              schema:
                type: object
                properties: &ref_3
                  ok:
                    type: boolean
                    example: false
                  error:
                    type: string
                  data:
                    type: object
  /projects/{id}:
    get:
      operationId: getProject
      tags:
        - Projects
      summary: Get a project
      description: Returns a specific project by ID
      parameters:
        - name: id
          in: path
          required: true
          schema: &ref_4
            type: string
            format: uuid
          description: Project UUID
      responses:
        '200':
          description: Project details
          content:
            application/json:
              schema:
                type: object
                properties: &ref_5
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties: *ref_1
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: &ref_6
            application/json:
              schema:
                type: object
                properties: *ref_3
    put:
      operationId: upsertProject
      tags:
        - Projects
      summary: Create or update a project
      description: Creates a new project or updates an existing one
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_32
                - id
                - title
                - description
                - scene_id
                - cols
                - rows
              properties: &ref_33
                id:
                  type: string
                  format: uuid
                title:
                  type: string
                description:
                  type: string
                thumbnail:
                  type: string
                scene_id:
                  type: string
                  format: uuid
                cols:
                  type: integer
                rows:
                  type: integer
                is_public:
                  type: boolean
                creation_coords:
                  type: string
                is_template:
                  type: boolean
                template_status:
                  type: string
                  enum:
                    - active
                    - coming_soon
                video:
                  type: string
      responses:
        '200':
          description: Project created/updated successfully
          content:
            application/json:
              schema:
                type: object
                properties: *ref_5
        '400':
          description: Bad request - invalid input
          content: &ref_7
            application/json:
              schema:
                type: object
                properties: *ref_3
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
    delete:
      operationId: deleteProject
      tags:
        - Projects
      summary: Delete a project
      description: Soft deletes a project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '200':
          description: Project deleted successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /projects/{id}/public:
    get:
      operationId: getPublicProject
      tags:
        - Projects
      summary: Get a public project
      description: Returns a public project by ID (no authentication required)
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '200':
          description: Public project details
          content:
            application/json:
              schema:
                type: object
                properties: *ref_5
        '404':
          description: Resource not found
          content: *ref_6
  /projects/{id}/media:
    post:
      operationId: uploadProjectMedia
      tags:
        - Projects
      summary: Upload project media
      description: Uploads media files (thumbnails, previews) for a project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                thumbnail:
                  type: string
                  format: binary
                preview:
                  type: string
                  format: binary
                north:
                  type: string
                  format: binary
                east:
                  type: string
                  format: binary
                south:
                  type: string
                  format: binary
                west:
                  type: string
                  format: binary
      responses:
        '200':
          description: Media uploaded successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /projects/{id}/media/{filename}:
    get:
      operationId: getProjectMediaFile
      tags:
        - Projects
      summary: Get project media file
      description: Redirects to the S3 URL for the media file
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
        - name: filename
          in: path
          required: true
          schema:
            type: string
      responses:
        '301':
          description: Redirect to S3 URL
        '404':
          description: Resource not found
          content: *ref_6
  /projects/{id}/contents/{content}:
    get:
      operationId: getProjectContent
      tags:
        - Projects
      summary: Get project content
      description: Returns project content by hash. For preview hash, returns entity object. For CRDT hash, redirects to CRDT file.
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
        - name: content
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Entity object (for preview hash)
          content:
            application/json:
              schema:
                type: object
        '301':
          description: Redirect to content URL
        '302':
          description: Redirect to CRDT file
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '404':
          description: Resource not found
          content: *ref_6
  /projects/{id}/about:
    get:
      operationId: getProjectPreviewInfo
      tags:
        - Projects
      summary: Get project preview info
      description: Returns realm configuration for project preview
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '200':
          description: Preview configuration
          content:
            application/json:
              schema:
                type: object
  /projects/{id}/crdt:
    get:
      operationId: getProjectCrdt
      tags:
        - Projects
      summary: Get project CRDT
      description: Returns the CRDT file for the project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '302':
          description: Redirect to CRDT file
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    put:
      operationId: uploadProjectCrdt
      tags:
        - Projects
      summary: Upload project CRDT
      description: Uploads the CRDT file for a project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      responses:
        '200':
          description: CRDT uploaded successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /projects/{coords}/coords:
    delete:
      operationId: removeProjectCoords
      tags:
        - Projects
      summary: Remove coords from projects
      description: Removes creation coordinates from all projects with the given coords
      parameters:
        - name: coords
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Coordinates removed successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /pools:
    get:
      operationId: getPools
      tags:
        - Pools
      summary: Get all pools
      description: Returns all public scene pools with filtering and pagination
      security: []
      parameters:
        - name: eth_address
          in: query
          schema:
            type: string
        - name: group
          in: query
          schema:
            type: string
        - name: sort_by
          in: query
          schema: &ref_30
            type: string
          description: Field to sort by
        - name: sort_order
          in: query
          schema: &ref_31
            type: string
            enum:
              - asc
              - desc
          description: Sort order
        - name: limit
          in: query
          schema: &ref_9
            type: integer
            minimum: 1
            maximum: 100
            default: 20
          description: Number of items per page
        - name: offset
          in: query
          schema: &ref_29
            type: integer
            minimum: 0
          description: Offset for pagination
      responses:
        '200':
          description: List of pools
          content:
            application/json:
              schema:
                type: object
                properties: &ref_35
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      allOf: &ref_8
                        - type: object
                          properties: *ref_1
                        - type: object
                          properties:
                            groups:
                              type: array
                              items:
                                type: string
                                format: uuid
                            likes:
                              type: integer
                            like:
                              type: boolean
  /projects/{id}/pool:
    get:
      operationId: getPool
      tags:
        - Pools
      summary: Get a pool
      description: Returns a pool by project ID
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '200':
          description: Pool details
          content:
            application/json:
              schema:
                type: object
                properties: &ref_34
                  ok:
                    type: boolean
                  data:
                    type: object
                    allOf: *ref_8
    put:
      operationId: upsertPool
      tags:
        - Pools
      summary: Create or update a pool
      description: Creates a pool from a project or updates an existing pool
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                groups:
                  type: array
                  items:
                    type: string
                    format: uuid
      responses:
        '200':
          description: Pool created/updated successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /pools/groups:
    get:
      operationId: getPoolGroups
      tags:
        - Pool Groups
      summary: Get all pool groups
      description: Returns all pool groups
      security: []
      parameters:
        - name: active_only
          in: query
          schema:
            type: boolean
            default: false
          description: Filter to only active groups
      responses:
        '200':
          description: List of pool groups
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      properties: &ref_36
                        id:
                          type: string
                          format: uuid
                        name:
                          type: string
                        is_active:
                          type: boolean
                        created_at:
                          type: string
                          format: date-time
                        updated_at:
                          type: string
                          format: date-time
  /pools/{id}/likes:
    get:
      operationId: getPoolLikes
      tags:
        - Pool Likes
      summary: Get pool likes count
      description: Returns the total number of likes for a pool
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: address
          in: query
          schema:
            type: string
          description: Filter by user address (use "me" for current user)
      responses:
        '200':
          description: Pool likes count
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: integer
        '404':
          description: Resource not found
          content: *ref_6
    put:
      operationId: likePool
      tags:
        - Pool Likes
      summary: Like a pool
      description: Adds a like to a pool
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Pool liked successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: integer
                    description: New total likes count
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    delete:
      operationId: unlikePool
      tags:
        - Pool Likes
      summary: Unlike a pool
      description: Removes a like from a pool
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Pool unliked successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: integer
                    description: New total likes count
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /collections:
    get:
      operationId: getCollections
      tags:
        - Collections
      summary: Get all collections
      description: Returns collections with filtering and pagination (committee members only for full access)
      parameters:
        - name: q
          in: query
          schema:
            type: string
          description: Search query
        - name: assignee
          in: query
          schema:
            type: string
        - name: status
          in: query
          schema:
            type: string
            enum: &ref_18
              - pending
              - approved
              - rejected
              - to_review
              - under_review
        - name: type
          in: query
          schema:
            type: string
            enum:
              - standard
              - third_party
        - name: is_published
          in: query
          schema:
            type: string
            enum:
              - 'true'
              - 'false'
        - name: sort
          in: query
          schema:
            type: string
            enum:
              - MOST_RELEVANT
              - CREATED_AT_DESC
              - CREATED_AT_ASC
              - NAME_DESC
              - NAME_ASC
              - UPDATED_AT_DESC
              - UPDATED_AT_ASC
        - name: page
          in: query
          schema: &ref_10
            type: integer
            minimum: 1
            default: 1
          description: Page number for pagination
        - name: limit
          in: query
          schema: *ref_9
          description: Number of items per page
      responses:
        '200':
          description: List of collections
          content:
            application/json:
              schema:
                type: object
                properties: &ref_11
                  ok:
                    type: boolean
                  data:
                    oneOf:
                      - type: array
                        items:
                          type: object
                          properties: &ref_12
                            id:
                              type: string
                              format: uuid
                            name:
                              type: string
                            eth_address:
                              type: string
                            salt:
                              type: string
                            contract_address:
                              type: string
                            urn:
                              type: string
                            is_published:
                              type: boolean
                            is_approved:
                              type: boolean
                            minters:
                              type: array
                              items:
                                type: string
                            managers:
                              type: array
                              items:
                                type: string
                            forum_link:
                              type: string
                            forum_id:
                              type: integer
                            lock:
                              type: string
                              format: date-time
                            reviewed_at:
                              type: string
                              format: date-time
                            created_at:
                              type: string
                              format: date-time
                            updated_at:
                              type: string
                              format: date-time
                      - type: object
                        properties: &ref_19
                          results:
                            type: array
                            items:
                              type: object
                          total:
                            type: integer
                          page:
                            type: integer
                          pages:
                            type: integer
                          limit:
                            type: integer
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /{address}/collections:
    get:
      operationId: getCollectionsByAddress
      tags:
        - Collections
      summary: Get collections by address
      description: Returns collections for a specific address
      parameters:
        - name: address
          in: path
          required: true
          schema:
            type: string
        - name: is_published
          in: query
          schema:
            type: string
        - name: sort
          in: query
          schema:
            type: string
        - name: page
          in: query
          schema: *ref_10
          description: Page number for pagination
        - name: limit
          in: query
          schema: *ref_9
          description: Number of items per page
      responses:
        '200':
          description: List of collections
          content:
            application/json:
              schema:
                type: object
                properties: *ref_11
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /collections/{id}:
    get:
      operationId: getCollection
      tags:
        - Collections
      summary: Get a collection
      description: Returns a collection by ID
      parameters:
        - name: id
          in: path
          required: true
          schema: &ref_13
            type: string
            format: uuid
          description: Collection UUID
      responses:
        '200':
          description: Collection details
          content:
            application/json:
              schema:
                type: object
                properties: &ref_39
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties: *ref_12
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    put:
      operationId: upsertCollection
      tags:
        - Collections
      summary: Create or update a collection
      description: Creates a new collection or updates an existing one
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_37
                - id
                - name
              properties: &ref_38
                id:
                  type: string
                  format: uuid
                name:
                  type: string
                urn:
                  type: string
      responses:
        '200':
          description: Collection created/updated successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '409':
          description: Conflict - resource already exists or is in an invalid state
          content: &ref_14
            application/json:
              schema:
                type: object
                properties: *ref_3
        '423':
          description: Resource is locked and cannot be modified
          content: &ref_15
            application/json:
              schema:
                type: object
                properties: *ref_3
    delete:
      operationId: deleteCollection
      tags:
        - Collections
      summary: Delete a collection
      description: Deletes a collection
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      responses:
        '200':
          description: Collection deleted successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '409':
          description: Conflict - resource already exists or is in an invalid state
          content: *ref_14
        '423':
          description: Resource is locked and cannot be modified
          content: *ref_15
  /collections/{id}/publish:
    post:
      operationId: publishCollection
      tags:
        - Collections
      summary: Publish a collection
      description: Publishes a collection to the blockchain
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                itemIds:
                  type: array
                  items:
                    type: string
                cheque:
                  type: object
                  properties: &ref_17
                    qty:
                      type: integer
                    salt:
                      type: string
                    signature:
                      type: string
      responses:
        '200':
          description: Collection published successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '409':
          description: Conflict - resource already exists or is in an invalid state
          content: *ref_14
  /collections/{id}/lock:
    post:
      operationId: lockCollection
      tags:
        - Collections
      summary: Lock a collection
      description: Locks a collection until publication
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      responses:
        '200':
          description: Collection locked successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: string
                    format: date-time
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
        '500':
          description: Internal server error
          content: &ref_16
            application/json:
              schema:
                type: object
                properties: *ref_3
  /collections/{id}/tos:
    post:
      operationId: saveCollectionTos
      tags:
        - Collections
      summary: Save Terms of Service
      description: Records Terms of Service acceptance for collection publication
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - email
              properties:
                email:
                  type: string
                  format: email
                event:
                  type: string
                  enum:
                    - publish_collection_tos
                    - publish_third_party_items_tos
                hashes:
                  type: array
                  items:
                    type: string
      responses:
        '200':
          description: TOS recorded successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
        '500':
          description: Internal server error
          content: *ref_16
  /collections/{id}/approvalData:
    get:
      operationId: getCollectionApprovalData
      tags:
        - Collections
      summary: Get approval data
      description: Returns data needed to approve a third-party collection
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      responses:
        '200':
          description: Approval data
          content:
            application/json:
              schema:
                type: object
                properties: &ref_43
                  cheque:
                    type: object
                    properties: *ref_17
                  content_hashes:
                    type: object
                    additionalProperties:
                      type: string
                  chequeWasConsumed:
                    type: boolean
                  root:
                    type: string
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
        '409':
          description: Conflict - resource already exists or is in an invalid state
          content: *ref_14
        '500':
          description: Internal server error
          content: *ref_16
  /addresses:
    get:
      operationId: getCollectionAddresses
      tags:
        - Collections
      summary: Get collection addresses
      description: Returns collection contract addresses with filtering
      security: []
      parameters:
        - name: status
          in: query
          schema:
            type: string
            enum: *ref_18
        - name: page
          in: query
          schema: *ref_10
          description: Page number for pagination
        - name: limit
          in: query
          schema: *ref_9
          description: Number of items per page
      responses:
        '200':
          description: List of addresses
  /items:
    get:
      operationId: getItems
      tags:
        - Items
      summary: Get all items
      description: Returns all items (committee members only)
      responses:
        '200':
          description: List of items
          content:
            application/json:
              schema:
                type: object
                properties: &ref_20
                  ok:
                    type: boolean
                  data:
                    oneOf:
                      - type: array
                        items:
                          type: object
                          properties: &ref_21
                            id:
                              type: string
                              format: uuid
                            urn:
                              type: string
                            name:
                              type: string
                            description:
                              type: string
                            thumbnail:
                              type: string
                            video:
                              type: string
                            eth_address:
                              type: string
                            collection_id:
                              type: string
                              format: uuid
                            blockchain_item_id:
                              type: string
                            price:
                              type: string
                            beneficiary:
                              type: string
                            rarity:
                              type: string
                              enum:
                                - common
                                - uncommon
                                - rare
                                - epic
                                - legendary
                                - mythic
                                - unique
                            type:
                              type: string
                              enum:
                                - wearable
                                - emote
                            data:
                              type: object
                            metrics:
                              type: object
                            utility:
                              type: string
                            contents:
                              type: object
                              additionalProperties:
                                type: string
                            mappings:
                              type: object
                            is_published:
                              type: boolean
                            is_approved:
                              type: boolean
                            in_catalyst:
                              type: boolean
                            total_supply:
                              type: integer
                            content_hash:
                              type: string
                            created_at:
                              type: string
                              format: date-time
                            updated_at:
                              type: string
                              format: date-time
                      - type: object
                        properties: *ref_19
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /{address}/items:
    get:
      operationId: getItemsByAddress
      tags:
        - Items
      summary: Get items by address
      description: Returns items for a specific address
      parameters:
        - name: address
          in: path
          required: true
          schema:
            type: string
        - name: collectionId
          in: query
          schema:
            type: string
        - name: page
          in: query
          schema: *ref_10
          description: Page number for pagination
        - name: limit
          in: query
          schema: *ref_9
          description: Number of items per page
      responses:
        '200':
          description: List of items
          content:
            application/json:
              schema:
                type: object
                properties: *ref_20
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /items/{id}:
    get:
      operationId: getItem
      tags:
        - Items
      summary: Get an item
      description: Returns an item by ID
      parameters:
        - name: id
          in: path
          required: true
          schema: &ref_22
            type: string
            format: uuid
          description: Item UUID
      responses:
        '200':
          description: Item details
          content:
            application/json:
              schema:
                type: object
                properties: &ref_42
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties: *ref_21
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
        '500':
          description: Internal server error
          content: *ref_16
    put:
      operationId: upsertItem
      tags:
        - Items
      summary: Create or update an item
      description: Creates a new item or updates an existing one (by ID or URN)
      parameters:
        - name: id
          description: Item UUID or URN
          in: path
          required: true
          schema:
            oneOf:
              - type: string
                format: uuid
              - type: string
                pattern: ^(urn:decentraland:(mainnet|goerli|sepolia|matic|mumbai|amoy):collections-thirdparty:[^:|\\s]+):([^:|\\s]+):([^:|\\s]+)$
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_40
                - id
                - name
                - description
                - rarity
                - type
                - data
                - contents
              properties: &ref_41
                id:
                  type: string
                  format: uuid
                urn:
                  type: string
                name:
                  type: string
                description:
                  type: string
                collection_id:
                  type: string
                  format: uuid
                rarity:
                  type: string
                type:
                  type: string
                  enum:
                    - wearable
                    - emote
                data:
                  type: object
                contents:
                  type: object
                utility:
                  type: string
                mappings:
                  type: object
      responses:
        '200':
          description: Item created/updated successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
        '409':
          description: Conflict - resource already exists or is in an invalid state
          content: *ref_14
        '423':
          description: Resource is locked and cannot be modified
          content: *ref_15
    delete:
      operationId: deleteItem
      tags:
        - Items
      summary: Delete an item
      description: Deletes an item
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_22
          description: Item UUID
      responses:
        '200':
          description: Item deleted successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
        '409':
          description: Conflict - resource already exists or is in an invalid state
          content: *ref_14
        '423':
          description: Resource is locked and cannot be modified
          content: *ref_15
        '500':
          description: Internal server error
          content: *ref_16
  /collections/{id}/items:
    get:
      operationId: getCollectionItems
      tags:
        - Items
      summary: Get collection items
      description: Returns items for a specific collection
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
        - name: status
          in: query
          schema:
            type: string
            enum: *ref_18
        - name: synced
          in: query
          schema:
            type: string
        - name: mappingStatus
          in: query
          schema:
            type: string
            enum:
              - missing_mapping
              - unpublished_mapping
        - name: name
          in: query
          schema:
            type: string
        - name: page
          in: query
          schema: *ref_10
          description: Page number for pagination
        - name: limit
          in: query
          schema: *ref_9
          description: Number of items per page
      responses:
        '200':
          description: List of items
          content:
            application/json:
              schema:
                type: object
                properties: *ref_20
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /items/{id}/files:
    post:
      operationId: uploadItemFiles
      tags:
        - Items
      summary: Upload item files
      description: Uploads content files for an item
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_22
          description: Item UUID
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
      responses:
        '200':
          description: Files uploaded successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /items/{id}/videos:
    post:
      operationId: uploadItemVideo
      tags:
        - Items
      summary: Upload item video
      description: Uploads a video file for an item (max 250MB)
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_22
          description: Item UUID
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
      responses:
        '200':
          description: Video uploaded successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /items/{collectionAddress}/{itemId}/contents:
    get:
      operationId: getItemContents
      tags:
        - Items
      summary: Get item contents
      description: Returns item contents by contract address and item ID
      security: []
      parameters:
        - name: collectionAddress
          in: path
          required: true
          schema:
            type: string
        - name: itemId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Item contents
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: string
        '404':
          description: Resource not found
          content: *ref_6
        '500':
          description: Internal server error
          content: *ref_16
  /published-collections/{address}/items/{id}/utility:
    get:
      operationId: getItemUtility
      tags:
        - Items
      summary: Get item utility
      description: Returns the utility field for a published item
      security: []
      parameters:
        - name: address
          in: path
          required: true
          schema:
            type: string
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Item utility
          content:
            application/json:
              schema:
                type: object
                properties:
                  utility:
                    type: string
                    nullable: true
        '404':
          description: Resource not found
          content: *ref_6
  /curations:
    get:
      operationId: getCollectionCurations
      tags:
        - Curations
      summary: Get all collection curations
      description: Returns all collection curations
      responses:
        '200':
          description: List of curations
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      properties: &ref_23
                        id:
                          type: string
                          format: uuid
                        collection_id:
                          type: string
                          format: uuid
                        status:
                          type: string
                          enum: *ref_18
                        assignee:
                          type: string
                        created_at:
                          type: string
                          format: date-time
                        updated_at:
                          type: string
                          format: date-time
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /collections/{id}/curation:
    get:
      operationId: getCollectionCuration
      tags:
        - Curations
      summary: Get collection curation
      description: Returns the curation for a collection
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      responses:
        '200':
          description: Collection curation
          content:
            application/json:
              schema:
                type: object
                properties: &ref_44
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties: *ref_23
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
        '409':
          description: Conflict - resource already exists or is in an invalid state
          content: *ref_14
    post:
      operationId: createCollectionCuration
      tags:
        - Curations
      summary: Create collection curation
      description: Creates a new curation for a collection
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                assignee:
                  type: string
      responses:
        '200':
          description: Curation created successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    patch:
      operationId: updateCollectionCuration
      tags:
        - Curations
      summary: Update collection curation
      description: Updates a collection curation
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  enum: *ref_18
                assignee:
                  type: string
      responses:
        '200':
          description: Curation updated successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /collections/{id}/curation/post:
    post:
      operationId: createCurationForumPost
      tags:
        - Curations
      summary: Create curation forum post
      description: Creates a forum post for curation assignee change
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: Forum post created successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /collections/{id}/itemCurations:
    get:
      operationId: getCollectionItemCurations
      tags:
        - Curations
      summary: Get collection item curations
      description: Returns item curations for a collection
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
        - name: itemIds
          in: query
          schema:
            type: array
            items:
              type: string
      responses:
        '200':
          description: List of item curations
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /items/{id}/curation:
    get:
      operationId: getItemCuration
      tags:
        - Curations
      summary: Get item curation
      description: Returns the curation for an item
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_22
          description: Item UUID
      responses:
        '200':
          description: Item curation
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    post:
      operationId: createItemCuration
      tags:
        - Curations
      summary: Create item curation
      description: Creates a new curation for an item
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_22
          description: Item UUID
      responses:
        '200':
          description: Curation created successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
        '409':
          description: Conflict - resource already exists or is in an invalid state
          content: *ref_14
    patch:
      operationId: updateItemCuration
      tags:
        - Curations
      summary: Update item curation
      description: Updates an item curation
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_22
          description: Item UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  enum: *ref_18
      responses:
        '200':
          description: Curation updated successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /committee:
    get:
      operationId: getCommittee
      tags:
        - Committee
      summary: Check committee membership
      description: Returns the committee members
      security: []
      responses:
        '200':
          description: Committee members
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        address:
                          type: string
  /thirdParties:
    get:
      operationId: getThirdParties
      tags:
        - Third Party
      summary: Get third parties
      description: Returns all third-party providers
      parameters:
        - name: manager
          in: query
          schema:
            type: string
      responses:
        '200':
          description: List of third parties
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      properties: &ref_24
                        id:
                          type: string
                        name:
                          type: string
                        description:
                          type: string
                        managers:
                          type: array
                          items:
                            type: string
                        maxItems:
                          type: string
                        totalItems:
                          type: string
                        contracts:
                          type: array
                          items:
                            type: object
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /thirdParties/{id}:
    get:
      operationId: getThirdParty
      tags:
        - Third Party
      summary: Get a third party
      description: Returns a third party by ID
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Third party details
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties: *ref_24
        '404':
          description: Resource not found
          content: *ref_6
    delete:
      operationId: deleteThirdParty
      tags:
        - Third Party
      summary: Remove virtual third party
      description: Removes a virtual third party after it's on the graph
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Third party removed successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    patch:
      operationId: updateThirdParty
      tags:
        - Third Party
      summary: Update third party
      description: Updates a virtual third party
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: Third party updated successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /thirdParties/{id}/slots:
    get:
      operationId: getThirdPartySlots
      tags:
        - Third Party
      summary: Get available slots
      description: Returns the number of available slots for a third party
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Available slots count
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: integer
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /rarities:
    get:
      operationId: getRarities
      tags:
        - Rarities
      summary: Get all rarities
      description: Returns all available item rarities with prices
      security: []
      responses:
        '200':
          description: List of rarities
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      properties: &ref_25
                        id:
                          type: string
                        name:
                          type: string
                        price:
                          type: string
                        maxSupply:
                          type: string
                        prices:
                          type: object
                          properties:
                            MANA:
                              type: string
                            USD:
                              type: string
  /rarities/{name}:
    get:
      operationId: getRarity
      tags:
        - Rarities
      summary: Get a rarity
      description: Returns a specific rarity by name
      security: []
      parameters:
        - name: name
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Rarity details
          content:
            application/json:
              schema:
                type: object
                properties: &ref_45
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties: *ref_25
        '404':
          description: Resource not found
          content: *ref_6
  /collections/{id}/post:
    post:
      operationId: createCollectionForumPost
      tags:
        - Forum
      summary: Create collection forum post
      description: Creates a forum post for a collection
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_13
          description: Collection UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                forumPost:
                  type: object
                  properties:
                    title:
                      type: string
                    raw:
                      type: string
      responses:
        '200':
          description: Forum post created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: string
                    description: Forum link
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '500':
          description: Internal server error
          content: *ref_16
  /assetPacks:
    get:
      operationId: getAssetPacks
      tags:
        - Asset Packs
      summary: Get all asset packs
      description: Returns asset packs for the user or default packs
      security: []
      parameters:
        - name: owner
          in: query
          schema:
            type: string
            description: Use "default" for default packs or user address
      responses:
        '200':
          description: List of asset packs
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      properties: &ref_26
                        id:
                          type: string
                          format: uuid
                        title:
                          type: string
                        thumbnail:
                          type: string
                        eth_address:
                          type: string
                        assets:
                          type: array
                          items:
                            type: object
                            properties: &ref_28
                              id:
                                type: string
                                format: uuid
                              asset_pack_id:
                                type: string
                                format: uuid
                              name:
                                type: string
                              model:
                                type: string
                              script:
                                type: string
                              thumbnail:
                                type: string
                              tags:
                                type: array
                                items:
                                  type: string
                              category:
                                type: string
                              contents:
                                type: object
                              metrics:
                                type: object
                              parameters:
                                type: array
                              actions:
                                type: array
                        created_at:
                          type: string
                          format: date-time
                        updated_at:
                          type: string
                          format: date-time
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /assetPacks/{id}:
    get:
      operationId: getAssetPack
      tags:
        - Asset Packs
      summary: Get an asset pack
      description: Returns an asset pack by ID
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Asset pack details
          content:
            application/json:
              schema:
                type: object
                properties: &ref_27
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties: *ref_26
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    put:
      operationId: upsertAssetPack
      tags:
        - Asset Packs
      summary: Create or update an asset pack
      description: Creates a new asset pack or updates an existing one
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: &ref_46
                - id
                - title
                - assets
              properties: &ref_47
                id:
                  type: string
                  format: uuid
                title:
                  type: string
                assets:
                  type: array
                  items:
                    type: object
                    required: &ref_48
                      - id
                      - name
                      - model
                    properties: &ref_49
                      id:
                        type: string
                        format: uuid
                      asset_pack_id:
                        type: string
                        format: uuid
                      name:
                        type: string
                      model:
                        type: string
                      script:
                        type: string
                      thumbnail:
                        type: string
                      tags:
                        type: array
                        items:
                          type: string
                      category:
                        type: string
                      contents:
                        type: object
                      metrics:
                        type: object
      responses:
        '200':
          description: Asset pack created/updated successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
    delete:
      operationId: deleteAssetPack
      tags:
        - Asset Packs
      summary: Delete an asset pack
      description: Deletes an asset pack
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Asset pack deleted successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /assetPacks/{id}/thumbnail:
    post:
      operationId: uploadAssetPackThumbnail
      tags:
        - Asset Packs
      summary: Upload asset pack thumbnail
      description: Uploads a thumbnail for an asset pack
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                thumbnail:
                  type: string
                  format: binary
      responses:
        '200':
          description: Thumbnail uploaded successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /assetPacks/{assetPackId}/assets/{id}/files:
    post:
      operationId: uploadAssetFiles
      tags:
        - Assets
      summary: Upload asset files
      description: Uploads files for an asset in an asset pack
      parameters:
        - name: assetPackId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
      responses:
        '200':
          description: Files uploaded successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /assets/{id}:
    get:
      operationId: getAsset
      tags:
        - Assets
      summary: Get a single asset
      description: Returns an asset by ID
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Asset details
          content:
            application/json:
              schema:
                type: object
                properties: *ref_27
        '404':
          description: Resource not found
          content: *ref_6
  /assets:
    get:
      operationId: getAssets
      tags:
        - Assets
      summary: Get multiple assets
      description: Returns multiple assets by IDs
      security: []
      parameters:
        - name: id
          in: query
          required: true
          schema:
            oneOf:
              - type: string
                format: uuid
              - type: array
                items:
                  type: string
                  format: uuid
      responses:
        '200':
          description: List of assets
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      properties: *ref_28
  /projects/{id}/manifest:
    get:
      operationId: getProjectManifest
      tags:
        - Manifest
      summary: Get project manifest
      description: Returns the manifest for a project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '301':
          description: Redirect to S3 manifest URL
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    put:
      operationId: upsertProjectManifest
      tags:
        - Manifest
      summary: Upsert project manifest
      description: Creates or updates the manifest for a project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                manifest:
                  type: object
      responses:
        '200':
          description: Manifest upserted successfully
          content:
            application/json:
              schema:
                type: object
                properties: *ref_5
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
    delete:
      operationId: deleteProjectManifest
      tags:
        - Manifest
      summary: Delete project manifest
      description: Deletes the manifest for a project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '200':
          description: Manifest deleted successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /manifests:
    get:
      operationId: getManifests
      tags:
        - Manifest
      summary: Get all manifests
      description: Returns all manifests for the authenticated user
      responses:
        '200':
          description: List of manifests
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /publics/{id}/manifest:
    get:
      operationId: getPublicProjectManifest
      tags:
        - Manifest
      summary: Get public project manifest
      description: Returns the manifest for a public project
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '301':
          description: Redirect to S3 manifest URL
        '404':
          description: Resource not found
          content: *ref_6
  /templates/{id}/manifest:
    get:
      operationId: getTemplateManifest
      tags:
        - Manifest
      summary: Get template manifest
      description: Returns the manifest for a template project
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '301':
          description: Redirect to S3 manifest URL
        '404':
          description: Resource not found
          content: *ref_6
  /pools/{id}/manifest:
    get:
      operationId: getPoolManifest
      tags:
        - Manifest
      summary: Get pool manifest
      description: Returns the manifest for a pool
      security: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '301':
          description: Redirect to S3 manifest URL
        '404':
          description: Resource not found
          content: *ref_6
  /deployments:
    get:
      operationId: getDeployments
      tags:
        - Deployments
      summary: Get all deployments
      description: Returns all deployments for the authenticated user
      responses:
        '200':
          description: List of deployments
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /projects/{id}/deployment:
    get:
      operationId: getProjectDeployment
      tags:
        - Deployments
      summary: Get project deployment
      description: Returns deployment info for a project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '200':
          description: Deployment details
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    put:
      operationId: upsertProjectDeployment
      tags:
        - Deployments
      summary: Create or update deployment
      description: Creates or updates deployment info for a project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deployment:
                  type: object
      responses:
        '200':
          description: Deployment updated successfully
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
    delete:
      operationId: deleteProjectDeployment
      tags:
        - Deployments
      summary: Delete deployment
      description: Deletes deployment info for a project
      parameters:
        - name: id
          in: path
          required: true
          schema: *ref_4
          description: Project UUID
      responses:
        '200':
          description: Deployment deleted successfully
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
        '404':
          description: Resource not found
          content: *ref_6
  /storage/assetPacks/{filename}:
    get:
      operationId: getAssetPackFile
      tags:
        - Storage
      summary: Get asset pack file
      description: Redirects to S3 URL for asset pack file
      security: []
      parameters:
        - name: filename
          in: path
          required: true
          schema:
            type: string
      responses:
        '301':
          description: Redirect to S3 URL
  /storage/contents/{hash}:
    get:
      operationId: getContentByHash
      tags:
        - Storage
      summary: Get content by hash
      description: Redirects to S3 URL for content file
      security: []
      parameters:
        - name: hash
          in: path
          required: true
          schema:
            type: string
      responses:
        '301':
          description: Redirect to S3 URL
    head:
      operationId: getContentHeaders
      tags:
        - Storage
      summary: Get content headers
      description: Returns headers for content file without body
      security: []
      parameters:
        - name: hash
          in: path
          required: true
          schema:
            type: string
      responses:
        '301':
          description: Redirect to S3 URL
  /storage/contents/{hash}/exists:
    get:
      operationId: checkContentExists
      tags:
        - Storage
      summary: Check if content exists
      description: Returns whether a file exists in storage without downloading it
      security: []
      parameters:
        - name: hash
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: File exists
        '404':
          description: File does not exist
  /storage/upload:
    post:
      operationId: uploadContent
      tags:
        - Storage
      summary: Upload content file
      description: Uploads a file to storage
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
      responses:
        '200':
          description: File uploaded successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties:
                      hash:
                        type: string
        '401':
          description: Unauthorized - authentication required or insufficient permissions
          content: *ref_2
  /share/{type}/{id}:
    get:
      operationId: getSharePage
      tags:
        - Share
      summary: Get share page
      description: Returns an HTML share page for a project or pool. Redirects to Builder if not a social agent.
      security: []
      parameters:
        - name: type
          in: path
          required: true
          schema:
            type: string
            enum:
              - scene
              - pool
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Share HTML page
          content:
            text/html:
              schema:
                type: string
        '301':
          description: Redirect to Builder URL
        '404':
          description: Resource not found
  /analytics/weekly:
    get:
      operationId: getWeeklyAnalytics
      tags:
        - Analytics
      summary: Get weekly analytics
      description: Returns weekly statistics
      security: []
      parameters:
        - name: base
          in: query
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Weekly analytics data
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
  /analytics/status:
    get:
      operationId: getAnalyticsStatus
      tags:
        - Analytics
      summary: Get analytics status
      description: Returns current analytics status
      security: []
      responses:
        '200':
          description: Analytics status
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
  /nfts:
    get:
      operationId: getNfts
      tags:
        - NFT
      summary: Get NFTs
      description: Returns NFTs for an address
      security: []
      parameters:
        - name: owner
          in: query
          required: true
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: first
          in: query
          schema:
            type: integer
            minimum: 1
        - name: skip
          in: query
          schema:
            type: integer
            minimum: 0
        - name: cursor
          in: query
          schema:
            type: string
      responses:
        '200':
          description: List of NFTs
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '500':
          description: Internal server error
          content: *ref_16
  /nfts/{contractAddress}/{tokenId}:
    get:
      operationId: getNft
      tags:
        - NFT
      summary: Get single NFT
      description: Returns a specific NFT by contract address and token ID
      security: []
      parameters:
        - name: contractAddress
          in: path
          required: true
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: tokenId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: NFT details
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '404':
          description: Resource not found
          content: *ref_6
        '500':
          description: Internal server error
          content: *ref_16
  /lands/redirectionHashes:
    get:
      operationId: getRedirectionHashes
      tags:
        - LAND
      summary: Get redirection hashes
      description: Returns IPFS hashes for LAND redirection files
      security: []
      parameters:
        - name: coords
          in: query
          required: true
          schema:
            oneOf:
              - type: string
              - type: array
                items:
                  type: string
      responses:
        '200':
          description: Redirection hashes
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        x:
                          type: integer
                        'y':
                          type: integer
                        ipfsHash:
                          type: string
                        contentHash:
                          type: string
        '400':
          description: Bad request - invalid input
          content: *ref_7
  /lands/{coords}/redirection:
    post:
      operationId: uploadLandRedirection
      tags:
        - LAND
      summary: Upload LAND redirection
      description: Uploads a redirection file to IPFS
      security: []
      parameters:
        - name: coords
          in: path
          required: true
          schema:
            type: string
            pattern: ^-?[0-9]+,-?[0-9]+$
      responses:
        '200':
          description: Redirection uploaded
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
                    properties:
                      ipfsHash:
                        type: string
                      contentHash:
                        type: string
        '400':
          description: Bad request - invalid input
          content: *ref_7
        '500':
          description: Internal server error
          content: *ref_16
  /newsletter:
    post:
      operationId: subscribeToNewsletter
      tags:
        - Newsletter
      summary: Subscribe to newsletter
      description: Subscribes an email to the newsletter
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - email
              properties:
                email:
                  type: string
                  format: email
                source:
                  type: string
      responses:
        '200':
          description: Subscribed successfully
  /newsletter/{subscriptionId}:
    get:
      operationId: getNewsletterSubscription
      tags:
        - Newsletter
      summary: Get subscription
      description: Returns a newsletter subscription by ID
      security: []
      parameters:
        - name: subscriptionId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Subscription details
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  data:
                    type: object
    delete:
      operationId: deleteNewsletterSubscription
      tags:
        - Newsletter
      summary: Delete subscription
      description: Deletes a newsletter subscription
      security: []
      parameters:
        - name: subscriptionId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Subscription deleted 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.
  parameters:
    ProjectId:
      name: id
      in: path
      required: true
      schema: *ref_4
      description: Project UUID
    CollectionId:
      name: id
      in: path
      required: true
      schema: *ref_13
      description: Collection UUID
    ItemId:
      name: id
      in: path
      required: true
      schema: *ref_22
      description: Item UUID
    Page:
      name: page
      in: query
      schema: *ref_10
      description: Page number for pagination
    Limit:
      name: limit
      in: query
      schema: *ref_9
      description: Number of items per page
    Offset:
      name: offset
      in: query
      schema: *ref_29
      description: Offset for pagination
    SortBy:
      name: sort_by
      in: query
      schema: *ref_30
      description: Field to sort by
    SortOrder:
      name: sort_order
      in: query
      schema: *ref_31
      description: Sort order
  responses:
    BadRequest:
      description: Bad request - invalid input
      content: *ref_7
    Unauthorized:
      description: Unauthorized - authentication required or insufficient permissions
      content: *ref_2
    NotFound:
      description: Resource not found
      content: *ref_6
    Conflict:
      description: Conflict - resource already exists or is in an invalid state
      content: *ref_14
    Locked:
      description: Resource is locked and cannot be modified
      content: *ref_15
    InternalServerError:
      description: Internal server error
      content: *ref_16
  schemas:
    ErrorResponse:
      type: object
      properties: *ref_3
    Project:
      type: object
      properties: *ref_1
    ProjectInput:
      type: object
      required: *ref_32
      properties: *ref_33
    ProjectResponse:
      type: object
      properties: *ref_5
    ProjectListResponse:
      type: object
      properties: *ref_0
    Pool:
      type: object
      allOf: *ref_8
    PoolResponse:
      type: object
      properties: *ref_34
    PoolListResponse:
      type: object
      properties: *ref_35
    PoolGroup:
      type: object
      properties: *ref_36
    Collection:
      type: object
      properties: *ref_12
    CollectionInput:
      type: object
      required: *ref_37
      properties: *ref_38
    CollectionResponse:
      type: object
      properties: *ref_39
    CollectionListResponse:
      type: object
      properties: *ref_11
    Item:
      type: object
      properties: *ref_21
    ItemInput:
      type: object
      required: *ref_40
      properties: *ref_41
    ItemResponse:
      type: object
      properties: *ref_42
    ItemListResponse:
      type: object
      properties: *ref_20
    ItemApprovalData:
      type: object
      properties: *ref_43
    Cheque:
      type: object
      properties: *ref_17
    CurationStatus:
      type: string
      enum: *ref_18
    CollectionCuration:
      type: object
      properties: *ref_23
    CollectionCurationResponse:
      type: object
      properties: *ref_44
    ItemCuration:
      type: object
      properties:
        id:
          type: string
          format: uuid
        item_id:
          type: string
          format: uuid
        status:
          type: string
          enum: *ref_18
        content_hash:
          type: string
        is_mapping_complete:
          type: boolean
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    ThirdParty:
      type: object
      properties: *ref_24
    Rarity:
      type: object
      properties: *ref_25
    RarityResponse:
      type: object
      properties: *ref_45
    AssetPack:
      type: object
      properties: *ref_26
    AssetPackInput:
      type: object
      required: *ref_46
      properties: *ref_47
    AssetPackResponse:
      type: object
      properties: *ref_27
    Asset:
      type: object
      properties: *ref_28
    AssetInput:
      type: object
      required: *ref_48
      properties: *ref_49
    PaginatedResponse:
      type: object
      properties: *ref_19
