openapi: 3.0.3
info:
  title: 6529.io API
  description: >-
    JSON REST API for 6529.io. New here? A terminology overview and a
    step-by-step authentication walkthrough (guides &amp; auth) live at <a
    href="https://6529.io/tools/api">https://6529.io/tools/api</a>. The raw
    machine-readable spec is downloadable at <a
    href="/openapi.yaml">/openapi.yaml</a> and <a
    href="/openapi.json">/openapi.json</a>.
  version: 1.0.0
servers:
  - url: /api
paths:
  /aggregated-activity:
    get:
      tags:
        - Aggregated Activity
      summary: Get aggregated activity
      operationId: getAggregatedActivity
      parameters:
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is ASC; applied to id sort
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: sort
          in: query
          description: Default is primary_purchases_count
          required: false
          schema:
            type: string
            enum:
              - primary_purchases_count
              - primary_purchases_value
              - secondary_purchases_count
              - secondary_purchases_value
              - sales_count
              - sales_value
              - transfers_in
              - transfers_out
              - airdrops
              - burns
        - name: search
          in: query
          description: Search by wallet address, profile handle or ENS
          required: false
          schema:
            type: string
        - name: content
          in: query
          description: Filter by content
          required: false
          schema:
            type: string
            enum:
              - Memes
              - Gradient
              - MemeLab
              - NextGen
        - name: season
          in: query
          description: Filter by season
          required: false
          schema:
            type: number
            format: int64
        - name: collector
          in: query
          description: Filter by collector type
          required: false
          schema:
            type: string
            enum:
              - All
              - Memes
              - Meme SZN Set
              - Genesis Set
              - Gradient
              - MemeLab
              - NextGen
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiAggregatedActivityPage"
  /aggregated-activity/consolidation/{consolidation_key}:
    get:
      tags:
        - Aggregated Activity
      summary: Get aggregated activity by consolidation key.
      operationId: getAggregatedActivityByConsolidationKey
      parameters:
        - name: consolidation_key
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiAggregatedActivity"
        "404":
          description: Aggregated Activity for consolidation key not found
  /aggregated-activity/consolidation/{consolidation_key}/memes:
    get:
      tags:
        - Aggregated Activity
      summary: Get memes aggregated activity by consolidation key per season.
      operationId: getMemesAggregatedActivityByConsolidationKey
      parameters:
        - name: consolidation_key
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiAggregatedActivityMemes"
        "404":
          description: Memes Aggregated Activity for consolidation key not found
  /auth/nonce:
    get:
      tags:
        - Authentication
      summary: Get a message to sign with your web3 wallet
      operationId: getNonce
      security: []
      parameters:
        - name: signer_address
          in: query
          required: true
          schema:
            type: string
          description: Your wallet address
        - name: short_nonce
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: If true, the nonce will be shorter and easier to sign.
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiNonceResponse"
  /auth/login:
    post:
      tags:
        - Authentication
      summary: Authenticate and get JWT token
      operationId: getAuthToken
      parameters:
        - name: signer_address
          in: query
          description: Your wallet address
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiLoginRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiLoginResponse"
        "400":
          description: Invalid request
  /auth/redeem-refresh-token:
    post:
      tags:
        - Authentication
      summary: Redeem refresh token
      operationId: redeemRefreshToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiRedeemRefreshTokenRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiRedeemRefreshTokenResponse"
        "400":
          description: Invalid request
  /auth/session-nonce:
    get:
      tags:
        - Authentication
      summary: Get a wallet auth session message to sign
      description: >
        V2 wallet session nonce endpoint. Web clients receive a canonical
        ERC-4361 Sign-In with Ethereum message whose scheme, domain, and URI are
        derived from the validated request Origin. Native clients continue to
        receive the 6529 structured version-2 session message. Desktop clients
        also retain the structured version-2 message and require a loopback
        localhost Origin. The response shape is identical for every client type.
      operationId: getWalletAuthSessionNonce
      security: []
      parameters:
        - name: signer_address
          in: query
          required: true
          schema:
            type: string
          description: Your wallet address
        - name: client_type
          in: query
          required: false
          schema:
            type: string
            enum:
              - web
              - native
              - desktop
            default: web
          description: >
            Web challenges use ERC-4361 SIWE and require an allowed Origin
            header. Desktop challenges require a localhost Origin. Native and
            desktop challenges use the 6529 structured version-2 format.
        - name: chain_id
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
          description: >-
            Backward-compatible request field. Session challenges are issued for
            the backend-configured auth chain, not this client-supplied value.
      x-6529-query-schema:
        $ref: "#/components/schemas/ApiSessionNonceQuery"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiSessionNonceResponse"
        "400":
          description: Invalid request
  /auth/session-login:
    post:
      tags:
        - Authentication
      summary: Authenticate and create a wallet auth session
      description: >
        V2 web cookie sessions accept canonical ERC-4361 SIWE challenges and,
        during rollout, valid outstanding first_party_web structured challenges.
        Native and desktop refresh-token sessions continue to require matching
        6529 structured version-2 Session Type values. Desktop sessions also
        require the signed Client Origin to be a localhost loopback origin.
        External clients should use the non-cookie bearer-token login flow.
      operationId: createWalletAuthSession
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiSessionLoginRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: "#/components/schemas/ApiSessionWebResponse"
                  - $ref: "#/components/schemas/ApiSessionNativeResponse"
        "400":
          description: Invalid request
  /auth/session-refresh:
    post:
      tags:
        - Authentication
      summary: Rotate a wallet auth session and issue a fresh JWT
      operationId: refreshWalletAuthSession
      security: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              oneOf:
                - $ref: "#/components/schemas/ApiSessionRefreshWebRequest"
                - $ref: "#/components/schemas/ApiSessionRefreshNativeRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: "#/components/schemas/ApiSessionWebResponse"
                  - $ref: "#/components/schemas/ApiSessionNativeResponse"
        "400":
          description: Invalid request
  /auth/session-logout:
    post:
      tags:
        - Authentication
      summary: Revoke a wallet auth session
      operationId: logoutWalletAuthSession
      security: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              oneOf:
                - $ref: "#/components/schemas/ApiSessionLogoutWebRequest"
                - $ref: "#/components/schemas/ApiSessionLogoutNativeRequest"
      responses:
        "204":
          description: successful operation
        "400":
          description: Invalid request
  /auth/connection-share:
    post:
      tags:
        - Authentication
      summary: Create a one-time wallet connection share code
      operationId: createWalletConnectionShare
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateConnectionShareRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCreateConnectionShareResponse"
        "400":
          description: Invalid request
  /auth/connection-share/legacy-desktop:
    post:
      tags:
        - Authentication
      summary: Create a legacy desktop connection share link
      description: >
        Compatibility bridge for 6529 Desktop builds that still redeem legacy
        refresh tokens. The caller must have bearer auth and a matching active
        session-v2 web cookie. This endpoint remains available only while legacy
        refresh redemption is enabled.
      operationId: createLegacyDesktopConnectionShare
      security:
        - bearerAuth: []
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/ApiCreateLegacyDesktopConnectionShareRequest
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/ApiCreateLegacyDesktopConnectionShareResponse
        "400":
          description: Invalid request
  /auth/connection-share/redeem:
    post:
      tags:
        - Authentication
      summary: Redeem a one-time wallet connection share code
      operationId: redeemWalletConnectionShare
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiRedeemConnectionShareRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiRedeemConnectionShareResponse"
        "400":
          description: Invalid request
  /cms/profile/{identity}/primary:
    get:
      tags:
        - CMS
      summary: Get the primary published CMS site for a profile identity.
      operationId: getCmsPrimarySiteByIdentity
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCmsPublishedSite"
        "404":
          description: Profile or CMS site not found
  /cms/packages/{package_hash}:
    get:
      tags:
        - CMS
      summary: Get a published CMS package by content hash.
      operationId: getCmsPackageByHash
      parameters:
        - name: package_hash
          in: path
          required: true
          schema:
            type: string
            pattern: ^sha256:[a-f0-9]{64}$
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCmsPublishedPackage"
        "404":
          description: CMS package not found
  /cms/my/sites:
    get:
      tags:
        - CMS
      summary: List CMS sites owned by the authenticated profile.
      operationId: getMyCmsSites
      security:
        - bearerAuth: []
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiCmsSite"
        "401":
          description: Unauthorized - authentication required
  /cms/sites:
    post:
      tags:
        - CMS
      summary: Create a CMS site owned by the authenticated profile.
      operationId: createCmsSite
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCmsCreateSiteRequest"
      responses:
        "201":
          description: created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCmsSite"
        "401":
          description: Unauthorized - authentication required
  /cms/sites/{site_id}/published-packages:
    post:
      tags:
        - CMS
      summary: Publish an immutable CMS package for a site.
      operationId: publishCmsPackage
      security:
        - bearerAuth: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCmsPublishPackageRequest"
      responses:
        "201":
          description: created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCmsPublishedSite"
        "401":
          description: Unauthorized - authentication required
        "403":
          description: Forbidden - only site owners can publish
        "404":
          description: CMS site not found
  /collected-stats/{identityKey}:
    get:
      tags:
        - Collected Stats
      summary: Get consolidated collection stats for an identity
      operationId: getCollectedStats
      parameters:
        - name: identityKey
          in: path
          description: Profile handle, wallet address, or ENS name
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCollectedStats"
        "404":
          description: Identity not found
  /community-members:
    get:
      tags:
        - CommunityMembers
      summary: Get community members.
      operationId: getCommunityMembers
      parameters:
        - name: only_profile_owners
          in: query
          description: Return only profile owners?
          required: false
          schema:
            type: boolean
        - name: param
          in: query
          description: Search param
          required: false
          schema:
            type: string
        - name: sort
          in: query
          description: >-
            Optional search-result ordering. Level ranks exact, prefix, and
            substring handle matches before ENS and auto-wallet matches, then
            orders by raw profile level within each match bucket.
          required: false
          schema:
            type: string
            enum:
              - level
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiCommunityMemberMinimal"
        "400":
          description: Unsupported community-member sort
  /community-members/top:
    get:
      tags:
        - CommunityMembers
      summary: Get top community members with pagination and sorting.
      operationId: getTopCommunityMembers
      parameters:
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: sort
          in: query
          description: Default is level
          required: false
          schema:
            $ref: "#/components/schemas/ApiCommunityMembersSortOption"
        - name: group_id
          in: query
          description: Filter by group ID
          required: false
          schema:
            type: string
        - name: param
          in: query
          description: Search by identity handle or wallet address
          required: false
          schema:
            type: string
            maxLength: 200
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCommunityMembersPage"
  /community-metrics:
    get:
      tags:
        - CommunityMetrics
      summary: Get community metrics.
      operationId: getCommunityMetrics
      parameters:
        - name: interval
          in: query
          description: Metrics interval
          required: true
          schema:
            type: string
            enum:
              - DAY
              - WEEK
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCommunityMetrics"
  /community-metrics/series:
    get:
      tags:
        - CommunityMetrics
      summary: Get community metrics series.
      operationId: getCommunityMetricsSeries
      parameters:
        - name: since
          in: query
          description: Unix millis timestamp for start of series.
          required: true
          schema:
            type: number
            format: int64
        - name: to
          in: query
          description: Unix millis timestamp for end of series.
          required: true
          schema:
            type: number
            format: int64
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCommunityMetricsSeries"
  /community-metrics/mints:
    get:
      tags:
        - CommunityMetrics
      summary: Get community mint metrics.
      operationId: getCommunityMintMetrics
      parameters:
        - name: page_size
          in: query
          required: false
          schema:
            type: number
            format: int64
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
        - name: sort_direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - mint_time
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMintMetricsPage"
  /v3/waves/{wave_id}:
    get:
      tags:
        - CompetitionsV3
      summary: Read a wave as a competition hub without selecting a competition
      operationId: getWaveHubV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleGetWaveHubV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
      responses:
        "200":
          description: Visible competition hub
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveV3"
        "400":
          description: Invalid wave identifier
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Wave is absent, private, or unified reads are disabled
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions:
    get:
      tags:
        - CompetitionsV3
      summary: List zero, one, or many competitions owned by a visible wave
      operationId: listWaveCompetitionsV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListWaveCompetitionsV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: lifecycle
          in: query
          required: false
          explode: true
          schema:
            type: array
            maxItems: 5
            uniqueItems: true
            items:
              $ref: "#/components/schemas/ApiCompetitionLifecycle"
        - name: phase
          in: query
          required: false
          explode: true
          schema:
            type: array
            maxItems: 8
            uniqueItems: true
            items:
              $ref: "#/components/schemas/ApiCompetitionComputedPhase"
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - created_at
              - starts_at
              - updated_at
            default: created_at
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: ASC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Stable cursor page; no active or current competition is inferred
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionPage"
        "400":
          description: Invalid filter, sort, limit, or request-bound cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Wave is absent, private, or unified reads are disabled
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}:
    get:
      tags:
        - CompetitionsV3
      summary: Read one competition after checking both parent identifiers
      operationId: getWaveCompetitionV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleGetWaveCompetitionV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        "200":
          description: Competition resource without internal routing state
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetition"
        "400":
          description: Invalid wave or competition identifier
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: >-
            Parent or child is absent, private, mismatched, or reads are
            disabled
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/versions:
    get:
      tags:
        - CompetitionsV3
      summary: List immutable competition configuration versions newest first
      operationId: listCompetitionVersionsV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionVersionsV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Newest-first version page; non-public actor fields are omitted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionConfigVersionPage"
        "400":
          description: Invalid limit or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent or child mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/entries:
    get:
      tags:
        - CompetitionsV3
      summary: List competition entries with stable competition context
      operationId: listCompetitionEntriesV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionEntriesV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: status
          in: query
          required: false
          explode: true
          schema:
            type: array
            maxItems: 4
            uniqueItems: true
            items:
              $ref: "#/components/schemas/ApiCompetitionEntryStatus"
        - name: submitter
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - submitted_at
              - rating
              - rank
            default: submitted_at
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: ASC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Entry page ordered by submitted_at then immutable entry ID
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionEntryPage"
        "400":
          description: Invalid filter, sort, limit, or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent or child mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/entries/{entry_id}:
    get:
      tags:
        - CompetitionsV3
      summary: Read one entry after checking every parent identifier
      operationId: getCompetitionEntryV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleGetCompetitionEntryV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: entry_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        "200":
          description: Competition entry with entry-relative winner context
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionEntry"
        "400":
          description: Invalid wave, competition, or entry identifier
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent or child mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/entries/{entry_id}/votes:
    get:
      tags:
        - CompetitionsV3
      summary: List the normalized vote history for one competition entry
      operationId: listCompetitionEntryVotesV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionEntryVotesV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: entry_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: ASC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Vote page ordered by update time then stable vote ID
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionEntryVotePage"
        "400":
          description: Invalid limit, direction, or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent or child mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/leaderboard:
    get:
      tags:
        - CompetitionsV3
      summary: List the authoritative competition leaderboard
      operationId: listCompetitionLeaderboardV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionLeaderboardV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - rating
            default: rating
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: DESC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Rating order with current legacy tie rules and stable ID tie breaker
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionLeaderboardPage"
        "400":
          description: Invalid sort, limit, direction, or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent or child mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/voters:
    get:
      tags:
        - CompetitionsV3
      summary: List voter totals and credit spend for a competition or entry
      operationId: listCompetitionVotersV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionVotersV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: entry_id
          in: query
          required: false
          schema:
            type: string
            format: uuid
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - votes
            default: votes
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: DESC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Voter aggregate page ordered by votes then profile ID
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionVoterPage"
        "400":
          description: Invalid entry, sort, limit, direction, or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent, competition, or entry mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/decisions:
    get:
      tags:
        - CompetitionsV3
      summary: List competition decisions and ordered winners
      operationId: listCompetitionDecisionsV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionDecisionsV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: ASC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Decision page ordered by scheduled time then decision ID
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionDecisionPage"
        "400":
          description: Invalid limit, direction, or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent or child mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/winners:
    get:
      tags:
        - CompetitionsV3
      summary: List winner entries with stable competition context
      operationId: listCompetitionWinnersV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionWinnersV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: ASC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Winner entry page
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionEntryPage"
        "400":
          description: Invalid limit, direction, or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent or child mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/outcomes:
    get:
      tags:
        - CompetitionsV3
      summary: List competition outcomes with stable IDs and legacy positions
      operationId: listCompetitionOutcomesV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionOutcomesV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: ASC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Outcome page ordered by explicit position then stable ID
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionOutcomePage"
        "400":
          description: Invalid limit, direction, or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent or child mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/outcomes/{outcome_id}/distribution:
    get:
      tags:
        - CompetitionsV3
      summary: List ordered distribution items for one competition outcome
      operationId: listCompetitionOutcomeDistributionV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionOutcomeDistributionV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: outcome_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: ASC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Distribution page ordered by explicit position then stable ID
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionDistributionItemPage"
        "400":
          description: Invalid limit, direction, or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent, competition, or outcome mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /v3/waves/{wave_id}/competitions/{competition_id}/pauses:
    get:
      tags:
        - CompetitionsV3
      summary: List immutable pause history for a competition
      operationId: listCompetitionPausesV3
      security:
        - bearerAuth: []
        - {}
      x-6529-router:
        enabled: true
        auth: optional
        typeImportGroup: competitions-v3
        handler:
          import: "@/api/competitions/competitions-v3.handlers"
          name: handleListCompetitionPausesV3
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: competition_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: direction
          in: query
          required: false
          schema:
            allOf:
              - $ref: "#/components/schemas/ApiCompetitionSortDirection"
            default: ASC
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: Pause page ordered by start time then stable pause ID
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionPausePage"
        "400":
          description: Invalid limit, direction, or cursor
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
        "404":
          description: Masked parent or child mismatch
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompetitionError"
  /content-moderation/blocked-profiles:
    get:
      tags:
        - ContentModeration
      summary: List profiles blocked by the authenticated profile.
      operationId: getBlockedProfiles
      security:
        - bearerAuth: []
      responses:
        "200":
          description: Blocked profiles
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiBlockedProfile"
        "401":
          description: Unauthorized
  /content-moderation/profiles/{profile_id}/block:
    parameters:
      - name: profile_id
        in: path
        required: true
        schema:
          type: string
    put:
      tags:
        - ContentModeration
      summary: Block a profile for the authenticated viewer.
      operationId: blockProfile
      security:
        - bearerAuth: []
      responses:
        "200":
          description: Block state
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileBlockState"
    delete:
      tags:
        - ContentModeration
      summary: Unblock a profile for the authenticated viewer.
      operationId: unblockProfile
      security:
        - bearerAuth: []
      responses:
        "200":
          description: Block state
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileBlockState"
  /content-moderation/drops/{drop_id}/hide:
    parameters:
      - name: drop_id
        in: path
        required: true
        schema:
          type: string
    put:
      tags:
        - ContentModeration
      summary: Hide one drop for the authenticated viewer.
      operationId: hideDrop
      security:
        - bearerAuth: []
      responses:
        "200":
          description: Hidden state
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropHiddenState"
    delete:
      tags:
        - ContentModeration
      summary: Unhide one drop for the authenticated viewer.
      operationId: unhideDrop
      security:
        - bearerAuth: []
      responses:
        "200":
          description: Hidden state
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropHiddenState"
  /content-moderation/drops/{drop_id}/reports:
    post:
      tags:
        - ContentModeration
      summary: Report a drop and optionally apply personal visibility actions.
      operationId: reportDrop
      security:
        - bearerAuth: []
      parameters:
        - name: drop_id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiContentModerationReportRequest"
      responses:
        "201":
          description: Persisted report
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiContentModerationReportResponse"
  /content-moderation/moderator-access:
    get:
      tags:
        - ContentModeration
      summary: Get moderation access for the authenticated profile.
      operationId: getContentModeratorAccess
      security:
        - bearerAuth: []
      responses:
        "200":
          description: Moderator access state
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiContentModeratorAccess"
  /content-moderation/block-activity:
    get:
      tags:
        - ContentModeration
      summary: List profile block and unblock activity for authorized moderators.
      operationId: getContentModerationBlockActivity
      security:
        - bearerAuth: []
      parameters:
        - name: include_unblocks
          in: query
          required: false
          description: >-
            Include unblock transitions in the same feed. Defaults to false for
            clients that only render block events.
          schema:
            type: boolean
            default: false
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
        - name: before
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 1000
      responses:
        "200":
          description: Block activity ordered from newest to oldest
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiContentModerationBlockActivityItem"
        "403":
          description: Moderator access required
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/content-moderation/get-block-activity.handler"
          name: handleGetContentModerationBlockActivity
  /content-moderation/reports:
    get:
      tags:
        - ContentModeration
      summary: Get the authorized content moderation queue.
      operationId: getContentModerationReports
      security:
        - bearerAuth: []
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - name: before
          in: query
          required: false
          description: Opaque cursor returned by the previous moderation queue item.
          schema:
            type: string
        - name: view
          in: query
          required: false
          description: Select open work or resolved report history.
          schema:
            type: string
            enum:
              - OPEN
              - RESOLVED
            default: OPEN
      responses:
        "200":
          description: Moderation queue
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiContentModerationQueueItem"
        "403":
          description: Moderator access required
  /content-moderation/reports/mine:
    get:
      tags:
        - ContentModeration
      summary: List reports submitted by the authenticated profile.
      operationId: getMyContentModerationReports
      security:
        - bearerAuth: []
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - name: before
          in: query
          required: false
          description: Opaque cursor returned by the previous report item.
          schema:
            type: string
      responses:
        "200":
          description: Reports submitted by the authenticated profile
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiContentModerationUserReport"
  /content-moderation/drops/{drop_id}/reports/mine:
    delete:
      tags:
        - ContentModeration
      summary: Withdraw the authenticated profile's open report for a drop.
      operationId: withdrawContentModerationReport
      security:
        - bearerAuth: []
      parameters:
        - name: drop_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Withdrawn report and current drop moderation state
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/ApiContentModerationReportWithdrawalResponse
        "404":
          description: No open report exists for this profile and drop
  /content-moderation/drops/{drop_id}/decision:
    post:
      tags:
        - ContentModeration
      summary: Apply an authorized moderation decision to a drop.
      operationId: decideModeratedDrop
      security:
        - bearerAuth: []
      parameters:
        - name: drop_id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiContentModerationDropDecisionRequest"
      responses:
        "200":
          description: Current moderation state
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiContentModerationDropDecisionResponse"
        "403":
          description: Moderator access required
  /content-moderation/profiles/{profile_id}/status:
    get:
      tags:
        - ContentModeration
      summary: Get the public moderation status of a profile.
      operationId: getPublicContentModerationProfileStatus
      security: []
      parameters:
        - name: profile_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Current public profile moderation status
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiContentModerationProfileStatusResponse"
        "404":
          description: Profile not found
      x-6529-router:
        enabled: true
        auth: none
        handler:
          import: "@/api/content-moderation/get-public-profile-status.handler"
          name: handleGetPublicContentModerationProfileStatus
    post:
      tags:
        - ContentModeration
      summary: Suspend or reinstate a profile as an authorized moderator.
      operationId: setModeratedProfileStatus
      security:
        - bearerAuth: []
      parameters:
        - name: profile_id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiContentModerationProfileStatusRequest"
      responses:
        "200":
          description: Current profile status
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiContentModerationProfileStatusResponse"
        "403":
          description: Moderator access required
  /content-moderation/profiles/suspended:
    get:
      tags:
        - ContentModeration
      summary: List currently suspended profiles for authorized moderators.
      operationId: getSuspendedContentModerationProfiles
      security:
        - bearerAuth: []
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - name: before
          in: query
          required: false
          description: Opaque cursor returned by the previous profile item.
          schema:
            type: string
      responses:
        "200":
          description: Suspended profiles
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiContentModerationProfileListItem"
        "403":
          description: Moderator access required
  /distribution_phases/{contract}/{nft_id}:
    get:
      tags:
        - Distributions
      summary: Get distribution phases for a specific contract and NFT
      operationId: getDistributionPhases
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: nft_id
          in: path
          description: NFT ID
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DistributionPhasesPage"
  /distribution_photos/{contract}/{nft_id}:
    get:
      tags:
        - Distributions
      summary: Get distribution photos for a specific contract and NFT
      operationId: getDistributionPhotos
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: nft_id
          in: path
          description: NFT ID
          required: true
          schema:
            type: integer
            format: int64
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DistributionPhotosPage"
  /distribution_photos/{contract}/{nft_id}/prep:
    post:
      tags:
        - Distributions
      summary: Get presigned S3 URL for distribution photo upload
      description: Requires the user to be authenticated as a Subscription Admin
      operationId: createDistributionPhotoUploadUrl
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: nft_id
          in: path
          description: NFT ID
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateMediaUploadUrlRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCreateMediaUrlResponse"
        "400":
          description: Invalid request
        "401":
          description: Unauthorized
  /distribution_photos/{contract}/{nft_id}/multipart-upload:
    post:
      tags:
        - Distributions
      summary: Start multipart upload for distribution photo
      description: Requires the user to be authenticated as a Subscription Admin
      operationId: createDistributionPhotoMultipartUpload
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: nft_id
          in: path
          description: NFT ID
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateMediaUploadUrlRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiStartMultipartMediaUploadResponse"
        "400":
          description: Invalid request
        "401":
          description: Unauthorized
  /distribution_photos/{contract}/{nft_id}/multipart-upload/part:
    post:
      tags:
        - Distributions
      summary: Get presigned URL for multipart upload part
      description: Requires the user to be authenticated as a Subscription Admin
      operationId: uploadPartOfDistributionPhotoMultipartUpload
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: nft_id
          in: path
          description: NFT ID
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUploadPartOfMultipartUploadRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiUploadPartOfMultipartUploadResponse"
        "400":
          description: Invalid request
        "401":
          description: Unauthorized
  /distribution_photos/{contract}/{nft_id}/multipart-upload/completion:
    post:
      tags:
        - Distributions
      summary: Complete multipart upload for distribution photo
      description: Requires the user to be authenticated as a Subscription Admin
      operationId: completeDistributionPhotoMultipartUpload
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: nft_id
          in: path
          description: NFT ID
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCompleteMultipartUploadRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompleteMultipartUploadResponse"
        "400":
          description: Invalid request
        "401":
          description: Unauthorized
  /distribution_photos/{contract}/{nft_id}/complete:
    post:
      tags:
        - Distributions
      summary: Save uploaded distribution photos to database
      description: >-
        Requires the user to be authenticated as a Subscription Admin. Replaces
        all existing photos for the card.
      operationId: completeDistributionPhotosUpload
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: nft_id
          in: path
          description: NFT ID
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DistributionPhotoCompleteRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DistributionPhotoCompleteResponse"
        "400":
          description: Invalid request
        "401":
          description: Unauthorized
  /distributions:
    get:
      tags:
        - Distributions
      summary: Get distributions
      description: >-
        At least one filter parameter (search, card_id, contract, wallet, phase,
        or minted) is required
      operationId: getDistributions
      parameters:
        - name: page_size
          in: query
          description: Default is 2000
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: search
          in: query
          description: Search by wallet address or display name
          required: false
          schema:
            type: string
        - name: card_id
          in: query
          description: Filter by card ID(s), comma-separated for multiple
          required: false
          schema:
            type: string
        - name: contract
          in: query
          description: Filter by contract address(es), comma-separated for multiple
          required: false
          schema:
            type: string
        - name: wallet
          in: query
          description: Filter by wallet address(es), comma-separated for multiple
          required: false
          schema:
            type: string
        - name: phase
          in: query
          description: Filter by distribution phase(s), comma-separated for multiple
          required: false
          schema:
            type: string
        - name: minted
          in: query
          description: >-
            Filter by mint status. true returns wallets with minted count
            greater than 0; false returns wallets with minted count equal to 0
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DistributionNormalizedPage"
  /distributions/{contract}/{card_id}/wallet-allocations:
    get:
      tags:
        - Distributions
      summary: Get a wallet's phase allocations for a card
      description: >-
        Returns whether the card distribution is published and the wallet's
        Phase 0, Phase 1, Phase 2, and Public allocations. Public allocations
        can contain airdrops but never allowlist spots.
      operationId: getWalletDistributionAllocations
      security: []
      x-6529-router:
        enabled: true
        auth: none
        cache:
          ttlSeconds: 60
        handler:
          import: "@/api/distributions/get-wallet-distribution-allocations.handler"
          name: handleGetWalletDistributionAllocations
      parameters:
        - name: contract
          in: path
          description: NFT contract address
          required: true
          schema:
            $ref: "#/components/schemas/ApiEthereumAddress"
        - name: card_id
          in: path
          description: Card ID
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: wallet
          in: query
          description: Wallet address whose allocations should be returned
          required: true
          schema:
            $ref: "#/components/schemas/ApiEthereumAddress"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWalletDistributionAllocations"
        "400":
          description: Invalid contract, card ID, or wallet address
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiErrorResponse"
  /distributions/{contract}/{id}/overview:
    get:
      tags:
        - Distributions
      summary: Get distribution overview for a specific contract and card
      description: Requires the user to be authenticated as a Subscription Admin
      operationId: getDistributionOverview
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: id
          in: path
          description: Card ID
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DistributionOverview"
        "400":
          description: Invalid request
        "403":
          description: Forbidden - not a Subscription Admin
  /distributions/{contract}/{id}/artist-airdrops:
    get:
      tags:
        - Distributions
      summary: Get artist airdrops for a specific contract and card
      description: >-
        Requires the user to be authenticated as a Subscription Admin. Returns
        JSON by default, or CSV in `address,count` format when the client sends
        `Accept: text/csv`.
      operationId: getDistributionArtistAirdrops
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: id
          in: path
          description: Card ID
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/PhaseAirdrop"
            text/csv:
              schema:
                type: string
                format: binary
        "400":
          description: Invalid request
        "403":
          description: Forbidden - not a Subscription Admin
    post:
      tags:
        - Distributions
      summary: Upload artist airdrops for a specific contract and card
      description: >-
        Requires the user to be authenticated as a Subscription Admin. Replaces
        any existing distribution rows for the Airdrop - Artist phase on the
        given token. The request body must be `application/json` matching
        `ApiDistributionAirdropsCsvUploadRequest`, with a `csv` property whose
        value is CSV text in `address,count` format.
      operationId: uploadDistributionArtistAirdrops
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: id
          in: path
          description: Card ID
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiDistributionAirdropsCsvUploadRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDistributionAirdropsUploadResponse"
        "400":
          description: Invalid request
        "403":
          description: Forbidden - not a Subscription Admin
  /distributions/{contract}/{id}/team-airdrops:
    get:
      tags:
        - Distributions
      summary: Get team airdrops for a specific contract and card
      description: >-
        Requires the user to be authenticated as a Subscription Admin. Returns
        JSON by default, or CSV in `address,count` format when the client sends
        `Accept: text/csv`.
      operationId: getDistributionTeamAirdrops
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: id
          in: path
          description: Card ID
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/PhaseAirdrop"
            text/csv:
              schema:
                type: string
                format: binary
        "400":
          description: Invalid request
        "403":
          description: Forbidden - not a Subscription Admin
    post:
      tags:
        - Distributions
      summary: Upload team airdrops for a specific contract and card
      description: >-
        Requires the user to be authenticated as a Subscription Admin. Replaces
        any existing distribution rows for the Airdrop - Team phase on the given
        token. The request body must be `application/json` matching
        `ApiDistributionAirdropsCsvUploadRequest`, with a `csv` property whose
        value is CSV text in `address,count` format.
      operationId: uploadDistributionTeamAirdrops
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: id
          in: path
          description: Card ID
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiDistributionAirdropsCsvUploadRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDistributionAirdropsUploadResponse"
        "400":
          description: Invalid request
        "403":
          description: Forbidden - not a Subscription Admin
  /light-drops:
    get:
      tags:
        - Drops
      summary: Get light drops
      operationId: getLightDrops
      parameters:
        - name: limit
          in: query
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
        - name: max_serial_no
          in: query
          required: false
          description: Latest message if null
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: min_serial_no
          in: query
          required: false
          description: Oldest message if null
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: older_first
          in: query
          required: false
          description: >-
            By default this endpoint orders things newer first, but if you set
            it to true then it starts from older drops.
          schema:
            type: boolean
        - name: wave_id
          in: query
          description: Drops in wave with given ID
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiLightDrop"
  /curated-profile-wave-drops:
    get:
      tags:
        - Drops
      summary: Get curated profile wave drops
      deprecated: true
      description: >-
        Deprecated. Use GET /v2/curated-profile-wave-drops instead. Returns
        drops from effective profile-wave curations across all public profile
        waves, newest drops first. If a profile wave has an explicit profile
        curation it is used; otherwise the oldest curation in the profile wave
        is used. Reply drops are included when curated.
      operationId: getCuratedProfileWaveDrops
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
            default: 100
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCuratedProfileWaveDropsPage"
  /drops:
    get:
      tags:
        - Drops
      summary: Get latest drops.
      deprecated: true
      description: Deprecated. Use GET /v2/drops instead.
      operationId: getLatestDrops
      parameters:
        - name: limit
          in: query
          description: How many drops to return (10 by default)
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 20
        - name: author
          in: query
          description: Drops by author
          required: false
          schema:
            type: string
        - name: group_id
          in: query
          description: Drops by authors that fall into supplied group
          required: false
          schema:
            type: string
        - name: wave_id
          in: query
          description: Drops in wave with given ID
          required: false
          schema:
            type: string
        - name: curation_id
          in: query
          description: >-
            Only include drops with persisted membership in the curation
            identified by ApiWaveCuration.id (UUID string)
          required: false
          schema:
            type: string
            format: uuid
        - name: curation_name
          in: query
          description: >-
            Only include drops with persisted membership in curations with this
            ApiWaveCuration.name across all visible waves. Cannot be combined
            with curation_id.
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 50
        - name: serial_no_less_than
          in: query
          description: Used to find older drops
          required: false
          schema:
            type: integer
            format: int64
        - name: include_replies
          in: query
          description: >-
            If true then reply drops will be included in top level (false by
            default)
          required: false
          schema:
            type: boolean
        - name: drop_type
          in: query
          description: Filter by drop type
          required: false
          schema:
            $ref: "#/components/schemas/ApiDropType"
        - name: ids
          in: query
          description: Comma-separated list of drop IDs to fetch
          required: false
          schema:
            type: string
        - name: serial_nos
          in: query
          description: Comma-separated list of drop serial numbers to fetch
          required: false
          schema:
            type: string
        - name: contains_media
          in: query
          description: >-
            If true then only drops that have at least one media attachment will
            be returned (false by default)
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiDrop"
    post:
      tags:
        - Drops
      summary: Create a drop
      description: Requires the user to be authenticated
      operationId: createDrop
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateDropRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDrop"
        "400":
          description: Invalid request
  /drop-ids:
    get:
      tags:
        - Drops
      summary: Get drop IDs in wave by serial range.
      operationId: getDropIds
      parameters:
        - name: wave_id
          in: query
          description: Drops in wave with given ID
          required: true
          schema:
            type: string
        - name: min_serial_no
          in: query
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: max_serial_no
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: limit
          in: query
          description: How many IDs to return (100 by default)
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 5000
            default: 100
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiDropId"
  /boosted-drops/:
    get:
      tags:
        - Drops
      summary: Get boosted drops.
      deprecated: true
      description: Deprecated. Use GET /v2/boosted-drops instead.
      operationId: getBoostedDrops
      parameters:
        - name: author
          in: query
          description: Drops by author
          required: false
          schema:
            type: string
        - name: booster
          in: query
          description: Drops boosted by given identity
          required: false
          schema:
            type: string
        - name: wave_id
          in: query
          description: Drops by wave
          required: false
          schema:
            type: string
        - name: min_boosts
          in: query
          description: Must be boosted at least so many times
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 200
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: sort
          in: query
          description: Default is last_boosted_at
          required: false
          schema:
            type: string
            enum:
              - last_boosted_at
              - first_boosted_at
              - drop_created_at
              - boosts
        - name: count_only_boosts_after
          in: query
          description: Timestamp in millis
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropsPage"
  /drops/{dropId}/boosts:
    get:
      tags:
        - Drops
      summary: Get drop boosts by Drop ID.
      deprecated: true
      description: Deprecated. Use GET /v2/drops/{id}/boosts instead.
      operationId: getDropBoostsById
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 2000
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: sort
          in: query
          description: Default is boosted_at
          required: false
          schema:
            type: string
            enum:
              - boosted_at
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropBoostsPage"
        "404":
          description: Drop not found
    post:
      tags:
        - Drops
      summary: Boost drop
      operationId: boostDrop
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      responses:
        "201":
          description: successful operation
        "400":
          description: Invalid request
        "404":
          description: Drop not found
    delete:
      tags:
        - Drops
      summary: Delete drop boost
      operationId: deleteDropBoost
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      responses:
        "201":
          description: successful operation
        "404":
          description: Drop not found
  /drops/{dropId}/bookmark:
    post:
      tags:
        - Drops
      summary: Bookmark a drop
      description: Requires the user to be authenticated
      operationId: bookmarkDrop
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDrop"
        "400":
          description: Invalid request
        "404":
          description: Drop not found
    delete:
      tags:
        - Drops
      summary: Remove bookmark from drop
      description: Requires the user to be authenticated
      operationId: unbookmarkDrop
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDrop"
        "404":
          description: Drop not found
  /drops-bookmarked/:
    get:
      tags:
        - Drops
      summary: Get bookmarked drops for authenticated user
      description: >-
        Requires the user to be authenticated. Returns drops bookmarked by the
        current user, sorted by bookmark time.
      operationId: getBookmarkedDrops
      parameters:
        - name: wave_id
          in: query
          description: Filter by wave
          required: false
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
        - name: sort_direction
          in: query
          description: Default is DESC (newest bookmarks first)
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropsPage"
  /drops/{dropId}:
    get:
      tags:
        - Drops
      summary: Get drop by ID.
      deprecated: true
      description: Deprecated. Use GET /v2/drops/{id} instead.
      operationId: getDropById
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDrop"
        "404":
          description: Drop not found
    post:
      tags:
        - Drops
      summary: Update drop by ID
      operationId: updateDropById
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUpdateDropRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDrop"
        "400":
          description: Invalid request
        "404":
          description: Drop not found
    delete:
      tags:
        - Drops
      summary: Delete drop by ID
      operationId: deleteDropById
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      responses:
        "201":
          description: successful operation
        "404":
          description: Drop not found
  /drops/{dropId}/ratings:
    post:
      tags:
        - Drops
      summary: Rate a drop
      description: Requires the user to be authenticated
      operationId: rateDrop
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiDropRatingRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDrop"
        "400":
          description: Invalid request
        "404":
          description: Drop not found
  /drops/{dropId}/curations:
    get:
      tags:
        - Drops
      summary: Get curations for a drop
      operationId: getDropCurations
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiDropCuration"
        "404":
          description: Drop not found
    post:
      tags:
        - Drops
      summary: Add a drop to a curation
      operationId: addDropCuration
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiDropCurationRequest"
      responses:
        "201":
          description: successful operation
    delete:
      tags:
        - Drops
      summary: Remove a drop from a curation
      operationId: removeDropCuration
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiDropCurationRequest"
      responses:
        "200":
          description: successful operation
  /drops/{dropId}/reaction:
    post:
      tags:
        - Drops
      summary: React to a drop
      operationId: reactToDrop
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiAddReactionToDropRequest"
      responses:
        "201":
          description: successful operation
    delete:
      tags:
        - Drops
      summary: Remove reaction from a drop
      operationId: removeReactionFromDrop
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiAddReactionToDropRequest"
      responses:
        "201":
          description: successful operation
  /drops/{dropId}/subscriptions:
    post:
      tags:
        - Drops
      summary: Subscribe authenticated user to drop actions.
      operationId: subscribeToDropActions
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiDropSubscriptionActions"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropSubscriptionActions"
        "404":
          description: Wave not found
    delete:
      tags:
        - Drops
      summary: Unsubscribe authenticated user from drop actions.
      operationId: unsubscribeFromDropActions
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiDropSubscriptionActions"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropSubscriptionActions"
        "404":
          description: Wave not found
  /drops/{dropId}/mark-unread:
    post:
      tags:
        - Drops
      summary: Mark a drop and all subsequent drops in the wave as unread
      description: >-
        Sets the user's latest_read_timestamp to just before this drop's
        created_at, making this drop and all newer drops unread.
      operationId: markDropUnread
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMarkDropUnreadResponse"
        "404":
          description: Drop not found
  /dm-drops/unread:
    get:
      tags:
        - Drops
      summary: Get authenticated user's direct-message unread count.
      operationId: getDmDropsUnread
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/dm-drops/dm-drops.handlers"
          name: handleGetDmDropsUnread
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDmDropsUnreadCount"
        "400":
          description: Bad request
        "401":
          description: Unauthorized
        "403":
          description: Forbidden - profile required
  /dm-drops/unread/snapshot:
    get:
      tags:
        - Drops
      summary: Get authenticated user's direct-message unread snapshot.
      operationId: getDmUnreadSnapshot
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/dm-drops/dm-drops.handlers"
          name: handleGetDmUnreadSnapshot
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDmUnreadSnapshot"
        "400":
          description: Bad request
        "401":
          description: Unauthorized
        "403":
          description: Forbidden - profile required
  /drops/{dropId}/toggle-hide-link-preview:
    post:
      tags:
        - Drops
      summary: Toggle hide link preview for a drop
      description: >-
        Toggles (flips) hide_link_preview for a drop when no body is provided,
        or sets it to the provided value. Only the author can call this
        endpoint.
      operationId: toggleHideLinkPreview
      parameters:
        - name: dropId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiToggleHideLinkPreviewRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDrop"
        "403":
          description: Only the author can toggle hide link preview
        "404":
          description: Drop not found
  /drop-media/prep:
    post:
      tags:
        - Drops
      summary: Create S3 URL for drop media upload
      description: >-
        Requires authentication; content_type must be one of the defined MIME
        types.
      operationId: createDropMediaUrl
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateMediaUploadUrlRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCreateMediaUrlResponse"
        "400":
          description: Invalid request
  /attachments/multipart-upload:
    post:
      tags:
        - Drops
      summary: Initialize multipart upload for a document attachment
      description: >-
        Requires authentication; content_type must be one of the defined
        attachment MIME types.
      operationId: createAttachmentMultipartUpload
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateAttachmentMultipartUploadRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/ApiCreateAttachmentMultipartUploadResponse
        "400":
          description: Invalid request
  /attachments/multipart-upload/part:
    post:
      tags:
        - Drops
      summary: Upload a part of an attachment multipart upload
      description: Requires the user to be authenticated
      operationId: uploadPartOfAttachmentMultipartUpload
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUploadPartOfMultipartUploadRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiUploadPartOfMultipartUploadResponse"
        "400":
          description: Invalid request
  /attachments/multipart-upload/completion:
    post:
      tags:
        - Drops
      summary: Complete an attachment multipart upload
      description: Requires the user to be authenticated
      operationId: completeAttachmentMultipartUpload
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCompleteAttachmentMultipartUploadRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiAttachment"
        "400":
          description: Invalid request
  /attachments/{attachment_id}:
    get:
      tags:
        - Drops
      summary: Get attachment status and final URL
      description: Requires the user to be authenticated
      operationId: getAttachment
      parameters:
        - name: attachment_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiAttachment"
        "404":
          description: Attachment not found
  /drop-media/multipart-upload:
    post:
      tags:
        - Drops
      summary: Get upload ID and key for multipart upload
      description: >-
        Requires authentication; content_type must be one of the defined MIME
        types.
      operationId: createMultipartDropMediaUrl
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateMediaUploadUrlRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiStartMultipartMediaUploadResponse"
        "400":
          description: Invalid request
  /drop-media/multipart-upload/part:
    post:
      tags:
        - Drops
      summary: Upload a part of multipart upload
      description: Requires the user to be authenticated
      operationId: uploadPartOfDropMultipartUpload
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUploadPartOfMultipartUploadRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiUploadPartOfMultipartUploadResponse"
        "400":
          description: Invalid request
  /drop-media/multipart-upload/completion:
    post:
      tags:
        - Drops
      summary: Complete the multipart upload
      description: Requires the user to be authenticated
      operationId: completeDropMultipartUpload
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCompleteMultipartUploadRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompleteMultipartUploadResponse"
        "400":
          description: Invalid request
  /drop-media/uploads/{media_upload_id}:
    get:
      tags:
        - Drops
      summary: Get drop or wave media upload status
      description: Returns the final media URL and async sanitizer status.
      operationId: getDropMediaUploadStatus
      parameters:
        - name: media_upload_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompleteMultipartUploadResponse"
        "403":
          description: Forbidden
        "404":
          description: Media upload not found
  /wave-media/multipart-upload:
    post:
      tags:
        - Drops
      summary: Get upload ID and key for multipart upload
      description: Requires the user to be authenticated
      operationId: createMultipartWaveMediaUrl
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateMediaUploadUrlRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiStartMultipartMediaUploadResponse"
        "400":
          description: Invalid request
  /wave-media/multipart-upload/part:
    post:
      tags:
        - Drops
      summary: Upload a part of multipart upload
      description: Requires the user to be authenticated
      operationId: uploadPartOfWaveMultipartUpload
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUploadPartOfMultipartUploadRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiUploadPartOfMultipartUploadResponse"
        "400":
          description: Invalid request
  /wave-media/multipart-upload/completion:
    post:
      tags:
        - Drops
      summary: Complete the multipart upload
      description: Requires the user to be authenticated
      operationId: completeWaveMultipartUpload
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCompleteMultipartUploadRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCompleteMultipartUploadResponse"
        "400":
          description: Invalid request
  /v2/boosted-drops:
    get:
      tags:
        - DropsV2
      summary: Get V2 boosted drops.
      operationId: getBoostedDropsV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetBoostedDropsV2
      parameters:
        - name: author
          in: query
          description: Drops by author
          required: false
          schema:
            type: string
        - name: booster
          in: query
          description: Drops boosted by given identity
          required: false
          schema:
            type: string
        - name: wave_id
          in: query
          description: Drops by wave
          required: false
          schema:
            type: string
        - name: min_boosts
          in: query
          description: Must be boosted at least so many times
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: sort
          in: query
          description: Default is last_boosted_at
          required: false
          schema:
            type: string
            enum:
              - last_boosted_at
              - first_boosted_at
              - drop_created_at
              - boosts
        - name: count_only_boosts_after
          in: query
          description: Timestamp in millis
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropV2Page"
  /v2/curated-profile-wave-drops:
    get:
      tags:
        - DropsV2
      summary: Get V2 curated profile wave drops
      description: >-
        Returns V2 drops from effective profile-wave curations across all public
        profile waves, newest drops first. If a profile wave has an explicit
        profile curation it is used; otherwise the oldest curation in the
        profile wave is used. Reply drops are included when curated.
      operationId: getCuratedProfileWaveDropsV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetCuratedProfileWaveDropsV2
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
            default: 50
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropV2PageWithoutCount"
  /v2/drops:
    get:
      tags:
        - DropsV2
      summary: Get V2 drops.
      operationId: getDropsV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetDropsV2
      parameters:
        - name: parent_drop_id
          in: query
          description: Return replies under this parent drop.
          required: false
          schema:
            type: string
        - name: serial_nos
          in: query
          description: Comma-separated list of drop serial numbers to fetch.
          required: false
          schema:
            type: string
        - name: ids
          in: query
          description: Comma-separated list of drop IDs to fetch.
          required: false
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropV2PageWithoutCount"
  /v2/drops/{id}:
    get:
      tags:
        - DropsV2
      summary: Get V2 drop by ID.
      operationId: getDropV2ById
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetDropV2ById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropAndWave"
        "404":
          description: Drop not found
  /v2/drops/{id}/replies:
    get:
      tags:
        - DropsV2
      summary: Get V2 replies to a drop.
      description: Returns the reply thread for a drop using V2 drop and wave shapes.
      operationId: getDropRepliesV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleGetDropRepliesV2
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 200
            default: 50
        - name: serial_no_limit
          in: query
          required: false
          description: Serial number anchor for paginating replies.
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: search_strategy
          in: query
          required: false
          description: >-
            Use in combination with serial_no_limit. If this is not set then
            FIND_OLDER is used.
          schema:
            $ref: "#/components/schemas/ApiDropSearchStrategy"
        - name: drop_type
          in: query
          description: Filter by drop type
          required: false
          schema:
            $ref: "#/components/schemas/ApiDropType"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveDropsFeedV2"
        "400":
          description: Invalid reply feed query params
        "404":
          description: Drop not found
  /v2/drops/{id}/metadata:
    get:
      tags:
        - DropsV2
      summary: Get V2 drop metadata by drop ID.
      operationId: getDropV2MetadataById
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetDropV2MetadataById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiDropMetadataV2"
        "404":
          description: Drop not found
  /v2/drops/{id}/parts/{part_no}:
    get:
      tags:
        - DropsV2
      summary: Get a single V2 drop part by drop ID and part number.
      operationId: getDropV2PartById
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetDropV2PartById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: part_no
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropPartV2"
        "400":
          description: Invalid request
        "404":
          description: Drop or drop part not found
  /v2/drops/{id}/boosts:
    get:
      tags:
        - DropsV2
      summary: Get V2 drop boosts by drop ID.
      operationId: getDropV2BoostsById
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetDropV2BoostsById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiDropBoostV2"
        "404":
          description: Drop not found
  /v2/drops/{id}/reactions:
    get:
      tags:
        - DropsV2
      summary: Get V2 drop reactions by drop ID.
      operationId: getDropV2ReactionsById
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetDropV2ReactionsById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiDropReactionV2"
        "404":
          description: Drop not found
  /v2/drops/{id}/votes:
    get:
      tags:
        - DropsV2
      summary: Get V2 drop voters by drop ID.
      operationId: getDropV2VotersById
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetDropV2VotersById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 20
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: sort_direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
            default: DESC
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropVotersPage"
        "400":
          description: Invalid request
        "404":
          description: Drop not found
  /v2/drops/{id}/votes/download:
    get:
      tags:
        - DropsV2
      summary: Download V2 drop voters by drop ID as CSV.
      operationId: downloadDropV2VotersById
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleDownloadDropV2VotersById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            text/csv:
              schema:
                type: string
                format: binary
        "404":
          description: Drop not found
  /v2/drops/{id}/votes/logs:
    get:
      tags:
        - DropsV2
      summary: Get V2 drop vote edit logs by drop ID.
      operationId: getDropV2VoteEditLogsById
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drops-v2.handlers"
          name: handleGetDropV2VoteEditLogsById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 0
            default: 0
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 20
        - name: sort_direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
            default: DESC
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiDropVoteEditLog"
        "400":
          description: Invalid request
        "404":
          description: Drop not found
  /v2/drops/{id}/poll/{option_no}/voters:
    get:
      tags:
        - DropsV2
      summary: Get V2 drop poll option voters by drop ID and option number.
      operationId: getDropPollOptionVotersV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drop-polls.handlers"
          name: handleGetDropPollOptionVotersV2
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: option_no
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 20
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropPollVotersPage"
        "400":
          description: Invalid request
        "403":
          description: Poll is anonymous
        "404":
          description: Drop, poll, or option not found
  /v2/drops/{id}/poll/vote:
    post:
      tags:
        - DropsV2
      summary: Vote in a V2 drop poll.
      operationId: voteDropPollV2
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/drops/drop-polls.handlers"
          name: handleVoteDropPollV2
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiDropPollVoteRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropV2"
        "400":
          description: Invalid request or closed poll
        "403":
          description: User cannot vote
        "404":
          description: Drop or poll not found
  /feed:
    get:
      tags:
        - Feed
      summary: Get feed
      operationId: getFeed
      parameters:
        - name: serial_no_less_than
          in: query
          description: Used to find older items
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiFeedItem"
  /groups:
    get:
      tags:
        - Groups
      summary: Search for user groups
      operationId: searchUserGroups
      parameters:
        - name: group_name
          description: Partial or full name
          in: query
          required: false
          schema:
            type: string
        - name: author_identity
          description: Group author identity
          in: query
          required: false
          schema:
            type: string
        - name: created_at_less_than
          description: created at date less than
          in: query
          required: false
          schema:
            type: number
            format: int64
        - name: include_profile_groups
          description: Include pure profile groups in search results
          in: query
          required: false
          schema:
            type: boolean
            default: false
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiGroupFull"
    post:
      tags:
        - Groups
      summary: Create a group
      operationId: createGroup
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateGroup"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiGroupFull"
        "400":
          description: Invalid request
  /groups/preview-members:
    post:
      tags:
        - Groups
      summary: Preview current members for an unsaved group description
      description: >-
        Evaluates a draft group without creating or updating a persisted group.
        Results reflect current identity metrics and ownership data.
      operationId: previewGroupMembers
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/community-members/group-members-preview.handler"
          name: handlePreviewGroupMembers
      parameters:
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 20
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: sort_direction
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
            default: DESC
        - name: sort
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiCommunityMembersSortOption"
        - name: param
          in: query
          description: Search by identity handle or wallet address
          required: false
          schema:
            type: string
            maxLength: 200
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiGroupMembersPreviewRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCommunityMembersPage"
        "400":
          description: Invalid request
        "401":
          description: Authentication required
  /groups/{id}/visible:
    post:
      tags:
        - Groups
      summary: Change group visibility
      operationId: changeGroupVisibility
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiChangeGroupVisibility"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiGroupFull"
        "400":
          description: Invalid request
        "404":
          description: Group not found
  /groups/{id}/identity_groups/{identity_group_id}:
    get:
      tags:
        - Groups
      summary: >-
        Get identity groups identities. Identities are represented as primary
        wallet addresses
      operationId: getIdentityGroupIdentities
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: identity_group_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
        "404":
          description: Group not found
  /identities:
    get:
      tags:
        - Identities
      summary: Search or list identities
      description: >-
        When handle is supplied, exact and prefix matches are ranked before
        other substring matches, with higher raw profile level first within each
        match bucket. Without handle, identities are ordered by raw profile
        level descending.
      operationId: searchIdentities
      parameters:
        - name: handle
          description: At least 3 characters of a handle when supplied
          in: query
          required: false
          schema:
            type: string
            minLength: 3
        - name: wave_id
          description: Search only users who can view given wave
          in: query
          required: false
          schema:
            type: string
        - name: limit
          description: Number of results (20 by default)
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
        - name: group_id
          description: Search only users who can view given group
          in: query
          required: false
          schema:
            type: string
        - name: ignore_authenticated_user
          description: Ignore authenticated user
          in: query
          required: false
          schema:
            type: boolean
        - name: classification
          description: Filter by profile classification
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiProfileClassification"
        - name: subclassification
          description: Filter by exact profile subclassification
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 255
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiIdentity"
        "400":
          description: Invalid handle, limit, classification, or subclassification
  /identities/{identity_key}:
    get:
      tags:
        - Identities
      summary: >-
        Get identity by it"s key. Key can be id, wallet, handle, ENS name,
        etc...
      operationId: getIdentityByKey
      parameters:
        - name: identity_key
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentity"
  /identities/by-wallet/{wallet}:
    get:
      tags:
        - Identities
      summary: Get identity by wallet
      operationId: getIdentityByWallet
      parameters:
        - name: wallet
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentity"
  /identities/{id}/subscriptions:
    get:
      tags:
        - Identities
      summary: Get subscribed actions to identity for authenticated user.
      operationId: getIdentitySubscriptions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentitySubscriptionActions"
        "404":
          description: Identity not found
    post:
      tags:
        - Identities
      summary: Subscribe authenticated user to identities actions.
      operationId: subscribeToIdentityActions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiIdentitySubscriptionActions"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentitySubscriptionActions"
        "404":
          description: Identity not found
    delete:
      tags:
        - Identities
      summary: Unsubscribe authenticated user from identity actions.
      operationId: unsubscribeFromIdentityActions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiIdentitySubscriptionActions"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentitySubscriptionActions"
  /identities/{id}/mute:
    get:
      tags:
        - Identities
      summary: Get authenticated user's mute state for an identity.
      operationId: getIdentityMuteState
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentityMuteState"
        "401":
          description: Unauthorized
        "403":
          description: Forbidden
        "404":
          description: Identity not found
    post:
      tags:
        - Identities
      summary: Mute identity notifications for authenticated user.
      operationId: muteIdentity
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentityMuteState"
        "400":
          description: Invalid request
        "401":
          description: Unauthorized
        "403":
          description: Forbidden
        "404":
          description: Identity not found
    delete:
      tags:
        - Identities
      summary: Unmute identity notifications for authenticated user.
      operationId: unmuteIdentity
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentityMuteState"
        "401":
          description: Unauthorized
        "403":
          description: Forbidden
        "404":
          description: Identity not found
  /identities/{id}/activity:
    get:
      tags:
        - Identities
      summary: Get daily public-wave drop activity for an identity.
      operationId: getIdentityActivity
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentityActivity"
        "404":
          description: Identity not found
  /media/resolve:
    post:
      tags:
        - Media
      summary: Resolve decentralized media references
      description: >-
        Resolves native IPFS, IPNS, Arweave, 6529 media resolver, and recognized
        third-party gateway URLs into canonical native URIs, 6529 resolver URLs,
        and optional external fallback URLs. Unrecognized HTTP(S) URLs are
        returned as unrecognized items instead of failing the batch.
      operationId: resolveDecentralizedMedia
      security: []
      x-6529-router:
        enabled: true
        auth: none
        handler:
          import: "@/api/media/decentralized-media.handlers"
          name: handleResolveDecentralizedMedia
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiMediaResolveRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMediaResolveResponse"
        "400":
          description: Invalid request shape
  /memes_extended_data:
    get:
      tags:
        - Memes
      summary: Get paginated Memes extended data
      description: >-
        Returns Meme Card metadata joined with the card's NFT market and TDH
        fields. `collection_size` is the total Meme Cards collection size.
        `ranked_collection_size`, when present, is the denominator for rank
        fields on rows included in TDH ranking. Rows not yet included in TDH
        calculations can return `recorded_in_tdh: false`, `-1` rank values, and
        `ranked_collection_size: null`. During migration or transient TDH lookup
        fallback, `recorded_in_tdh` and `ranked_collection_size` can be `null`
        or absent, and clients should treat that as legacy/transitional state.
      operationId: getMemesExtendedData
      parameters:
        - name: page_size
          in: query
          description: Default is 101
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 101
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: id
          in: query
          description: Comma-separated Meme Card IDs
          required: false
          schema:
            type: string
        - name: season
          in: query
          description: Comma-separated Meme seasons
          required: false
          schema:
            type: string
        - name: sort
          in: query
          description: Default is age
          required: false
          schema:
            type: string
            enum:
              - age
              - edition_size
              - meme
              - hodlers
              - tdh
              - percent_unique
              - percent_unique_cleaned
              - floor_price
              - market_cap
              - total_volume_last_24_hours
              - total_volume_last_7_days
              - total_volume_last_1_month
              - total_volume
              - highest_offer
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMemesExtendedDataPage"
  /meme-cards/{meme_card_id}/drop:
    get:
      tags:
        - Memes
      summary: Get the Main Stage drop mapped to a Meme card
      description: >-
        Returns the explicit one-to-one mapping between a minted Meme card and
        the winning Memes Main Stage submission that produced it.
      operationId: getMemeCardDropMapping
      security: []
      x-6529-router:
        enabled: true
        auth: none
        cache:
          ttlSeconds: 300
        handler:
          import: "@/api/memes/meme-card-drop-mappings.handlers"
          name: handleGetMemeCardDropMapping
      parameters:
        - name: meme_card_id
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMemeCardDropMapping"
        "400":
          description: Invalid Meme card ID
        "404":
          description: No Main Stage drop mapping exists for this Meme card
  /memes-mint-stats:
    get:
      tags:
        - Memes Mint Stats
      summary: Get paginated memes mint stats
      operationId: getMemesMintStats
      parameters:
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is ASC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMemesMintStatsPage"
  /memes-mint-stats/total:
    get:
      tags:
        - Memes Mint Stats
      summary: Get total memes mint stats
      operationId: getMemesMintStatsTotal
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMemesMintStatsTotals"
  /memes-mint-stats/yearly:
    get:
      tags:
        - Memes Mint Stats
      summary: Get yearly aggregated memes mint stats
      operationId: getMemesMintStatsYearly
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiMemesMintStatsYearly"
  /memes-mint-stats/{id}:
    get:
      tags:
        - Memes Mint Stats
      summary: Get memes mint stats for one meme id
      operationId: getMemesMintStatsById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMemesMintStat"
        "404":
          description: Memes mint stats for id not found
  /minting-claims/{contract}/{card_id}/{merkle_root}/proofs/{address}:
    get:
      tags:
        - Minting Claims
      summary: Get merkle proofs for an address in a card root
      description: >
        Returns allowlist merkle proofs for one address for the given contract,
        card and merkle root.
      operationId: getMintingClaimsProofs
      parameters:
        - name: contract
          in: path
          required: true
          description: Contract address
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: card_id
          in: path
          required: true
          description: Card (token) ID
          schema:
            type: integer
            format: int64
            minimum: 0
        - name: merkle_root
          in: path
          required: true
          description: 0x-prefixed 66-character hex merkle root
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{64}$
        - name: address
          in: path
          required: true
          description: Wallet address
          schema:
            $ref: "#/components/schemas/ApiEthereumAddress"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MintingClaimsProofsResponse"
        "400":
          description: Invalid request (missing or invalid parameters)
        "404":
          description: No merkle root found for the given contract/card/merkle_root
  /minting-claims/{contract}/{card_id}/roots:
    get:
      tags:
        - Minting Claims
      summary: Get merkle roots for a token
      description: Returns merkle roots (one per phase) for the given contract and card.
      operationId: getMintingClaimsRoots
      parameters:
        - name: contract
          in: path
          required: true
          description: Contract address
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: card_id
          in: path
          required: true
          description: Card (token) ID
          schema:
            type: integer
            format: int64
            minimum: 0
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/MintingClaimsRootItem"
        "400":
          description: Invalid request (missing or invalid parameters)
  /minting-claims/{contract}/{card_id}/airdrops:
    get:
      tags:
        - Minting Claims
      summary: Get per-phase airdrop totals for a token
      description: |
        Returns per-phase airdrop totals for the given contract and card.
      operationId: getMintingClaimsAirdrops
      parameters:
        - name: contract
          in: path
          required: true
          description: Contract address
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: card_id
          in: path
          required: true
          description: Card (token) ID
          schema:
            type: integer
            format: int64
            minimum: 0
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiMintingClaimsPhaseTotalItem"
        "400":
          description: Invalid request (missing or invalid parameters)
  /minting-claims/{contract}/{card_id}/allowlists:
    get:
      tags:
        - Minting Claims
      summary: Get per-phase allowlist totals for a token
      description: |
        Returns per-phase allowlist totals for the given contract and card.
      operationId: getMintingClaimsAllowlists
      parameters:
        - name: contract
          in: path
          required: true
          description: Contract address
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: card_id
          in: path
          required: true
          description: Card (token) ID
          schema:
            type: integer
            format: int64
            minimum: 0
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiMintingClaimsPhaseTotalItem"
        "400":
          description: Invalid request (missing or invalid parameters)
  /minting-claims/{contract}/claims:
    get:
      tags:
        - Minting Claims
      summary: Get minting claims (paginated, admin only)
      description: >
        Returns a page of minting claims for the given contract, ordered by
        claim_id descending. Default page_size 10, max 20. Only
        DISTRIBUTION_ADMIN_WALLETS can call this.
      operationId: getMintingClaims
      parameters:
        - name: contract
          in: path
          required: true
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 20
            default: 10
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MintingClaimsPageResponse"
        "401":
          description: Unauthorized - authentication required
        "403":
          description: Forbidden - only distribution admins can access
  /minting-claims/{contract}/claims/{claim_id}:
    get:
      tags:
        - Minting Claims
      summary: Get minting claim by claim_id (admin only)
      description: >
        Returns the minting claim for the given contract and claim_id. Only
        DISTRIBUTION_ADMIN_WALLETS can call this.
      operationId: getMintingClaimById
      parameters:
        - name: contract
          in: path
          required: true
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: claim_id
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MintingClaim"
        "401":
          description: Unauthorized - authentication required
        "403":
          description: Forbidden - only distribution admins can access
        "404":
          description: Claim not found
    patch:
      tags:
        - Minting Claims
      summary: Update minting claim (admin only)
      description: >
        Partial update by contract and claim_id. Any field can be provided; only
        provided fields are updated. Only DISTRIBUTION_ADMIN_WALLETS can call
        this.
      operationId: patchMintingClaim
      parameters:
        - name: contract
          in: path
          required: true
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: claim_id
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MintingClaimUpdateRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MintingClaim"
        "401":
          description: Unauthorized - authentication required
        "403":
          description: Forbidden - only distribution admins can access
        "404":
          description: Claim not found
  /minting-claims/{contract}/claims/{claim_id}/arweave-upload:
    post:
      tags:
        - Minting Claims
      summary: Upload minting claim metadata and media to Arweave (admin only)
      description: >
        Uploads claim metadata and media (image, and animation if not HTML) to
        Arweave asynchronously via background queue. Requires claim to have an
        image URL and valid metadata fields. If already synced or already
        uploading returns 409. Only DISTRIBUTION_ADMIN_WALLETS can call this.
      operationId: postMintingClaimArweaveUpload
      parameters:
        - name: contract
          in: path
          required: true
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: claim_id
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "202":
          description: Accepted; work queued
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MintingClaim"
        "400":
          description: Bad Request - claim data or media URL/content-type is invalid
        "401":
          description: Unauthorized - authentication required
        "403":
          description: Forbidden - only distribution admins can access
        "404":
          description: Claim not found
        "409":
          description: Conflict - claim already synced or upload already in progress
  /minting-claims/actions/{contract}/types:
    get:
      tags:
        - Minting Claims
      summary: >-
        Get supported minting claim action types for a contract (claims admin
        only)
      description: >
        Returns the supported minting claim action names for the given contract.
        Only CLAIMS_ADMIN_WALLETS can call this. Unsupported contracts return
        400.
      operationId: getMintingClaimActionTypes
      parameters:
        - name: contract
          in: path
          required: true
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMintingClaimActionTypesResponse"
        "400":
          description: Unsupported contract
        "401":
          description: Unauthorized - authentication required
        "403":
          description: Forbidden - only claims admins can access
  /minting-claims/actions/{contract}/{claim_id}:
    get:
      tags:
        - Minting Claims
      summary: Get minting claim actions (claims admin only)
      description: >
        Returns the current action state for a minting claim. All supported
        actions for the contract are always returned; missing records are
        represented as completed=false. Only CLAIMS_ADMIN_WALLETS can call this.
        Unsupported contracts return 400.
      operationId: getMintingClaimActions
      parameters:
        - name: contract
          in: path
          required: true
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: claim_id
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMintingClaimActionsResponse"
        "400":
          description: Invalid request or unsupported contract
        "401":
          description: Unauthorized - authentication required
        "403":
          description: Forbidden - only claims admins can access
        "404":
          description: Claim not found
    post:
      tags:
        - Minting Claims
      summary: Upsert minting claim action state (claims admin only)
      description: >
        Creates or updates the current state of a minting claim action for the
        given claim. The caller wallet is recorded as the actor. Only
        CLAIMS_ADMIN_WALLETS can call this. Unsupported contracts or unsupported
        action names for the given contract return 400.
      operationId: postMintingClaimAction
      parameters:
        - name: contract
          in: path
          required: true
          schema:
            type: string
            pattern: ^0x[a-fA-F0-9]{40}$
        - name: claim_id
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiMintingClaimActionUpdateRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMintingClaimActionsResponse"
        "400":
          description: Invalid request or unsupported contract
        "401":
          description: Unauthorized - authentication required
        "403":
          description: Forbidden - only claims admins can update
        "404":
          description: Claim not found
  /nft-link:
    get:
      tags:
        - NFT Link
      summary: Get marketplace data about NFT link
      operationId: getNftLinkData
      parameters:
        - name: url
          in: query
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                items:
                  $ref: "#/components/schemas/ApiNftLinkResponse"
  /nft-owners:
    get:
      tags:
        - NFT Owners
      summary: Get NFT owners
      operationId: getNftOwners
      parameters:
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: contract
          in: query
          description: Filter by contract address
          required: false
          schema:
            type: string
        - name: token_id
          in: query
          description: Filter by token ID
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                items:
                  $ref: "#/components/schemas/ApiNftOwnerPage"
  /nft-owners/consolidation/{consolidation_key}:
    get:
      tags:
        - NFT Owners
      summary: Get NFT owners by consolidation key
      operationId: getNftOwnersByConsolidationKey
      parameters:
        - name: consolidation_key
          in: path
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: contract
          in: query
          description: Filter by contract address
          required: false
          schema:
            type: string
        - name: token_id
          in: query
          description: Filter by token ID
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                items:
                  $ref: "#/components/schemas/ApiNftOwnerPage"
  /nfts:
    get:
      tags:
        - NFTs
      summary: Get NFTs
      operationId: getNfts
      parameters:
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 101
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: id
          in: query
          description: Filter by NFT ID
          required: false
          schema:
            type: string
        - name: contract
          in: query
          description: Filter by NFT ID
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiNftsPage"
  /nfts/{contract}/media:
    get:
      tags:
        - NFTs
      summary: Get NFT Media by Contract
      operationId: getNftMediaByContract
      parameters:
        - name: contract
          in: path
          description: The NFT contract address to filter the media by
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Successful operation, returns an array of NFT media
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiNftMedia"
  /notifications:
    get:
      tags:
        - Notifications
      summary: Get notifications for authenticated user.
      deprecated: true
      description: Deprecated. Use GET /v2/notifications instead.
      operationId: getNotifications
      parameters:
        - name: limit
          in: query
          description: Default is 10
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 101
        - name: id_less_than
          in: query
          description: Used to find older notifications
          required: false
          schema:
            type: number
            format: int64
        - name: cause
          in: query
          description: Comma-separated list of notification causes to include
          required: false
          schema:
            type: string
        - name: cause_exclude
          in: query
          description: Comma-separated list of notification causes to exclude
          required: false
          schema:
            type: string
        - name: unread_only
          in: query
          description: Only return unread notifications
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiNotificationsResponse"
  /notifications/read:
    post:
      tags:
        - Notifications
      summary: Mark all notifications as read
      operationId: markAllNotificationsAsRead
      responses:
        "200":
          description: successful operation
  /notifications/{id}/read:
    post:
      tags:
        - Notifications
      summary: Mark notification as read
      operationId: markNotificationAsRead
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: Notification ID or string "all" to mark all notifications as read
      responses:
        "201":
          description: successful operation
  /notifications/wave/{wave_id}/read:
    post:
      tags:
        - Notifications
      summary: Mark wave notifications as read
      operationId: markWaveNotificationsAsRead
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiMarkWaveReadRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMarkWaveReadResponse"
  /notifications/wave-subscription/{wave_id}:
    get:
      tags:
        - Notifications
      summary: Get wave subscription
      operationId: getWaveSubscription
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveNotificationPreferences"
    post:
      tags:
        - Notifications
      summary: Subscribe to wave notifications
      operationId: subscribeToWaveNotifications
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUpdateWaveNotificationPreferencesRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveNotificationPreferences"
    delete:
      tags:
        - Notifications
      summary: Unsubscribe from wave notifications
      operationId: unsubscribeFromWaveNotifications
      parameters:
        - name: wave_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveNotificationPreferences"
  /v2/notifications:
    get:
      tags:
        - NotificationsV2
      summary: Get V2 notifications for authenticated user.
      operationId: getNotificationsV2
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/notifications/notifications-v2.handlers"
          name: handleGetNotificationsV2
      parameters:
        - name: limit
          in: query
          description: Default is 10
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: id_less_than
          in: query
          description: Used to find older notifications
          required: false
          schema:
            type: number
            format: int64
        - name: cause
          in: query
          description: Comma-separated list of notification causes to include
          required: false
          schema:
            type: string
        - name: cause_exclude
          in: query
          description: Comma-separated list of notification causes to exclude
          required: false
          schema:
            type: string
        - name: unread_only
          in: query
          description: Only return unread notifications
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiNotificationsResponseV2"
  /og-metadata/profiles/{identity}:
    get:
      tags:
        - OG Metadata
      summary: Get OG metadata for a profile
      operationId: getOgMetadataProfile
      security: []
      x-6529-router:
        enabled: true
        auth: none
        cache:
          ttlSeconds: 300
        handler:
          import: "@/api/og-metadata/og-metadata.handlers"
          name: handleGetOgMetadataProfile
      parameters:
        - name: identity
          in: path
          required: true
          description: Profile id, handle, wallet address, or ENS name
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiOgMetadata"
        "404":
          description: Profile not found
  /og-metadata/waves/{id}:
    get:
      tags:
        - OG Metadata
      summary: Get OG metadata for a wave
      operationId: getOgMetadataWave
      security: []
      x-6529-router:
        enabled: true
        auth: none
        cache:
          ttlSeconds: 300
        handler:
          import: "@/api/og-metadata/og-metadata.handlers"
          name: handleGetOgMetadataWave
      parameters:
        - name: id
          in: path
          required: true
          description: Wave id
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiOgMetadata"
        "404":
          description: Wave not found
  /og-metadata/drops/{drop}:
    get:
      tags:
        - OG Metadata
      summary: Get OG metadata for a drop by id or serial number
      operationId: getOgMetadataDrop
      security: []
      x-6529-router:
        enabled: true
        auth: none
        cache:
          ttlSeconds: 300
        handler:
          import: "@/api/og-metadata/og-metadata.handlers"
          name: handleGetOgMetadataDrop
      parameters:
        - name: drop
          in: path
          required: true
          description: Drop UUID or numeric drop serial number
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiOgMetadata"
        "400":
          description: Invalid drop identifier
        "404":
          description: Drop not found
  /blocks:
    get:
      tags:
        - Other
      summary: Get blocks and related timestamps
      operationId: getBlocks
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiBlocksPage"
  /uploads:
    get:
      tags:
        - Other
      summary: Get TDH snapshots links
      operationId: getUploads
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: block
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: date
          in: query
          required: false
          schema:
            type: string
            format: date-time
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiUploadsPage"
  /consolidated_uploads:
    get:
      tags:
        - Other
      summary: Get consolidated TDH snapshots links
      operationId: getConsolidatedUploads
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: block
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: date
          in: query
          required: false
          schema:
            type: string
            format: date-time
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiUploadsPage"
  /settings:
    get:
      tags:
        - Other
      summary: Seize settings
      operationId: getSettings
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiSeizeSettings"
  /memes/artists_names:
    get:
      tags:
        - Other
      summary: meme artists names
      operationId: getMemeArtistsNames
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiArtistNameItem"
  /memelab/artists_names:
    get:
      tags:
        - Other
      summary: memelab artists names
      operationId: getMemelabArtistsNames
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiArtistNameItem"
  /owners-balances:
    get:
      tags:
        - Owners Balances
      summary: Get owner balances
      operationId: getOwnerBalances
      parameters:
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiOwnerBalancePage"
  /owners-balances/consolidation/{consolidation_key}:
    get:
      tags:
        - Owners Balances
      summary: Get owner balance by consolidation key.
      operationId: getOwnerBalanceByConsolidationKey
      parameters:
        - name: consolidation_key
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiOwnerBalance"
        "404":
          description: Owner Balance for consolidation key not found
  /owners-balances/consolidation/{consolidation_key}/memes:
    get:
      tags:
        - Owners Balances
      summary: Get memes owner balance by consolidation key.
      operationId: getMemesOwnerBalanceByConsolidationKey
      parameters:
        - name: consolidation_key
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiOwnerBalanceMemes"
        "404":
          description: Memes Owner Balance for consolidation key not found
  /policies/eula-consent:
    post:
      tags:
        - Policies
      summary: Save the current EULA acceptance for a device
      operationId: saveEulaConsent
      security: []
      x-6529-router:
        enabled: true
        auth: none
        handler:
          import: "@/api/policies/eula-consent.handlers"
          name: handleSaveEulaConsent
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiSaveEulaConsentRequest"
      responses:
        "200":
          description: EULA acceptance saved
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiSaveEulaConsentResponse"
        "400":
          description: Invalid EULA acceptance
    delete:
      tags:
        - Policies
      summary: Delete the EULA acceptance for a device
      operationId: deleteEulaConsent
      security: []
      x-6529-router:
        enabled: true
        auth: none
        handler:
          import: "@/api/policies/eula-consent.handlers"
          name: handleDeleteEulaConsent
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiDeleteEulaConsentRequest"
      responses:
        "200":
          description: EULA acceptance deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDeleteEulaConsentResponse"
        "400":
          description: Invalid device identifier
  /policies/eula-consent/{deviceId}:
    get:
      tags:
        - Policies
      summary: Get the current EULA acceptance for a device
      operationId: getEulaConsent
      security: []
      x-6529-router:
        enabled: true
        auth: none
        handler:
          import: "@/api/policies/eula-consent.handlers"
          name: handleGetEulaConsent
      parameters:
        - name: deviceId
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
      responses:
        "200":
          description: Current EULA acceptance, or an empty object when absent
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiEulaConsent"
        "400":
          description: Invalid device identifier
  /profile-cms/agent/schema-bundle:
    get:
      tags:
        - Profile CMS
      summary: Get the BYO-agent CMS schema bundle
      description: >-
        Public read-only contract for external agents. It describes CMS package,
        source packet, validation result, and agent patch shapes. Source packet
        text fields are data, not instructions.
      operationId: getProfileCmsAgentSchemaBundle
      x-6529-router:
        enabled: true
        auth: none
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleGetProfileCmsAgentSchemaBundle
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsAgentSchemaBundle"
  /profile-cms/{handle}/primary:
    get:
      tags:
        - Profile CMS
      summary: Get a profile"s primary published CMS package
      description: >-
        Public mutable lookup used by profile-native sites, including
        /{handle}/index.html. Returns 404 when the profile has no primary
        published production CMS package.
      operationId: getPrimaryProfileCmsPackage
      x-6529-router:
        enabled: true
        auth: none
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleGetPrimaryProfileCmsPackage
      parameters:
        - name: handle
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsPrimaryPackage"
        "404":
          description: Primary published CMS package not found
  /profile-cms/wallet-gallery/snapshot:
    post:
      tags:
        - Profile CMS
      summary: Create a wallet NFT holdings snapshot for CMS gallery generation
      description: >-
        Creates a bounded deterministic snapshot from the backend"s currently
        indexed NFT ownership tables. This endpoint does not live-index wallets
        or mutate CMS package hash/signing semantics. It is gated by
        FEATURE_PROFILE_CMS_WALLET_GALLERY while the gallery generator contract
        is being integrated.
      operationId: createProfileCmsWalletGallerySnapshot
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/profile-cms/wallet-gallery.handlers"
          name: handleCreateProfileCmsWalletGallerySnapshot
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/ApiCreateProfileCmsWalletGallerySnapshotRequest
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsWalletGallerySnapshot"
        "400":
          description: Invalid wallet, ENS, or exclusion input
        "403":
          description: Wallet gallery snapshot feature is disabled
  /profile-cms/packages:
    post:
      tags:
        - Profile CMS
      summary: Save a draft CMS package
      description: Requires the profile owner or delegated CMS publisher.
      operationId: saveProfileCmsPackageDraft
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleSaveProfileCmsPackageDraft
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiSaveProfileCmsPackageDraftRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsPackage"
        "400":
          description: Invalid CMS package
        "403":
          description: Missing CMS publish permissions
  /profile-cms/packages/validate:
    post:
      tags:
        - Profile CMS
      summary: Validate a CMS package against V1 protocol
      description: Requires authentication. Publish uses stricter production options.
      operationId: validateProfileCmsPackage
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleValidateProfileCmsPackage
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiValidateProfileCmsPackageRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsValidationResult"
        "400":
          description: Invalid request
  /profile-cms/packages/{id}:
    get:
      tags:
        - Profile CMS
      summary: Fetch a CMS package by database id
      operationId: getProfileCmsPackageById
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleGetProfileCmsPackageById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsPackage"
        "404":
          description: CMS package not found
  /profile-cms/packages/{id}/agent/source-packet:
    get:
      tags:
        - Profile CMS
      summary: Fetch a read-only CMS source packet for external agents
      description: >-
        Published production packages are public. Draft and private package
        packets require profile owner or delegated CMS publisher authority.
        Response fields distinguish facts, author copy, derived metadata, and
        validation diagnostics.
      operationId: getProfileCmsAgentSourcePacket
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleGetProfileCmsAgentSourcePacket
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsAgentSourcePacket"
        "404":
          description: CMS package not found
  /profile-cms/packages/{id}/agent/patch/validate:
    post:
      tags:
        - Profile CMS
      summary: Validate an external agent patch against a draft CMS package
      description: >-
        Requires profile owner or delegated CMS publisher authority. This
        endpoint never applies changes; it dry-runs supported operations and
        returns structured patch and CMS validation diagnostics. The target must
        be a draft package and agent_patch.target.base_package_hash is required
        for stale-draft detection.
      operationId: validateProfileCmsAgentPatch
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleValidateProfileCmsAgentPatch
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiValidateProfileCmsAgentPatchRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsAgentPatchValidationResult"
        "400":
          description: Invalid request body
        "403":
          description: Missing CMS publish permissions
        "404":
          description: CMS package not found
  /profile-cms/packages/{id}/publish:
    post:
      tags:
        - Profile CMS
      summary: Publish a draft CMS package
      description: >-
        Requires the profile owner or delegated CMS publisher. The backend runs
        CMS V1 validation with production options and enforces package hashes.
      operationId: publishProfileCmsPackage
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handlePublishProfileCmsPackage
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiPublishProfileCmsPackageRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsPackage"
        "400":
          description: Validation or hash check failed
        "403":
          description: Missing CMS publish permissions
        "404":
          description: CMS package not found
  /profile-cms/packages/{id}/rollback:
    post:
      tags:
        - Profile CMS
      summary: Roll back primary CMS package pointer
      description: >-
        Requires the profile owner or delegated CMS publisher. Sets a previous
        published package as primary with an expected-current concurrency guard.
      operationId: rollbackProfileCmsPackage
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleRollbackProfileCmsPackage
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiRollbackProfileCmsPackageRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsPackage"
        "400":
          description: Concurrency guard or state check failed
        "403":
          description: Missing CMS publish permissions
        "404":
          description: CMS package not found
  /profile-cms/packages/{id}/archive:
    post:
      tags:
        - Profile CMS
      summary: Archive a non-primary CMS package
      description: Requires the profile owner or delegated CMS publisher.
      operationId: archiveProfileCmsPackage
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleArchiveProfileCmsPackage
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiArchiveProfileCmsPackageRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsPackage"
        "400":
          description: State check failed
        "403":
          description: Missing CMS publish permissions
        "404":
          description: CMS package not found
  /profile-cms/packages/{id}/export:
    get:
      tags:
        - Profile CMS
      summary: Export CMS package inspection data
      description: >-
        Returns package JSON, storage receipts, and pointer events needed by
        future standalone renderers and mirrors. Published production packages
        are public; private rows require profile CMS permissions.
      operationId: exportProfileCmsPackage
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleExportProfileCmsPackage
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsPackageExport"
        "404":
          description: CMS package not found
  /profile-cms/packages/by-hash/{package_hash}:
    get:
      tags:
        - Profile CMS
      summary: Fetch a CMS package by package hash
      operationId: getProfileCmsPackageByHash
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleGetProfileCmsPackageByHash
      parameters:
        - name: package_hash
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsPackage"
        "404":
          description: CMS package not found
  /profile-cms/profiles/{profile_id}/packages:
    get:
      tags:
        - Profile CMS
      summary: List CMS packages for a profile
      operationId: listProfileCmsPackages
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleListProfileCmsPackages
      parameters:
        - name: profile_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiProfileCmsPackage"
        "404":
          description: Profile not found
  /profile-cms/profiles/{profile_id}/packages/{package_id}/versions/{version}:
    get:
      tags:
        - Profile CMS
      summary: Fetch a CMS package by profile, package id, and version
      operationId: getProfileCmsPackageByVersion
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/profile-cms/profile-cms.handlers"
          name: handleGetProfileCmsPackageByVersion
      parameters:
        - name: profile_id
          in: path
          required: true
          schema:
            type: string
        - name: package_id
          in: path
          required: true
          schema:
            type: string
        - name: version
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileCmsPackage"
        "404":
          description: CMS package not found
  /profiles/{identity}/cic/rating:
    post:
      tags:
        - ProfileCIC
      summary: >-
        Change profile CIC rating. If you are authenticated as proxy, you will
        be rating on behalf of the profile you are proxying.
      operationId: rateProfileCic
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiChangeProfileCicRating"
      responses:
        "201":
          description: successful operation
        "400":
          description: Invalid request
  /profiles/{identity}/cic/statements:
    get:
      tags:
        - ProfileCIC
      summary: Get profile identity statements
      operationId: getProfileCicStatements
      security: []
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: >-
            Profile identity statements, or an empty list when the profile is
            not found
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiCicStatement"
    post:
      tags:
        - ProfileCIC
      summary: Add a profile identity statement
      description: >-
        Requires a wallet-authenticated owner of the target profile. NFT account
        links must use HTTPS. NINFA links use statement_type NINFA. Custom art
        links use statement_type LINK and carry their required display label in
        statement_comment.
      operationId: createProfileCicStatement
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateProfileCicStatement"
      responses:
        "201":
          description: Profile identity statement created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCicStatement"
        "400":
          description: Invalid or duplicate statement, or profile statement limit reached
        "401":
          description: Authentication required
        "403":
          description: Authenticated wallet does not own the profile
        "404":
          description: Profile not found
  /profiles/{identity}/cic/statements/{statement_id}:
    get:
      tags:
        - ProfileCIC
      summary: Get a profile identity statement
      operationId: getProfileCicStatement
      security: []
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: statement_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Profile identity statement
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCicStatement"
        "404":
          description: Profile or statement not found
    delete:
      tags:
        - ProfileCIC
      summary: Delete a profile identity statement
      operationId: deleteProfileCicStatement
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: statement_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "201":
          description: Profile identity statement deleted
        "401":
          description: Authentication required
        "403":
          description: Authenticated wallet does not own the profile
        "404":
          description: Profile or statement not found
  /profiles/{identity}/cic/ratings/by-rater:
    get:
      tags:
        - ProfileCIC
      summary: Get profile CIC ratings by rater
      operationId: getProfileCicRatingsByRater
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: given
          in: query
          required: false
          schema:
            type: boolean
        - name: page
          in: query
          required: false
          schema:
            type: number
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: number
            minimum: 1
            maximum: 2000
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: order_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - last_modified
              - rating
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiRatingWithProfileInfoAndLevelPage"
        "404":
          description: Profile not found
  /profiles/{identity}/cic/overview:
    get:
      tags:
        - ProfileCIC
      summary: Get profile CIC overview
      operationId: getProfileCicOverview
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiRepDirection"
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCicOverview"
        "404":
          description: Profile not found
  /profiles/{identity}/cic/contributors:
    get:
      tags:
        - ProfileCIC
      summary: Get profile CIC contributors
      operationId: getProfileCicContributors
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiRepDirection"
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCicContributorsPage"
        "404":
          description: Profile not found
  /profiles/{identity}/rep/rating:
    post:
      tags:
        - ProfileREP
      summary: >-
        Change profile REP rating. If you are authenticated as proxy, you will
        be rating on behalf of the profile you are proxying.
      operationId: rateProfileRep
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiChangeProfileRepRating"
      responses:
        "201":
          description: successful operation
        "400":
          description: Invalid request
    get:
      tags:
        - ProfileREP
      summary: Get profile REP rating
      operationId: getProfileRepRating
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: from_identity
          in: query
          required: false
          schema:
            type: string
        - name: category
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiRepRating"
        "404":
          description: Profile not found
  /profiles/{identity}/rep/ratings/by-rater:
    get:
      tags:
        - ProfileREP
      summary: Get profile REP ratings by rater
      operationId: getProfileRepRatingsByRater
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: given
          in: query
          required: false
          schema:
            type: boolean
        - name: page
          in: query
          required: false
          schema:
            type: number
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: number
            minimum: 1
            maximum: 2000
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: order_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - last_modified
              - rating
        - name: category
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiRatingWithProfileInfoAndLevelPage"
        "404":
          description: Profile not found
  /profiles/{identity}/rep/overview:
    get:
      tags:
        - ProfileREP
      summary: Get profile REP overview
      operationId: getProfileRepOverview
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiRepDirection"
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiRepOverview"
        "404":
          description: Profile not found
  /profiles/{identity}/rep/categories:
    get:
      tags:
        - ProfileREP
      summary: Get profile REP categories
      operationId: getProfileRepCategories
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiRepDirection"
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - name: top_contributors_limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 10
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiRepCategoriesPage"
        "404":
          description: Profile not found
  /profiles/{identity}/rep/categories/{category}/contributors:
    get:
      tags:
        - ProfileREP
      summary: Get profile REP contributors for category
      operationId: getProfileRepCategoryContributors
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
        - name: category
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
            pattern: ^[a-zA-Z0-9?!,."() ]{1,100}$
        - name: direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiRepDirection"
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiRepContributorsPage"
        "404":
          description: Profile not found
  /rep/categories/{category}/overview:
    get:
      tags:
        - ProfileREP
      summary: Get global REP category overview
      operationId: getGlobalRepCategoryOverview
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/rep-categories/global-rep-category.handlers"
          name: handleGetGlobalRepCategoryOverview
      parameters:
        - name: category
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
            pattern: ^[\p{L}\p{N}?!,.\x27() ]{1,100}$
          description: URL-encoded REP category name.
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiGlobalRepCategoryOverview"
  /rep/categories/{category}/ratings:
    get:
      tags:
        - ProfileREP
      summary: Get global REP category giver-recipient pairings
      operationId: getGlobalRepCategoryRatings
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/rep-categories/global-rep-category.handlers"
          name: handleGetGlobalRepCategoryRatings
      parameters:
        - name: category
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
            pattern: ^[\p{L}\p{N}?!,.\x27() ]{1,100}$
          description: URL-encoded REP category name.
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: order_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - rep
              - last_modified
              - giver
              - recipient
        - name: search
          in: query
          required: false
          schema:
            type: string
            maxLength: 100
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiGlobalRepCategoryRatingsPage"
  /rep/categories/{category}/recipients:
    get:
      tags:
        - ProfileREP
      summary: Get global REP category recipients
      operationId: getGlobalRepCategoryRecipients
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/rep-categories/global-rep-category.handlers"
          name: handleGetGlobalRepCategoryRecipients
      parameters:
        - name: category
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
            pattern: ^[\p{L}\p{N}?!,.\x27() ]{1,100}$
          description: URL-encoded REP category name.
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: order_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - rep
              - last_modified
              - profile
        - name: search
          in: query
          required: false
          schema:
            type: string
            maxLength: 100
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiGlobalRepCategoryRecipientsPage"
  /rep/categories/{category}/givers:
    get:
      tags:
        - ProfileREP
      summary: Get global REP category givers
      operationId: getGlobalRepCategoryGivers
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/rep-categories/global-rep-category.handlers"
          name: handleGetGlobalRepCategoryGivers
      parameters:
        - name: category
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
            pattern: ^[\p{L}\p{N}?!,.\x27() ]{1,100}$
          description: URL-encoded REP category name.
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: order_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - rep
              - last_modified
              - profile
        - name: search
          in: query
          required: false
          schema:
            type: string
            maxLength: 100
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiGlobalRepCategoryGiversPage"
  /rep/categories/{category}/wave-overview:
    get:
      tags:
        - ProfileREP
      summary: Get Wave REP category overview across visible waves
      operationId: getGlobalRepCategoryWaveOverview
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/rep-categories/global-rep-category.handlers"
          name: handleGetGlobalRepCategoryWaveOverview
      parameters:
        - name: category
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
            pattern: ^[\p{L}\p{N}?!,.\x27() ]{1,100}$
          description: URL-encoded REP category name.
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiGlobalRepCategoryWaveOverview"
  /rep/categories/{category}/waves:
    get:
      tags:
        - ProfileREP
      summary: Get visible waves using a REP category
      operationId: getGlobalRepCategoryWaves
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/rep-categories/global-rep-category.handlers"
          name: handleGetGlobalRepCategoryWaves
      parameters:
        - name: category
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
            pattern: ^[\p{L}\p{N}?!,.\x27() ]{1,100}$
          description: URL-encoded REP category name.
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: order_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - rep
              - last_modified
              - wave
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiGlobalRepCategoryWavesPage"
  /rep/categories/{category}/wave-contributors:
    get:
      tags:
        - ProfileREP
      summary: Get visible Wave REP contributors for a category
      operationId: getGlobalRepCategoryWaveContributors
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/rep-categories/global-rep-category.handlers"
          name: handleGetGlobalRepCategoryWaveContributors
      parameters:
        - name: category
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
            pattern: ^[\p{L}\p{N}?!,.\x27() ]{1,100}$
          description: URL-encoded REP category name.
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: order_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - rep
              - last_modified
              - wave
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiGlobalRepCategoryWaveContributorsPage"
  /profile-preferences:
    get:
      tags:
        - Profiles
      summary: Get the authenticated profile's privacy and notification preferences
      operationId: getProfilePreferences
      security:
        - bearerAuth: []
      x-6529-router:
        enabled: true
        auth: required
        typeImportGroup: profile-preferences
        handler:
          import: "@/api/profile-preferences/profile-preferences.handlers"
          name: handleGetProfilePreferences
      responses:
        "200":
          description: Profile preferences, including backward-compatible defaults
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfilePreferences"
        "400":
          description: Bad request
        "401":
          description: Unauthorized
        "403":
          description: Forbidden - authenticated profile required
    put:
      tags:
        - Profiles
      summary: Update the authenticated profile's privacy and notification preferences
      operationId: putProfilePreferences
      security:
        - bearerAuth: []
      x-6529-router:
        enabled: true
        auth: required
        typeImportGroup: profile-preferences
        handler:
          import: "@/api/profile-preferences/profile-preferences.handlers"
          name: handlePutProfilePreferences
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUpdateProfilePreferences"
      responses:
        "200":
          description: Updated profile preferences
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfilePreferences"
        "400":
          description: Bad request
        "401":
          description: Unauthorized
        "403":
          description: Forbidden - authenticated profile required
  /profiles:
    post:
      tags:
        - Profiles
      summary: Create or update a profile
      operationId: createOrUpdateProfile
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateOrUpdateProfileRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentity"
        "400":
          description: Invalid request
  /profiles/{identity}/wave:
    get:
      tags:
        - Profiles
      summary: Get profile wave
      operationId: getProfileWave
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileWave"
        "404":
          description: Profile not found
    post:
      tags:
        - Profiles
      summary: Set explicit profile wave
      operationId: setProfileWave
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiSetProfileWaveRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentity"
        "400":
          description: Invalid request
        "403":
          description: Forbidden
        "404":
          description: Profile or wave not found
    delete:
      tags:
        - Profiles
      summary: Clear explicit profile wave
      operationId: clearProfileWave
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiIdentity"
        "403":
          description: Forbidden
        "404":
          description: Profile not found
  /mention-aliases:
    get:
      tags:
        - Profiles
      summary: List the authenticated profile's personal mention shortcuts
      operationId: listMentionAliases
      security:
        - bearerAuth: []
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiMentionAlias"
        "401":
          description: Unauthorized
        "403":
          description: Forbidden
    post:
      tags:
        - Profiles
      summary: Create a personal mention shortcut
      operationId: createMentionAlias
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiMentionAliasRequest"
      responses:
        "201":
          description: created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMentionAlias"
        "400":
          description: Invalid input
        "401":
          description: Unauthorized
        "403":
          description: Forbidden
  /mention-aliases/{aliasId}:
    parameters:
      - name: aliasId
        in: path
        required: true
        schema:
          type: string
          format: uuid
    put:
      tags:
        - Profiles
      summary: Update a personal mention shortcut
      operationId: updateMentionAlias
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiMentionAliasRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiMentionAlias"
        "400":
          description: Invalid input
        "401":
          description: Unauthorized
        "403":
          description: Forbidden
        "404":
          description: Not Found
    delete:
      tags:
        - Profiles
      summary: Delete a personal mention shortcut
      operationId: deleteMentionAlias
      security:
        - bearerAuth: []
      responses:
        "204":
          description: deleted
        "400":
          description: Invalid input
        "401":
          description: Unauthorized
        "403":
          description: Forbidden
        "404":
          description: Not Found
  /profiles/{identity}/proxies:
    get:
      tags:
        - Proxies
      summary: Get profile proxies
      operationId: getProfileProxies
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiProfileProxy"
        "404":
          description: Profile not found
  /profiles/{identity}/proxies/received:
    get:
      tags:
        - Proxies
      summary: Get proxies received by a profile
      operationId: getProxiesReceived
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiProfileProxy"
        "404":
          description: Profile not found
  /profiles/{identity}/proxies/granted:
    get:
      tags:
        - Proxies
      summary: Get proxies granted by a profile
      operationId: getProxiesGranted
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiProfileProxy"
        "404":
          description: Profile not found
  /proxies:
    post:
      tags:
        - Proxies
      summary: Create a new proxy
      description: Requires the user to be authenticated
      operationId: createProxy
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateNewProfileProxy"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileProxy"
        "400":
          description: Invalid request
  /proxies/{proxyId}:
    get:
      tags:
        - Proxies
      summary: Get proxy by ID
      operationId: getProxyById
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileProxy"
        "404":
          description: Proxy not found
  /proxies/{proxyId}/actions:
    post:
      tags:
        - Proxies
      summary: Add action to proxy
      description: Requires the user to be authenticated
      operationId: addActionToProxy
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              anyOf:
                - $ref: >-
                    #/components/schemas/ApiCreateNewProfileProxyAllocateRepAction
                - $ref: >-
                    #/components/schemas/ApiCreateNewProfileProxyAllocateCicAction
                - $ref: >-
                    #/components/schemas/ApiCreateNewProfileProxyCreateWaveAction
                - $ref: "#/components/schemas/ApiCreateNewProfileProxyReadWaveAction"
                - $ref: >-
                    #/components/schemas/ApiCreateNewProfileProxyCreateWaveParticipationDropAction
                - $ref: >-
                    #/components/schemas/ApiCreateNewProfileProxyRateWaveDropAction
                - $ref: >-
                    #/components/schemas/ApiCreateNewProfileProxyPublishCmsAction
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileProxyAction"
        "400":
          description: Invalid request
        "404":
          description: Proxy not found
  /proxies/{proxyId}/actions/{actionId}/acceptance:
    post:
      tags:
        - Proxies
      summary: Accept action
      operationId: acceptAction
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
        - name: actionId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - action
              properties:
                action:
                  type: string
                  enum:
                    - ACCEPT
                    - REJECT
                    - REVOKE
                    - RESTORE
      responses:
        "201":
          description: successful operation
        "400":
          description: Invalid request
        "404":
          description: Proxy or action not found
  /proxies/{proxyId}/actions/{actionId}:
    put:
      tags:
        - Proxies
      summary: Update action
      operationId: updateAction
      parameters:
        - name: proxyId
          in: path
          required: true
          schema:
            type: string
        - name: actionId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUpdateProxyActionRequest"
      responses:
        "201":
          description: successful operation
        "400":
          description: Invalid request
        "404":
          description: Proxy or action not found
  /push-notifications/register:
    post:
      tags:
        - Push Notifications
      summary: Register a push notification token
      operationId: registerPushNotificationToken
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiRegisterPushNotificationTokenRequest"
      responses:
        "201":
          description: Push notification token registered successfully
        "400":
          description: Invalid request
        "401":
          description: Unauthorized
  /push-notifications/devices:
    get:
      tags:
        - Push Notifications
      summary: Get all registered devices for the authenticated user
      operationId: getDevices
      responses:
        "200":
          description: List of registered devices
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiPushNotificationDevice"
        "401":
          description: Unauthorized
        "403":
          description: Forbidden - profile required
  /push-notifications/devices/{device_id}:
    delete:
      tags:
        - Push Notifications
      summary: Delete a registered device
      operationId: deleteDevice
      parameters:
        - name: device_id
          in: path
          required: true
          schema:
            type: string
          description: The device ID to delete
      responses:
        "204":
          description: Device deleted successfully
        "401":
          description: Unauthorized
        "403":
          description: Forbidden - profile required
  /push-notifications/settings/{device_id}:
    get:
      tags:
        - Push Notifications
      summary: Get push notification settings for a device
      operationId: getPushNotificationSettings
      parameters:
        - name: device_id
          in: path
          required: true
          schema:
            type: string
          description: The device ID to get settings for
      responses:
        "200":
          description: Push notification settings
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiPushNotificationSettings"
        "401":
          description: Unauthorized
        "403":
          description: Forbidden - profile required
    put:
      tags:
        - Push Notifications
      summary: Update push notification settings for a device
      operationId: updatePushNotificationSettings
      parameters:
        - name: device_id
          in: path
          required: true
          schema:
            type: string
          description: The device ID to update settings for
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiPushNotificationSettingsUpdate"
      responses:
        "200":
          description: Updated push notification settings
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiPushNotificationSettings"
        "400":
          description: Invalid request
        "401":
          description: Unauthorized
        "403":
          description: Forbidden - profile required
  /bulk-rep:
    post:
      tags:
        - Ratings
      summary: >-
        Change REP rating of multiple targets and categories in one go. Targets
        final REP value will be the value you supply here. If you supply
        multiple  addresses for one consolidation group then those amounts will
        be summed together.
      operationId: bulkRep
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiBulkRepRequest"
      responses:
        "201":
          description: successful operation
        "400":
          description: Invalid request
  /ratings:
    post:
      tags:
        - Ratings
      summary: >-
        This is deprecated. Use bulk-rep instead. Bulk rate. Supplied amount
        will be added to all target identities. If same identity is supplied
        multiple times, all the additions will be summed up. Targets must be
        represented as Ethereum wallet addresses. ENS names and profile handles
        are not supported.
      deprecated: true
      operationId: bulkRate
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiBulkRateRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiBulkRateResponse"
        "400":
          description: Invalid request
  /ratings/credit:
    get:
      tags:
        - Ratings
      summary: Get available credit for rating
      operationId: getCreditLeft
      parameters:
        - name: rater
          in: query
          required: true
          schema:
            type: string
        - name: rater_representative
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiAvailableRatingCredit"
  /subscriptions/consolidation/coverage/{consolidation_key}:
    get:
      tags:
        - Subscriptions
      summary: Get projected subscription coverage for a consolidation
      description: >-
        Returns the authoritative backend forecast for The Memes subscription
        minting. Monetary values are lossless decimal ETH strings. Future Meme
        timing is projected from the canonical calendar provider and does not
        represent a top-up deadline. This public access policy matches the
        existing subscription details and upcoming-Meme endpoints. The response
        is intentionally uncached because background top-ups, redemptions,
        eligibility changes, and time can change coverage.
      operationId: getSubscriptionCoverage
      security: []
      x-6529-router:
        enabled: true
        auth: none
        handler:
          import: "@/api/subscriptions/get-subscription-coverage.handler"
          name: handleGetSubscriptionCoverage
      parameters:
        - name: consolidation_key
          in: path
          description: Normalized consolidation key
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 200
      responses:
        "200":
          description: Current projected subscription coverage
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiSubscriptionCoverage"
        "400":
          description: Invalid consolidation key
  /subscriptions/consolidation/details/{consolidation_key}:
    get:
      tags:
        - Subscriptions
      summary: Get subscription details for a consolidation
      operationId: getSubscriptionDetails
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubscriptionDetails"
        "404":
          description: Not found
  /subscriptions/consolidation/top-up/{consolidation_key}:
    get:
      tags:
        - Subscriptions
      summary: Get top-ups for a consolidation
      operationId: getSubscriptionTopUps
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubscriptionTopUpPage"
        "404":
          description: Not found
  /subscriptions/consolidation/upcoming-memes/{consolidation_key}:
    get:
      tags:
        - Subscriptions
      summary: Get upcoming meme subscriptions for a consolidation
      operationId: getUpcomingMemeSubscriptions
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
        - name: card_count
          in: query
          description: Number of upcoming cards to fetch. Default is 3
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/NFTSubscription"
  /subscriptions/consolidation/upcoming-memes/{meme_id}/{consolidation_key}:
    get:
      tags:
        - Subscriptions
      summary: Get upcoming meme subscription status for a consolidation
      operationId: getUpcomingMemeSubscriptionStatus
      parameters:
        - name: meme_id
          in: path
          description: Meme token id
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiUpcomingMemeSubscriptionStatus"
        "400":
          description: Meme already dropped
  /subscriptions/upcoming-memes-counts:
    get:
      tags:
        - Subscriptions
      summary: Get upcoming meme subscription counts
      operationId: getUpcomingMemeSubscriptionCounts
      parameters:
        - name: card_count
          in: query
          description: Number of upcoming cards to fetch. Default is 3
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/SubscriptionCounts"
  /subscriptions/memes/{token_id}/count:
    get:
      tags:
        - Subscriptions
      summary: Get meme subscription count
      operationId: getMemeSubscriptionCount
      parameters:
        - name: token_id
          in: path
          description: Meme token ID
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubscriptionCounts"
        "400":
          description: Invalid token ID
  /subscriptions/redeemed-memes-counts:
    get:
      tags:
        - Subscriptions
      summary: Get redeemed meme subscription counts
      operationId: getRedeemedMemeSubscriptionCounts
      parameters:
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RedeemedSubscriptionCountsPage"
  /subscriptions/redeemed-memes-counts/download:
    get:
      tags:
        - Subscriptions
      summary: Download redeemed meme subscription counts as CSV
      description: >-
        Downloads a CSV with meme_id, artist, drop_date, unique_profiles,
        subscriptions_count, and proceeds for MEMES cards with id >= 220. When
        `szn` is provided, only cards in that season are included.
      operationId: downloadRedeemedMemeSubscriptionCounts
      parameters:
        - name: szn
          in: query
          description: Optional MEMES season filter
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            text/csv:
              schema:
                type: string
                format: binary
  /subscriptions/consolidation/logs/{consolidation_key}:
    get:
      tags:
        - Subscriptions
      summary: Get subscription logs for a consolidation
      operationId: getSubscriptionLogs
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubscriptionLogPage"
        "404":
          description: Not found
  /subscriptions/consolidation/redeemed/{consolidation_key}:
    get:
      tags:
        - Subscriptions
      summary: Get redeemed subscriptions for a consolidation
      operationId: getRedeemedSubscriptions
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RedeemedSubscriptionPage"
        "404":
          description: Not found
  /subscriptions/consolidation/{consolidation_key}/airdrop-address:
    get:
      tags:
        - Subscriptions
      summary: Get airdrop address for a consolidation
      operationId: getAirdropAddress
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AirdropAddressResponse"
  /subscriptions/final/{contract}/{token_id}/phases/{phase_name}:
    get:
      tags:
        - Subscriptions
      summary: Get final subscription airdrops for a token phase
      operationId: getFinalSubscriptionsByPhase
      parameters:
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: token_id
          in: path
          description: Token ID
          required: true
          schema:
            type: integer
            format: int64
        - name: phase_name
          in: path
          description: Phase name (URL encoded)
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/PhaseAirdrop"
        "400":
          description: Invalid token ID
  /subscriptions/consolidation/final/{consolidation_key}/{contract}/{token_id}:
    get:
      tags:
        - Subscriptions
      summary: Get final subscription for a consolidation
      operationId: getFinalSubscription
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
        - name: contract
          in: path
          description: Contract address
          required: true
          schema:
            type: string
        - name: token_id
          in: path
          description: Token ID
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NFTFinalSubscription"
        "400":
          description: Invalid token ID
        "404":
          description: Not found
  /subscriptions/uploads:
    get:
      tags:
        - Subscriptions
      summary: Get subscription uploads
      operationId: getSubscriptionUploads
      parameters:
        - name: contract
          in: query
          description: Contract address (required)
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NFTFinalSubscriptionUploadPage"
        "400":
          description: Contract is required
  /subscriptions/{consolidation_key}/subscription-mode:
    post:
      tags:
        - Subscriptions
      summary: Update subscription mode
      description: >-
        Requires authentication. User can only change subscription mode for
        their own consolidation.
      operationId: updateSubscriptionMode
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateSubscriptionModeRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubscriptionModeResponse"
        "400":
          description: Not enough balance
        "403":
          description: User can only change subscription mode for their own consolidation
  /subscriptions/{consolidation_key}/subscribe-all-editions:
    post:
      tags:
        - Subscriptions
      summary: Toggle subscribe all editions preference
      description: >-
        Requires authentication. User can only change this setting for their own
        consolidation.
      operationId: updateSubscribeAllEditions
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateSubscribeAllEditionsRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubscribeAllEditionsResponse"
        "403":
          description: User can only change subscription mode for their own consolidation
  /subscriptions/{consolidation_key}/subscription:
    post:
      tags:
        - Subscriptions
      summary: Update subscription for a specific NFT
      description: >-
        Requires authentication. User can only change subscriptions for their
        own consolidation.
      operationId: updateSubscription
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateSubscriptionRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubscriptionResponse"
        "400":
          description: Not enough balance or NFT already released
        "403":
          description: User can only change subscription mode for their own consolidation
  /subscriptions/{consolidation_key}/subscription-count:
    post:
      tags:
        - Subscriptions
      summary: Update subscription count for a specific NFT
      description: >-
        Requires authentication. User can only change subscriptions for their
        own consolidation.
      operationId: updateSubscriptionCount
      parameters:
        - name: consolidation_key
          in: path
          description: Consolidation key
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateSubscriptionCountRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubscriptionCountResponse"
        "400":
          description: Not enough balance, NFT already released, or exceeds eligibility
        "403":
          description: User can only change subscription mode for their own consolidation
  /identity-subscriptions/outgoing/{target_type}:
    get:
      tags:
        - Subscriptions
      summary: Get outgoing subscriptions for authenticated user.
      operationId: getOutgoingSubscriptions
      parameters:
        - name: target_type
          in: path
          required: true
          schema:
            type: string
            enum:
              - IDENTITY
              - WAVE
              - DROP
        - name: page_size
          in: query
          required: false
          schema:
            type: number
            format: int64
            default: 10
            minimum: 1
            maximum: 100
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            default: 1
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiOutgoingIdentitySubscriptionsPage"
  /identity-subscriptions/incoming/{target_type}/{target_id}:
    get:
      tags:
        - Subscriptions
      summary: Get identities subscribed to target.
      operationId: getIncomingSubscriptionsForTarget
      parameters:
        - name: target_type
          in: path
          required: true
          schema:
            type: string
            enum:
              - IDENTITY
              - WAVE
              - DROP
        - name: target_id
          in: path
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            default: 10
            maximum: 100
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            default: 1
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiIncomingIdentitySubscriptionsPage"
  /tdh/consolidated_metrics:
    get:
      tags:
        - TDH
      summary: Get consolidated TDH metrics with pagination and sorting.
      operationId: getConsolidatedTdhMetrics
      parameters:
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            default: 50
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            default: 1
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: sort
          in: query
          description: >-
            Default is level. Use tdh to sort by the selected tdh_view. Use
            boosted_tdh to sort by boosted TDH regardless of tdh_view.
          required: false
          schema:
            $ref: "#/components/schemas/ApiConsolidatedTdhMetricsSort"
        - name: tdh_view
          in: query
          description: >-
            Selects which TDH value is returned as tdh and used when sort=tdh.
            Default is boosted.
          required: false
          schema:
            $ref: "#/components/schemas/ApiConsolidatedTdhView"
        - name: search
          in: query
          required: false
          schema:
            type: string
        - name: content
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiConsolidatedTdhMetricsContent"
        - name: collector
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiConsolidatedTdhMetricsCollector"
        - name: season
          in: query
          required: false
          schema:
            type: number
            format: int64
        - name: download_page
          in: query
          required: false
          schema:
            type: boolean
        - name: download_all
          in: query
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiConsolidatedTdhMetricsPage"
            text/csv:
              schema:
                type: string
                format: binary
        "400":
          description: Unsupported sort field or TDH view
  /tdh/consolidation/{identity}:
    get:
      tags:
        - TDH
      summary: Get consolidated TDH for an identity
      description: >-
        Returns the consolidated TDH data for a given identity. The identity can
        be a profile handle, wallet address, ENS name, or consolidation key.
      operationId: getConsolidatedTdh
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
          description: Profile handle, wallet address, ENS name, or consolidation key
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiConsolidatedTdh"
        "404":
          description: Consolidated TDH not found
  /tdh-editions/wallet/{wallet}:
    get:
      tags:
        - TDH Editions
      summary: Get TDH editions for a wallet
      operationId: getTdhEditionsByWallet
      parameters:
        - name: wallet
          in: path
          required: true
          schema:
            type: string
        - name: contract
          in: query
          required: false
          schema:
            type: string
        - name: token_id
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: edition_id
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - id
              - hodl_rate
              - days_held
              - balance
              - edition_id
              - contract
            default: id
        - name: sort_direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiTdhEditionsPage"
        "400":
          description: Invalid wallet
  /tdh-editions/consolidation/{consolidation_key}:
    get:
      tags:
        - TDH Editions
      summary: Get TDH editions by consolidation key
      operationId: getTdhEditionsByConsolidationKey
      parameters:
        - name: consolidation_key
          in: path
          required: true
          schema:
            type: string
        - name: contract
          in: query
          required: false
          schema:
            type: string
        - name: token_id
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: edition_id
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - id
              - hodl_rate
              - days_held
              - balance
              - edition_id
              - contract
            default: id
        - name: sort_direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiTdhEditionsPage"
        "404":
          description: Consolidation key not found
  /tdh-editions/identity/{identity}:
    get:
      tags:
        - TDH Editions
      summary: Get TDH editions for an identity, wallet address, or ENS
      operationId: getTdhEditionsByIdentity
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
          description: Identity handle, profile id, wallet address, or ENS name
        - name: contract
          in: query
          required: false
          schema:
            type: string
        - name: token_id
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: edition_id
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - id
              - hodl_rate
              - days_held
              - balance
              - edition_id
              - contract
            default: id
        - name: sort_direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiTdhEditionsPage"
        "404":
          description: Identity not found
  /transactions:
    get:
      tags:
        - Transactions
      summary: Get transactions
      operationId: getTransactions
      parameters:
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: wallets
          in: query
          description: Filter by wallet address
          required: false
          schema:
            type: string
        - name: contract
          in: query
          description: Filter by contract address
          required: false
          schema:
            type: string
        - name: nfts
          in: query
          description: Filter by NFT ID
          required: false
          schema:
            type: string
        - name: filter
          in: query
          description: Filter by transaction type
          required: false
          schema:
            type: string
            enum:
              - sales
              - purchases
              - transfers
              - airdrops
              - burns
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiTransactionPage"
  /waves/{id}/rep/rating:
    post:
      tags:
        - WaveREP
      summary: >-
        Change wave REP rating. If you are authenticated as proxy, you will be
        rating on behalf of the profile you are proxying.
      operationId: rateWaveRep
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiChangeWaveRepRating"
      responses:
        "201":
          description: successful operation
        "400":
          description: Invalid request
        "404":
          description: Wave not found
    get:
      tags:
        - WaveREP
      summary: Get wave REP rating
      operationId: getWaveRepRating
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: from_identity
          in: query
          description: >-
            If omitted, the authenticated profile is used. Anonymous requests
            without from_identity return 0.
          required: false
          schema:
            type: string
        - name: category
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveRepRating"
        "404":
          description: Wave not found
  /waves/{id}/rep/ratings/by-rater:
    get:
      tags:
        - WaveREP
      summary: Get wave REP ratings by rater
      operationId: getWaveRepRatingsByRater
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: number
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: number
            minimum: 1
            maximum: 2000
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: order_by
          in: query
          required: false
          schema:
            type: string
            enum:
              - last_modified
              - rating
        - name: category
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiRatingWithProfileInfoAndLevelPage"
        "404":
          description: Wave not found
  /waves/{id}/rep/overview:
    get:
      tags:
        - WaveREP
      summary: Get wave REP overview
      operationId: getWaveRepOverview
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveRepOverview"
        "404":
          description: Wave not found
  /waves/{id}/rep/categories:
    get:
      tags:
        - WaveREP
      summary: Get wave REP categories
      operationId: getWaveRepCategories
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - name: top_contributors_limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 10
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveRepCategoriesPage"
        "404":
          description: Wave not found
  /waves/{id}/rep/categories/{category}/contributors:
    get:
      tags:
        - WaveREP
      summary: Get wave REP contributors for category
      operationId: getWaveRepCategoryContributors
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: category
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
            pattern: ^[a-zA-Z0-9?!,."() ]{1,100}$
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveRepContributorsPage"
        "404":
          description: Wave not found
  /waves/{waveId}/outcomes:
    get:
      tags:
        - Waves
      summary: Get wave outcomes
      operationId: getWaveOutcomes
      parameters:
        - name: waveId
          in: path
          required: true
          schema:
            type: string
        - name: sort_direction
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
            default: DESC
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
            default: 100
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveOutcomesPage"
        "404":
          description: Wave not found
  /waves/{waveId}/outcomes/{outcomeIndex}/distribution:
    get:
      tags:
        - Waves
      summary: Get wave outcome distribution
      operationId: getWaveOutcomeDistribution
      parameters:
        - name: waveId
          in: path
          required: true
          schema:
            type: string
        - name: outcomeIndex
          in: path
          required: true
          schema:
            type: string
        - name: sort_direction
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
            default: DESC
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
            default: 100
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveOutcomeDistributionItemsPage"
        "404":
          description: Wave not found
  /waves/{id}/decisions:
    get:
      tags:
        - Waves
      summary: Get already decided wave decision outcomes
      deprecated: true
      description: Deprecated. Use GET /v2/waves/{id}/decisions instead.
      operationId: getWaveDecisions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: sort_direction
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
            default: DESC
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - decision_time
            default: decision_time
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
            default: 100
        - name: is_additional_action_promised
          in: query
          description: >-
            Optional filter for winner drops by whether an additional action was
            promised
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveDecisionsPage"
        "404":
          description: Wave not found
  /waves/{id}/pauses:
    post:
      tags:
        - Waves
      summary: Create or edit wave decision pause
      operationId: updateWaveDecisionPause
      parameters:
        - name: id
          description: wave id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUpdateWaveDecisionPause"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWave"
        "404":
          description: Wave not found
  /waves/{waveId}/pauses/{id}:
    delete:
      tags:
        - Waves
      summary: Delete wave decision pause
      description: >-
        Pause can only be deleted if no past decisions have already been skipped
        based on it.
      operationId: deleteWaveDecisionPause
      parameters:
        - name: waveId
          description: wave id
          in: path
          required: true
          schema:
            type: string
        - name: id
          description: pause id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWave"
        "404":
          description: Wave or pause not found
  /waves/{waveId}/search:
    get:
      tags:
        - Waves
      summary: Search for drops in wave by content
      deprecated: true
      description: Deprecated. Use GET /v2/waves/{waveId}/search instead.
      operationId: searchDropsInWave
      parameters:
        - name: waveId
          in: path
          required: true
          schema:
            type: string
        - name: term
          in: query
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            default: 1
        - name: size
          in: query
          required: false
          schema:
            type: number
            format: int64
            maximum: 100
            minimum: 1
            default: 20
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropWithoutWavesPageWithoutCount"
        "404":
          description: Wave not found
  /wave-media/prep:
    post:
      tags:
        - Waves
      summary: Create S3 URL for wave PFP
      description: Requires the user to be authenticated
      operationId: createWaveMediaUrl
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateMediaUploadUrlRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCreateMediaUrlResponse"
        "400":
          description: Invalid request
  /waves-overview:
    get:
      tags:
        - Waves
      summary: Get overview of waves by different criteria.
      deprecated: true
      description: Deprecated. Use GET /v2/waves?view=OVERVIEW instead.
      operationId: getWavesOverview
      parameters:
        - name: limit
          in: query
          description: How many waves to return (10 by default)
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 20
            default: 10
        - name: offset
          in: query
          description: Used to find next waves
          required: false
          schema:
            type: integer
            format: int64
            minimum: 0
        - name: pinned
          in: query
          description: Filter only PINNED or UNPINNED waves
          required: false
          schema:
            $ref: "#/components/schemas/ApiWavesPinFilter"
        - name: type
          in: query
          description: Type of overview
          required: true
          schema:
            $ref: "#/components/schemas/ApiWavesOverviewType"
        - name: only_waves_followed_by_authenticated_user
          in: query
          description: >-
            If true then result only includes waves the authenticated user
            follows, plus root parent containers for subwaves the authenticated
            user follows where the parent is visible.
          required: false
          schema:
            type: boolean
        - name: direct_message
          in: query
          description: Use true for DM waves, use false for non-DM waves, omit for all
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWave"
  /waves-overview/favourites-of-identity/{identityKey}:
    get:
      tags:
        - Waves
      summary: Get waves where a profile has written the most messages.
      deprecated: true
      description: >-
        Deprecated. Use GET /v2/waves?view=FAVOURITES&identity={identityKey}
        instead. Returns non-DM waves ranked by how many chat messages the
        resolved profile has written in them. Results only include waves the
        requester can access.
      operationId: getFavouriteWavesOfIdentity
      parameters:
        - name: identityKey
          in: path
          description: Profile id, wallet, ENS, or handle to resolve
          required: true
          schema:
            type: string
        - name: limit
          in: query
          description: How many waves to return (50 by default)
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 50
        - name: offset
          in: query
          description: Used to find next waves
          required: false
          schema:
            type: integer
            format: int64
            minimum: 0
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWave"
  /waves-overview/hot:
    get:
      tags:
        - Waves
      summary: Get hot waves overview.
      deprecated: true
      description: >-
        Deprecated. Use GET /v2/waves?view=HOT instead. Returns up to 25 public
        waves ranked by activity in the last 24 hours.
      operationId: getHotWavesOverview
      parameters:
        - name: exclude_followed
          in: query
          description: >-
            If true then result excludes waves the authenticated user already
            follows, plus root parent containers for subwaves the authenticated
            user follows where the parent is visible.
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWave"
  /waves:
    get:
      tags:
        - Waves
      summary: Get waves.
      deprecated: true
      description: Deprecated. Use GET /v2/waves?view=SEARCH instead.
      operationId: getWaves
      parameters:
        - name: name
          in: query
          description: Search by name or part of name
          required: false
          schema:
            type: string
        - name: author
          in: query
          description: Search by author identity
          required: false
          schema:
            type: string
        - name: limit
          in: query
          description: How many waves to return (10 by default)
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 20
        - name: serial_no_less_than
          in: query
          description: Used to find older drops
          required: false
          schema:
            type: integer
            format: int64
        - name: group_id
          in: query
          description: Waves by authors that fall into supplied group
          required: false
          schema:
            type: string
        - name: direct_message
          in: query
          description: Use true for DM waves, use false for non-DM waves, omit for all
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWave"
    post:
      tags:
        - Waves
      summary: Create new wave
      description: Requires the user to be authenticated
      operationId: createWave
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateNewWave"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWave"
        "400":
          description: Invalid request
  /wave-group-validation:
    post:
      tags:
        - Waves
      summary: Validate Wave privilege groups against its View group
      description: >-
        Returns the active privilege scopes that contain at least one member
        outside the supplied View group. Omitted privilege properties are not
        checked. A null Drop, Vote, or Chat property represents Everyone; a null
        Admin property means there is no explicit Admin group. Private groups
        are available only to their creator or eligible members; other private
        group ids are treated as unavailable.
      operationId: validateWaveGroups
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/wave-group-validation.handler"
          name: handleValidateWaveGroups
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiWaveGroupValidationRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveGroupValidationResponse"
        "400":
          description: Invalid request or unavailable group
        "403":
          description: Authentication is required when validating the caller as Admin
  /waves/direct-message/new:
    post:
      tags:
        - Waves
      summary: Create a direct message wave
      operationId: createDirectMessageWave
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                identity_addresses:
                  type: array
                  items:
                    type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWave"
        "400":
          description: Invalid request
  /waves/{id}:
    get:
      tags:
        - Waves
      summary: Get wave by ID.
      operationId: getWaveById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWave"
        "404":
          description: Wave not found
    delete:
      tags:
        - Waves
      summary: Delete wave by ID
      operationId: deleteWaveById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "201":
          description: successful operation
        "404":
          description: Wave not found
    post:
      tags:
        - Waves
      summary: Update wave by ID
      operationId: updateWaveById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiUpdateWaveRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWave"
        "400":
          description: Invalid request
        "404":
          description: Drop not found
  /waves/{id}/subwaves:
    get:
      tags:
        - Waves
      summary: Get wave subwaves.
      description: Returns direct subwaves of a wave.
      operationId: listWaveSubwaves
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleListWaveSubwaves
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          description: Number of subwaves to return
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 50
        - name: sort
          in: query
          description: Sort subwaves by name or creation time
          required: false
          schema:
            $ref: "#/components/schemas/ApiSubwavesSort"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveOverviewPage"
        "400":
          description: Invalid request
        "404":
          description: Wave not found
  /waves/{id}/drops:
    get:
      tags:
        - Waves
      summary: Get drops related to wave or parent drop
      deprecated: true
      description: >-
        Deprecated. Use GET /v2/waves/{id}/drops for the wave timeline feed, GET
        /v2/drops/{id}/replies for reply threads, and GET
        /v2/waves/{id}/curations/{curation_id}/drops for curation drops.
      operationId: getDropsOfWave
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: drop_id
          in: query
          required: false
          schema:
            type: string
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 200
            default: 20
        - name: serial_no_limit
          in: query
          required: false
          description: >-
            Use instead of serial_no_less_than. If you use serial_no_less_than
            and this then serial_no_less_than is preferred (until future when
            it"s deleted)
          schema:
            type: integer
            format: int64
        - name: search_strategy
          in: query
          required: false
          description: >-
            Use in combination with serial_no_limit. If this not set then
            FIND_OLDER is used. If serial_no_less_than is set then this is
            ignored.
          schema:
            $ref: "#/components/schemas/ApiDropSearchStrategy"
        - name: serial_no_less_than
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: drop_type
          in: query
          description: Filter by drop type
          required: false
          schema:
            $ref: "#/components/schemas/ApiDropType"
        - name: curation_id
          in: query
          description: >-
            Only include drops with persisted membership in the curation
            identified by ApiWaveCuration.id (UUID string)
          required: false
          schema:
            type: string
            format: uuid
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveDropsFeed"
  /waves/{id}/my-chat-history:
    delete:
      tags:
        - Waves
      summary: Delete the authenticated user's chat history from a wave
      description: >-
        Permanently deletes every CHAT drop authored by the authenticated user
        in the wave, except for the wave's pinned drop. Participatory and winner
        drops are never deleted. This self-service cleanup remains available if
        the caller is no longer eligible to view or participate in the wave.
      operationId: deleteMyWaveChatHistory
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/waves/delete-my-wave-chat-history.handler"
          name: handleDeleteMyWaveChatHistory
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Chat history deletion result
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDeleteMyWaveChatHistoryResponse"
        "403":
          description: A profile is required and proxies cannot delete chat history
        "404":
          description: Wave not found
  /waves/{id}/undiscovered-drop:
    get:
      tags:
        - Waves
      summary: Get the next undiscovered participatory drop for quick vote
      operationId: getWaveUndiscoveredDrop
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: skip
          in: query
          required: false
          description: >-
            Zero-based offset into the newest unvoted and unskipped drops for
            this wave. If no unskipped drops remain, the offset applies to the
            earliest skipped unvoted drops instead.
          schema:
            type: integer
            format: int64
            minimum: 0
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiUndiscoveredDrop"
        "403":
          description: User is not eligible to quick vote in this wave
        "404":
          description: Wave not found
  /waves/{id}/pinned-drop:
    post:
      tags:
        - Waves
      summary: Change pinned drop in a wave
      operationId: setWavePinnedDrop
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiSetPinnedDropRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWave"
        "400":
          description: Invalid request
        "403":
          description: Only wave creators or admins can change pinned drop
        "404":
          description: Wave or drop not found
  /waves/{id}/pins:
    post:
      tags:
        - Waves
      summary: Pin a wave
      operationId: pinWave
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
    delete:
      tags:
        - Waves
      summary: Unpin a wave
      operationId: unPinWave
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
  /waves/{id}/mute:
    post:
      tags:
        - Waves
      summary: Mute a wave
      operationId: muteWave
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
    delete:
      tags:
        - Waves
      summary: Unmute a wave
      operationId: unmuteWave
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
  /waves/{id}/leaderboard:
    get:
      tags:
        - Waves
      summary: Get waves leaderboard
      deprecated: true
      description: Deprecated. Use GET /v2/waves/{id}/leaderboard instead.
      operationId: getWaveLeaderboard
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is ASC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: sort
          in: query
          description: Default is rank
          required: false
          schema:
            type: string
            enum:
              - RANK
              - REALTIME_VOTE
              - MY_REALTIME_VOTE
              - CREATED_AT
              - PRICE
              - RATING_PREDICTION
              - TREND
        - name: price_currency
          in: query
          description: >-
            Optional currency used for min_price/max_price filtering and PRICE
            sorting
          required: false
          schema:
            type: string
        - name: min_price
          in: query
          description: Optional minimum price filter applied to leaderboard results
          required: false
          schema:
            type: number
            format: double
            minimum: 0
        - name: max_price
          in: query
          description: Optional maximum price filter applied to leaderboard results
          required: false
          schema:
            type: number
            format: double
            minimum: 0
        - name: curation_id
          in: query
          description: >-
            Only include drops with persisted membership in the curation
            identified by ApiWaveCuration.id (UUID string)
          required: false
          schema:
            type: string
            format: uuid
        - name: unvoted_by_me
          in: query
          description: >-
            When true, only returns drops the authenticated user has not voted
            on or currently has a 0 vote on
          required: false
          schema:
            type: boolean
            default: false
        - name: is_additional_action_promised
          in: query
          description: >-
            Optional filter for participatory drops by whether an additional
            action was promised
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropsLeaderboardPage"
  /waves/{id}/curations:
    get:
      tags:
        - Waves
      summary: List curations configured for wave
      operationId: listWaveCurations
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWaveCuration"
    post:
      tags:
        - Waves
      summary: Create curation for wave
      operationId: createWaveCuration
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiWaveCurationRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveCuration"
  /waves/{id}/curations/{curation_id}/drops:
    get:
      tags:
        - Waves
      summary: List drops in a curation for wave
      deprecated: true
      description: >-
        Deprecated. Use GET /v2/waves/{id}/curations/{curation_id}/drops
        instead.
      operationId: listWaveCurationDrops
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: curation_id
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiCurationDropsPage"
        "404":
          description: Wave or curation not found
  /waves/{id}/curations/{curationId}:
    post:
      tags:
        - Waves
      summary: Update curation for wave
      operationId: updateWaveCuration
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: curationId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiWaveCurationRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveCuration"
    delete:
      tags:
        - Waves
      summary: Delete curation from wave
      operationId: deleteWaveCuration
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: curationId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
  /waves/{id}/logs:
    get:
      tags:
        - Waves
      summary: Get drop logs
      operationId: getDropLogs
      parameters:
        - name: id
          in: path
          description: Filter by wave ID
          required: true
          schema:
            type: string
        - name: log_types
          in: query
          description: Filter by log type (comma separated)
          required: false
          schema:
            type: string
        - name: drop_id
          in: query
          description: Filter by drop ID
          required: false
          schema:
            type: string
        - name: offset
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 0
        - name: limit
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
            default: 20
        - name: sort_direction
          in: query
          description: Default is DESC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWaveLog"
        "404":
          description: Wave not found
  /waves/{id}/voters:
    get:
      tags:
        - Waves
      summary: Get info about waves voters (top voters etc)
      operationId: getWaveVotersInfo
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: drop_id
          in: query
          description: If set then you"ll get stats for specific drop
          required: false
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 0
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: sort_direction
          in: query
          description: Default is ASC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: sort
          in: query
          description: Default is ABSOLUTE
          required: false
          schema:
            type: string
            enum:
              - ABSOLUTE
              - POSITIVE
              - NEGATIVE
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveVotersPage"
  /waves/{id}/subscriptions:
    post:
      tags:
        - Waves
      summary: Subscribe authenticated user to wave actions.
      operationId: subscribeToWaveActions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiWaveSubscriptionActions"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveSubscriptionActions"
        "404":
          description: Wave not found
    delete:
      tags:
        - Waves
      summary: Unsubscribe authenticated user from wave actions.
      operationId: unsubscribeFromWaveActions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiWaveSubscriptionActions"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveSubscriptionActions"
        "404":
          description: Wave not found
  /v2/official-waves:
    get:
      tags:
        - WavesV2
      summary: Get official waves
      operationId: getOfficialWaves
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleGetOfficialWaves
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWaveOverview"
  /v2/waves:
    get:
      tags:
        - WavesV2
      summary: Get V2 waves
      description: >-
        Returns a paginated list of wave overviews. Use view=SEARCH for the
        regular waves search, view=OVERVIEW for overview rankings, view=HOT for
        hot waves, and view=FAVOURITES for waves where an identity has written
        the most messages.
      operationId: getWavesV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleGetWavesV2
      parameters:
        - name: view
          in: query
          description: Defaults to SEARCH
          required: false
          schema:
            $ref: "#/components/schemas/ApiWavesV2ListType"
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          description: >-
            Number of waves to return. Per-view defaults and maximums match the
            legacy endpoints.
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
        - name: name
          in: query
          description: SEARCH view only. Search by name or part of name.
          required: false
          schema:
            type: string
        - name: author
          in: query
          description: SEARCH view only. Search by author identity.
          required: false
          schema:
            type: string
        - name: serial_no_less_than
          in: query
          description: SEARCH view only. Restricts search to older waves.
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: group_id
          in: query
          description: SEARCH view only. Waves by authors that fall into supplied group.
          required: false
          schema:
            type: string
        - name: direct_message
          in: query
          description: >-
            SEARCH and OVERVIEW views only. Use true for DM waves, false for
            non-DM waves, omit for all.
          required: false
          schema:
            type: boolean
        - name: overview_type
          in: query
          description: OVERVIEW view only. Type of overview.
          required: false
          schema:
            $ref: "#/components/schemas/ApiWavesOverviewType"
        - name: only_waves_followed_by_authenticated_user
          in: query
          description: >-
            OVERVIEW view only. If true then result only includes waves that the
            authenticated user follows, plus root parent containers for subwaves
            the authenticated user follows where the parent is visible.
          required: false
          schema:
            type: boolean
        - name: pinned
          in: query
          description: OVERVIEW view only. Filter only PINNED or NOT_PINNED waves.
          required: false
          schema:
            $ref: "#/components/schemas/ApiWavesPinFilter"
        - name: score_sort
          in: query
          description: >-
            Score-aware broad discovery sort. Applies when overview_type is
            SCORED_RECENTLY_DROPPED_TO.
          required: false
          schema:
            $ref: "#/components/schemas/ApiWaveScoreSort"
        - name: min_visibility_score
          in: query
          description: Score-aware overview filter, inclusive 0..100.
          required: false
          schema:
            type: number
            format: double
            minimum: 0
            maximum: 100
        - name: min_quality_score
          in: query
          description: Score-aware overview filter, inclusive 0..100.
          required: false
          schema:
            type: number
            format: double
            minimum: 0
            maximum: 100
        - name: min_hotness_score
          in: query
          description: Score-aware overview filter, inclusive 0..100.
          required: false
          schema:
            type: number
            format: double
            minimum: 0
            maximum: 100
        - name: min_rep_sort_score
          in: query
          description: Score-aware overview filter, inclusive 0..100.
          required: false
          schema:
            type: number
            format: double
            minimum: 0
            maximum: 100
        - name: visibility_tier
          in: query
          description: Score-aware overview visibility tier filter.
          required: false
          schema:
            $ref: "#/components/schemas/ApiWaveVisibilityTier"
        - name: exclude_followed
          in: query
          description: >-
            HOT view and OVERVIEW view with
            overview_type=SCORED_RECENTLY_DROPPED_TO only. If true then result
            excludes waves the authenticated user already follows, plus root
            parent containers for subwaves the authenticated user follows where
            the parent is visible.
          required: false
          schema:
            type: boolean
        - name: identity
          in: query
          description: FAVOURITES view only. Profile id, wallet, ENS, or handle to resolve.
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveOverviewPage"
        "400":
          description: Invalid request
  /v2/waves/profile-activity/{identity}:
    get:
      tags:
        - WavesV2
      summary: Get profile wave activity
      description: >-
        Returns accessible non-direct-message waves created by, or recently
        posted to by, the resolved profile. latest_post_timestamp is the
        profile's latest authored drop in the exact wave, including the wave
        description drop, replies, and CHAT, PARTICIPATORY, and WINNER drop
        types. It excludes reactions, votes, subscriptions, reads, and drops
        authored by other identities.
      operationId: getProfileWaveActivity
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/profile-wave-activity.handler"
          name: handleGetProfileWaveActivity
      parameters:
        - name: identity
          in: path
          description: Profile id, wallet, ENS, or handle to resolve.
          required: true
          schema:
            type: string
            maxLength: 200
        - name: activity_type
          in: query
          required: true
          schema:
            $ref: "#/components/schemas/ApiProfileWaveActivityType"
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 50
            default: 20
        - name: cursor
          in: query
          description: Opaque cursor returned by the previous page.
          required: false
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiProfileWaveActivityPage"
        "400":
          description: Invalid request or cursor
        "404":
          description: Identity not found
  /v2/waves/{id}/metadata:
    get:
      tags:
        - WavesV2
      summary: Get V2 wave metadata
      operationId: getWaveMetadata
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleGetWaveMetadata
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWaveMetadata"
        "404":
          description: Wave not found
    post:
      tags:
        - WavesV2
      summary: Create V2 wave metadata
      operationId: createWaveMetadata
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleCreateWaveMetadata
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiCreateWaveMetadataRequest"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveMetadata"
        "400":
          description: Invalid request
        "403":
          description: User cannot manage wave metadata
        "404":
          description: Wave not found
  /v2/waves/{id}/metadata/{metadata_id}:
    delete:
      tags:
        - WavesV2
      summary: Delete V2 wave metadata
      operationId: deleteWaveMetadata
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleDeleteWaveMetadata
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: metadata_id
          in: path
          required: true
          schema:
            type: integer
            format: int64
            minimum: 1
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveMetadata"
        "403":
          description: User cannot manage wave metadata
        "404":
          description: Wave metadata not found
  /v2/waves/{id}/competition-drops:
    get:
      tags:
        - WavesV2
      summary: Get one author's competition drops in a wave
      description: >-
        Lazily returns full participatory or winner drops for one author after a
        wave-scoped competition badge is opened.
      operationId: getWaveCompetitionDropsV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleGetWaveCompetitionDropsV2
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: author_id
          in: query
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: drop_type
          in: query
          required: true
          schema:
            type: string
            enum:
              - PARTICIPATORY
              - WINNER
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropV2PageWithoutCount"
        "400":
          description: Invalid competition drop query params
        "404":
          description: Wave not found or not visible
  /v2/waves/{id}/drops:
    get:
      tags:
        - WavesV2
      summary: Get V2 timeline drops for a wave
      description: >-
        Returns the timeline feed for a wave. This endpoint does not accept
        reply-thread or curation filters. Use GET /v2/drops/{id}/replies for
        reply threads and GET /v2/waves/{id}/curations/{curation_id}/drops for
        curation drops.
      operationId: getWaveDropsV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleGetWaveDropsV2
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 200
            default: 50
        - name: serial_no_limit
          in: query
          required: false
          description: Serial number anchor for paginating drops.
          schema:
            type: integer
            format: int64
            minimum: 1
        - name: search_strategy
          in: query
          required: false
          description: >-
            Use in combination with serial_no_limit. If this is not set then
            FIND_OLDER is used.
          schema:
            $ref: "#/components/schemas/ApiDropSearchStrategy"
        - name: drop_type
          in: query
          description: Filter by drop type
          required: false
          schema:
            $ref: "#/components/schemas/ApiDropType"
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveDropsFeedV2"
        "400":
          description: Invalid wave timeline feed query params
  /v2/waves/{id}/polls:
    get:
      tags:
        - WavesV2
      summary: Get V2 polls in a wave.
      operationId: getWavePollsV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/drops/drop-polls.handlers"
          name: handleGetWavePollsV2
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 20
        - name: sort_direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
            default: DESC
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - created_at
              - closing_time
            default: created_at
        - name: state
          in: query
          required: false
          schema:
            type: string
            enum:
              - OPEN
              - CLOSED
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropPollsPage"
        "400":
          description: Invalid request
        "404":
          description: Wave not found
  /v2/waves/{id}/curations/{curation_id}/drops:
    get:
      tags:
        - WavesV2
      summary: List V2 drops in a curation for wave
      operationId: listWaveCurationDropsV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleListWaveCurationDropsV2
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: curation_id
          in: path
          required: true
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 100
            default: 50
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropV2PageWithoutCount"
        "404":
          description: Wave or curation not found
  /v2/waves/{id}/decisions:
    get:
      tags:
        - WavesV2
      summary: Get already decided V2 wave decision outcomes
      operationId: getWaveDecisionsV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleGetWaveDecisionsV2
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: sort_direction
          in: query
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
            default: DESC
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - decision_time
            default: decision_time
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
            default: 100
        - name: is_additional_action_promised
          in: query
          description: >-
            Optional filter for winner drops by whether an additional action was
            promised
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiWaveDecisionsPageV2"
        "404":
          description: Wave not found
  /v2/waves/{id}/leaderboard:
    get:
      tags:
        - WavesV2
      summary: Get V2 waves leaderboard
      operationId: getWaveLeaderboardV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleGetWaveLeaderboardV2
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: page_size
          in: query
          description: Default is 50
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: page
          in: query
          description: Default is 1
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
        - name: sort_direction
          in: query
          description: Default is ASC
          required: false
          schema:
            type: string
            enum:
              - ASC
              - DESC
        - name: sort
          in: query
          description: Default is rank
          required: false
          schema:
            type: string
            enum:
              - RANK
              - REALTIME_VOTE
              - MY_REALTIME_VOTE
              - CREATED_AT
              - PRICE
              - RATING_PREDICTION
              - TREND
        - name: price_currency
          in: query
          description: >-
            Optional currency used for min_price/max_price filtering and PRICE
            sorting
          required: false
          schema:
            type: string
        - name: min_price
          in: query
          description: Optional minimum price filter applied to leaderboard results
          required: false
          schema:
            type: number
            format: double
            minimum: 0
        - name: max_price
          in: query
          description: Optional maximum price filter applied to leaderboard results
          required: false
          schema:
            type: number
            format: double
            minimum: 0
        - name: curation_id
          in: query
          description: >-
            Only include drops with persisted membership in the curation
            identified by ApiWaveCuration.id (UUID string)
          required: false
          schema:
            type: string
            format: uuid
        - name: unvoted_by_me
          in: query
          description: >-
            When true, only returns drops the authenticated user has not voted
            on or currently has a 0 vote on
          required: false
          schema:
            type: boolean
            default: false
        - name: is_additional_action_promised
          in: query
          description: >-
            Optional filter for participatory drops by whether an additional
            action was promised
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropsLeaderboardPageV2"
  /v2/waves/mention-search:
    get:
      tags:
        - WavesV2
      summary: Search draft-wave-eligible profiles for user mentions
      description: >-
        Returns profiles whose handles start with the requested value and who
        are eligible for the selected draft wave visibility group. Omitting the
        visibility group searches the public-wave audience. Results are ranked
        by profile level and exclude the authenticated acting profile.
      operationId: searchDraftWaveMentions
      x-6529-router:
        enabled: true
        auth: required
        handler:
          import: "@/api/waves/wave-mention-search.handler"
          name: handleSearchDraftWaveMentions
      parameters:
        - name: handle
          in: query
          required: true
          schema:
            type: string
            minLength: 3
            maxLength: 15
            pattern: ^\w{3,15}$
        - name: visibility_group_id
          in: query
          required: false
          schema:
            type: string
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 20
            default: 5
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWaveMentionSearchResult"
        "400":
          description: Invalid search request
        "401":
          description: Authentication required
        "403":
          description: An acting profile is required
  /v2/waves/{waveId}/mention-search:
    get:
      tags:
        - WavesV2
      summary: Search wave-eligible profiles for user mentions
      description: >-
        Returns profiles whose handles start with the requested value and who
        are eligible to read the requested wave. Results are ranked by profile
        level and exclude the authenticated acting profile.
      operationId: searchWaveMentions
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/wave-mention-search.handler"
          name: handleSearchWaveMentions
      parameters:
        - name: waveId
          in: path
          required: true
          schema:
            type: string
        - name: handle
          in: query
          required: true
          schema:
            type: string
            minLength: 3
            maxLength: 15
            pattern: ^\w{3,15}$
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 20
            default: 5
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWaveMentionSearchResult"
        "400":
          description: Invalid search request
        "404":
          description: Wave not found or not visible to the caller
  /v2/waves/{waveId}/search:
    get:
      tags:
        - WavesV2
      summary: Search for V2 drops in a wave
      operationId: searchDropsInWaveV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleSearchDropsInWaveV2
      parameters:
        - name: waveId
          in: path
          required: true
          schema:
            type: string
        - name: term
          in: query
          required: false
          schema:
            type: string
            minLength: 3
            maxLength: 200
        - name: author_id
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: after
          in: query
          description: Inclusive lower created-at timestamp in milliseconds
          required: false
          schema:
            type: integer
            format: int64
            minimum: 0
        - name: before
          in: query
          description: Exclusive upper created-at timestamp in milliseconds
          required: false
          schema:
            type: integer
            format: int64
            minimum: 0
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            default: 1
        - name: size
          in: query
          required: false
          schema:
            type: number
            format: int64
            maximum: 100
            minimum: 1
            default: 20
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiDropV2PageWithoutCount"
        "400":
          description: >-
            Invalid search criteria: at least one of term, author_id, after, or
            before is required; term must contain 3 to 200 characters; and when
            both dates are provided, after must be less than before
        "404":
          description: Wave not found
  /v2/waves/{waveId}/search-authors:
    get:
      tags:
        - WavesV2
      summary: Search profiles that authored a drop in a wave
      operationId: searchWaveAuthorsV2
      x-6529-router:
        enabled: true
        auth: optional
        handler:
          import: "@/api/waves/waves-v2.handlers"
          name: handleSearchWaveAuthorsV2
      parameters:
        - name: waveId
          in: path
          required: true
          schema:
            type: string
        - name: handle
          in: query
          description: >-
            Case-insensitive handle prefix. Empty returns the first authors in
            the readable wave.
          required: false
          schema:
            type: string
            maxLength: 15
            pattern: ^\w{0,15}$
            default: ""
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 20
            default: 10
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ApiWaveSearchAuthor"
        "404":
          description: Wave not found or not visible to the caller
  /xtdh/stats:
    get:
      tags:
        - xTDH
      summary: Get global xTDH stats
      operationId: getGlobalXTdhStats
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhGlobalStats"
        "404":
          description: Not found
  /xtdh/stats/{identity}:
    get:
      tags:
        - xTDH
      summary: Get identities xTDH stats
      operationId: getIdentitiesXTdhStats
      parameters:
        - name: identity
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhStats"
        "404":
          description: Not found
  /xtdh/grants:
    get:
      tags:
        - xTDH
      summary: Get xTDH grants
      operationId: getXTdhGrants
      parameters:
        - name: grantor
          in: query
          required: false
          schema:
            type: string
        - name: target_contract
          in: query
          required: false
          schema:
            type: string
        - name: target_collection_name
          in: query
          required: false
          schema:
            type: string
        - name: target_chain
          in: query
          required: false
          schema:
            type: string
        - name: valid_from_gt
          in: query
          required: false
          schema:
            type: number
            format: int64
        - name: valid_from_lt
          in: query
          required: false
          schema:
            type: number
            format: int64
        - name: valid_to_gt
          in: query
          required: false
          schema:
            type: number
            format: int64
        - name: valid_to_lt
          in: query
          required: false
          schema:
            type: number
            format: int64
        - name: status
          in: query
          required: false
          description: One or more (comma separated) statuses you are interested in
          schema:
            type: string
        - name: sort_direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - created_at
              - valid_from
              - valid_to
              - rate
            default: created_at
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
            default: 100
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhGrantsPage"
        "400":
          description: Invalid request
    post:
      tags:
        - xTDH
      summary: Create xTDH grant
      operationId: grantXTdh
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiXTdhCreateGrant"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhGrant"
        "400":
          description: Invalid request
  /xtdh/grants/{id}:
    get:
      tags:
        - xTDH
      summary: Get xTDH grant
      operationId: getXTdhGrant
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhGrant"
        "404":
          description: Not Found
    post:
      tags:
        - xTDH
      summary: Update xTDH grant
      operationId: updateXTdhGrant
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ApiXTdhGrantUpdateRequest"
      responses:
        "201":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhGrant"
        "403":
          description: Invalid input
        "404":
          description: Not Found
  /xtdh/grants/{id}/tokens:
    get:
      tags:
        - xTDH
      summary: Get xTDH grant tokens
      operationId: getXTdhGrantTokens
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: sort_direction
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/ApiPageSortDirection"
        - name: sort
          in: query
          required: false
          schema:
            type: string
            enum:
              - token
            default: token
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            default: 1
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            format: int64
            minimum: 1
            maximum: 2000
            default: 100
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhGrantTokensPage"
        "400":
          description: Invalid request
  /xtdh/collections:
    get:
      tags:
        - xTDH
      summary: Get info about xTDH collections
      operationId: getInfoAboutXTdhCollections
      parameters:
        - name: identity
          in: query
          description: Filter by receiving identity
          required: false
          schema:
            type: string
        - name: collection_name
          in: query
          required: false
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 0
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: sort
          in: query
          description: xtdh when omitted
          required: false
          schema:
            type: string
            enum:
              - xtdh
              - xtdh_rate
        - name: order
          in: query
          description: desc when omitted
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhCollectionsPage"
  /xtdh/tokens:
    get:
      tags:
        - xTDH
      summary: Get info about xTDH tokens
      operationId: getInfoAboutXTdhTokens
      parameters:
        - name: identity
          in: query
          description: Filter by receiving identity
          required: false
          schema:
            type: string
        - name: contract
          in: query
          description: Filter by receiving contract
          required: false
          schema:
            type: string
        - name: token
          in: query
          description: Filter by token. Needs to be paired with contract to work
          required: false
          schema:
            type: number
            format: int64
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 0
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: sort
          in: query
          description: xtdh when omitted
          required: false
          schema:
            type: string
            enum:
              - xtdh
              - xtdh_rate
        - name: order
          in: query
          description: desc when omitted
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhTokensPage"
  /xtdh/tokens/{contract}/{token}/contributors:
    get:
      tags:
        - xTDH
      summary: Get info about xTDH contributors
      operationId: getInfoAboutXTdhContributors
      parameters:
        - name: contract
          in: path
          required: true
          schema:
            type: string
        - name: token
          in: path
          required: true
          schema:
            type: number
            format: int64
        - name: group_by
          in: query
          description: Group by grant or grantor (grant when omitted)
          required: false
          schema:
            type: string
            enum:
              - grant
              - grantor
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 0
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: sort
          in: query
          description: xtdh when omitted
          required: false
          schema:
            type: string
            enum:
              - xtdh
              - xtdh_rate
        - name: order
          in: query
          description: desc when omitted
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhContributionsPage"
  /xtdh/grantees:
    get:
      tags:
        - xTDH
      summary: Get info about xTDH grantees
      operationId: getInfoAboutXTdhGrantees
      parameters:
        - name: contract
          in: query
          required: false
          schema:
            type: string
        - name: page
          in: query
          required: false
          schema:
            type: number
            format: int64
            minimum: 0
        - name: page_size
          in: query
          description: Default is 20
          required: false
          schema:
            type: number
            format: int64
            minimum: 1
            maximum: 100
        - name: sort
          in: query
          description: xtdh when omitted
          required: false
          schema:
            type: string
            enum:
              - xtdh
              - xtdh_rate
        - name: order
          in: query
          description: desc when omitted
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ApiXTdhGranteesPage"
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
  schemas:
    AirdropAddressResponse:
      type: object
      required:
        - tdh_wallet
        - airdrop_address
      properties:
        tdh_wallet:
          type: object
          required:
            - address
            - ens
          properties:
            address:
              type: string
            ens:
              type: string
        airdrop_address:
          type: object
          required:
            - address
            - ens
          properties:
            address:
              type: string
            ens:
              type: string
    AllowlistNormalizedEntry:
      type: object
      required:
        - phase
        - spots
        - spots_airdrop
        - spots_allowlist
      properties:
        phase:
          type: string
        spots:
          type: integer
          format: int64
        spots_airdrop:
          type: integer
          format: int64
        spots_allowlist:
          type: integer
          format: int64
    ApiAddReactionToDropRequest:
      type: object
      required:
        - reaction
      properties:
        reaction:
          type: string
    ApiAggregatedActivity:
      type: object
      required:
        - consolidation_key
        - created_at
        - updated_at
        - primary_purchases_value
        - primary_purchases_count
        - secondary_purchases_value
        - secondary_purchases_count
        - burns
        - sales_value
        - sales_count
        - airdrops
        - transfers_in
        - transfers_out
        - primary_purchases_value_memes
        - primary_purchases_count_memes
        - secondary_purchases_value_memes
        - secondary_purchases_count_memes
        - burns_memes
        - sales_value_memes
        - sales_count_memes
        - airdrops_memes
        - transfers_in_memes
        - transfers_out_memes
        - primary_purchases_value_memelab
        - primary_purchases_count_memelab
        - secondary_purchases_value_memelab
        - secondary_purchases_count_memelab
        - burns_memelab
        - sales_value_memelab
        - sales_count_memelab
        - airdrops_memelab
        - transfers_in_memelab
        - transfers_out_memelab
        - primary_purchases_value_gradients
        - primary_purchases_count_gradients
        - secondary_purchases_value_gradients
        - secondary_purchases_count_gradients
        - burns_gradients
        - sales_value_gradients
        - sales_count_gradients
        - airdrops_gradients
        - transfers_in_gradients
        - transfers_out_gradients
        - primary_purchases_value_nextgen
        - primary_purchases_count_nextgen
        - secondary_purchases_value_nextgen
        - secondary_purchases_count_nextgen
        - burns_nextgen
        - sales_value_nextgen
        - sales_count_nextgen
        - airdrops_nextgen
        - transfers_in_nextgen
        - transfers_out_nextgen
      properties:
        consolidation_key:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        primary_purchases_value:
          type: integer
          format: int64
        primary_purchases_count:
          type: integer
          format: int64
        secondary_purchases_value:
          type: integer
          format: int64
        secondary_purchases_count:
          type: integer
          format: int64
        burns:
          type: integer
          format: int64
        sales_value:
          type: integer
          format: int64
        sales_count:
          type: integer
          format: int64
        airdrops:
          type: integer
          format: int64
        transfers_in:
          type: integer
          format: int64
        transfers_out:
          type: integer
          format: int64
        primary_purchases_value_memes:
          type: integer
          format: int64
        primary_purchases_count_memes:
          type: integer
          format: int64
        secondary_purchases_value_memes:
          type: integer
          format: int64
        secondary_purchases_count_memes:
          type: integer
          format: int64
        burns_memes:
          type: integer
          format: int64
        sales_value_memes:
          type: integer
          format: int64
        sales_count_memes:
          type: integer
          format: int64
        airdrops_memes:
          type: integer
          format: int64
        transfers_in_memes:
          type: integer
          format: int64
        transfers_out_memes:
          type: integer
          format: int64
        primary_purchases_value_memelab:
          type: integer
          format: int64
        primary_purchases_count_memelab:
          type: integer
          format: int64
        secondary_purchases_value_memelab:
          type: integer
          format: int64
        secondary_purchases_count_memelab:
          type: integer
          format: int64
        burns_memelab:
          type: integer
          format: int64
        sales_value_memelab:
          type: integer
          format: int64
        sales_count_memelab:
          type: integer
          format: int64
        airdrops_memelab:
          type: integer
          format: int64
        transfers_in_memelab:
          type: integer
          format: int64
        transfers_out_memelab:
          type: integer
          format: int64
        primary_purchases_value_gradients:
          type: integer
          format: int64
        primary_purchases_count_gradients:
          type: integer
          format: int64
        secondary_purchases_value_gradients:
          type: integer
          format: int64
        secondary_purchases_count_gradients:
          type: integer
          format: int64
        burns_gradients:
          type: integer
          format: int64
        sales_value_gradients:
          type: integer
          format: int64
        sales_count_gradients:
          type: integer
          format: int64
        airdrops_gradients:
          type: integer
          format: int64
        transfers_in_gradients:
          type: integer
          format: int64
        transfers_out_gradients:
          type: integer
          format: int64
        primary_purchases_value_nextgen:
          type: integer
          format: int64
        primary_purchases_count_nextgen:
          type: integer
          format: int64
        secondary_purchases_value_nextgen:
          type: integer
          format: int64
        secondary_purchases_count_nextgen:
          type: integer
          format: int64
        burns_nextgen:
          type: integer
          format: int64
        sales_value_nextgen:
          type: integer
          format: int64
        sales_count_nextgen:
          type: integer
          format: int64
        airdrops_nextgen:
          type: integer
          format: int64
        transfers_in_nextgen:
          type: integer
          format: int64
        transfers_out_nextgen:
          type: integer
          format: int64
    ApiAggregatedActivityMemes:
      type: object
      required:
        - consolidation_key
        - created_at
        - updated_at
        - primary_purchases_value
        - primary_purchases_count
        - secondary_purchases_value
        - secondary_purchases_count
        - burns
        - sales_value
        - sales_count
        - airdrops
        - transfers_in
        - transfers_out
        - season
      properties:
        consolidation_key:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        primary_purchases_value:
          type: integer
          format: int64
        primary_purchases_count:
          type: integer
          format: int64
        secondary_purchases_value:
          type: integer
          format: int64
        secondary_purchases_count:
          type: integer
          format: int64
        burns:
          type: integer
          format: int64
        sales_value:
          type: integer
          format: int64
        sales_count:
          type: integer
          format: int64
        airdrops:
          type: integer
          format: int64
        transfers_in:
          type: integer
          format: int64
        transfers_out:
          type: integer
          format: int64
        season:
          type: integer
          format: int64
    ApiAggregatedActivityPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiAggregatedActivity"
    ApiArchiveProfileCmsPackageRequest:
      type: object
      properties:
        expected_package_hash:
          type: string
    ApiArtistNameItem:
      type: object
      required:
        - name
        - cards
      properties:
        name:
          type: string
        cards:
          type: array
          items:
            type: integer
            format: int64
    ApiAttachment:
      type: object
      required:
        - attachment_id
        - file_name
        - mime_type
        - kind
        - status
      properties:
        attachment_id:
          type: string
        file_name:
          type: string
        mime_type:
          $ref: "#/components/schemas/ApiAttachmentUploadMimeType"
        kind:
          $ref: "#/components/schemas/ApiAttachmentKind"
        status:
          $ref: "#/components/schemas/ApiAttachmentStatus"
        url:
          type: string
          nullable: true
        error_reason:
          type: string
          nullable: true
        safety:
          $ref: "#/components/schemas/ApiAttachmentSafety"
    ApiAttachmentKind:
      type: string
      enum:
        - pdf
        - csv
    ApiAttachmentSafety:
      type: object
      required:
        - status
        - scanner
        - validation
        - size_bytes
        - sha256
      properties:
        status:
          $ref: "#/components/schemas/ApiAttachmentSafetyStatus"
        scanner:
          nullable: true
          allOf:
            - $ref: "#/components/schemas/ApiAttachmentSafetyScanner"
        validation:
          nullable: true
          allOf:
            - $ref: "#/components/schemas/ApiAttachmentSafetyValidation"
        size_bytes:
          type: integer
          format: int64
          nullable: true
        sha256:
          type: string
          nullable: true
    ApiAttachmentSafetyScanner:
      type: string
      enum:
        - guardduty
    ApiAttachmentSafetyStatus:
      type: string
      enum:
        - pending
        - scanned_validated
        - blocked
        - failed
    ApiAttachmentSafetyValidation:
      type: string
      enum:
        - public_ipfs_validated
    ApiAttachmentStatus:
      type: string
      enum:
        - uploading
        - verifying
        - processing
        - ready
        - bad
    ApiAttachmentUploadMimeType:
      type: string
      enum:
        - application/pdf
        - text/csv
    ApiAuthSettings:
      type: object
      required:
        - structured_signatures_required
        - session_v2_migration_deadline
      properties:
        structured_signatures_required:
          type: boolean
          description: >-
            True when backend strict structured wallet signature enforcement is
            enabled. Frontend clients should treat legacy auth as no longer
            acceptable when this is true.
        session_v2_migration_deadline:
          type: string
          nullable: true
          description: >-
            Optional global deadline for frontend v1-auth to session-v2
            migration countdown and cutoff behavior, formatted as an ISO
            datetime with timezone. Null means no migration prompt should be
            shown unless strict structured signatures are required.
    ApiAvailableRatingCredit:
      type: object
      required:
        - credit
      properties:
        cic_credit:
          type: number
          format: int64
        rep_credit:
          type: number
          format: int64
        wave_rep_credit:
          type: number
          format: int64
    ApiBlockedProfile:
      type: object
      required:
        - profile_id
        - blocked_at
      properties:
        profile_id:
          type: string
        handle:
          type: string
          nullable: true
        pfp:
          type: string
          nullable: true
        blocked_at:
          type: integer
          format: int64
    ApiBlockItem:
      type: object
      required:
        - block_number
        - created_at
        - timestamp
      properties:
        block_number:
          type: integer
          format: int64
        created_at:
          type: string
          format: date-time
        timestamp:
          type: string
          format: date-time
    ApiBlocksPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiBlockItem"
    ApiBulkRateRequest:
      type: object
      required:
        - matter
        - category
        - amount_to_add
        - target_wallet_addresses
      properties:
        matter:
          $ref: "#/components/schemas/ApiRateMatter"
        category:
          type: string
          maxLength: 100
          nullable: true
          pattern: ^[a-zA-Z0-9?!,."() ]$
          description: >-
            Category of the rating must be set when matter is REP and null if
            matter is CIC
        amount_to_add:
          type: number
          format: int64
          example: 1
        target_wallet_addresses:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 100
            pattern: 0x[a-fA-F0-9]{40}
            description: Wallet address of the target profile
    ApiBulkRateResponse:
      type: object
      required:
        - skipped
      properties:
        skipped:
          type: array
          items:
            $ref: "#/components/schemas/ApiBulkRateSkippedIdentity"
    ApiBulkRateSkippedIdentity:
      type: object
      required:
        - identity
        - reason
      properties:
        identity:
          type: string
        reason:
          type: string
    ApiBulkRepRequest:
      type: object
      required:
        - targets
      properties:
        targets:
          type: array
          maxLength: 200
          items:
            $ref: "#/components/schemas/ApiBulkRepTarget"
    ApiBulkRepTarget:
      type: object
      required:
        - address
        - category
        - amount
      properties:
        address:
          type: string
          pattern: 0x[a-fA-F0-9]{40}
        category:
          type: string
          maxLength: 100
          pattern: ^[a-zA-Z0-9?!,."() ]{1,100}$
        amount:
          type: integer
          format: int64
    ApiChangeGroupVisibility:
      type: object
      required:
        - visible
        - old_version_id
      properties:
        visible:
          type: boolean
        old_version_id:
          type: string
          minLength: 1
          nullable: true
    ApiChangeProfileCicRating:
      type: object
      required:
        - amount
        - category
      properties:
        amount:
          type: number
          format: int64
    ApiChangeProfileRepRating:
      type: object
      required:
        - amount
        - category
      properties:
        amount:
          type: number
          format: int64
        category:
          type: string
          maxLength: 100
          minLength: 1
          pattern: ^[a-zA-Z0-9?!,."() ]{1,100}$
    ApiChangeWaveRepRating:
      type: object
      required:
        - amount
        - category
      properties:
        amount:
          type: number
          format: int64
        category:
          type: string
          maxLength: 100
          minLength: 1
          pattern: ^[a-zA-Z0-9?!,."() ]{1,100}$
    ApiCicContributor:
      type: object
      required:
        - contribution
        - profile
      properties:
        contribution:
          type: number
          format: int64
        profile:
          $ref: "#/components/schemas/ApiProfileMin"
    ApiCicContributorsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCicContributor"
    ApiCicOverview:
      type: object
      required:
        - total_cic
        - authenticated_user_contribution
        - contributor_count
        - contributors
      properties:
        total_cic:
          type: number
          format: int64
        authenticated_user_contribution:
          type: number
          format: int64
          nullable: true
        contributor_count:
          type: number
          format: int64
        contributors:
          $ref: "#/components/schemas/ApiCicContributorsPage"
    ApiCicStatement:
      type: object
      required:
        - id
        - profile_id
        - statement_group
        - statement_type
        - statement_comment
        - statement_value
        - crated_at
      properties:
        id:
          type: string
        profile_id:
          type: string
        statement_group:
          $ref: "#/components/schemas/ApiCicStatementGroup"
        statement_type:
          type: string
          description: >-
            Statement kind. NFT account links include NINFA for Ninfa and LINK
            for a custom-labelled art link. Clients must tolerate unknown
            values.
        statement_comment:
          type: string
          nullable: true
          description: >-
            Display label for custom NFT account LINK statements; null
            otherwise.
        statement_value:
          type: string
        crated_at:
          type: string
          format: date-time
    ApiCicStatementGroup:
      type: string
      enum:
        - GENERAL
        - CONTACT
        - SOCIAL_MEDIA_ACCOUNT
        - NFT_ACCOUNTS
        - SOCIAL_MEDIA_VERIFICATION_POST
    ApiCmsAgentPatch:
      type: object
      required:
        - schema
        - patch_id
        - target
        - operations
        - provenance
      properties:
        schema:
          type: string
          enum:
            - 6529.cms.agent_patch.v1
        patch_id:
          type: string
          minLength: 1
        target:
          $ref: "#/components/schemas/ApiCmsAgentPatchTarget"
        operations:
          type: array
          minItems: 1
          maxItems: 200
          items:
            $ref: "#/components/schemas/ApiCmsAgentPatchOperation"
        provenance:
          $ref: "#/components/schemas/ApiCmsAgentPatchProvenance"
    ApiCmsAgentPatchOperation:
      type: object
      required:
        - op
        - path
      properties:
        op:
          type: string
          enum:
            - add_page
            - remove_page
            - update_page_metadata
            - add_block
            - update_block
            - remove_block
            - reorder_blocks
            - update_navigation
            - update_theme
            - update_share_metadata
            - attach_source_packet
            - set_taxonomy_terms
        path:
          type: string
          minLength: 1
        value:
          description: Operation-specific JSON value.
          nullable: true
        reason:
          type: string
        source_packet_ids:
          type: array
          items:
            type: string
    ApiCmsAgentPatchProvenance:
      type: object
      required:
        - created_at
        - author_type
      properties:
        created_at:
          type: string
          format: date-time
        author_type:
          type: string
          enum:
            - user_agent
            - local_tool
            - human
        agent_name:
          type: string
        agent_version:
          type: string
        notes:
          type: string
    ApiCmsAgentPatchTarget:
      type: object
      required:
        - draft_id
        - base_version
        - base_package_hash
      properties:
        draft_id:
          type: string
        base_version:
          type: integer
          format: int64
          minimum: 0
        base_package_hash:
          type: string
          pattern: ^sha256:[a-f0-9]{64}$
    ApiCmsCreateSiteRequest:
      type: object
      required:
        - slug
        - title
      properties:
        slug:
          type: string
          pattern: ^[a-z0-9][a-z0-9-]{0,62}$
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          nullable: true
          maxLength: 5000
    ApiCmsPublishedPackage:
      type: object
      required:
        - package_hash
        - payload_hash
        - schema
        - site_id
        - owner_profile_id
        - title
        - static_path
        - package_json
        - storage
        - signature
        - published_at
        - published_by_wallet
      properties:
        package_hash:
          type: string
          pattern: ^sha256:[a-f0-9]{64}$
          description: >-
            Server verifies this equals sha256(canonical package_json with
            package_hash set to null).
        payload_hash:
          type: string
          pattern: ^sha256:[a-f0-9]{64}$
          description: Server verifies this equals sha256(canonical package_json.payload).
        schema:
          type: string
        site_id:
          type: string
        owner_profile_id:
          type: string
        title:
          type: string
        description:
          type: string
          nullable: true
        static_path:
          type: string
        canonical_url:
          type: string
          nullable: true
        package_json:
          type: object
          additionalProperties: true
          description: >-
            Full portable CMS package. package_hash, payload_hash, schema,
            storage, and signature must match the sibling request fields.
        storage:
          type: array
          items:
            $ref: "#/components/schemas/ApiCmsStorageLocation"
        signature:
          $ref: "#/components/schemas/ApiCmsSignatureEnvelope"
        published_at:
          type: integer
          format: int64
          description: Server-derived publish timestamp in milliseconds since epoch.
        published_by_wallet:
          type: string
          description: Server-derived authenticated wallet that published the package.
    ApiCmsPublishedSite:
      type: object
      required:
        - site
        - published_package
      properties:
        site:
          $ref: "#/components/schemas/ApiCmsSite"
        published_package:
          $ref: "#/components/schemas/ApiCmsPublishedPackage"
    ApiCmsPublishPackageRequest:
      type: object
      required:
        - package_hash
        - payload_hash
        - schema
        - title
        - static_path
        - package_json
        - storage
        - signature
      properties:
        package_hash:
          type: string
          pattern: ^sha256:[a-f0-9]{64}$
        payload_hash:
          type: string
          pattern: ^sha256:[a-f0-9]{64}$
        schema:
          type: string
          maxLength: 100
        title:
          type: string
          minLength: 1
          maxLength: 255
        description:
          type: string
          nullable: true
          maxLength: 5000
        static_path:
          type: string
          maxLength: 500
        canonical_url:
          type: string
          nullable: true
          maxLength: 1000
        package_json:
          type: object
          additionalProperties: true
        storage:
          type: array
          minItems: 1
          items:
            $ref: "#/components/schemas/ApiCmsStorageLocation"
        signature:
          $ref: "#/components/schemas/ApiCmsSignatureEnvelope"
        set_primary:
          type: boolean
          description: >-
            Defaults to true. Only the authenticated owner of the site can
            mutate the public primary package pointer.
    ApiCmsSignatureEnvelope:
      type: object
      description: >-
        Opaque package signature envelope for this vertical slice. The server
        stores it and verifies hash consistency with package_json; wallet
        signature verification is a future publish-adapter responsibility.
      required:
        - signature_type
        - signing_wallet
        - signed_at
        - signature
      properties:
        signature_type:
          type: string
        signing_wallet:
          type: string
        signed_at:
          type: string
          description: Client-supplied signing timestamp stored as envelope metadata.
        signature:
          type: string
      additionalProperties: true
    ApiCmsSite:
      type: object
      required:
        - id
        - owner_profile_id
        - slug
        - title
        - created_at
        - updated_at
      properties:
        id:
          type: string
        owner_profile_id:
          type: string
        slug:
          type: string
        title:
          type: string
        description:
          type: string
          nullable: true
        primary_package_hash:
          type: string
          nullable: true
        primary_static_path:
          type: string
          nullable: true
        created_at:
          type: integer
          format: int64
        updated_at:
          type: integer
          format: int64
    ApiCmsStorageLocation:
      type: object
      required:
        - provider
        - uri
        - pinned
      properties:
        provider:
          type: string
        uri:
          type: string
        pinned:
          type: boolean
      additionalProperties: true
    ApiCollectedStats:
      type: object
      required:
        - boost
        - nextgen_balance
        - gradients_balance
        - memes_balance
        - unique_memes
        - seasons
      properties:
        boost:
          type: number
          format: double
        nextgen_balance:
          type: integer
          format: int64
        gradients_balance:
          type: integer
          format: int64
        memes_balance:
          type: integer
          format: int64
        unique_memes:
          type: integer
          format: int64
        seasons:
          type: array
          items:
            $ref: "#/components/schemas/ApiCollectedStatsSeason"
    ApiCollectedStatsSeason:
      type: object
      required:
        - season
        - total_cards_in_season
        - sets_held
        - partial_set_unique_cards_held
        - total_cards_held
      properties:
        season:
          type: string
        total_cards_in_season:
          type: integer
          format: int64
        sets_held:
          type: integer
          format: int64
        partial_set_unique_cards_held:
          type: integer
          format: int64
        total_cards_held:
          type: integer
          format: int64
    ApiCommunityMemberMinimal:
      type: object
      required:
        - profile_id
        - handle
        - normalised_handle
        - primary_wallet
        - display
        - tdh
        - level
        - cic_rating
        - wallet
        - pfp
      properties:
        profile_id:
          type: string
          nullable: true
        handle:
          type: string
          nullable: true
        normalised_handle:
          type: string
          nullable: true
        primary_wallet:
          type: string
          nullable: true
        display:
          type: string
          nullable: true
        tdh:
          type: number
          format: int64
        level:
          type: number
          format: int64
        cic_rating:
          type: number
          format: int64
        wallet:
          type: string
        pfp:
          type: string
          nullable: true
    ApiCommunityMemberOverview:
      type: object
      required:
        - display
        - detail_view_key
        - level
        - tdh
        - tdh_rate
        - xtdh
        - xtdh_rate
        - xtdh_outgoing
        - xtdh_incoming
        - combined_tdh
        - combined_tdh_rate
        - rep
        - cic
        - pfp
        - last_activity
        - wallet
      properties:
        display:
          type: string
        detail_view_key:
          type: string
        level:
          type: number
          format: int64
        tdh:
          type: number
          format: int64
        tdh_rate:
          type: number
          format: double
        xtdh:
          type: number
          format: double
        xtdh_rate:
          type: number
          format: double
        xtdh_outgoing:
          type: number
          format: double
        xtdh_incoming:
          type: number
          format: double
        combined_tdh:
          type: number
          format: double
        combined_tdh_rate:
          type: number
          format: double
        rep:
          type: number
          format: int64
        cic:
          type: number
          format: int64
        pfp:
          type: string
          nullable: true
        last_activity:
          type: number
          format: int64
          nullable: true
        wallet:
          type: string
    ApiCommunityMembersPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCommunityMemberOverview"
    ApiCommunityMembersSortOption:
      type: string
      enum:
        - display
        - level
        - tdh
        - tdh_rate
        - rep
        - cic
        - xtdh
        - xtdh_rate
        - xtdh_outgoing
        - xtdh_incoming
        - combined_tdh
        - combined_tdh_rate
    ApiCommunityMetric:
      type: object
      required:
        - older
        - newer
      properties:
        older:
          $ref: "#/components/schemas/ApiCommunityMetricSample"
        newer:
          $ref: "#/components/schemas/ApiCommunityMetricSample"
    ApiCommunityMetrics:
      type: object
      required:
        - drops_created
        - distinct_droppers
        - main_stage_submissions
        - main_stage_distinct_voters
        - main_stage_votes
        - network_tdh
        - tdh_on_main_stage_submissions
        - consolidations_formed
        - xtdh_granted
        - active_identities
        - profile_count
      properties:
        drops_created:
          $ref: "#/components/schemas/ApiCommunityMetric"
        distinct_droppers:
          $ref: "#/components/schemas/ApiCommunityMetric"
        main_stage_submissions:
          $ref: "#/components/schemas/ApiCommunityMetric"
        main_stage_distinct_voters:
          $ref: "#/components/schemas/ApiCommunityMetric"
        main_stage_votes:
          $ref: "#/components/schemas/ApiCommunityMetric"
        network_tdh:
          $ref: "#/components/schemas/ApiCommunityMetric"
        tdh_on_main_stage_submissions:
          $ref: "#/components/schemas/ApiCommunityMetric"
        consolidations_formed:
          $ref: "#/components/schemas/ApiCommunityMetric"
        xtdh_granted:
          $ref: "#/components/schemas/ApiCommunityMetric"
        active_identities:
          $ref: "#/components/schemas/ApiCommunityMetric"
        profile_count:
          $ref: "#/components/schemas/ApiCommunityMetric"
    ApiCommunityMetricSample:
      type: object
      required:
        - period_start
        - period_end
        - event_count
        - value_count
      properties:
        period_start:
          type: number
        period_end:
          type: number
        event_count:
          type: number
        value_count:
          type: number
    ApiCommunityMetricsSeries:
      type: object
      required:
        - steps_start_times
        - drops_created
        - distinct_droppers
        - main_stage_submissions
        - main_stage_distinct_voters
        - main_stage_votes
        - network_tdh
        - tdh_on_main_stage_submissions
        - consolidations_formed
        - xtdh_granted
        - active_identities
        - profile_count
      properties:
        steps_start_times:
          type: array
          items:
            type: number
            format: int64
        drops_created:
          type: array
          items:
            type: number
            format: int64
        distinct_droppers:
          type: array
          items:
            type: number
            format: int64
        main_stage_submissions:
          type: array
          items:
            type: number
            format: int64
        main_stage_distinct_voters:
          type: array
          items:
            type: number
            format: int64
        main_stage_votes:
          type: array
          items:
            type: number
            format: int64
        network_tdh:
          type: array
          items:
            type: number
            format: int64
        tdh_on_main_stage_submissions:
          type: array
          items:
            type: number
            format: int64
        consolidations_formed:
          type: array
          items:
            type: number
            format: int64
        xtdh_granted:
          type: array
          items:
            type: number
            format: int64
        active_identities:
          type: array
          items:
            type: number
            format: int64
        profile_count:
          type: array
          items:
            type: number
            format: int64
    ApiCompetition:
      type: object
      additionalProperties: false
      required:
        - id
        - wave_id
        - type
        - title
        - description
        - lifecycle
        - computed_phase
        - config_version
        - participation
        - voting
        - decisions
        - winners
        - outcome_config
        - capabilities
        - permissions
        - created_at
        - updated_at
        - published_at
        - ended_at
        - cancelled_at
        - archived_at
      properties:
        id:
          type: string
          format: uuid
        wave_id:
          type: string
        type:
          $ref: "#/components/schemas/ApiCompetitionType"
        title:
          type: string
        description:
          type: string
          nullable: true
        lifecycle:
          $ref: "#/components/schemas/ApiCompetitionLifecycle"
        computed_phase:
          $ref: "#/components/schemas/ApiCompetitionComputedPhase"
        config_version:
          type: integer
          format: int64
          minimum: 1
        participation:
          $ref: "#/components/schemas/ApiCompetitionParticipationConfig"
        voting:
          $ref: "#/components/schemas/ApiCompetitionVotingConfig"
        decisions:
          $ref: "#/components/schemas/ApiCompetitionDecisionConfig"
        winners:
          $ref: "#/components/schemas/ApiCompetitionWinnerConfig"
        outcome_config:
          type: array
          items:
            type: object
            additionalProperties: true
        capabilities:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionCapability"
        permissions:
          $ref: "#/components/schemas/ApiCompetitionPermissions"
        created_at:
          type: integer
          format: int64
        updated_at:
          type: integer
          format: int64
        published_at:
          type: integer
          format: int64
          nullable: true
        ended_at:
          type: integer
          format: int64
          nullable: true
        cancelled_at:
          type: integer
          format: int64
          nullable: true
        archived_at:
          type: integer
          format: int64
          nullable: true
    ApiCompetitionCapability:
      type: string
      enum:
        - MAIN_STAGE
        - CURATION
        - QUORUM
        - ANNOUNCEMENTS
    ApiCompetitionComputedPhase:
      type: string
      enum:
        - DRAFT
        - UPCOMING
        - PARTICIPATION_OPEN
        - VOTING_OPEN
        - DECIDING
        - COMPLETED
        - CANCELLED
        - ARCHIVED
    ApiCompetitionConfigVersion:
      type: object
      additionalProperties: false
      required:
        - competition_id
        - version
        - config
        - created_at
      properties:
        competition_id:
          type: string
          format: uuid
        version:
          type: integer
          format: int64
          minimum: 1
        config:
          type: object
          additionalProperties: true
        created_at:
          type: integer
          format: int64
    ApiCompetitionConfigVersionPage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionConfigVersion"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionDecision:
      type: object
      additionalProperties: false
      required:
        - id
        - competition_id
        - scheduled_at
        - decided_at
        - status
        - winners
      properties:
        id:
          type: string
          format: uuid
        competition_id:
          type: string
          format: uuid
        scheduled_at:
          type: integer
          format: int64
        decided_at:
          type: integer
          format: int64
          nullable: true
        status:
          $ref: "#/components/schemas/ApiCompetitionDecisionStatus"
        winners:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionDecisionWinner"
    ApiCompetitionDecisionConfig:
      type: object
      additionalProperties: false
      required:
        - strategy
        - next_decision_time
        - winning_min_threshold
        - winning_max_threshold
        - winning_threshold_min_duration_ms
        - max_winners
        - time_lock_ms
      properties:
        strategy:
          type: object
          additionalProperties: true
          nullable: true
        next_decision_time:
          type: integer
          format: int64
          nullable: true
        winning_min_threshold:
          type: integer
          format: int64
          nullable: true
        winning_max_threshold:
          type: integer
          format: int64
          nullable: true
        winning_threshold_min_duration_ms:
          type: integer
          format: int64
        max_winners:
          type: integer
          format: int64
          nullable: true
        time_lock_ms:
          type: integer
          format: int64
          nullable: true
    ApiCompetitionDecisionPage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionDecision"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionDecisionStatus:
      type: string
      enum:
        - PENDING
        - COMPLETED
        - CANCELLED
    ApiCompetitionDecisionWinner:
      type: object
      additionalProperties: false
      required:
        - entry_id
        - rank
        - final_rating
      properties:
        entry_id:
          type: string
          format: uuid
        rank:
          type: integer
          format: int64
          minimum: 1
        final_rating:
          type: integer
          format: int64
    ApiCompetitionDistributionItem:
      type: object
      additionalProperties: false
      required:
        - id
        - outcome_id
        - position
        - amount
        - description
      properties:
        id:
          type: string
          format: uuid
        outcome_id:
          type: string
          format: uuid
        position:
          type: integer
          format: int64
          minimum: 1
        amount:
          type: number
          format: double
          nullable: true
        description:
          type: string
          nullable: true
    ApiCompetitionDistributionItemPage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionDistributionItem"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionEntry:
      type: object
      additionalProperties: false
      required:
        - id
        - wave_id
        - competition_id
        - drop_id
        - submitter
        - status
        - config_version
        - submitted_at
        - rank
        - won_at
        - decision_id
      properties:
        id:
          type: string
          format: uuid
        wave_id:
          type: string
        competition_id:
          type: string
          format: uuid
        drop_id:
          type: string
        submitter:
          $ref: "#/components/schemas/ApiProfileMin"
        status:
          $ref: "#/components/schemas/ApiCompetitionEntryStatus"
        config_version:
          type: integer
          format: int64
          minimum: 1
        submitted_at:
          type: integer
          format: int64
        rank:
          type: integer
          format: int64
          nullable: true
        won_at:
          type: integer
          format: int64
          nullable: true
        decision_id:
          type: string
          format: uuid
          nullable: true
    ApiCompetitionEntryPage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionEntry"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionEntryStatus:
      type: string
      enum:
        - ACTIVE
        - WITHDRAWN
        - DISQUALIFIED
        - WINNER
    ApiCompetitionEntryVote:
      type: object
      additionalProperties: false
      required:
        - id
        - entry_id
        - voter_profile_id
        - value
        - credit_spent
        - created_at
        - updated_at
      properties:
        id:
          type: string
          format: uuid
        entry_id:
          type: string
          format: uuid
        voter_profile_id:
          type: string
        value:
          type: integer
          format: int64
        credit_spent:
          type: integer
          format: int64
        created_at:
          type: integer
          format: int64
        updated_at:
          type: integer
          format: int64
    ApiCompetitionEntryVotePage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionEntryVote"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionError:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: string
    ApiCompetitionLeaderboardEntry:
      type: object
      additionalProperties: false
      required:
        - competition_id
        - entry_id
        - drop_id
        - rating
        - real_time_rating
        - rank
        - submitted_at
      properties:
        competition_id:
          type: string
          format: uuid
        entry_id:
          type: string
          format: uuid
        drop_id:
          type: string
        rating:
          type: integer
          format: int64
        real_time_rating:
          type: integer
          format: int64
        rank:
          type: integer
          format: int64
          nullable: true
        submitted_at:
          type: integer
          format: int64
    ApiCompetitionLeaderboardPage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionLeaderboardEntry"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionLifecycle:
      type: string
      enum:
        - DRAFT
        - PUBLISHED
        - ENDED
        - CANCELLED
        - ARCHIVED
    ApiCompetitionOutcome:
      type: object
      additionalProperties: false
      required:
        - id
        - competition_id
        - decision_id
        - position
        - legacy_index
        - type
        - subtype
        - description
        - credit
        - rep_category
        - amount
      properties:
        id:
          type: string
          format: uuid
        competition_id:
          type: string
          format: uuid
        decision_id:
          type: string
          format: uuid
          nullable: true
        position:
          type: integer
          format: int64
          minimum: 1
        legacy_index:
          type: integer
          format: int64
          minimum: 1
          nullable: true
        type:
          type: string
        subtype:
          type: string
          nullable: true
        description:
          type: string
        credit:
          type: string
          nullable: true
        rep_category:
          type: string
          nullable: true
        amount:
          type: number
          format: double
          nullable: true
    ApiCompetitionOutcomePage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionOutcome"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionPage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetition"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionParticipationConfig:
      type: object
      additionalProperties: false
      required:
        - group_id
        - signature_required
        - max_entries_per_participant
        - required_metadata
        - required_media
        - submission_type
        - identity_submission_strategy
        - identity_submission_duplicates
        - starts_at
        - ends_at
        - terms
      properties:
        group_id:
          type: string
          nullable: true
        signature_required:
          type: boolean
        max_entries_per_participant:
          type: integer
          format: int64
          nullable: true
        required_metadata:
          type: array
          items:
            type: object
            additionalProperties: true
        required_media:
          type: array
          items:
            type: string
            enum:
              - IMAGE
              - VIDEO
              - AUDIO
        submission_type:
          type: string
          nullable: true
        identity_submission_strategy:
          type: string
          nullable: true
        identity_submission_duplicates:
          type: string
          nullable: true
        starts_at:
          type: integer
          format: int64
          nullable: true
        ends_at:
          type: integer
          format: int64
          nullable: true
        terms:
          type: string
          nullable: true
    ApiCompetitionPause:
      type: object
      additionalProperties: false
      required:
        - id
        - competition_id
        - start_time
        - end_time
        - reason
      properties:
        id:
          type: string
          format: uuid
        competition_id:
          type: string
          format: uuid
        start_time:
          type: integer
          format: int64
        end_time:
          type: integer
          format: int64
          nullable: true
        reason:
          type: string
          nullable: true
    ApiCompetitionPausePage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionPause"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionPermissions:
      type: object
      additionalProperties: false
      required:
        - view
        - submit
        - vote
        - administer
      properties:
        view:
          type: boolean
        submit:
          type: boolean
        vote:
          type: boolean
        administer:
          type: boolean
    ApiCompetitionSortDirection:
      type: string
      enum:
        - ASC
        - DESC
    ApiCompetitionType:
      type: string
      enum:
        - RANK
        - APPROVE
    ApiCompetitionVoter:
      type: object
      additionalProperties: false
      required:
        - profile_id
        - votes
        - credit_spent
      properties:
        profile_id:
          type: string
        votes:
          type: integer
          format: int64
        credit_spent:
          type: integer
          format: int64
    ApiCompetitionVoterPage:
      type: object
      additionalProperties: false
      required:
        - data
        - next_cursor
        - has_more
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompetitionVoter"
        next_cursor:
          type: string
          nullable: true
        has_more:
          type: boolean
    ApiCompetitionVotingConfig:
      type: object
      additionalProperties: false
      required:
        - group_id
        - credit_type
        - credit_scope
        - credit_category
        - credit_creditor
        - credit_nfts
        - signature_required
        - starts_at
        - ends_at
        - max_votes_per_identity_to_entry
        - forbid_negative_votes
      properties:
        group_id:
          type: string
          nullable: true
        credit_type:
          type: string
        credit_scope:
          type: string
        credit_category:
          type: string
          nullable: true
        credit_creditor:
          type: string
          nullable: true
        credit_nfts:
          type: array
          items:
            type: object
            additionalProperties: true
        signature_required:
          type: boolean
        starts_at:
          type: integer
          format: int64
          nullable: true
        ends_at:
          type: integer
          format: int64
          nullable: true
        max_votes_per_identity_to_entry:
          type: integer
          format: int64
          nullable: true
        forbid_negative_votes:
          type: boolean
    ApiCompetitionWinnerConfig:
      type: object
      additionalProperties: false
      required:
        - max_winners
        - winning_min_threshold
        - winning_max_threshold
        - winning_threshold_min_duration_ms
      properties:
        max_winners:
          type: integer
          format: int64
          nullable: true
        winning_min_threshold:
          type: integer
          format: int64
          nullable: true
        winning_max_threshold:
          type: integer
          format: int64
          nullable: true
        winning_threshold_min_duration_ms:
          type: integer
          format: int64
    ApiCompleteAttachmentMultipartUploadRequest:
      type: object
      required:
        - attachment_id
        - upload_id
        - key
        - parts
      allOf:
        - $ref: "#/components/schemas/ApiCompleteMultipartUploadRequest"
      properties:
        attachment_id:
          type: string
    ApiCompleteMultipartUploadRequest:
      required:
        - upload_id
        - key
        - parts
      properties:
        upload_id:
          type: string
        key:
          type: string
        parts:
          type: array
          items:
            $ref: "#/components/schemas/ApiCompleteMultipartUploadRequestPart"
    ApiCompleteMultipartUploadRequestPart:
      required:
        - etag
        - part_no
      properties:
        etag:
          type: string
        part_no:
          type: integer
          format: int64
    ApiCompleteMultipartUploadResponse:
      required:
        - media_url
      properties:
        media_url:
          type: string
        media_upload_id:
          type: string
          nullable: true
        media_status:
          $ref: "#/components/schemas/ApiDropMediaStatus"
        media_error:
          type: string
          nullable: true
    ApiConsolidatedTdh:
      type: object
      properties:
        block:
          type: integer
          format: int64
        date:
          type: string
          format: date-time
        consolidation_key:
          type: string
        consolidation_display:
          type: string
        wallets:
          type: array
          items:
            type: string
        balance:
          type: integer
          format: int64
        unique_memes:
          type: integer
          format: int64
        memes_cards_sets:
          type: integer
          format: int64
        tdh:
          type: integer
          format: int64
        boost:
          type: number
          format: double
        boosted_tdh:
          type: integer
          format: int64
        boosted_tdh_rate:
          type: number
          format: double
        tdh__raw:
          type: integer
          format: int64
        tdh_rank:
          type: integer
          format: int64
        tdh_rank_memes:
          type: integer
          format: int64
        tdh_rank_gradients:
          type: integer
          format: int64
        tdh_rank_nextgen:
          type: integer
          format: int64
        genesis:
          type: integer
          format: int64
        nakamoto:
          type: integer
          format: int64
        boosted_memes_tdh:
          type: integer
          format: int64
        memes_tdh:
          type: integer
          format: int64
        memes_tdh__raw:
          type: integer
          format: int64
        memes_balance:
          type: integer
          format: int64
        memes:
          type: array
          items:
            $ref: "#/components/schemas/ApiTokenTdh"
        memes_ranks:
          type: array
          items:
            $ref: "#/components/schemas/ApiTokenTdhRank"
        gradients_balance:
          type: integer
          format: int64
        boosted_gradients_tdh:
          type: integer
          format: int64
        gradients_tdh:
          type: integer
          format: int64
        gradients_tdh__raw:
          type: integer
          format: int64
        gradients:
          type: array
          items:
            $ref: "#/components/schemas/ApiTokenTdh"
        gradients_ranks:
          type: array
          items:
            $ref: "#/components/schemas/ApiTokenTdhRank"
        nextgen_balance:
          type: integer
          format: int64
        boosted_nextgen_tdh:
          type: integer
          format: int64
        nextgen_tdh:
          type: integer
          format: int64
        nextgen_tdh__raw:
          type: integer
          format: int64
        nextgen:
          type: array
          items:
            $ref: "#/components/schemas/ApiTokenTdh"
        nextgen_ranks:
          type: array
          items:
            $ref: "#/components/schemas/ApiTokenTdhRank"
        boost_breakdown:
          type: object
    ApiConsolidatedTdhMetrics:
      type: object
      properties:
        consolidation_key:
          type: string
        handle:
          type: string
          nullable: true
        pfp_url:
          type: string
          nullable: true
        rep_score:
          type: number
          format: double
          nullable: true
        cic_score:
          type: number
          format: double
          nullable: true
        primary_wallet:
          type: string
          nullable: true
        consolidation_display:
          type: string
          nullable: true
        balance:
          type: integer
          format: int64
        unique_memes:
          type: integer
          format: int64
        unique_memes_total:
          type: integer
          format: int64
        memes_cards_sets:
          type: integer
          format: int64
        level:
          type: integer
          format: int64
        total_tdh:
          type: integer
          format: int64
        tdh:
          type: integer
          format: int64
          description: Selected TDH value for the requested tdh_view.
        tdh_view:
          $ref: "#/components/schemas/ApiConsolidatedTdhView"
        boosted_tdh:
          type: integer
          format: int64
        unboosted_tdh:
          type: integer
          format: int64
        day_change:
          type: integer
          format: int64
          description: Daily TDH change for the requested tdh_view.
    ApiConsolidatedTdhMetricsCollector:
      type: string
      enum:
        - All
        - Memes
        - Meme SZN Set
        - Genesis Set
        - Gradient
        - MemeLab
        - NextGen
    ApiConsolidatedTdhMetricsContent:
      type: string
      enum:
        - Memes
        - Gradient
        - MemeLab
        - NextGen
    ApiConsolidatedTdhMetricsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiConsolidatedTdhMetrics"
    ApiConsolidatedTdhMetricsSort:
      type: string
      enum:
        - level
        - balance
        - unique_memes
        - memes_cards_sets
        - tdh
        - boosted_tdh
        - day_change
    ApiConsolidatedTdhView:
      type: string
      enum:
        - boosted
        - unboosted
    ApiContentModerationAuditEntry:
      type: object
      required:
        - id
        - created_at
        - actor_profile_id
        - actor_handle
        - actor_pfp
        - action
        - target_drop_id
        - target_profile_id
        - previous_state
        - new_state
        - reason
        - metadata
      properties:
        id:
          type: string
        created_at:
          type: integer
          format: int64
        actor_profile_id:
          type: string
          nullable: true
        actor_handle:
          type: string
          nullable: true
        actor_pfp:
          type: string
          nullable: true
        action:
          type: string
        target_drop_id:
          type: string
          nullable: true
        target_profile_id:
          type: string
          nullable: true
        previous_state:
          type: string
          nullable: true
        new_state:
          type: string
          nullable: true
        reason:
          type: string
          nullable: true
        metadata:
          type: object
          nullable: true
          additionalProperties: true
    ApiContentModerationBlockActivityItem:
      type: object
      required:
        - id
        - action
        - blocker_profile_id
        - blocker_handle
        - blocker_pfp
        - blocked_profile_id
        - blocked_handle
        - blocked_pfp
        - created_at
        - cursor
      properties:
        id:
          type: string
        action:
          type: string
          enum:
            - PROFILE_BLOCKED
            - PROFILE_UNBLOCKED
        blocker_profile_id:
          type: string
        blocker_handle:
          type: string
          nullable: true
        blocker_pfp:
          type: string
          nullable: true
        blocked_profile_id:
          type: string
        blocked_handle:
          type: string
          nullable: true
        blocked_pfp:
          type: string
          nullable: true
        created_at:
          type: integer
          format: int64
        cursor:
          type: string
    ApiContentModerationDropDecisionRequest:
      type: object
      required:
        - decision
      properties:
        decision:
          type: string
          enum:
            - ALLOW
            - QUARANTINE
            - REMOVE
        reason:
          type: string
          nullable: true
          maxLength: 2000
    ApiContentModerationDropDecisionResponse:
      type: object
      required:
        - drop_id
        - status
      properties:
        drop_id:
          type: string
        status:
          $ref: "#/components/schemas/ApiDropModerationStatus"
    ApiContentModerationProfileListItem:
      type: object
      required:
        - profile_id
        - handle
        - pfp
        - status
        - updated_by_profile_id
        - reason
        - updated_at
        - cursor
      properties:
        profile_id:
          type: string
        handle:
          type: string
          nullable: true
        pfp:
          type: string
          nullable: true
        status:
          $ref: "#/components/schemas/ApiModeratedProfileStatus"
        updated_by_profile_id:
          type: string
        reason:
          type: string
          nullable: true
        updated_at:
          type: integer
          format: int64
        cursor:
          type: string
    ApiContentModerationProfileStatusRequest:
      type: object
      required:
        - status
      properties:
        status:
          $ref: "#/components/schemas/ApiModeratedProfileStatus"
        reason:
          type: string
          nullable: true
          maxLength: 2000
    ApiContentModerationProfileStatusResponse:
      type: object
      required:
        - profile_id
        - status
      properties:
        profile_id:
          type: string
        status:
          $ref: "#/components/schemas/ApiModeratedProfileStatus"
    ApiContentModerationQueueItem:
      type: object
      required:
        - id
        - drop_id
        - reporter_profile_id
        - reporter_handle
        - reporter_pfp
        - author_profile_id
        - author_handle
        - author_pfp
        - author_status
        - reason
        - content_snapshot
        - status
        - created_at
        - report_count
        - cursor
        - moderation
        - history
      properties:
        id:
          type: string
          format: uuid
        drop_id:
          type: string
        reporter_profile_id:
          type: string
        reporter_handle:
          type: string
          nullable: true
        reporter_pfp:
          type: string
          nullable: true
        author_profile_id:
          type: string
        author_handle:
          type: string
          nullable: true
        author_pfp:
          type: string
          nullable: true
        author_status:
          $ref: "#/components/schemas/ApiModeratedProfileStatus"
        reason:
          $ref: "#/components/schemas/ApiContentModerationReportReason"
        notes:
          type: string
          nullable: true
        content_snapshot:
          type: object
          additionalProperties: true
        status:
          $ref: "#/components/schemas/ApiContentModerationReportStatus"
        ai_recommendation:
          allOf:
            - $ref: "#/components/schemas/ApiContentModerationRecommendation"
          nullable: true
        ai_category:
          type: string
          nullable: true
        ai_confidence:
          type: number
          format: double
          nullable: true
        ai_rationale:
          type: string
          nullable: true
        ai_evidence:
          type: array
          nullable: true
          items: {}
        ai_policy_version:
          type: string
          nullable: true
        ai_assessed_at:
          type: integer
          format: int64
          nullable: true
        created_at:
          type: integer
          format: int64
        resolved_by_profile_id:
          type: string
          nullable: true
        resolution_reason:
          type: string
          nullable: true
        resolved_at:
          type: integer
          format: int64
          nullable: true
        report_count:
          type: integer
          format: int64
        cursor:
          type: string
          description: Opaque cursor for fetching queue items after this item.
        moderation:
          $ref: "#/components/schemas/ApiDropModeration"
        history:
          type: array
          items:
            $ref: "#/components/schemas/ApiContentModerationAuditEntry"
    ApiContentModerationRecommendation:
      type: string
      enum:
        - NO_VIOLATION_DETECTED
        - NEEDS_HUMAN_REVIEW
        - URGENT_QUARANTINE
    ApiContentModerationReportedAttachment:
      type: object
      additionalProperties: false
      required:
        - original_file_name
        - kind
        - declared_mime
        - detected_mime
        - size_bytes
        - ipfs_url
      properties:
        original_file_name:
          type: string
        kind:
          type: string
        declared_mime:
          type: string
        detected_mime:
          type: string
          nullable: true
        size_bytes:
          type: integer
          format: int64
          nullable: true
        ipfs_url:
          type: string
          nullable: true
    ApiContentModerationReportedContent:
      type: object
      additionalProperties: false
      required:
        - wave_id
        - wave_name
        - wave_picture
        - wave_is_direct_message
        - title
        - parts
      properties:
        wave_id:
          type: string
          nullable: true
        wave_name:
          type: string
          nullable: true
        wave_picture:
          type: string
          nullable: true
        wave_is_direct_message:
          type: boolean
        title:
          type: string
          nullable: true
        parts:
          type: array
          items:
            $ref: "#/components/schemas/ApiContentModerationReportedContentPart"
    ApiContentModerationReportedContentPart:
      type: object
      additionalProperties: false
      required:
        - part_no
        - content
        - media
        - attachments
      properties:
        part_no:
          type: integer
          format: int64
        content:
          type: string
          nullable: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiContentModerationReportedMedia"
        attachments:
          type: array
          items:
            $ref: "#/components/schemas/ApiContentModerationReportedAttachment"
    ApiContentModerationReportedMedia:
      type: object
      additionalProperties: false
      required:
        - url
        - mime_type
      properties:
        url:
          type: string
        mime_type:
          type: string
    ApiContentModerationReportReason:
      type: string
      enum:
        - SCAM_OR_PHISHING
        - PRIVATE_INFORMATION_OR_DOXXING
        - THREATS_OR_TARGETED_HARASSMENT
        - HATE_OR_DISCRIMINATION
        - SEXUAL_EXPLOITATION_OR_ILLEGAL_CONTENT
        - SPAM
        - OTHER
    ApiContentModerationReportRequest:
      type: object
      required:
        - reason
      properties:
        reason:
          $ref: "#/components/schemas/ApiContentModerationReportReason"
        notes:
          type: string
          nullable: true
          maxLength: 1000
        hide_drop:
          type: boolean
          default: true
        block_author:
          type: boolean
          default: false
    ApiContentModerationReportResponse:
      type: object
      required:
        - id
        - status
        - drop_status
      properties:
        id:
          type: string
          format: uuid
        status:
          $ref: "#/components/schemas/ApiContentModerationReportStatus"
        drop_status:
          $ref: "#/components/schemas/ApiDropModerationStatus"
    ApiContentModerationReportStatus:
      type: string
      enum:
        - OPEN
        - RESOLVED_ALLOWED
        - RESOLVED_REMOVED
        - WITHDRAWN
    ApiContentModerationReportWithdrawalResponse:
      type: object
      required:
        - drop_id
        - status
        - drop_status
      properties:
        drop_id:
          type: string
        status:
          $ref: "#/components/schemas/ApiContentModerationReportStatus"
        drop_status:
          $ref: "#/components/schemas/ApiDropModerationStatus"
    ApiContentModerationUserReport:
      type: object
      required:
        - id
        - drop_id
        - author_profile_id
        - author_handle
        - author_pfp
        - reason
        - notes
        - status
        - created_at
        - resolved_at
        - drop_status
        - reported_content
        - cursor
      properties:
        id:
          type: string
          format: uuid
        drop_id:
          type: string
        author_profile_id:
          type: string
        author_handle:
          type: string
          nullable: true
        author_pfp:
          type: string
          nullable: true
        reason:
          $ref: "#/components/schemas/ApiContentModerationReportReason"
        notes:
          type: string
          nullable: true
        status:
          $ref: "#/components/schemas/ApiContentModerationReportStatus"
        created_at:
          type: integer
          format: int64
        resolved_at:
          type: integer
          format: int64
          nullable: true
        drop_status:
          $ref: "#/components/schemas/ApiDropModerationStatus"
        reported_content:
          $ref: "#/components/schemas/ApiContentModerationReportedContent"
        cursor:
          type: string
          description: Opaque cursor for fetching reports after this item.
    ApiContentModeratorAccess:
      type: object
      required:
        - moderator
        - has_open_reports
        - open_report_count
        - resolved_report_count
        - suspended_profile_count
      properties:
        moderator:
          type: boolean
        has_open_reports:
          type: boolean
        open_report_count:
          type: integer
          format: int64
        resolved_report_count:
          type: integer
          format: int64
        suspended_profile_count:
          type: integer
          format: int64
    ApiCreateAttachmentMultipartUploadRequest:
      type: object
      required:
        - content_type
        - file_name
      properties:
        content_type:
          $ref: "#/components/schemas/ApiAttachmentUploadMimeType"
        file_name:
          type: string
          example: report.pdf
    ApiCreateAttachmentMultipartUploadResponse:
      type: object
      required:
        - attachment_id
        - upload_id
        - key
        - status
      properties:
        attachment_id:
          type: string
        upload_id:
          type: string
        key:
          type: string
        status:
          $ref: "#/components/schemas/ApiAttachmentStatus"
    ApiCreateConnectionShareRequest:
      type: object
      required:
        - target_client_type
      properties:
        target_client_type:
          type: string
          enum:
            - native
            - desktop
        role:
          type: string
          nullable: true
        client_type:
          type: string
          description: Optional source session type for native or desktop callers.
          enum:
            - native
            - desktop
        client_address:
          type: string
          description: Wallet address bound to the source native or desktop session.
        native_refresh_token:
          type: string
          description: Refresh token for the source native or desktop session.
    ApiCreateConnectionShareResponse:
      type: object
      required:
        - connection_share_code
        - expires_at
        - address
        - target_client_type
        - deep_link_path
      properties:
        connection_share_code:
          type: string
        expires_at:
          type: string
          format: date-time
        address:
          type: string
        role:
          type: string
          nullable: true
        target_client_type:
          type: string
          enum:
            - native
            - desktop
        deep_link_path:
          type: string
    ApiCreateDropMedia:
      type: object
      required:
        - url
        - mime_type
      properties:
        url:
          type: string
          maxLength: 2000
        mime_type:
          type: string
          maxLength: 100
        media_upload_id:
          type: string
          nullable: true
    ApiCreateDropPart:
      type: object
      required:
        - media
      properties:
        content:
          type: string
          description: >-
            Runtime validation allows at most 25,000 JavaScript UTF-16 code
            units and 65,535 UTF-8 bytes for this part. The byte limit is
            enforced independently by the API.
          x-6529-max-utf16-code-units: 25000
          x-6529-max-utf8-bytes: 65535
          nullable: true
        quoted_drop:
          anyOf:
            - $ref: "#/components/schemas/ApiQuotedDrop"
            - type: "null"
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiCreateDropMedia"
        attachments:
          type: array
          default: []
          items:
            $ref: "#/components/schemas/ApiDropAttachmentReference"
    ApiCreateDropPollRequest:
      type: object
      required:
        - options
        - multichoice
        - closing_time
      properties:
        options:
          type: array
          minItems: 2
          maxItems: 100
          uniqueItems: true
          items:
            type: string
            minLength: 1
            maxLength: 500
        multichoice:
          type: boolean
        anonymous:
          type: boolean
          default: false
        only_droppers_can_respond:
          type: boolean
          default: false
        closing_time:
          type: integer
          format: int64
          description: Future Unix timestamp in milliseconds.
    ApiCreateDropRequest:
      type: object
      required:
        - wave_id
        - type
      allOf:
        - $ref: "#/components/schemas/ApiCreateWaveDropRequest"
      properties:
        wave_id:
          type: string
        reply_to:
          $ref: "#/components/schemas/ApiReplyToDrop"
        drop_type:
          $ref: "#/components/schemas/ApiDropType"
        is_additional_action_promised:
          type: boolean
        mentioned_groups:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropGroupMention"
        poll:
          $ref: "#/components/schemas/ApiCreateDropPollRequest"
        hide_link_preview:
          type: boolean
          description: >-
            When true, create the drop with generated external link previews
            hidden. Omit or set to false to leave previews visible.
            Signature-required drops must include this field in the signed
            payload when present.
    ApiCreateGroup:
      type: object
      required:
        - name
        - group
      properties:
        name:
          type: string
        group:
          $ref: "#/components/schemas/ApiCreateGroupDescription"
        is_private:
          type: boolean
    ApiCreateGroupDescription:
      type: object
      required:
        - tdh
        - rep
        - cic
        - level
        - owns_nfts
        - identity_addresses
        - excluded_identity_addresses
      properties:
        tdh:
          $ref: "#/components/schemas/ApiGroupTdhFilter"
        rep:
          $ref: "#/components/schemas/ApiGroupRepFilter"
        cic:
          $ref: "#/components/schemas/ApiGroupCicFilter"
        level:
          $ref: "#/components/schemas/ApiGroupLevelFilter"
        owns_nfts:
          type: array
          items:
            $ref: "#/components/schemas/ApiGroupOwnsNft"
        identity_addresses:
          anyOf:
            - type: "null"
            - type: array
              items:
                type: string
          example:
            - "0x1234567890123456789012345678901234567890"
        excluded_identity_addresses:
          anyOf:
            - type: "null"
            - type: array
              items:
                type: string
          example:
            - "0x1234567890123456789012345678901234567890"
        is_beneficiary_of_grant_id:
          type: string
          nullable: true
        is_beneficiary_of_grant_match_mode:
          $ref: "#/components/schemas/ApiGroupBeneficiaryGrantMatchMode"
    ApiCreateLegacyDesktopConnectionShareRequest:
      type: object
      properties:
        role:
          type: string
          nullable: true
        client_type:
          type: string
          description: Optional source session type for native or desktop callers.
          enum:
            - native
            - desktop
        client_address:
          type: string
          description: Wallet address bound to the source native or desktop session.
        native_refresh_token:
          type: string
          description: Refresh token for the source native or desktop session.
    ApiCreateLegacyDesktopConnectionShareResponse:
      type: object
      required:
        - refresh_token
        - address
        - deep_link_path
      properties:
        refresh_token:
          type: string
        address:
          type: string
        role:
          type: string
          nullable: true
        deep_link_path:
          type: string
    ApiCreateMediaUploadUrlRequest:
      required:
        - content_type
        - file_name
        - file_size
      properties:
        content_type:
          $ref: "#/components/schemas/ApiMediaUploadMimeType"
        file_name:
          type: string
          example: image.png
    ApiCreateMediaUrlResponse:
      required:
        - upload_url
        - content_type
        - media_url
      properties:
        upload_url:
          type: string
          example: https://example.com/upload/image.png
        content_type:
          type: string
          example: image/png
        media_url:
          type: string
          example: https://example.com/final/image.png
    ApiCreateMentionedWave:
      type: object
      required:
        - wave_name_in_content
        - wave_id
      properties:
        wave_name_in_content:
          type: string
          minLength: 1
        wave_id:
          type: string
          maxLength: 100
          minLength: 1
    ApiCreateNewProfileProxy:
      type: object
      required:
        - target_id
      properties:
        target_id:
          type: string
    ApiCreateNewProfileProxyAllocateCicAction:
      type: object
      required:
        - action_type
        - end_time
        - credit_amount
      properties:
        action_type:
          $ref: "#/components/schemas/ApiProfileProxyActionType"
        end_time:
          anyOf:
            - type: "null"
            - type: number
              format: int64
        credit_amount:
          type: number
          format: int64
          example: 1000
    ApiCreateNewProfileProxyAllocateRepAction:
      type: object
      required:
        - action_type
        - end_time
        - credit_amount
      properties:
        action_type:
          $ref: "#/components/schemas/ApiProfileProxyActionType"
        end_time:
          anyOf:
            - type: "null"
            - type: number
              format: int64
          example: 1719850339996
        credit_amount:
          type: number
          format: int64
          example: 1000
    ApiCreateNewProfileProxyCreateWaveAction:
      type: object
      required:
        - action_type
        - end_time
      properties:
        action_type:
          $ref: "#/components/schemas/ApiProfileProxyActionType"
        end_time:
          anyOf:
            - type: "null"
            - type: number
              format: int64
    ApiCreateNewProfileProxyCreateWaveParticipationDropAction:
      type: object
      required:
        - action_type
        - end_time
      properties:
        action_type:
          $ref: "#/components/schemas/ApiProfileProxyActionType"
        end_time:
          anyOf:
            - type: "null"
            - type: number
              format: int64
    ApiCreateNewProfileProxyPublishCmsAction:
      type: object
      required:
        - action_type
        - end_time
      properties:
        action_type:
          $ref: "#/components/schemas/ApiProfileProxyActionType"
        end_time:
          anyOf:
            - type: "null"
            - type: number
              format: int64
    ApiCreateNewProfileProxyRateWaveDropAction:
      type: object
      required:
        - action_type
        - end_time
      properties:
        action_type:
          $ref: "#/components/schemas/ApiProfileProxyActionType"
        end_time:
          anyOf:
            - type: "null"
            - type: number
              format: int64
    ApiCreateNewProfileProxyReadWaveAction:
      type: object
      required:
        - action_type
        - end_time
      properties:
        action_type:
          $ref: "#/components/schemas/ApiProfileProxyActionType"
        end_time:
          anyOf:
            - type: "null"
            - type: number
              format: int64
    ApiCreateNewWave:
      type: object
      required:
        - name
        - picture
        - description_drop
        - voting
        - visibility
        - participation
        - chat
        - wave
        - outcomes
      properties:
        name:
          description: The name of the wave
          type: string
          maxLength: 250
        picture:
          description: The picture of the wave
          type: string
          example: https://example.com/picture.jpg
          nullable: true
        parent_wave_id:
          description: Optional top-level parent wave id when creating a subwave.
          type: string
          nullable: true
        description_drop:
          $ref: "#/components/schemas/ApiCreateWaveDropRequest"
        voting:
          $ref: "#/components/schemas/ApiCreateNewWaveVotingConfig"
        visibility:
          $ref: "#/components/schemas/ApiCreateNewWaveVisibilityConfig"
        participation:
          $ref: "#/components/schemas/ApiCreateNewWaveParticipationConfig"
        chat:
          $ref: "#/components/schemas/ApiCreateNewWaveChatConfig"
        wave:
          $ref: "#/components/schemas/ApiCreateWaveConfig"
        outcomes:
          type: array
          items:
            $ref: "#/components/schemas/ApiCreateWaveOutcome"
    ApiCreateNewWaveCardSetTdhVotingConfig:
      allOf:
        - $ref: "#/components/schemas/ApiCreateNewWaveVotingConfigBase"
        - type: object
          required:
            - credit_nfts
          properties:
            credit_nfts:
              type: array
              items:
                $ref: "#/components/schemas/ApiWaveCreditNft"
              minItems: 1
    ApiCreateNewWaveChatConfig:
      type: object
      required:
        - scope
        - enabled
      properties:
        scope:
          $ref: "#/components/schemas/ApiCreateNewWaveScope"
        enabled:
          type: boolean
        slow_mode_cooldown_ms:
          type: integer
          format: int64
          minimum: 1000
        links_disabled:
          type: boolean
    ApiCreateNewWaveParticipationConfig:
      type: object
      required:
        - scope
        - required_metadata
        - signature_required
        - no_of_applications_allowed_per_participant
        - required_media
        - terms
      properties:
        scope:
          $ref: "#/components/schemas/ApiCreateNewWaveScope"
        no_of_applications_allowed_per_participant:
          description: >-
            The number of applications allowed per participant. Infinite if
            omitted.
          type: integer
          format: int64
          nullable: true
          minimum: 1
        required_media:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveParticipationRequirement"
        required_metadata:
          description: |
            The metadata that must be provided by the participant. 
            Empty array if nothing is required.
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveRequiredMetadata"
        signature_required:
          description: If true then the votes must be signed by voters.
          type: boolean
        terms:
          description: >-
            If this is and the "signature_required" is set then this will be
            embedded as a signature input data component for each drop.
          type: string
          nullable: true
        period:
          $ref: "#/components/schemas/ApiIntRange"
        submission_strategy:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiWaveParticipationSubmissionStrategy"
    ApiCreateNewWaveScope:
      type: object
      required:
        - group_id
      properties:
        group_id:
          description: If null, everyone is included
          type: string
          nullable: true
    ApiCreateNewWaveStandardVotingConfig:
      allOf:
        - $ref: "#/components/schemas/ApiCreateNewWaveVotingConfigBase"
    ApiCreateNewWaveVisibilityConfig:
      type: object
      required:
        - scope
      properties:
        scope:
          $ref: "#/components/schemas/ApiCreateNewWaveScope"
    ApiCreateNewWaveVotingConfig:
      oneOf:
        - $ref: "#/components/schemas/ApiCreateNewWaveStandardVotingConfig"
        - $ref: "#/components/schemas/ApiCreateNewWaveCardSetTdhVotingConfig"
      discriminator:
        propertyName: credit_type
        mapping:
          TDH: "#/components/schemas/ApiCreateNewWaveStandardVotingConfig"
          REP: "#/components/schemas/ApiCreateNewWaveStandardVotingConfig"
          XTDH: "#/components/schemas/ApiCreateNewWaveStandardVotingConfig"
          TDH_PLUS_XTDH: "#/components/schemas/ApiCreateNewWaveStandardVotingConfig"
          CARD_SET_TDH: "#/components/schemas/ApiCreateNewWaveCardSetTdhVotingConfig"
    ApiCreateNewWaveVotingConfigBase:
      type: object
      required:
        - scope
        - credit_type
        - credit_category
        - signature_required
        - creditor_id
        - forbid_negative_votes
      properties:
        scope:
          $ref: "#/components/schemas/ApiCreateNewWaveScope"
        credit_type:
          $ref: "#/components/schemas/ApiWaveCreditType"
        credit_scope:
          $ref: "#/components/schemas/ApiWaveCreditScope"
        credit_category:
          description: >-
            Only relevant when credit_type=REP. The REP category which is usable
            as credit. If not set then all categories will be usable as voting
            credits.
          type: string
          nullable: true
        credit_nfts:
          description: Only relevant when credit_type=CARD_SET_TDH
          anyOf:
            - type: "null"
            - type: array
              items:
                $ref: "#/components/schemas/ApiWaveCreditNft"
              minItems: 1
        creditor_id:
          description: Only relevant when credit_type=REP
          type: string
          nullable: true
        signature_required:
          description: If true then the votes must be signed by voters.
          type: boolean
        period:
          $ref: "#/components/schemas/ApiIntRange"
        forbid_negative_votes:
          type: boolean
    ApiCreateOrUpdateProfileRequest:
      type: object
      required:
        - handle
        - classification
        - sub_classification
        - pfp_url
      properties:
        handle:
          type: string
        banner_1:
          type: string
          nullable: true
        banner_2:
          type: string
          nullable: true
        website:
          type: string
          nullable: true
        classification:
          $ref: "#/components/schemas/ApiProfileClassification"
        sub_classification:
          type: string
          nullable: true
        pfp_url:
          type: string
          nullable: true
    ApiCreateProfileCicStatement:
      type: object
      required:
        - statement_group
        - statement_type
        - statement_comment
        - statement_value
      properties:
        statement_group:
          $ref: "#/components/schemas/ApiCicStatementGroup"
        statement_type:
          type: string
          minLength: 1
          maxLength: 250
        statement_comment:
          type: string
          nullable: true
          description: >-
            Required 1-40 character display label when statement_group is
            NFT_ACCOUNTS and statement_type is LINK; null for NINFA.
        statement_value:
          type: string
          minLength: 1
          maxLength: 2048
    ApiCreateProfileCmsWalletGallerySnapshotRequest:
      type: object
      required:
        - wallets
      properties:
        wallets:
          type: array
          minItems: 1
          maxItems: 25
          description: Wallet addresses or ENS names to resolve before snapshotting.
          items:
            type: string
        exclude_contracts:
          type: array
          description: Whole NFT contracts to omit from the visible gallery assets.
          items:
            type: string
        exclude_assets:
          type: array
          description: Individual NFT assets to omit from the visible gallery assets.
          items:
            $ref: "#/components/schemas/ApiProfileCmsWalletGalleryAssetIdentifier"
        include_spam:
          type: boolean
          description: >-
            Reserved for indexed spam flags. The MVP index currently returns no
            spam-flagged assets.
        max_assets:
          type: integer
          format: int64
          minimum: 1
          maximum: 500
          description: Maximum number of visible assets to return after exclusions.
    ApiCreateWaveConfig:
      type: object
      required:
        - type
        - time_lock_ms
        - winning_threshold
        - max_winners
        - admin_group
        - decisions_strategy
        - admin_drop_deletion_enabled
      properties:
        type:
          $ref: "#/components/schemas/ApiWaveType"
        winning_threshold:
          description: >-
            Single positive threshold a drop must reach to win. Must be set if
            and only if type is APPROVE
          type: integer
          format: int64
          minimum: 1
          nullable: true
        winning_threshold_min_duration_ms:
          description: >-
            Milliseconds a drop must continuously stay at or above
            winning_threshold before winning an APPROVE wave. Defaults to 0,
            which declares a winner as soon as the threshold is reached. When
            time_lock_ms is set, this duration is measured against the
            time-scaled weighted vote.
          type: integer
          format: int64
          minimum: 0
          nullable: true
        max_winners:
          description: >-
            Total number of APPROVE decisions this wave may produce. Null means
            unlimited. Must be set if and only if type is APPROVE
          type: integer
          format: int64
          minimum: 1
          nullable: true
        max_votes_per_identity_to_drop:
          description: >-
            Maximum absolute vote one identity can hold on a single drop. Null
            means unlimited. Supported only for APPROVE and RANK waves
          type: integer
          format: int64
          minimum: 1
          nullable: true
        time_lock_ms:
          nullable: true
          description: >-
            When set, vote totals use a trailing time-scaled weighted average
            over this duration, so new vote changes gradually gain or lose
            influence. If not set, votes are counted immediately.
          type: integer
          format: int64
          minimum: 1
        admin_group:
          oneOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiCreateNewWaveScope"
        decisions_strategy:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiWaveDecisionsStrategy"
        admin_drop_deletion_enabled:
          type: boolean
    ApiCreateWaveDropRequest:
      type: object
      required:
        - referenced_nfts
        - mentioned_users
        - metadata
        - parts
        - signature
      properties:
        title:
          type: string
          maxLength: 250
          nullable: true
        parts:
          type: array
          minItems: 1
          description: >-
            Across all parts, runtime validation allows at most 50,000
            JavaScript UTF-16 code units. Each part is also subject to the
            per-part UTF-16 and UTF-8 limits documented on ApiCreateDropPart.
          x-6529-max-total-utf16-code-units: 50000
          items:
            $ref: "#/components/schemas/ApiCreateDropPart"
        referenced_nfts:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropReferencedNFT"
        mentioned_users:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMentionedUser"
        mentioned_waves:
          type: array
          items:
            $ref: "#/components/schemas/ApiCreateMentionedWave"
        metadata:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMetadata"
        signature:
          description: >-
            If wave requires drop signatures then this needs to be set.
            Signature of a drop is ethSign(creatorWallet,
            sha256(oneLineJsonWithAlphabeticallySortedFieldsRecursive(ApiCreateDropRequest
            - signature - signature_message (+ wave.participation.terms if it
            exists))))
          type: string
          nullable: true
        signature_message:
          description: >-
            Optional request-only structured wallet signature message. Present
            when structured signatures are enabled and omitted from the payload
            hash before signature verification.
          type: string
          nullable: true
        is_safe_signature:
          type: boolean
        signer_address:
          type: string
    ApiCreateWaveMetadataRequest:
      type: object
      required:
        - data_key
        - data_value
      properties:
        data_key:
          type: string
          minLength: 1
          maxLength: 500
        data_value:
          type: string
          maxLength: 8000
    ApiCreateWaveOutcome:
      type: object
      required:
        - type
        - description
      properties:
        type:
          $ref: "#/components/schemas/ApiWaveOutcomeType"
        subtype:
          $ref: "#/components/schemas/ApiWaveOutcomeSubType"
        description:
          type: string
        credit:
          $ref: "#/components/schemas/ApiWaveOutcomeCredit"
        rep_category:
          type: string
        amount:
          type: number
          format: int64
        distribution:
          type: array
          items:
            $ref: "#/components/schemas/ApiCreateWaveOutcomeDistributionItem"
    ApiCreateWaveOutcomeDistributionItem:
      type: object
      properties:
        amount:
          type: number
          format: int64
          nullable: true
        description:
          type: string
          nullable: true
    ApiCuratedProfileWaveDropsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiDrop"
    ApiCurationDrop:
      type: object
      required:
        - drop_priority_order
      allOf:
        - $ref: "#/components/schemas/ApiDropWithoutWave"
      properties:
        drop_priority_order:
          type: integer
          format: int64
          minimum: 1
          nullable: true
    ApiCurationDropsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiCurationDrop"
    ApiDecentralizedMediaProtocol:
      type: string
      enum:
        - ipfs
        - ipns
        - arweave
    ApiDecentralizedMediaResolution:
      type: object
      required:
        - input
        - recognized
        - external_fallback_urls
        - warnings
      properties:
        input:
          type: string
        recognized:
          type: boolean
        protocol:
          $ref: "#/components/schemas/ApiDecentralizedMediaProtocol"
        native_uri:
          type: string
        id:
          type: string
        path:
          type: string
        resolver_url:
          type: string
          format: uri
        external_fallback_urls:
          type: array
          items:
            type: string
            format: uri
        warnings:
          type: array
          items:
            type: string
    ApiDeleteEulaConsentRequest:
      type: object
      additionalProperties: false
      required:
        - device_id
      properties:
        device_id:
          type: string
          minLength: 1
          maxLength: 100
    ApiDeleteEulaConsentResponse:
      type: object
      additionalProperties: false
      required:
        - message
      properties:
        message:
          type: string
    ApiDeleteMyWaveChatHistoryResponse:
      type: object
      additionalProperties: false
      required:
        - deleted_drop_ids
        - preserved_pinned_drop_id
      properties:
        deleted_drop_ids:
          type: array
          items:
            type: string
        preserved_pinned_drop_id:
          description: >-
            ID of the caller-authored pinned CHAT drop that was preserved, or
            null when the pinned drop was not authored by the caller.
          type: string
          nullable: true
    ApiDistributionAirdropsCsvUploadRequest:
      type: object
      required:
        - csv
      properties:
        csv:
          type: string
          description: CSV text with one `address,count` entry per line
          example: |-
            0x0000000000000000000000000000000000000001,2
            0x0000000000000000000000000000000000000002,1
    ApiDistributionAirdropsUploadResponse:
      type: object
      required:
        - success
        - message
      properties:
        success:
          type: boolean
        message:
          type: string
    ApiDmDropsUnreadCount:
      type: object
      required:
        - count
      properties:
        count:
          type: integer
          minimum: 0
    ApiDmUnreadConversationState:
      type: object
      required:
        - profile_id
        - wave_id
        - unread_count
        - first_unread_drop_serial_no
        - latest_drop_serial_no
        - latest_read_serial_no
        - version
      properties:
        profile_id:
          type: string
        wave_id:
          type: string
        unread_count:
          type: integer
          minimum: 0
        first_unread_drop_serial_no:
          type: integer
          nullable: true
          minimum: 1
        latest_drop_serial_no:
          type: integer
          minimum: 0
        latest_read_serial_no:
          type: integer
          minimum: 0
        version:
          type: integer
          minimum: 0
    ApiDmUnreadSnapshot:
      type: object
      required:
        - profile_id
        - count
        - conversations
      properties:
        profile_id:
          type: string
        count:
          type: integer
          minimum: 0
        conversations:
          type: array
          items:
            $ref: "#/components/schemas/ApiDmUnreadConversationState"
    ApiDrop:
      type: object
      required:
        - id
        - serial_no
        - drop_type
        - wave
        - author
        - created_at
        - updated_at
        - referenced_nfts
        - mentioned_users
        - mentioned_groups
        - mentioned_waves
        - metadata
        - parts
        - parts_count
        - rating
        - realtime_rating
        - rating_prediction
        - top_raters
        - raters_count
        - title
        - context_profile_context
        - subscribed_actions
        - rank
        - is_signed
        - reactions
        - boosts
        - is_additional_action_promised
        - hide_link_preview
      properties:
        id:
          type: string
        serial_no:
          description: Sequence number of the drop in Seize
          type: number
          format: int64
        drop_type:
          $ref: "#/components/schemas/ApiDropType"
        rank:
          type: number
          format: int64
          nullable: true
        winning_context:
          $ref: "#/components/schemas/ApiDropWinningContext"
        wave:
          $ref: "#/components/schemas/ApiWaveMin"
        reply_to:
          $ref: "#/components/schemas/ApiReplyToDropResponse"
        author:
          $ref: "#/components/schemas/ApiProfileMin"
        created_at:
          description: >-
            Time when the drop was created in milliseconds since 1-1-1970
            00:00:00.0 UTC
          type: number
          format: int64
        updated_at:
          description: >-
            Time when the drop was updated in milliseconds since 1-1-1970
            00:00:00.0 UTC
          type: number
          format: int64
          nullable: true
        title:
          type: string
          maxLength: 250
          nullable: true
        parts:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropPart"
        parts_count:
          description: Number of drops in the storm
          type: number
          format: int64
        referenced_nfts:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropReferencedNFT"
        mentioned_users:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMentionedUser"
        mentioned_groups:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropGroupMention"
        mentioned_waves:
          type: array
          items:
            $ref: "#/components/schemas/ApiMentionedWave"
        metadata:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMetadataResponse"
        rating:
          type: number
          format: int64
        realtime_rating:
          type: number
          format: int64
        rating_prediction:
          type: number
          format: int64
        top_raters:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropRater"
        raters_count:
          type: number
          format: int64
        context_profile_context:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiDropContextProfileContext"
        viewer_context:
          $ref: "#/components/schemas/ApiDropViewerModerationContext"
        moderation:
          $ref: "#/components/schemas/ApiDropModeration"
        subscribed_actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropSubscriptionTargetAction"
        is_signed:
          type: boolean
        reactions:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropReaction"
        boosts:
          type: number
          format: int64
        is_additional_action_promised:
          type: boolean
          nullable: true
        hide_link_preview:
          type: boolean
        poll:
          $ref: "#/components/schemas/ApiDropPoll"
        nft_links:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropNftLink"
    ApiDropAndDropVote:
      type: object
      required:
        - drop
        - vote
      properties:
        drop:
          $ref: "#/components/schemas/ApiDrop"
        vote:
          $ref: "#/components/schemas/ApiDropVote"
    ApiDropAndWave:
      type: object
      required:
        - drop
        - wave
      properties:
        drop:
          $ref: "#/components/schemas/ApiDropV2"
        wave:
          $ref: "#/components/schemas/ApiWaveOverview"
    ApiDropAttachmentReference:
      type: object
      additionalProperties: false
      required:
        - attachment_id
      properties:
        attachment_id:
          type: string
    ApiDropBoost:
      type: object
      required:
        - booster
        - boosted_at
      properties:
        booster:
          $ref: "#/components/schemas/ApiProfileMin"
        boosted_at:
          type: number
          format: int64
          nullable: true
    ApiDropBoostsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropBoost"
    ApiDropBoostV2:
      type: object
      required:
        - booster
        - boosted_at
      properties:
        booster:
          $ref: "#/components/schemas/ApiIdentityOverview"
        boosted_at:
          type: integer
          format: int64
    ApiDropContextProfileContext:
      type: object
      required:
        - rating
        - min_rating
        - max_rating
        - reaction
        - boosted
        - bookmarked
        - curatable
        - curated
      properties:
        rating:
          type: number
          format: int64
        min_rating:
          type: number
          format: int64
        max_rating:
          type: number
          format: int64
        reaction:
          type: string
          nullable: true
        boosted:
          type: boolean
        bookmarked:
          type: boolean
        curatable:
          type: boolean
        curated:
          type: boolean
    ApiDropCuration:
      type: object
      required:
        - drop_included
        - authenticated_user_can_curate
        - drop_priority_order
      allOf:
        - $ref: "#/components/schemas/ApiWaveCuration"
      properties:
        drop_included:
          type: boolean
        authenticated_user_can_curate:
          type: boolean
        drop_priority_order:
          type: integer
          format: int64
          minimum: 1
          nullable: true
    ApiDropCurationRequest:
      type: object
      required:
        - curation_id
      properties:
        curation_id:
          type: string
        priority_order:
          type: integer
          format: int64
          minimum: 1
    ApiDropGroupMention:
      type: string
      enum:
        - ALL
        - CONTRIBUTORS
        - ADMINS
        - DEVS_6529
    ApiDropHiddenState:
      type: object
      required:
        - hidden
      properties:
        hidden:
          type: boolean
    ApiDropId:
      type: object
      required:
        - id
        - serial_no
      properties:
        id:
          type: string
        serial_no:
          type: integer
          format: int64
    ApiDropMainType:
      type: string
      enum:
        - CHAT
        - SUBMISSION
    ApiDropMedia:
      type: object
      required:
        - url
        - mime_type
      properties:
        url:
          type: string
          maxLength: 2000
        mime_type:
          type: string
          maxLength: 100
        media_upload_id:
          type: string
          nullable: true
        media_status:
          $ref: "#/components/schemas/ApiDropMediaStatus"
        media_error:
          type: string
          nullable: true
    ApiDropMediaStatus:
      type: string
      enum:
        - uploading
        - processing
        - ready
        - failed
    ApiDropMentionedUser:
      type: object
      required:
        - mentioned_profile_id
        - handle_in_content
      properties:
        mentioned_profile_id:
          type: string
          format: uuid
        handle_in_content:
          type: string
          maxLength: 100
        current_handle:
          type: string
          maxLength: 100
          nullable: true
    ApiDropMetadata:
      type: object
      required:
        - data_key
        - data_value
      description: >-
        Drop metadata. data_value maximum length is 255 when data_key is title,
        8000 when data_key is description, and 5000 for all other metadata keys.
      properties:
        data_key:
          type: string
          maxLength: 500
        data_value:
          type: string
          maxLength: 8000
    ApiDropMetadataResponse:
      type: object
      required:
        - data_key
        - data_value
      description: >-
        Drop metadata response. data_value maximum length is 255 when data_key
        is title, 8000 when data_key is description, and 5000 for all other
        metadata keys.
      properties:
        data_key:
          type: string
          maxLength: 500
        data_value:
          type: string
          maxLength: 8000
        resolved_profile:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiDropResolvedIdentityProfile"
    ApiDropMetadataV2:
      type: object
      required:
        - data_key
        - data_value
      description: >-
        Drop metadata V2 response. data_value maximum length is 255 when
        data_key is title, 8000 when data_key is description, and 5000 for all
        other metadata keys.
      properties:
        data_key:
          type: string
          maxLength: 500
        data_value:
          type: string
          maxLength: 8000
        resolved_profile:
          $ref: "#/components/schemas/ApiDropResolvedIdentityProfileV2"
    ApiDropModeration:
      type: object
      required:
        - status
        - can_view
      properties:
        status:
          $ref: "#/components/schemas/ApiDropModerationStatus"
        can_view:
          type: boolean
    ApiDropModerationStatus:
      type: string
      enum:
        - VISIBLE
        - AI_QUARANTINED
        - MODERATOR_REMOVED
    ApiDropNftLink:
      type: object
      required:
        - url_in_text
        - data
      properties:
        url_in_text:
          type: string
          maxLength: 2000
        data:
          anyOf:
            - $ref: "#/components/schemas/ApiNftLinkData"
            - type: "null"
    ApiDropPart:
      type: object
      required:
        - part_id
        - media
        - attachments
        - quoted_drop
        - content
      properties:
        part_id:
          description: Which drop in the storm is this drop
          type: number
          format: int64
        content:
          type: string
          nullable: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMedia"
        attachments:
          type: array
          items:
            $ref: "#/components/schemas/ApiAttachment"
        quoted_drop:
          anyOf:
            - $ref: "#/components/schemas/ApiQuotedDropResponse"
            - type: "null"
    ApiDropPartQuoteV2:
      type: object
      required:
        - drop_id
        - drop_part_id
      properties:
        drop_id:
          type: string
        drop_part_id:
          type: integer
          format: int64
    ApiDropPartV2:
      type: object
      required:
        - part_no
      properties:
        part_no:
          type: integer
          format: int64
          minimum: 1
        viewer_context:
          $ref: "#/components/schemas/ApiDropViewerModerationContext"
        moderation:
          $ref: "#/components/schemas/ApiDropModeration"
        content:
          type: string
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMedia"
        attachments:
          type: array
          items:
            $ref: "#/components/schemas/ApiAttachment"
        quoted_drop:
          $ref: "#/components/schemas/ApiDropPartQuoteV2"
    ApiDropPoll:
      type: object
      required:
        - id
        - options
        - voted
        - multichoice
        - anonymous
        - only_droppers_can_respond
        - closing_time
        - is_open
      properties:
        id:
          type: string
        options:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropPollOption"
        voted:
          description: Option numbers voted for by the authenticated context profile.
          type: array
          items:
            type: integer
            format: int64
            minimum: 1
        multichoice:
          type: boolean
        anonymous:
          type: boolean
        only_droppers_can_respond:
          type: boolean
        closing_time:
          type: integer
          format: int64
        is_open:
          type: boolean
    ApiDropPollOption:
      type: object
      required:
        - option_no
        - option_string
        - votes
      properties:
        option_no:
          type: integer
          format: int64
          minimum: 1
        option_string:
          type: string
          maxLength: 500
        votes:
          type: integer
          format: int64
    ApiDropPollsPage:
      type: object
      required:
        - data
        - open_unanswered
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        open_unanswered:
          type: number
          format: int64
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropV2"
    ApiDropPollVoteRequest:
      type: object
      required:
        - options
      properties:
        options:
          type: array
          minItems: 1
          maxItems: 100
          uniqueItems: true
          items:
            type: integer
            format: int64
            minimum: 1
    ApiDropPollVotersPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiIdentityOverview"
    ApiDropRater:
      type: object
      required:
        - profile
        - rating
      properties:
        profile:
          $ref: "#/components/schemas/ApiProfileMin"
        rating:
          type: number
          format: int64
    ApiDropRatingRequest:
      type: object
      required:
        - rating
      properties:
        rating:
          type: number
          format: int64
        category:
          type: string
          maxLength: 100
          nullable: true
    ApiDropReaction:
      type: object
      required:
        - reaction
        - profiles
      properties:
        reaction:
          type: string
        profiles:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileMin"
    ApiDropReactionCounter:
      type: object
      required:
        - reaction
        - count
      properties:
        reaction:
          type: string
        count:
          type: integer
          format: int64
    ApiDropReactionV2:
      type: object
      required:
        - reaction
        - reactors
      properties:
        reaction:
          type: string
        reactors:
          type: array
          items:
            $ref: "#/components/schemas/ApiIdentityOverview"
    ApiDropReferencedNFT:
      type: object
      required:
        - contract
        - token
        - name
      properties:
        contract:
          type: string
          maxLength: 100
        token:
          type: string
          maxLength: 250
        name:
          type: string
          maxLength: 500
    ApiDropResolvedIdentityProfile:
      allOf:
        - $ref: "#/components/schemas/ApiProfileMin"
        - type: object
          required:
            - bio
            - top_rep_categories
          properties:
            bio:
              type: string
              nullable: true
            top_rep_categories:
              type: array
              items:
                $ref: "#/components/schemas/ApiProfileRepCategorySummary"
    ApiDropResolvedIdentityProfileV2:
      allOf:
        - $ref: "#/components/schemas/ApiIdentityOverview"
        - type: object
          properties:
            bio:
              type: string
            top_rep_categories:
              type: array
              items:
                $ref: "#/components/schemas/ApiProfileRepCategorySummary"
    ApiDropSearchStrategy:
      type: string
      enum:
        - FIND_OLDER
        - FIND_NEWER
        - FIND_BOTH
    ApiDropsLeaderboardPage:
      type: object
      required:
        - drops
        - wave
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        drops:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropWithoutWave"
        wave:
          $ref: "#/components/schemas/ApiWaveMin"
    ApiDropsLeaderboardPageV2:
      type: object
      required:
        - drops
        - wave
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        drops:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropV2"
        wave:
          $ref: "#/components/schemas/ApiWaveMin"
    ApiDropsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiDrop"
    ApiDropSubscriptionActions:
      type: object
      required:
        - actions
      properties:
        actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropSubscriptionTargetAction"
    ApiDropSubscriptionTargetAction:
      type: string
      enum:
        - DROP_REPLIED
        - DROP_VOTED
    ApiDropTraceItem:
      type: object
      required:
        - drop_id
        - is_deleted
      properties:
        drop_id:
          type: string
        is_deleted:
          type: boolean
    ApiDropType:
      type: string
      enum:
        - CHAT
        - PARTICIPATORY
        - WINNER
    ApiDropV2:
      type: object
      required:
        - id
        - serial_no
        - is_signed
        - parts_count
        - author
        - created_at
        - boosts
        - drop_type
        - hide_link_preview
      properties:
        id:
          type: string
        serial_no:
          type: integer
          format: int64
        created_at:
          type: integer
          format: int64
        updated_at:
          type: integer
          format: int64
        is_signed:
          type: boolean
        hide_link_preview:
          type: boolean
        title:
          type: string
        content:
          type: string
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMedia"
        attachments:
          type: array
          items:
            $ref: "#/components/schemas/ApiAttachment"
        parts_count:
          type: integer
          format: int64
        author:
          $ref: "#/components/schemas/ApiIdentityOverview"
        drop_type:
          $ref: "#/components/schemas/ApiDropMainType"
        referenced_nfts:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropReferencedNFT"
        mentioned_users:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMentionedUser"
        mentioned_groups:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropGroupMention"
        mentioned_waves:
          type: array
          items:
            $ref: "#/components/schemas/ApiMentionedWaveV2"
        nft_links:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropNftLink"
        priority_metadata:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMetadataV2"
        reactions:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropReactionCounter"
        boosts:
          type: integer
          format: int64
        reply_to_drop:
          $ref: "#/components/schemas/ApiReplyToDropV2"
        submission_context:
          $ref: "#/components/schemas/ApiSubmissionDropContext"
        context_profile_context:
          $ref: "#/components/schemas/ApiDropV2ContextProfileContext"
        viewer_context:
          $ref: "#/components/schemas/ApiDropViewerModerationContext"
        moderation:
          $ref: "#/components/schemas/ApiDropModeration"
        poll:
          $ref: "#/components/schemas/ApiDropPoll"
        wave:
          $ref: "#/components/schemas/ApiWaveOverview"
    ApiDropV2ContextProfileContext:
      type: object
      required:
        - boosted
        - bookmarked
        - subscribed
      properties:
        reaction:
          type: string
        boosted:
          type: boolean
        bookmarked:
          type: boolean
        subscribed:
          type: boolean
    ApiDropV2Page:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropV2"
    ApiDropV2PageWithoutCount:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropV2"
    ApiDropViewerModerationContext:
      type: object
      required:
        - author_blocked
        - drop_hidden
      properties:
        author_blocked:
          type: boolean
        drop_hidden:
          type: boolean
        report_status:
          type: string
          description: Latest non-withdrawn report state for the authenticated viewer.
    ApiDropVote:
      type: object
      required:
        - vote
        - voter
        - time
      properties:
        vote:
          type: number
          format: int64
        voter:
          $ref: "#/components/schemas/ApiProfileMin"
        time:
          type: number
          format: int64
    ApiDropVoteEditLog:
      type: object
      required:
        - id
        - old_vote
        - new_vote
        - created_at
        - voter
      properties:
        id:
          type: string
        old_vote:
          type: number
          format: int64
        new_vote:
          type: number
          format: int64
        created_at:
          type: integer
          format: int64
        voter:
          $ref: "#/components/schemas/ApiIdentityOverview"
    ApiDropVoter:
      type: object
      required:
        - voter
        - vote
      properties:
        voter:
          $ref: "#/components/schemas/ApiIdentityOverview"
        vote:
          type: number
          format: int64
    ApiDropVotersPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropVoter"
    ApiDropWinningContext:
      type: object
      required:
        - place
        - awards
        - decision_time
      properties:
        place:
          type: integer
          format: int64
        awards:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveDecisionAward"
        decision_time:
          type: integer
          format: int64
        sale_time:
          type: integer
          format: int64
          nullable: true
        sale_price:
          type: number
          nullable: true
        sale_price_currency:
          type: string
          nullable: true
    ApiDropWithoutWave:
      type: object
      required:
        - id
        - serial_no
        - drop_type
        - author
        - created_at
        - updated_at
        - referenced_nfts
        - mentioned_users
        - mentioned_groups
        - mentioned_waves
        - metadata
        - parts
        - parts_count
        - rating
        - rating_prediction
        - realtime_rating
        - top_raters
        - raters_count
        - title
        - subscribed_actions
        - context_profile_context
        - rank
        - is_signed
        - reactions
        - boosts
        - is_additional_action_promised
        - hide_link_preview
      properties:
        id:
          type: string
        serial_no:
          description: Sequence number of the drop in Seize
          type: number
          format: int64
        drop_type:
          $ref: "#/components/schemas/ApiDropType"
        rank:
          type: number
          format: int64
          nullable: true
        winning_context:
          $ref: "#/components/schemas/ApiDropWinningContext"
        reply_to:
          $ref: "#/components/schemas/ApiReplyToDropResponse"
        author:
          $ref: "#/components/schemas/ApiProfileMin"
        created_at:
          description: >-
            Time when the drop was created in milliseconds since 1-1-1970
            00:00:00.0 UTC
          type: number
          format: int64
        updated_at:
          description: >-
            Time when the drop was updated in milliseconds since 1-1-1970
            00:00:00.0 UTC
          type: number
          format: int64
          nullable: true
        title:
          type: string
          maxLength: 250
          nullable: true
        viewer_context:
          $ref: "#/components/schemas/ApiDropViewerModerationContext"
        moderation:
          $ref: "#/components/schemas/ApiDropModeration"
        parts:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropPart"
        parts_count:
          description: Number of drops in the storm
          type: number
          format: int64
        referenced_nfts:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropReferencedNFT"
        mentioned_users:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMentionedUser"
        mentioned_groups:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropGroupMention"
        mentioned_waves:
          type: array
          items:
            $ref: "#/components/schemas/ApiMentionedWave"
        metadata:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMetadataResponse"
        rating:
          type: number
          format: int64
        realtime_rating:
          type: number
          format: int64
        rating_prediction:
          type: number
          format: int64
        top_raters:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropRater"
        raters_count:
          type: number
          format: int64
        context_profile_context:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiDropContextProfileContext"
        subscribed_actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropSubscriptionTargetAction"
        is_signed:
          type: boolean
        reactions:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropReaction"
        boosts:
          type: number
          format: int64
        is_additional_action_promised:
          type: boolean
          nullable: true
        hide_link_preview:
          type: boolean
        poll:
          $ref: "#/components/schemas/ApiDropPoll"
        nft_links:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropNftLink"
    ApiDropWithoutWavesPageWithoutCount:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropWithoutWave"
    ApiErrorResponse:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: string
    ApiEthereumAddress:
      type: string
      pattern: ^0x[a-fA-F0-9]{40}$
    ApiEulaConsent:
      type: object
      additionalProperties: false
      properties:
        device_id:
          type: string
          minLength: 1
          maxLength: 100
        platform:
          type: string
          minLength: 1
          maxLength: 32
        accepted_at:
          type: integer
          format: int64
        eula_version:
          $ref: "#/components/schemas/ApiEulaVersion"
    ApiEulaVersion:
      type: string
      enum:
        - "2026-08-24"
    ApiFeedItem:
      type: object
      required:
        - serial_no
        - type
        - item
      properties:
        serial_no:
          type: number
          format: int64
        type:
          $ref: "#/components/schemas/ApiFeedItemType"
        item:
          type: object
    ApiFeedItemType:
      type: string
      enum:
        - WAVE_CREATED
        - DROP_CREATED
        - DROP_REPLIED
    ApiGlobalRepCategoryGiver:
      type: object
      required:
        - profile
        - total_rep
        - recipient_count
        - last_modified
      properties:
        profile:
          $ref: "#/components/schemas/ApiProfileMin"
        total_rep:
          type: number
          format: int64
        recipient_count:
          type: number
          format: int64
        last_modified:
          type: string
    ApiGlobalRepCategoryGiversPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryGiver"
    ApiGlobalRepCategoryOverview:
      type: object
      required:
        - category
        - total_rep
        - pair_count
        - giver_count
        - recipient_count
        - top_recipients
        - top_givers
        - recently_updated
      properties:
        category:
          type: string
        total_rep:
          type: number
          format: int64
        pair_count:
          type: number
          format: int64
        giver_count:
          type: number
          format: int64
        recipient_count:
          type: number
          format: int64
        top_recipients:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryRecipient"
        top_givers:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryGiver"
        recently_updated:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryRating"
    ApiGlobalRepCategoryRating:
      type: object
      required:
        - giver
        - recipient
        - rep
        - last_modified
        - category
      properties:
        giver:
          $ref: "#/components/schemas/ApiProfileMin"
        recipient:
          $ref: "#/components/schemas/ApiProfileMin"
        rep:
          type: number
          format: int64
        last_modified:
          type: string
        category:
          type: string
    ApiGlobalRepCategoryRatingsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryRating"
    ApiGlobalRepCategoryRecipient:
      type: object
      required:
        - profile
        - total_rep
        - rater_count
        - last_modified
      properties:
        profile:
          $ref: "#/components/schemas/ApiProfileMin"
        total_rep:
          type: number
          format: int64
        rater_count:
          type: number
          format: int64
        last_modified:
          type: string
    ApiGlobalRepCategoryRecipientsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryRecipient"
    ApiGlobalRepCategorySuggestedCategory:
      type: object
      required:
        - category
        - total_rep
        - profile_rep
        - wave_rep
        - rating_count
        - last_modified
      properties:
        category:
          type: string
        total_rep:
          type: number
          format: int64
        profile_rep:
          type: number
          format: int64
        wave_rep:
          type: number
          format: int64
        rating_count:
          type: number
          format: int64
        last_modified:
          type: string
    ApiGlobalRepCategoryWave:
      type: object
      required:
        - wave
        - total_rep
        - contributor_count
        - last_modified
        - top_contributors
      properties:
        wave:
          $ref: "#/components/schemas/ApiGlobalRepCategoryWaveRef"
        total_rep:
          type: number
          format: int64
        contributor_count:
          type: number
          format: int64
        last_modified:
          type: string
        top_contributors:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryWaveContributor"
    ApiGlobalRepCategoryWaveContributor:
      type: object
      required:
        - wave
        - profile
        - contribution
        - last_modified
      properties:
        wave:
          $ref: "#/components/schemas/ApiGlobalRepCategoryWaveRef"
        profile:
          $ref: "#/components/schemas/ApiProfileMin"
        contribution:
          type: number
          format: int64
        last_modified:
          type: string
    ApiGlobalRepCategoryWaveContributorsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryWaveContributor"
    ApiGlobalRepCategoryWaveOverview:
      type: object
      required:
        - category
        - total_rep
        - wave_count
        - contributor_count
        - top_waves
        - top_contributors
      properties:
        category:
          type: string
        total_rep:
          type: number
          format: int64
        wave_count:
          type: number
          format: int64
        contributor_count:
          type: number
          format: int64
        top_waves:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryWave"
        top_contributors:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryWaveContributor"
    ApiGlobalRepCategoryWaveRef:
      type: object
      required:
        - id
        - name
        - is_direct_message
      properties:
        id:
          type: string
        name:
          type: string
        pfp:
          type: string
          nullable: true
        is_direct_message:
          type: boolean
    ApiGlobalRepCategoryWavesPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiGlobalRepCategoryWave"
    ApiGroup:
      type: object
      required:
        - is_hidden
      properties:
        id:
          type: string
        name:
          type: string
        author:
          $ref: "#/components/schemas/ApiProfileMin"
        created_at:
          type: number
          format: int64
        is_hidden:
          type: boolean
        is_direct_message:
          type: boolean
    ApiGroupBeneficiaryGrantMatchMode:
      type: string
      enum:
        - ANY_TOKEN
        - ALL_TOKENS
    ApiGroupCicFilter:
      type: object
      required:
        - min
        - max
        - direction
        - user_identity
      properties:
        min:
          type: number
          format: int64
          nullable: true
        max:
          type: number
          format: int64
          nullable: true
        user_identity:
          type: string
          minLength: 1
          maxLength: 200
          nullable: true
        direction:
          example: RECEIVED
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiGroupFilterDirection"
    ApiGroupDescription:
      type: object
      required:
        - tdh
        - rep
        - cic
        - level
        - owns_nfts
        - identity_group_id
        - identity_group_identities_count
        - excluded_identity_group_id
        - excluded_identity_group_identities_count
        - is_beneficiary_of_grant_id
        - is_beneficiary_of_grant_match_mode
        - is_beneficiary_of_grant
      properties:
        tdh:
          $ref: "#/components/schemas/ApiGroupTdhFilter"
        rep:
          $ref: "#/components/schemas/ApiGroupRepFilter"
        cic:
          $ref: "#/components/schemas/ApiGroupCicFilter"
        level:
          $ref: "#/components/schemas/ApiGroupLevelFilter"
        owns_nfts:
          type: array
          items:
            $ref: "#/components/schemas/ApiGroupOwnsNft"
        identity_group_id:
          type: string
          nullable: true
        identity_group_identities_count:
          type: number
          format: int64
          nullable: false
        excluded_identity_group_id:
          type: string
          nullable: true
        excluded_identity_group_identities_count:
          type: number
          format: int64
          nullable: false
        is_beneficiary_of_grant_id:
          type: string
          nullable: true
        is_beneficiary_of_grant_match_mode:
          $ref: "#/components/schemas/ApiGroupBeneficiaryGrantMatchMode"
        is_beneficiary_of_grant:
          oneOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiXTdhGrant"
    ApiGroupFilterDirection:
      type: string
      enum:
        - RECEIVED
        - SENT
    ApiGroupFull:
      type: object
      required:
        - id
        - name
        - group
        - created_at
        - created_by
        - visible
        - is_private
      properties:
        id:
          type: string
        name:
          type: string
        group:
          $ref: "#/components/schemas/ApiGroupDescription"
        created_at:
          type: number
          format: int64
        created_by:
          $ref: "#/components/schemas/ApiProfileMin"
        visible:
          type: boolean
        is_private:
          type: boolean
        is_direct_message:
          type: boolean
    ApiGroupLevelFilter:
      type: object
      required:
        - min
        - max
      properties:
        min:
          type: number
          format: int64
          nullable: true
        max:
          type: number
          format: int64
          nullable: true
    ApiGroupMembersPreviewRequest:
      type: object
      required:
        - group
      properties:
        group:
          $ref: "#/components/schemas/ApiCreateGroupDescription"
    ApiGroupNftOwnershipMatchMode:
      type: string
      enum:
        - ANY_TOKEN
        - ALL_TOKENS
    ApiGroupOwnsNft:
      type: object
      required:
        - name
        - tokens
      properties:
        name:
          type: string
          enum:
            - MEMES
            - MEMELAB
            - NEXTGEN
            - GRADIENTS
        tokens:
          type: array
          items:
            type: string
        match_mode:
          $ref: "#/components/schemas/ApiGroupNftOwnershipMatchMode"
    ApiGroupRepFilter:
      type: object
      required:
        - min
        - max
        - category
        - direction
        - user_identity
      properties:
        min:
          type: number
          format: int64
          nullable: true
        max:
          type: number
          format: int64
          nullable: true
        category:
          type: string
          minLength: 1
          maxLength: 200
          nullable: true
        user_identity:
          type: string
          minLength: 1
          maxLength: 200
          nullable: true
        direction:
          example: RECEIVED
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiGroupFilterDirection"
    ApiGroupTdhFilter:
      type: object
      required:
        - min
        - max
        - inclusion_strategy
      properties:
        min:
          type: number
          minimum: 0
          format: int64
          nullable: true
        max:
          type: number
          minimum: 0
          format: int64
          nullable: true
        inclusion_strategy:
          $ref: "#/components/schemas/ApiGroupTdhInclusionStrategy"
    ApiGroupTdhInclusionStrategy:
      type: string
      enum:
        - TDH
        - XTDH
        - BOTH
    ApiIdentity:
      type: object
      required:
        - id
        - handle
        - normalised_handle
        - pfp
        - cic
        - rep
        - level
        - tdh
        - tdh_rate
        - xtdh
        - xtdh_rate
        - display
        - consolidation_key
        - classification
        - sub_classification
        - primary_wallet
        - banner1
        - banner2
        - active_main_stage_submission_ids
        - winner_main_stage_drop_ids
        - artist_of_prevote_cards
        - profile_wave_id
        - is_wave_creator
      properties:
        id:
          type: string
          nullable: true
        handle:
          type: string
          nullable: true
        normalised_handle:
          type: string
          nullable: true
        pfp:
          type: string
          nullable: true
        cic:
          type: integer
          format: int65
        rep:
          type: integer
          format: int65
        level:
          type: integer
          format: int65
        tdh:
          type: number
          format: double
        tdh_rate:
          type: number
          format: int64
        xtdh:
          type: number
          format: double
        xtdh_rate:
          type: number
          format: int64
        consolidation_key:
          type: string
        display:
          type: string
        primary_wallet:
          type: string
        banner1:
          type: string
          nullable: true
        banner2:
          type: string
          nullable: true
        classification:
          $ref: "#/components/schemas/ApiProfileClassification"
        sub_classification:
          type: string
          nullable: true
        query:
          type: string
          nullable: true
        wallets:
          type: array
          items:
            $ref: "#/components/schemas/ApiWallet"
        active_main_stage_submission_ids:
          type: array
          items:
            type: string
        winner_main_stage_drop_ids:
          type: array
          items:
            type: string
        artist_of_prevote_cards:
          type: array
          items:
            type: integer
            format: int64
        profile_wave_id:
          type: string
          nullable: true
        is_wave_creator:
          type: boolean
    ApiIdentityActivity:
      type: object
      required:
        - last_date
        - date_samples
      properties:
        last_date:
          type: string
          example: 12.03.2026
        date_samples:
          type: array
          minItems: 365
          maxItems: 365
          items:
            type: integer
            format: int64
            minimum: 0
    ApiIdentityAndSubscriptionActions:
      type: object
      required:
        - identity
        - actions
      properties:
        identity:
          $ref: "#/components/schemas/ApiProfileMin"
        actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiIdentitySubscriptionTargetAction"
    ApiIdentityMuteState:
      type: object
      required:
        - muted
      properties:
        muted:
          type: boolean
    ApiIdentityOverview:
      type: object
      required:
        - id
        - primary_address
        - level
        - classification
        - badges
      properties:
        id:
          type: string
        handle:
          type: string
        primary_address:
          type: string
        pfp:
          type: string
        level:
          type: integer
          format: int64
        classification:
          $ref: "#/components/schemas/ApiProfileClassification"
        context_profile_context:
          $ref: "#/components/schemas/ApiIdentityOverviewContextProfileContext"
        badges:
          $ref: "#/components/schemas/ApiIdentityOverviewBadges"
        wave_participation:
          $ref: "#/components/schemas/ApiIdentityWaveParticipation"
    ApiIdentityOverviewBadges:
      type: object
      required:
        - artist_of_main_stage_submissions
        - artist_of_memes
      properties:
        artist_of_main_stage_submissions:
          type: integer
          format: int64
        artist_of_memes:
          type: integer
          format: int64
        profile_wave_id:
          type: string
        profile_wave_name:
          type: string
        profile_wave_pfp:
          type: string
          nullable: true
    ApiIdentityOverviewContextProfileContext:
      type: object
      required:
        - subscribed
      properties:
        subscribed:
          type: boolean
    ApiIdentitySubscriptionActions:
      type: object
      required:
        - actions
      properties:
        actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiIdentitySubscriptionTargetAction"
    ApiIdentitySubscriptionTargetAction:
      type: string
      enum:
        - WAVE_CREATED
        - DROP_CREATED
        - DROP_REPLIED
        - DROP_VOTED
    ApiIdentitySubscriptionTargetType:
      type: string
      enum:
        - PROFILE
        - WAVE
        - DROP
    ApiIdentityWaveParticipation:
      type: object
      required:
        - is_participant
        - is_winner
      properties:
        is_participant:
          type: boolean
          description: >-
            Whether the identity currently has at least one active PARTICIPATORY
            drop in the wave.
        is_winner:
          type: boolean
          description: Whether the identity has at least one WINNER drop in the wave.
    ApiIncomingIdentitySubscriptionsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiIdentityAndSubscriptionActions"
    ApiIntRange:
      type: object
      required:
        - min
        - max
      properties:
        min:
          description: Included
          type: number
          format: int64
          nullable: true
        max:
          description: Included
          type: number
          format: int64
          nullable: true
    ApiLightDrop:
      type: object
      required:
        - id
        - wave_id
        - wave_name
        - author
        - created_at
        - serial_no
        - drop_type
        - part_1_text
        - part_1_medias
        - has_quote
        - is_reply_drop
        - title
      properties:
        id:
          type: string
        wave_id:
          type: string
        wave_name:
          type: string
        author:
          type: string
        created_at:
          type: number
          format: int64
        serial_no:
          description: Sequence number of the drop in Seize
          type: number
          format: int64
        drop_type:
          $ref: "#/components/schemas/ApiDropType"
        title:
          type: string
          maxLength: 250
          nullable: true
        viewer_context:
          $ref: "#/components/schemas/ApiDropViewerModerationContext"
        moderation:
          $ref: "#/components/schemas/ApiDropModeration"
        part_1_text:
          type: string
          nullable: true
        part_1_medias:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMedia"
        has_quote:
          type: boolean
        is_reply_drop:
          type: boolean
    ApiLoginRequest:
      type: object
      required:
        - client_address
        - client_signature
        - server_signature
        - is_safe_wallet
      properties:
        is_safe_wallet:
          type: boolean
        client_address:
          type: string
        client_signature:
          type: string
        server_signature:
          type: string
        role:
          type: string
    ApiLoginResponse:
      type: object
      required:
        - token
        - refresh_token
      properties:
        token:
          type: string
        refresh_token:
          type: string
    ApiMarkDropUnreadResponse:
      type: object
      required:
        - your_unread_drops_count
      properties:
        your_unread_drops_count:
          type: integer
        first_unread_drop_serial_no:
          type: integer
          nullable: true
        dm_unread_state:
          nullable: true
          allOf:
            - $ref: "#/components/schemas/ApiDmUnreadConversationState"
    ApiMarkWaveReadRequest:
      type: object
      properties:
        read_through_serial_no:
          type: integer
          minimum: 0
        request_dm_unread_state:
          type: boolean
    ApiMarkWaveReadResponse:
      type: object
      required:
        - dm_unread_state
      properties:
        dm_unread_state:
          nullable: true
          allOf:
            - $ref: "#/components/schemas/ApiDmUnreadConversationState"
    ApiMediaResolveRequest:
      type: object
      required:
        - inputs
      properties:
        inputs:
          type: array
          minItems: 1
          maxItems: 100
          items:
            type: string
        include_external_fallbacks:
          type: boolean
          default: true
    ApiMediaResolveResponse:
      type: object
      required:
        - items
      properties:
        items:
          type: array
          items:
            $ref: "#/components/schemas/ApiDecentralizedMediaResolution"
    ApiMediaUploadMimeType:
      type: string
      enum:
        - image/png
        - image/jpeg
        - image/jpg
        - image/gif
        - video/mp4
        - video/x-msvideo
        - audio/mpeg
        - audio/mpeg3
        - audio/ogg
        - audio/mp3
        - audio/wav
        - audio/aac
        - audio/x-aac
        - model/gltf-binary
        - video/quicktime
        - image/webp
    ApiMemeCardDropMapping:
      type: object
      required:
        - meme_card_id
        - drop_id
      properties:
        meme_card_id:
          type: integer
          format: int64
          minimum: 1
        drop_id:
          type: string
    ApiMemesExtendedData:
      type: object
      description: >-
        Meme Card NFT data plus extended collection metrics. Positive rank
        values are ranked against `ranked_collection_size` when that value is
        present. `collection_size` remains the total Meme Cards collection size.
        A rank value of `-1` represents an unranked card when `recorded_in_tdh`
        is `false`; `recorded_in_tdh: null` or an absent value is a
        legacy/transitional state.
      required:
        - collection_size
        - edition_size
        - edition_size_rank
        - museum_holdings
        - museum_holdings_rank
        - edition_size_cleaned
        - edition_size_cleaned_rank
        - hodlers
        - hodlers_rank
        - percent_unique
        - percent_unique_rank
        - percent_unique_cleaned
        - percent_unique_cleaned_rank
        - burnt
        - edition_size_not_burnt
        - edition_size_not_burnt_rank
        - percent_unique_not_burnt
        - percent_unique_not_burnt_rank
        - season
        - meme
        - meme_name
      allOf:
        - $ref: "#/components/schemas/ApiNft"
      properties:
        collection_size:
          type: integer
          format: int64
          description: Total Meme Cards collection size.
        edition_size:
          type: integer
          format: int64
        edition_size_rank:
          type: integer
          format: int64
          description: Positive rank for TDH-recorded cards, or -1 when unranked.
        museum_holdings:
          type: integer
          format: int64
        museum_holdings_rank:
          type: integer
          format: int64
          description: Positive rank for TDH-recorded cards, or -1 when unranked.
        edition_size_cleaned:
          type: integer
          format: int64
        edition_size_cleaned_rank:
          type: integer
          format: int64
          description: Positive rank for TDH-recorded cards, or -1 when unranked.
        hodlers:
          type: integer
          format: int64
        hodlers_rank:
          type: integer
          format: int64
          description: Positive rank for TDH-recorded cards, or -1 when unranked.
        percent_unique:
          type: number
          format: double
        percent_unique_rank:
          type: integer
          format: int64
          description: Positive rank for TDH-recorded cards, or -1 when unranked.
        percent_unique_cleaned:
          type: number
          format: double
        percent_unique_cleaned_rank:
          type: integer
          format: int64
          description: Positive rank for TDH-recorded cards, or -1 when unranked.
        burnt:
          type: integer
          format: int64
        edition_size_not_burnt:
          type: integer
          format: int64
        edition_size_not_burnt_rank:
          type: integer
          format: int64
          description: Positive rank for TDH-recorded cards, or -1 when unranked.
        percent_unique_not_burnt:
          type: number
          format: double
        percent_unique_not_burnt_rank:
          type: integer
          format: int64
          description: Positive rank for TDH-recorded cards, or -1 when unranked.
        season:
          type: integer
          format: int64
        meme:
          type: integer
          format: int64
        meme_name:
          type: string
        recorded_in_tdh:
          type: boolean
          nullable: true
          description: >-
            True when this Meme Card is present in TDH NFT records, false when
            it is known not to be recorded yet, and null/absent during legacy or
            fallback states.
        ranked_collection_size:
          type: integer
          format: int64
          nullable: true
          description: >-
            Rank denominator for TDH-recorded cards. Null for unranked, legacy,
            or fallback rows.
    ApiMemesExtendedDataPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiMemesExtendedData"
    ApiMemesMintStat:
      type: object
      required:
        - id
        - mint_date
        - total_count
        - mint_count
        - subscriptions_count
        - proceeds_eth
        - proceeds_usd
        - artist_split_eth
        - artist_split_usd
        - payment_details
      properties:
        id:
          type: integer
          format: int64
        mint_date:
          type: string
          format: date-time
          nullable: true
        total_count:
          type: integer
          format: int64
        mint_count:
          type: integer
          format: int64
        subscriptions_count:
          type: integer
          format: int64
        proceeds_eth:
          type: number
          format: double
        proceeds_usd:
          type: number
          format: double
        artist_split_eth:
          type: number
          format: double
        artist_split_usd:
          type: number
          format: double
        payment_details:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiPaymentDetails"
    ApiMemesMintStatsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiMemesMintStat"
    ApiMemesMintStatsTotals:
      type: object
      required:
        - total_count
        - mint_count
        - subscriptions_count
        - proceeds_eth
        - proceeds_usd
        - artist_split_eth
        - artist_split_usd
        - artists_count
      properties:
        total_count:
          type: integer
          format: int64
        mint_count:
          type: integer
          format: int64
        subscriptions_count:
          type: integer
          format: int64
        proceeds_eth:
          type: number
          format: double
        proceeds_usd:
          type: number
          format: double
        artist_split_eth:
          type: number
          format: double
        artist_split_usd:
          type: number
          format: double
        artists_count:
          type: integer
          format: int64
    ApiMemesMintStatsYearly:
      type: object
      required:
        - year
        - total_count
        - mint_count
        - subscriptions_count
        - proceeds_eth
        - proceeds_usd
        - artist_split_eth
        - artist_split_usd
      properties:
        year:
          type: integer
          format: int64
        total_count:
          type: integer
          format: int64
        mint_count:
          type: integer
          format: int64
        subscriptions_count:
          type: integer
          format: int64
        proceeds_eth:
          type: number
          format: double
        proceeds_usd:
          type: number
          format: double
        artist_split_eth:
          type: number
          format: double
        artist_split_usd:
          type: number
          format: double
    ApiMentionAlias:
      type: object
      required:
        - id
        - alias
        - members
      properties:
        id:
          type: string
          format: uuid
        alias:
          type: string
          minLength: 3
          maxLength: 15
          pattern: ^[A-Za-z0-9_]+$
        members:
          type: array
          maxItems: 25
          items:
            $ref: "#/components/schemas/ApiMentionAliasMember"
    ApiMentionAliasMember:
      type: object
      required:
        - profile_id
        - handle
      properties:
        profile_id:
          type: string
        handle:
          type: string
        pfp:
          type: string
          nullable: true
    ApiMentionAliasRequest:
      type: object
      required:
        - alias
        - member_profile_ids
      properties:
        alias:
          type: string
          minLength: 3
          description: Up to 15 alias characters, optionally prefixed with @.
          pattern: ^@?[A-Za-z0-9_]{3,15}$
        member_profile_ids:
          type: array
          minItems: 1
          maxItems: 25
          uniqueItems: true
          items:
            type: string
            maxLength: 100
            pattern: ^[A-Za-z0-9_-]+$
    ApiMentionedWave:
      type: object
      required:
        - wave_name_in_content
        - wave_id
      properties:
        wave_name_in_content:
          type: string
          minLength: 1
        wave_id:
          type: string
        wave:
          $ref: "#/components/schemas/ApiWaveMin"
    ApiMentionedWaveV2:
      type: object
      required:
        - id
        - in_content
      properties:
        id:
          type: string
        name:
          type: string
        pfp:
          type: string
        in_content:
          type: string
    ApiMintingClaimAction:
      type: object
      required:
        - action
        - completed
      properties:
        action:
          type: string
          minLength: 1
          pattern: ^[A-Z0-9_]+$
          description: Contract-specific minting claim action name
        completed:
          type: boolean
        created_at:
          type: integer
          format: int64
          description: Unix epoch milliseconds when this action record was created
        updated_at:
          type: integer
          format: int64
          description: Unix epoch milliseconds when this action record was last updated
        created_by_wallet:
          $ref: "#/components/schemas/ApiEthereumAddress"
          description: Wallet that first created this action record
        updated_by_wallet:
          $ref: "#/components/schemas/ApiEthereumAddress"
          description: Wallet that last updated this action record
    ApiMintingClaimActionsResponse:
      type: object
      required:
        - contract
        - claim_id
        - actions
      properties:
        contract:
          type: string
        claim_id:
          type: integer
          format: int64
        actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiMintingClaimAction"
    ApiMintingClaimActionTypesResponse:
      type: object
      required:
        - contract
        - action_types
      properties:
        contract:
          type: string
        action_types:
          type: array
          items:
            type: string
            minLength: 1
            description: Contract-specific minting claim action name
    ApiMintingClaimActionUpdateRequest:
      type: object
      required:
        - action
        - completed
      properties:
        action:
          type: string
          minLength: 1
          pattern: ^[A-Z0-9_]+$
          description: Contract-specific minting claim action name
        completed:
          type: boolean
    ApiMintingClaimsPhaseTotalItem:
      type: object
      required:
        - phase
        - addresses
        - total
      properties:
        phase:
          type: string
          description: Phase name
        addresses:
          type: integer
          format: int64
          minimum: 0
          description: Number of unique addresses in this phase
        total:
          type: integer
          format: int64
          minimum: 0
          description: Sum of spots for this phase
    ApiMintMetrics:
      type: object
      required:
        - card
        - mint_time
        - subscriptions
        - mints
        - edition_size
        - unminted
      properties:
        card:
          type: number
          format: int64
        mint_time:
          type: number
          format: int64
        subscriptions:
          type: number
          format: int64
        mints:
          type: number
          format: int64
        edition_size:
          type: number
          format: int64
          nullable: true
        unminted:
          type: number
          format: int64
    ApiMintMetricsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiMintMetrics"
    ApiModeratedProfileStatus:
      type: string
      enum:
        - ACTIVE
        - SUSPENDED
    ApiNft:
      type: object
      required:
        - id
        - contract
        - mint_price
        - supply
        - name
        - collection
        - token_type
        - hodl_rate
        - description
        - artist
        - uri
        - thumbnail
        - image
        - animation
        - metadata
        - tdh
        - tdh__raw
        - tdh_rank
        - market_cap
        - floor_price
        - floor_price_from
        - scaled
        - compressed_animation
        - icon
        - total_volume_last_24_hours
        - total_volume_last_7_days
        - total_volume_last_1_month
        - total_volume
        - created_at
        - mint_date
        - boosted_tdh
        - artist_seize_handle
        - has_distribution
        - highest_offer
        - highest_offer_from
      properties:
        id:
          type: integer
          format: int64
        contract:
          type: string
        mint_price:
          type: number
          format: float
        supply:
          type: integer
          format: int64
        name:
          type: string
        collection:
          type: string
        token_type:
          type: string
          enum:
            - ERC1155
            - ERC721
        hodl_rate:
          type: number
          format: float
        description:
          type: string
        artist:
          type: string
        uri:
          type: string
          nullable: true
        thumbnail:
          type: string
        image:
          type: string
          nullable: true
        animation:
          type: string
          nullable: true
        metadata:
          type: object
        tdh:
          type: number
          format: int64
        tdh__raw:
          type: number
          format: int64
        tdh_rank:
          type: number
          format: int64
        market_cap:
          type: number
          format: float
        floor_price:
          type: number
          format: float
        floor_price_from:
          type: string
          nullable: true
        scaled:
          type: string
        compressed_animation:
          type: string
          nullable: true
        icon:
          type: string
        total_volume_last_24_hours:
          type: number
          format: float
        total_volume_last_7_days:
          type: number
          format: float
        total_volume_last_1_month:
          type: number
          format: float
        total_volume:
          type: number
          format: float
        created_at:
          type: string
          format: date-time
        mint_date:
          type: string
          format: date-time
          nullable: true
        boosted_tdh:
          type: number
          format: int64
        artist_seize_handle:
          type: string
          nullable: true
        has_distribution:
          type: boolean
        highest_offer:
          type: number
          format: float
        highest_offer_from:
          type: string
          nullable: true
    ApiNftLinkData:
      type: object
      required:
        - canonical_id
        - platform
        - chain
        - contract
        - token
        - name
        - description
        - media_uri
        - last_error_message
        - price
        - price_currency
        - last_successfully_updated
        - failed_since
        - media_preview
      properties:
        canonical_id:
          type: string
        platform:
          type: string
        chain:
          type: string
          nullable: true
        contract:
          type: string
          nullable: true
        token:
          type: string
          nullable: true
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        media_uri:
          type: string
          nullable: true
        last_error_message:
          type: string
          nullable: true
        price:
          type: string
          nullable: true
        price_currency:
          type: string
          nullable: true
        last_successfully_updated:
          type: integer
          format: int64
          nullable: true
        failed_since:
          type: integer
          format: int64
          nullable: true
        media_preview:
          anyOf:
            - $ref: "#/components/schemas/ApiNftLinkMediaPreview"
            - type: "null"
    ApiNftLinkMediaPreview:
      type: object
      required:
        - status
        - kind
        - card_url
        - thumb_url
        - small_url
        - width
        - height
        - mime_type
      properties:
        status:
          type: string
          enum:
            - PENDING
            - PROCESSING
            - READY
            - FAILED
            - SKIPPED
        kind:
          type: string
          nullable: true
        card_url:
          type: string
          nullable: true
        thumb_url:
          type: string
          nullable: true
        small_url:
          type: string
          nullable: true
        width:
          type: integer
          format: int64
          nullable: true
        height:
          type: integer
          format: int64
          nullable: true
        mime_type:
          type: string
          nullable: true
    ApiNftLinkResponse:
      type: object
      required:
        - is_enrichable
        - validation_error
        - data
      properties:
        is_enrichable:
          type: boolean
        validation_error:
          type: string
          nullable: true
        data:
          anyOf:
            - $ref: "#/components/schemas/ApiNftLinkData"
            - type: "null"
    ApiNftMedia:
      type: object
      required:
        - id
        - image
        - image_compact
        - animation
        - animation_compact
      properties:
        id:
          type: string
          description: The unique identifier for the NFT media
        image:
          type: string
          description: The URL of the NFT image
        animation:
          type: string
          description: The URL of the NFT animation, if available
    ApiNftOwner:
      type: object
      required:
        - created_at
        - updated_at
        - token_id
        - contract
        - balance
        - consolidation_key
      properties:
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        token_id:
          type: integer
          format: int64
        contract:
          type: string
        balance:
          type: integer
          format: int64
        consolidation_key:
          type: string
    ApiNftOwnerPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiNftOwner"
    ApiNftsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiNft"
    ApiNonceResponse:
      type: object
      required:
        - nonce
        - server_signature
      properties:
        nonce:
          type: string
        server_signature:
          type: string
    ApiNotification:
      type: object
      required:
        - id
        - cause
        - created_at
        - read_at
        - related_identity
        - related_drops
        - additional_context
      properties:
        id:
          type: number
          format: int64
        cause:
          $ref: "#/components/schemas/ApiNotificationCause"
        created_at:
          type: number
          format: int64
        read_at:
          type: number
          format: int64
          nullable: true
        related_identity:
          allOf:
            - $ref: "#/components/schemas/ApiProfileMin"
          nullable: true
        related_drops:
          type: array
          items:
            $ref: "#/components/schemas/ApiDrop"
        additional_context:
          type: object
    ApiNotificationAdditionalContextV2:
      type: object
      properties:
        amount:
          type: number
          format: double
        rater_rating:
          type: number
          format: double
        total:
          type: number
          format: double
        category:
          type: string
        vote:
          type: number
          format: double
        vote_change:
          type: number
          format: double
        total_vote:
          type: number
          format: double
        reaction:
          type: string
        reactors:
          type: array
          items:
            $ref: "#/components/schemas/ApiNotificationDropReactedReactor"
        poll_options:
          type: array
          items:
            $ref: "#/components/schemas/ApiNotificationPollVoteOption"
        quote_drop_id:
          type: string
        quote_drop_part:
          type: number
          format: int64
        quoted_drop_id:
          type: string
        quoted_drop_part:
          type: number
          format: int64
        reply_drop_id:
          type: string
        replied_drop_id:
          type: string
        replied_drop_part:
          type: number
          format: int64
        wave_id:
          type: string
        recipient_profile_id:
          type: string
        profile_handle:
          type: string
        status:
          $ref: "#/components/schemas/ApiSubscriptionCoverageStatus"
        consolidation_key:
          type: string
        mint_capacity:
          type: integer
          format: int64
          minimum: 0
        allocated_mints:
          type: integer
          format: int64
          minimum: 0
        fully_funded_drops:
          type: integer
          format: int64
          minimum: 0
        funded_through:
          allOf:
            - $ref: "#/components/schemas/ApiSubscriptionCoveragePoint"
          nullable: true
        next_unfunded:
          allOf:
            - $ref: "#/components/schemas/ApiSubscriptionCoverageNotificationRisk"
          nullable: true
        minimum_top_up_eth:
          type: string
          nullable: true
        top_up_deadline:
          type: string
          format: date-time
          nullable: true
        calculation_version:
          type: integer
          format: int64
          minimum: 1
        forecast_fingerprint:
          type: string
      description: >-
        Notification-specific additional context. For DROP_REACTED notifications
        this includes reaction and reactors, where each reactor only has handle,
        pfp, and subscribed.
    ApiNotificationCause:
      type: string
      enum:
        - IDENTITY_SUBSCRIBED
        - IDENTITY_MENTIONED
        - IDENTITY_REP
        - IDENTITY_NIC
        - DROP_QUOTED
        - DROP_REPLIED
        - DROP_VOTED
        - DROP_POLL_VOTED
        - DROP_REACTED
        - DROP_BOOSTED
        - WAVE_CREATED
        - ALL_DROPS
        - PRIORITY_ALERT
        - SUBSCRIPTION_COVERAGE
    ApiNotificationDropReactedReactor:
      type: object
      required:
        - subscribed
      properties:
        handle:
          type: string
        pfp:
          type: string
        subscribed:
          type: boolean
    ApiNotificationPollVoteOption:
      type: object
      required:
        - option_no
        - option_string
      properties:
        option_no:
          type: integer
          format: int64
          minimum: 1
        option_string:
          type: string
    ApiNotificationsResponse:
      type: object
      required:
        - notifications
        - unread_count
      properties:
        notifications:
          type: array
          items:
            $ref: "#/components/schemas/ApiNotification"
        unread_count:
          type: number
          format: int64
    ApiNotificationsResponseV2:
      type: object
      required:
        - notifications
        - unread_count
      properties:
        notifications:
          type: array
          items:
            $ref: "#/components/schemas/ApiNotificationV2"
        unread_count:
          type: number
          format: int64
    ApiNotificationV2:
      type: object
      required:
        - id
        - cause
        - created_at
        - read_at
        - related_identity
        - related_drops
        - additional_context
      properties:
        id:
          type: number
          format: int64
        cause:
          $ref: "#/components/schemas/ApiNotificationCause"
        created_at:
          type: number
          format: int64
        read_at:
          type: number
          format: int64
          nullable: true
        related_identity:
          allOf:
            - $ref: "#/components/schemas/ApiIdentityOverview"
          nullable: true
        related_drops:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropV2"
        related_wave:
          $ref: "#/components/schemas/ApiWaveOverview"
        additional_context:
          $ref: "#/components/schemas/ApiNotificationAdditionalContextV2"
    ApiOgMediaAsset:
      type: object
      required:
        - url
      properties:
        url:
          type: string
          maxLength: 2000
        mime_type:
          type: string
          maxLength: 100
          nullable: true
        width:
          type: integer
          format: int64
          nullable: true
        height:
          type: integer
          format: int64
          nullable: true
    ApiOgMetadata:
      type: object
      required:
        - entity_type
        - entity_id
      properties:
        entity_type:
          $ref: "#/components/schemas/ApiOgMetadataEntityType"
        entity_id:
          type: string
        author:
          $ref: "#/components/schemas/ApiOgMetadataProfile"
        profile:
          $ref: "#/components/schemas/ApiOgMetadataProfile"
        wave:
          $ref: "#/components/schemas/ApiOgMetadataWave"
        drop:
          $ref: "#/components/schemas/ApiOgMetadataDrop"
    ApiOgMetadataDrop:
      type: object
      required:
        - id
        - serial_no
        - drop_type
      properties:
        id:
          type: string
        serial_no:
          type: integer
          format: int64
        drop_type:
          $ref: "#/components/schemas/ApiDropMainType"
        submission_status:
          $ref: "#/components/schemas/ApiSubmissionDropStatus"
        submitted_at:
          type: integer
          format: int64
          nullable: true
        won_at:
          type: integer
          format: int64
          nullable: true
        is_additional_action_promised:
          type: boolean
          nullable: true
        title:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        content:
          type: string
          nullable: true
        votes:
          $ref: "#/components/schemas/ApiSubmissionDropVoting"
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiOgMediaAsset"
        files:
          type: array
          items:
            $ref: "#/components/schemas/ApiAttachment"
    ApiOgMetadataEntityType:
      type: string
      enum:
        - PROFILE
        - WAVE
        - DROP
    ApiOgMetadataProfile:
      type: object
      required:
        - id
      properties:
        id:
          type: string
        handle:
          type: string
          nullable: true
        primary_address:
          type: string
          nullable: true
        profile_enabled_at:
          type: integer
          format: int64
          nullable: true
        classification:
          $ref: "#/components/schemas/ApiProfileClassification"
        sub_classification:
          type: string
          nullable: true
        followers_count:
          type: integer
          format: int64
        has_active_submissions:
          type: boolean
        has_winning_submissions:
          type: boolean
        cic:
          type: integer
          format: int64
          nullable: true
        rep:
          type: integer
          format: int64
          nullable: true
        level:
          type: integer
          format: int64
          nullable: true
        tdh:
          type: number
          format: double
          nullable: true
        description:
          type: string
          nullable: true
        twitter_handle:
          type: string
          nullable: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiOgMediaAsset"
        banner:
          $ref: "#/components/schemas/ApiOgMetadataProfileBanner"
    ApiOgMetadataProfileBanner:
      type: object
      required:
        - primary
        - secondary
        - media
      properties:
        primary:
          type: string
          nullable: true
        secondary:
          type: string
          nullable: true
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiOgMediaAsset"
    ApiOgMetadataWave:
      type: object
      required:
        - id
        - name
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
          nullable: true
        subscribers_count:
          type: integer
          format: int64
        drops_count:
          type: integer
          format: int64
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiOgMediaAsset"
    ApiOutgoingIdentitySubscriptionsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiTargetAndSubscriptionActions"
    ApiOwnerBalance:
      type: object
      required:
        - consolidation_key
        - created_at
        - updated_at
        - total_balance
        - gradients_balance
        - nextgen_balance
        - memelab_balance
        - unique_memelab
        - memes_balance
        - unique_memes
        - genesis
        - nakamoto
        - memes_cards_sets
        - memes_cards_sets_minus1
        - memes_cards_sets_minus2
        - boost
        - boosted_tdh
        - boosted_memes_tdh
        - boosted_gradients_tdh
        - boosted_nextgen_tdh
        - total_balance_rank
        - memes_balance_rank
        - unique_memes_rank
        - gradients_balance_rank
        - nextgen_balance_rank
        - memelab_balance_rank
        - unique_memelab_rank
        - boosted_tdh_rank
        - xtdh
        - xtdh_rank
        - boosted_memes_tdh_rank
        - boosted_gradients_tdh_rank
        - boosted_nextgen_tdh_rank
      properties:
        consolidation_key:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        total_balance:
          type: integer
          format: int64
        gradients_balance:
          type: integer
          format: int64
        nextgen_balance:
          type: integer
          format: int64
        memelab_balance:
          type: integer
          format: int64
        unique_memelab:
          type: integer
          format: int64
        memes_balance:
          type: integer
          format: int64
        unique_memes:
          type: integer
          format: int64
        genesis:
          type: integer
          format: int64
        nakamoto:
          type: integer
          format: int64
        memes_cards_sets:
          type: integer
          format: int64
        memes_cards_sets_minus1:
          type: integer
          format: int64
        memes_cards_sets_minus2:
          type: integer
          format: int64
        boost:
          type: number
          format: double
        boosted_tdh:
          type: integer
          format: int64
        boosted_memes_tdh:
          type: integer
          format: int64
        boosted_gradients_tdh:
          type: integer
          format: int64
        boosted_nextgen_tdh:
          type: integer
          format: int64
        total_balance_rank:
          type: integer
          format: int64
        memes_balance_rank:
          type: integer
          format: int64
        unique_memes_rank:
          type: integer
          format: int64
        gradients_balance_rank:
          type: integer
          format: int64
        nextgen_balance_rank:
          type: integer
          format: int64
        memelab_balance_rank:
          type: integer
          format: int64
        unique_memelab_rank:
          type: integer
          format: int64
        boosted_tdh_rank:
          type: integer
          format: int64
        boosted_memes_tdh_rank:
          type: integer
          format: int64
        boosted_gradients_tdh_rank:
          type: integer
          format: int64
        boosted_nextgen_tdh_rank:
          type: integer
          format: int64
        xtdh:
          type: number
          format: double
        xtdh_rank:
          type: integer
          format: int64
    ApiOwnerBalanceMemes:
      type: object
      required:
        - consolidation_key
        - created_at
        - updated_at
        - season
        - balance
        - unique
        - sets
        - boosted_tdh
        - rank
      properties:
        consolidation_key:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        season:
          type: integer
          format: int64
        balance:
          type: integer
          format: int64
        unique:
          type: integer
          format: int64
        sets:
          type: integer
          format: int64
        boosted_tdh:
          type: integer
          format: int64
        rank:
          type: integer
          format: int64
    ApiOwnerBalancePage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiOwnerBalance"
    ApiPageBase:
      type: object
      required:
        - count
        - page
        - next
      properties:
        count:
          type: number
          format: int64
        page:
          type: number
          format: int64
        next:
          type: boolean
    ApiPageSortDirection:
      type: string
      enum:
        - ASC
        - DESC
    ApiPageWithNextUriBase:
      type: object
      required:
        - count
        - page
        - next
      properties:
        count:
          type: number
          format: int64
        page:
          type: number
          format: int64
        next:
          type: string
          nullable: true
    ApiPageWithoutCount:
      type: object
      required:
        - page
        - next
      properties:
        page:
          type: number
          format: int64
        next:
          type: boolean
    ApiPaymentDetails:
      type: object
      required:
        - payment_address
        - has_designated_payee
        - designated_payee_name
      properties:
        payment_address:
          $ref: "#/components/schemas/ApiEthereumAddress"
        has_designated_payee:
          type: boolean
        designated_payee_name:
          type: string
    ApiProfileBlockState:
      type: object
      required:
        - blocked
      properties:
        blocked:
          type: boolean
    ApiProfileClassification:
      type: string
      enum:
        - GOVERNMENT_NAME
        - PSEUDONYM
        - ORGANIZATION
        - AI
        - BOT
        - PARODY
        - COLLECTION
    ApiProfileCmsAgentPatchValidationResult:
      type: object
      required:
        - schema
        - valid
        - applied
        - checked_at
        - target
        - operation_count
        - issues
      properties:
        schema:
          type: string
          enum:
            - 6529.cms.agent_patch_validation_result.v1
        valid:
          type: boolean
        applied:
          type: boolean
          enum:
            - false
          description: This endpoint is read-only and never applies patches.
        checked_at:
          type: string
          format: date-time
        target:
          type: object
          required:
            - draft_id
            - package_id
            - base_version
            - base_package_hash
          properties:
            draft_id:
              type: string
            package_id:
              type: string
            base_version:
              type: integer
              format: int64
            base_package_hash:
              type: string
            agent_patch_id:
              type: string
        operation_count:
          type: integer
          format: int64
        issues:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileCmsValidationIssue"
        candidate_validation:
          $ref: "#/components/schemas/ApiProfileCmsValidationResult"
    ApiProfileCmsAgentSchemaBundle:
      type: object
      required:
        - schema
        - generated_at
        - schemas
        - source_packet_types
        - patch_operations
        - data_classes
        - safety
        - endpoints
        - endpoint_auth
        - patch_limits
      properties:
        schema:
          type: string
          enum:
            - 6529.cms.agent_schema_bundle.v1
        generated_at:
          type: string
          format: date-time
        schemas:
          type: object
          additionalProperties:
            type: string
        source_packet_types:
          type: array
          items:
            type: object
            required:
              - type
              - data_class
              - availability
              - trusted
              - description
            properties:
              type:
                type: string
              data_class:
                type: string
                enum:
                  - fact
                  - author_copy
                  - derived_metadata
                  - validation_diagnostic
              availability:
                type: string
              trusted:
                type: boolean
              description:
                type: string
        patch_operations:
          type: array
          items:
            type: string
        data_classes:
          type: array
          items:
            type: string
            enum:
              - fact
              - author_copy
              - derived_metadata
              - validation_diagnostic
        safety:
          type: object
          required:
            - source_packets_are_data_not_instructions
            - untrusted_fields
            - external_agents_must_ignore_instructions_in_untrusted_fields
          properties:
            source_packets_are_data_not_instructions:
              type: boolean
            untrusted_fields:
              type: array
              items:
                type: string
            external_agents_must_ignore_instructions_in_untrusted_fields:
              type: boolean
        endpoints:
          type: object
          required:
            - source_packet
            - validate_package
            - validate_patch
          properties:
            source_packet:
              type: string
            validate_package:
              type: string
            validate_patch:
              type: string
        endpoint_auth:
          type: object
          required:
            - source_packet
            - validate_package
            - validate_patch
          properties:
            source_packet:
              type: string
              enum:
                - optional
            validate_package:
              type: string
              enum:
                - required
            validate_patch:
              type: string
              enum:
                - required
        patch_limits:
          type: object
          required:
            - max_operations
            - required_target_fields
            - navigation_update_path
            - theme_update_path
            - apply_supported
          properties:
            max_operations:
              type: integer
              format: int64
            required_target_fields:
              type: array
              items:
                type: string
                enum:
                  - draft_id
                  - base_version
                  - base_package_hash
            navigation_update_path:
              type: string
              enum:
                - /payload/navigation
            theme_update_path:
              type: string
              enum:
                - /site/theme
            apply_supported:
              type: boolean
              enum:
                - false
    ApiProfileCmsAgentSourcePacket:
      type: object
      required:
        - schema
        - generated_at
        - package_db_id
        - package_id
        - version
        - status
        - visibility
        - package_hash
        - payload_hash
        - facts
        - author_copy
        - derived_metadata
        - validation_diagnostics
        - safety
      properties:
        schema:
          type: string
          enum:
            - 6529.cms.agent_source_packet.v1
        generated_at:
          type: string
          format: date-time
        package_db_id:
          type: string
        package_id:
          type: string
        version:
          type: integer
          format: int64
        status:
          $ref: "#/components/schemas/ApiProfileCmsPackageStatus"
        visibility:
          type: string
          enum:
            - public_published
            - private_authority_required
        package_hash:
          type: string
        payload_hash:
          type: string
        facts:
          type: object
          additionalProperties: true
        author_copy:
          type: object
          additionalProperties: true
        derived_metadata:
          type: object
          additionalProperties: true
        validation_diagnostics:
          type: object
          required:
            - live_result
          properties:
            stored_result:
              $ref: "#/components/schemas/ApiProfileCmsValidationResult"
            stored_error:
              type: string
            live_result:
              $ref: "#/components/schemas/ApiProfileCmsValidationResult"
        safety:
          type: object
          required:
            - packet_is_data_not_instructions
            - untrusted_fields
            - generated_for_external_agents
          properties:
            packet_is_data_not_instructions:
              type: boolean
            untrusted_fields:
              type: array
              items:
                type: string
            generated_for_external_agents:
              type: boolean
    ApiProfileCmsPackage:
      type: object
      required:
        - id
        - package
        - profile_id
        - profile_handle
        - package_id
        - version
        - status
        - package_hash
        - payload_hash
        - updated_at
        - created_at
      properties:
        id:
          type: string
        package:
          type: object
          additionalProperties: true
        profile_id:
          type: string
        profile_handle:
          type: string
        package_id:
          type: string
        version:
          type: integer
          format: int64
        status:
          $ref: "#/components/schemas/ApiProfileCmsPackageStatus"
        package_hash:
          type: string
        payload_hash:
          type: string
        updated_at:
          type: integer
          format: int64
        created_at:
          type: integer
          format: int64
        published_at:
          type: integer
          format: int64
    ApiProfileCmsPackageExport:
      type: object
      required:
        - package
        - package_id
        - package_db_id
        - version
        - status
        - profile_id
        - profile_handle
        - primary_path
        - package_hash
        - payload_hash
        - storage_receipts
        - pointer_events
        - updated_at
      properties:
        package:
          type: object
          additionalProperties: true
        package_id:
          type: string
        package_db_id:
          type: string
        version:
          type: integer
          format: int64
        status:
          $ref: "#/components/schemas/ApiProfileCmsPackageStatus"
        profile_id:
          type: string
        profile_handle:
          type: string
        primary_path:
          type: string
        package_hash:
          type: string
        payload_hash:
          type: string
        storage_receipts:
          type: array
          items:
            type: object
            additionalProperties: true
        pointer_events:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileCmsPointerEvent"
        updated_at:
          type: integer
          format: int64
        published_at:
          type: integer
          format: int64
    ApiProfileCmsPackageStatus:
      type: string
      enum:
        - draft
        - validating
        - published
        - failed
        - archived
        - superseded
    ApiProfileCmsPointerEvent:
      type: object
      required:
        - id
        - event_type
        - profile_id
        - profile_handle
        - package_id
        - package_db_id
        - package_version
        - package_hash
        - payload_hash
        - actor_profile_id
        - event_sequence
        - created_at
      properties:
        id:
          type: string
        event_type:
          type: string
          enum:
            - publish
            - set_primary
            - supersede
            - rollback
            - archive
        profile_id:
          type: string
        profile_handle:
          type: string
        package_id:
          type: string
        package_db_id:
          type: string
        package_version:
          type: integer
          format: int64
        package_hash:
          type: string
        payload_hash:
          type: string
        previous_package_db_id:
          type: string
        actor_profile_id:
          type: string
        signer_address:
          type: string
        typed_data_hash:
          type: string
        storage_receipt:
          type: object
          additionalProperties: true
        event_sequence:
          type: integer
          format: int64
          description: Logical ordering for pointer events created in the same millisecond.
        created_at:
          type: integer
          format: int64
    ApiProfileCmsPrimaryPackage:
      type: object
      required:
        - package
        - package_id
        - version
        - package_hash
        - payload_hash
        - updated_at
      properties:
        package:
          type: object
          additionalProperties: true
        package_id:
          type: string
        version:
          type: integer
          format: int64
        package_hash:
          type: string
        payload_hash:
          type: string
        updated_at:
          type: integer
          format: int64
        published_at:
          type: integer
          format: int64
    ApiProfileCmsValidationIssue:
      type: object
      required:
        - severity
        - code
        - message
        - path
      properties:
        severity:
          type: string
          enum:
            - error
            - warning
            - note
        code:
          type: string
        message:
          type: string
        path:
          type: string
        page_id:
          type: string
        block_id:
          type: string
        suggested_fix:
          type: string
    ApiProfileCmsValidationResult:
      type: object
      required:
        - schema
        - valid
        - checked_at
        - issues
      properties:
        schema:
          type: string
          enum:
            - 6529.cms.validation_result.v1
        valid:
          type: boolean
        checked_at:
          type: string
        validator:
          type: string
        validator_version:
          type: string
        target:
          type: object
          properties:
            package_hash:
              type: string
            draft_id:
              type: string
            package_id:
              type: string
        issues:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileCmsValidationIssue"
    ApiProfileCmsWalletGalleryAsset:
      type: object
      required:
        - contract
        - token_id
        - balance
        - owner_wallet
        - owner_display
        - collection
        - collection_key
        - name
        - description
        - artist
        - artist_seize_handle
        - token_type
        - media
        - metadata
        - flags
      properties:
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        balance:
          type: integer
          format: int64
        owner_wallet:
          type: string
        owner_display:
          type: string
          nullable: true
        collection:
          type: string
        collection_key:
          type: string
          enum:
            - MEMES
            - MEMELAB
            - GRADIENTS
            - NEXTGEN
        name:
          type: string
        description:
          type: string
          nullable: true
        artist:
          type: string
          nullable: true
        artist_seize_handle:
          type: string
          nullable: true
        token_type:
          type: string
          nullable: true
        media:
          $ref: "#/components/schemas/ApiProfileCmsWalletGalleryMedia"
        metadata:
          type: object
          nullable: true
          additionalProperties: true
        flags:
          $ref: "#/components/schemas/ApiProfileCmsWalletGalleryAssetFlags"
    ApiProfileCmsWalletGalleryAssetFlags:
      type: object
      required:
        - spam
        - excluded
        - exclusion_reason
      properties:
        spam:
          type: boolean
        excluded:
          type: boolean
        exclusion_reason:
          type: string
          nullable: true
    ApiProfileCmsWalletGalleryAssetIdentifier:
      type: object
      required:
        - contract
        - token_id
      properties:
        contract:
          type: string
        token_id:
          type: integer
          format: int64
          minimum: 0
    ApiProfileCmsWalletGalleryExcludedAsset:
      type: object
      required:
        - contract
        - token_id
        - owner_wallet
        - reason
      properties:
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        owner_wallet:
          type: string
        reason:
          type: string
          enum:
            - contract_excluded
            - asset_excluded
    ApiProfileCmsWalletGalleryMedia:
      type: object
      required:
        - image
        - image_preview
        - thumbnail
        - animation
        - animation_preview
        - mime_type
      properties:
        image:
          type: string
          nullable: true
        image_preview:
          type: string
          nullable: true
        thumbnail:
          type: string
          nullable: true
        animation:
          type: string
          nullable: true
        animation_preview:
          type: string
          nullable: true
        mime_type:
          type: string
          nullable: true
    ApiProfileCmsWalletGallerySnapshot:
      type: object
      required:
        - generated_at
        - source
        - block_reference
        - wallets
        - assets
        - excluded_assets
        - totals
      properties:
        generated_at:
          type: integer
          format: int64
        source:
          type: string
          enum:
            - indexed_ownership
        block_reference:
          type: integer
          format: int64
          description: >-
            Highest nft_owners block_reference represented by returned indexed
            rows.
        wallets:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileCmsWalletGalleryWallet"
        assets:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileCmsWalletGalleryAsset"
        excluded_assets:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileCmsWalletGalleryExcludedAsset"
        totals:
          $ref: "#/components/schemas/ApiProfileCmsWalletGalleryTotals"
    ApiProfileCmsWalletGalleryTotals:
      type: object
      required:
        - requested_wallets
        - resolved_wallets
        - unresolved_wallets
        - indexed_assets
        - visible_assets
        - excluded_assets
        - spam_assets
        - truncated
      properties:
        requested_wallets:
          type: integer
          format: int64
        resolved_wallets:
          type: integer
          format: int64
        unresolved_wallets:
          type: integer
          format: int64
        indexed_assets:
          type: integer
          format: int64
        visible_assets:
          type: integer
          format: int64
        excluded_assets:
          type: integer
          format: int64
        spam_assets:
          type: integer
          format: int64
          description: Reserved for indexed spam flags; currently zero for the MVP source.
        truncated:
          type: boolean
    ApiProfileCmsWalletGalleryWallet:
      type: object
      required:
        - input
        - address
        - ens
        - display
        - status
        - reason
      properties:
        input:
          type: string
        address:
          type: string
          nullable: true
        ens:
          type: string
          nullable: true
        display:
          type: string
          nullable: true
        status:
          type: string
          enum:
            - resolved
            - unresolved
        reason:
          type: string
          nullable: true
    ApiProfileMin:
      type: object
      required:
        - id
        - handle
        - pfp
        - cic
        - rep
        - tdh
        - xtdh
        - xtdh_rate
        - level
        - tdh_rate
        - classification
        - sub_classification
        - primary_address
        - banner1_color
        - banner2_color
        - subscribed_actions
        - archived
        - active_main_stage_submission_ids
        - winner_main_stage_drop_ids
        - artist_of_prevote_cards
        - profile_wave_id
        - is_wave_creator
      properties:
        id:
          type: string
          format: uuid
        handle:
          type: string
          nullable: true
        pfp:
          type: string
          nullable: true
        banner1_color:
          type: string
          nullable: true
        banner2_color:
          type: string
          nullable: true
        cic:
          type: number
          format: int64
        rep:
          type: number
          format: int64
        tdh:
          type: number
          format: double
        tdh_rate:
          type: number
          format: int64
        xtdh:
          type: number
          format: double
        xtdh_rate:
          type: number
          format: int64
        level:
          type: number
          format: int64
        classification:
          $ref: "#/components/schemas/ApiProfileClassification"
        sub_classification:
          type: string
          nullable: true
        primary_address:
          type: string
        subscribed_actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiIdentitySubscriptionTargetAction"
        archived:
          type: boolean
        active_main_stage_submission_ids:
          type: array
          items:
            type: string
        winner_main_stage_drop_ids:
          type: array
          items:
            type: string
        artist_of_prevote_cards:
          type: array
          items:
            type: integer
            format: int64
        profile_wave_id:
          type: string
          nullable: true
        is_wave_creator:
          type: boolean
    ApiProfileMinsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileMin"
    ApiProfileNotificationCategories:
      type: object
      required:
        - direct_messages
        - mentions_replies_quotes
        - reactions_votes_boosts
        - new_followers
        - rep_and_nic
        - subscription_coverage
      properties:
        direct_messages:
          type: boolean
          description: >-
            Direct-message and wave-activity notifications, including new waves,
            all-drops subscriptions, and priority alerts.
        mentions_replies_quotes:
          type: boolean
        reactions_votes_boosts:
          type: boolean
        new_followers:
          type: boolean
        rep_and_nic:
          type: boolean
        subscription_coverage:
          type: boolean
    ApiProfilePreferences:
      type: object
      required:
        - direct_message_policy
        - notification_level
        - notifications
      properties:
        direct_message_policy:
          type: string
          enum:
            - EVERYONE
            - PEOPLE_I_FOLLOW
            - NOBODY
        notification_level:
          type: string
          enum:
            - ALL
            - ESSENTIAL_ONLY
        notifications:
          $ref: "#/components/schemas/ApiProfileNotificationCategories"
    ApiProfileProxy:
      type: object
      required:
        - id
        - granted_to
        - created_at
        - created_by
        - actions
      properties:
        id:
          type: string
        granted_to:
          $ref: "#/components/schemas/ApiProfileMin"
        created_at:
          type: number
        created_by:
          $ref: "#/components/schemas/ApiProfileMin"
        actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileProxyAction"
    ApiProfileProxyAction:
      type: object
      required:
        - id
        - proxy_id
        - action_type
        - credit_amount
        - credit_spent
        - start_time
        - end_time
        - accepted_at
        - rejected_at
        - revoked_at
        - created_at
        - is_active
      properties:
        id:
          type: string
        proxy_id:
          type: string
        action_type:
          $ref: "#/components/schemas/ApiProfileProxyActionType"
        credit_amount:
          anyOf:
            - type: "null"
            - type: number
              format: int64
          example: 1000
        credit_spent:
          anyOf:
            - type: "null"
            - type: number
              format: int64
          example: 1000
        start_time:
          type: number
          format: int64
          example: 1719850339996
        end_time:
          anyOf:
            - type: "null"
            - type: number
              format: int64
          example: 1719850339996
        created_at:
          type: number
          format: int64
          example: 1719850339996
        accepted_at:
          anyOf:
            - type: "null"
            - type: number
              format: int64
          example: 1719850339996
        rejected_at:
          anyOf:
            - type: "null"
            - type: number
              format: int64
          example: 1719850339996
        revoked_at:
          anyOf:
            - type: "null"
            - type: number
              format: int64
          example: 1719850339996
        is_active:
          type: boolean
    ApiProfileProxyActionType:
      type: string
      enum:
        - ALLOCATE_REP
        - ALLOCATE_CIC
        - CREATE_WAVE
        - READ_WAVE
        - CREATE_DROP_TO_WAVE
        - RATE_WAVE_DROP
        - PUBLISH_CMS
    ApiProfileRepCategorySummary:
      type: object
      required:
        - category
        - rep
      properties:
        category:
          type: string
        rep:
          type: number
          format: int64
    ApiProfileWave:
      type: object
      required:
        - profile_wave_id
        - profile_curation_id
      properties:
        profile_wave_id:
          type: string
          nullable: true
        profile_curation_id:
          type: string
          nullable: true
    ApiProfileWaveActivity:
      type: object
      required:
        - wave_id
        - wave_name
        - wave_picture
        - is_private
        - total_drops_count
        - latest_post_timestamp
      properties:
        wave_id:
          type: string
        wave_name:
          type: string
        wave_picture:
          type: string
          nullable: true
        is_private:
          type: boolean
        total_drops_count:
          type: integer
          format: int64
          description: Total retained CHAT drops in the wave, across all authors.
        latest_post_timestamp:
          type: integer
          format: int64
          nullable: true
          description: >-
            Latest qualifying authored drop timestamp for the resolved profile
            in this exact wave, including the wave description drop and replies.
            Null when a CREATED result has no qualifying authored drop.
    ApiProfileWaveActivityPage:
      type: object
      required:
        - data
        - next_cursor
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiProfileWaveActivity"
        next_cursor:
          type: string
          nullable: true
    ApiProfileWaveActivityType:
      type: string
      enum:
        - CREATED
        - RECENT
    ApiPublishProfileCmsPackageRequest:
      type: object
      required:
        - signer_address
        - signature
        - chain_id
        - deadline
      properties:
        expected_package_hash:
          type: string
        expected_payload_hash:
          type: string
        signer_address:
          type: string
          description: >-
            EOA wallet or Safe contract address expected to verify the CMS
            publish signature.
        signature:
          type: string
          description: EIP-712 signature over the ProfileCmsPublish typed data.
        chain_id:
          type: integer
          format: int64
          description: >-
            EIP-712 domain chain id; Safe/EIP-1271 verification uses this same
            RPC chain.
        deadline:
          type: integer
          format: int64
          description: >-
            Unix epoch milliseconds. Must be in the future and no more than 15
            minutes from server receipt.
        is_safe_signature:
          type: boolean
          description: Set true only for Safe/EIP-1271 contract signatures.
        verifying_contract:
          type: string
          description: >-
            Optional EIP-712 domain verifyingContract. Omit or pass null when
            the client signed without one.
          nullable: true
    ApiPushNotificationDevice:
      type: object
      required:
        - device_id
        - created_at
        - updated_at
      properties:
        device_id:
          type: string
        platform:
          type: string
          nullable: true
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    ApiPushNotificationSettings:
      type: object
      required:
        - identity_subscribed
        - identity_mentioned
        - identity_rep
        - identity_nic
        - drop_quoted
        - drop_replied
        - drop_voted
        - drop_reacted
        - drop_boosted
        - wave_created
        - subscription_coverage
      properties:
        identity_subscribed:
          type: boolean
          description: Notify when someone follows you
        identity_mentioned:
          type: boolean
          description: Notify when someone mentions you
        identity_rep:
          type: boolean
          description: Notify when someone gives you REP
        identity_nic:
          type: boolean
          description: Notify when someone gives you NIC
        drop_quoted:
          type: boolean
          description: Notify when someone quotes your drop
        drop_replied:
          type: boolean
          description: Notify when someone replies to your drop
        drop_voted:
          type: boolean
          description: Notify when someone votes on your drop
        drop_reacted:
          type: boolean
          description: Notify when someone reacts to your drop
        drop_boosted:
          type: boolean
          description: Notify when someone boosts your drop
        wave_created:
          type: boolean
          description: Notify when you are invited to a wave
        subscription_coverage:
          type: boolean
          description: Notify when The Memes subscription coverage becomes low
    ApiPushNotificationSettingsUpdate:
      type: object
      properties:
        identity_subscribed:
          type: boolean
        identity_mentioned:
          type: boolean
        identity_rep:
          type: boolean
        identity_nic:
          type: boolean
        drop_quoted:
          type: boolean
        drop_replied:
          type: boolean
        drop_voted:
          type: boolean
        drop_reacted:
          type: boolean
        drop_boosted:
          type: boolean
        wave_created:
          type: boolean
        subscription_coverage:
          type: boolean
    ApiQuotedDrop:
      type: object
      required:
        - drop_id
        - drop_part_id
      properties:
        drop_id:
          type: string
        drop_part_id:
          type: number
          format: int64
    ApiQuotedDropResponse:
      type: object
      required:
        - drop_id
        - drop_part_id
      properties:
        drop_id:
          type: string
        drop_part_id:
          type: number
          format: int64
        drop:
          $ref: "#/components/schemas/ApiDropWithoutWave"
    ApiRateMatter:
      type: string
      enum:
        - REP
        - CIC
        - WAVE_REP
    ApiRatingWithProfileInfoAndLevel:
      type: object
      required:
        - profile_id
        - handle
        - wallets
        - tdh
        - xtdh
        - rating
        - cic
        - last_modified
        - level
      properties:
        profile_id:
          type: string
        handle:
          type: string
        wallets:
          type: array
          items:
            type: string
        tdh:
          type: number
          format: int64
        xtdh:
          type: number
          format: float
        rating:
          type: number
          format: int64
        cic:
          type: number
          format: int64
        last_modified:
          type: string
    ApiRatingWithProfileInfoAndLevelPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiRatingWithProfileInfoAndLevel"
    ApiRedeemConnectionShareRequest:
      type: object
      required:
        - connection_share_code
        - target_client_type
      properties:
        connection_share_code:
          type: string
        target_client_type:
          type: string
          enum:
            - native
            - desktop
    ApiRedeemConnectionShareResponse:
      type: object
      required:
        - address
        - access_token
        - access_token_expires_at
        - client_type
        - native_refresh_token
        - refresh_token_expires_at
      properties:
        address:
          type: string
        role:
          type: string
          nullable: true
        access_token:
          type: string
        access_token_expires_at:
          type: string
          format: date-time
        client_type:
          type: string
          enum:
            - native
            - desktop
        native_refresh_token:
          type: string
        refresh_token_expires_at:
          type: string
          format: date-time
    ApiRedeemRefreshTokenRequest:
      type: object
      required:
        - address
        - token
      properties:
        address:
          type: string
        token:
          type: string
        role:
          type: string
    ApiRedeemRefreshTokenResponse:
      type: object
      required:
        - address
        - token
      properties:
        address:
          type: string
        token:
          type: string
    ApiRegisterPushNotificationTokenRequest:
      type: object
      required:
        - device_id
        - token
      properties:
        device_id:
          type: string
        token:
          type: string
        profile_id:
          type: string
          description: Optional profile_id
        platform:
          type: string
          description: Optional platform (ios, android, web)
    ApiRepCategoriesPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiRepCategory"
    ApiRepCategory:
      type: object
      required:
        - category
        - total_rep
        - contributor_count
        - authenticated_user_contribution
        - top_contributors
      properties:
        category:
          type: string
        total_rep:
          type: number
          format: int64
        contributor_count:
          type: number
          format: int64
        authenticated_user_contribution:
          type: number
          format: int64
          nullable: true
        top_contributors:
          type: array
          items:
            $ref: "#/components/schemas/ApiRepContributor"
    ApiRepContributor:
      type: object
      required:
        - contribution
        - profile
      properties:
        contribution:
          type: number
          format: int64
        profile:
          $ref: "#/components/schemas/ApiProfileMin"
    ApiRepContributorsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiRepContributor"
    ApiRepDirection:
      type: string
      enum:
        - incoming
        - outgoing
    ApiReplyToDrop:
      type: object
      required:
        - drop_id
        - drop_part_id
      properties:
        drop_id:
          type: string
        drop_part_id:
          type: number
          format: int64
    ApiReplyToDropAuthor:
      type: object
      required:
        - handle
        - pfp
      properties:
        handle:
          type: string
        pfp:
          type: string
    ApiReplyToDropResponse:
      type: object
      required:
        - drop_id
        - drop_part_id
        - is_deleted
      properties:
        drop_id:
          type: string
        drop_part_id:
          type: number
          format: int64
        is_deleted:
          type: boolean
        drop:
          $ref: "#/components/schemas/ApiDropWithoutWave"
    ApiReplyToDropV2:
      type: object
      required:
        - id
      properties:
        id:
          type: string
        serial_no:
          type: integer
          format: int64
        content:
          type: string
        author:
          $ref: "#/components/schemas/ApiReplyToDropAuthor"
        viewer_context:
          $ref: "#/components/schemas/ApiDropViewerModerationContext"
        moderation:
          $ref: "#/components/schemas/ApiDropModeration"
    ApiRepOverview:
      type: object
      required:
        - total_rep
        - authenticated_user_contribution
        - contributor_count
        - contributors
      properties:
        total_rep:
          type: number
          format: int64
        authenticated_user_contribution:
          type: number
          format: int64
          nullable: true
        contributor_count:
          type: number
          format: int64
        contributors:
          $ref: "#/components/schemas/ApiRepContributorsPage"
    ApiRepRating:
      type: object
      required:
        - rating
      properties:
        rating:
          type: number
          format: int64
    ApiRollbackProfileCmsPackageRequest:
      type: object
      required:
        - expected_current_package_id
      properties:
        expected_current_package_id:
          type: string
        expected_current_package_hash:
          type: string
    ApiSaveEulaConsentRequest:
      type: object
      additionalProperties: false
      required:
        - device_id
        - platform
        - eula_version
      properties:
        device_id:
          type: string
          minLength: 1
          maxLength: 100
        platform:
          type: string
          minLength: 1
          maxLength: 32
        eula_version:
          $ref: "#/components/schemas/ApiEulaVersion"
    ApiSaveEulaConsentResponse:
      type: object
      additionalProperties: false
      required:
        - message
        - eula_version
      properties:
        message:
          type: string
        eula_version:
          $ref: "#/components/schemas/ApiEulaVersion"
    ApiSaveProfileCmsPackageDraftRequest:
      type: object
      required:
        - profile_id
        - cms_package
      properties:
        profile_id:
          type: string
        cms_package:
          type: object
          additionalProperties: true
    ApiSeizeSettings:
      type: object
      required:
        - rememes_submission_tdh_threshold
        - memes_wave_id
        - curation_wave_id
        - distribution_admin_wallets
        - claims_admin_wallets
        - announcements_wave_id
        - quorum_wave_id
        - auth
      properties:
        rememes_submission_tdh_threshold:
          type: integer
          format: int64
        memes_wave_id:
          type: string
          nullable: true
        curation_wave_id:
          type: string
          nullable: true
        distribution_admin_wallets:
          type: array
          items:
            $ref: "#/components/schemas/ApiEthereumAddress"
        claims_admin_wallets:
          type: array
          items:
            $ref: "#/components/schemas/ApiEthereumAddress"
        announcements_wave_id:
          type: string
          nullable: true
        quorum_wave_id:
          type: string
          nullable: true
        auth:
          $ref: "#/components/schemas/ApiAuthSettings"
    ApiSessionLoginRequest:
      type: object
      additionalProperties: false
      required:
        - client_type
        - client_address
        - client_signature
        - server_signature
      properties:
        client_type:
          type: string
          enum:
            - web
            - native
            - desktop
        client_address:
          type: string
        client_signature:
          type: string
        server_signature:
          type: string
          description: >-
            Opaque server-signed challenge token. New web tokens bind the exact
            SIWE message, web client type, frontend Origin, API audience, and
            expiration. /auth/session-login temporarily accepts valid
            outstanding first_party_web structured challenges for web cookie
            sessions and continues to require matching native or desktop
            challenges for refresh-token sessions. external_client challenges
            use /auth/login bearer-token auth instead.
        role:
          type: string
          nullable: true
        wallet_kind_hint:
          type: string
          nullable: true
          enum:
            - eoa
            - contract
            - unknown
        signature_version:
          type: integer
          enum:
            - 1
            - 2
          default: 2
          description: >-
            Optional 6529 session-signature protocol compatibility field. This
            is not the ERC-4361 SIWE Version field; SIWE messages always use
            Version 1.
    ApiSessionLogoutNativeRequest:
      type: object
      required:
        - client_type
        - client_address
        - native_refresh_token
      properties:
        client_type:
          type: string
          enum:
            - native
            - desktop
        client_address:
          type: string
        native_refresh_token:
          type: string
        all_sessions:
          type: boolean
    ApiSessionLogoutWebRequest:
      type: object
      required:
        - client_type
      additionalProperties: false
      properties:
        client_type:
          type: string
          enum:
            - web
        client_address:
          type: string
          nullable: true
          description: >-
            Optional active wallet address. Web clients should include it so
            multi-account logout targets the matching address-scoped cookie
            instead of the compatibility cookie.
        all_sessions:
          type: boolean
    ApiSessionNativeResponse:
      type: object
      required:
        - address
        - access_token
        - access_token_expires_at
        - client_type
        - native_refresh_token
        - refresh_token_expires_at
      properties:
        address:
          type: string
        role:
          type: string
          nullable: true
        access_token:
          type: string
        access_token_expires_at:
          type: string
          format: date-time
        client_type:
          type: string
          enum:
            - native
            - desktop
        native_refresh_token:
          type: string
        refresh_token_expires_at:
          type: string
          format: date-time
    ApiSessionNonceQuery:
      type: object
      additionalProperties: false
      required:
        - signer_address
      properties:
        signer_address:
          type: string
          description: Your wallet address
        client_type:
          type: string
          enum:
            - web
            - native
            - desktop
          default: web
        chain_id:
          type: integer
          minimum: 1
          default: 1
          description: >-
            Backward-compatible request field. Session challenges are issued for
            the backend-configured auth chain, not this client-supplied value.
    ApiSessionNonceResponse:
      type: object
      required:
        - signable_message
        - server_signature
      properties:
        signable_message:
          type: string
          description: >-
            Canonical ERC-4361 SIWE for web clients, or the 6529 structured
            version-2 session message for native and desktop clients.
        server_signature:
          type: string
          description: Opaque server-signed challenge token.
    ApiSessionRefreshNativeRequest:
      type: object
      required:
        - client_type
        - client_address
        - native_refresh_token
      properties:
        client_type:
          type: string
          enum:
            - native
            - desktop
        client_address:
          type: string
        native_refresh_token:
          type: string
    ApiSessionRefreshWebRequest:
      type: object
      required:
        - client_type
      additionalProperties: false
      properties:
        client_type:
          type: string
          enum:
            - web
        client_address:
          type: string
          nullable: true
          description: >-
            Optional active wallet address. Web clients should include it so
            multi-account sessions refresh the matching address-scoped cookie
            instead of the compatibility cookie.
    ApiSessionWebResponse:
      type: object
      required:
        - address
        - access_token
        - access_token_expires_at
        - client_type
      properties:
        address:
          type: string
        role:
          type: string
          nullable: true
        access_token:
          type: string
        access_token_expires_at:
          type: string
          format: date-time
        client_type:
          type: string
          enum:
            - web
    ApiSetPinnedDropRequest:
      type: object
      required:
        - drop_id
      properties:
        drop_id:
          type: string
    ApiSetProfileWaveRequest:
      type: object
      required:
        - wave_id
      properties:
        wave_id:
          type: string
          minLength: 1
          maxLength: 100
        profile_curation_id:
          type: string
          nullable: true
          minLength: 1
          maxLength: 50
    ApiStartMultipartMediaUploadResponse:
      required:
        - upload_id
        - key
      properties:
        upload_id:
          type: string
        key:
          type: string
        media_upload_id:
          type: string
          nullable: true
        media_status:
          $ref: "#/components/schemas/ApiDropMediaStatus"
    ApiSubmissionDropContext:
      type: object
      required:
        - status
        - voting
        - has_metadata
      properties:
        status:
          $ref: "#/components/schemas/ApiSubmissionDropStatus"
        voting:
          $ref: "#/components/schemas/ApiSubmissionDropVoting"
        has_metadata:
          type: boolean
        is_additional_action_promised:
          type: boolean
        over_threshold_since_ms:
          description: >-
            Unix timestamp in milliseconds when this active APPROVE submission
            most recently started continuously meeting the winning threshold.
            Omitted unless the drop is currently over threshold and has not yet
            won.
          type: integer
          format: int64
        won_at:
          description: >-
            Unix timestamp in milliseconds when this submission won. Omitted
            unless the submission has won.
          type: integer
          format: int64
        meme_card_id:
          description: >-
            The Memes card ID assigned to this winning Main Stage submission.
            Omitted for active submissions, winners outside the configured Main
            Stage wave, and legacy winners whose relationship is unavailable.
          type: integer
          format: int64
          minimum: 1
    ApiSubmissionDropStatus:
      type: string
      enum:
        - ACTIVE
        - WINNER
    ApiSubmissionDropVoting:
      type: object
      required:
        - is_open
        - total_votes_given
        - current_calculated_vote
        - predicted_final_vote
        - voters_count
        - place
      properties:
        is_open:
          type: boolean
        context_profile_context:
          $ref: "#/components/schemas/ApiSubmissionDropVotingContextProfileContext"
        total_votes_given:
          type: integer
          format: int64
        current_calculated_vote:
          type: integer
          format: int64
        predicted_final_vote:
          type: integer
          format: int64
        voters_count:
          type: integer
          format: int64
        place:
          type: integer
          format: int64
    ApiSubmissionDropVotingContextProfileContext:
      type: object
      required:
        - can_vote
        - min
        - max
        - current
      properties:
        can_vote:
          type: boolean
        min:
          type: integer
          format: int64
        max:
          type: integer
          format: int64
        current:
          type: integer
          format: int64
    ApiSubscriptionCoverage:
      type: object
      required:
        - consolidation_key
        - calculated_at
        - status
        - mode
        - subscribe_all_editions
        - eligibility_count
        - balance_eth
        - mint_price_eth
        - mint_capacity
        - allocated_mints
        - fully_funded_drops
        - funded_through
        - next_unfunded
        - minimum_top_up
        - recommended_top_up
        - forecast
      properties:
        consolidation_key:
          type: string
        calculated_at:
          type: string
          format: date-time
        status:
          $ref: "#/components/schemas/ApiSubscriptionCoverageStatus"
        mode:
          allOf:
            - $ref: "#/components/schemas/ApiSubscriptionCoverageMode"
          nullable: true
        subscribe_all_editions:
          type: boolean
          nullable: true
        eligibility_count:
          type: integer
          format: int64
          minimum: 0
          nullable: true
        balance_eth:
          type: string
          description: Exact current subscription balance in ETH
        mint_price_eth:
          type: string
          description: Exact price of one subscription mint in ETH
        mint_capacity:
          type: integer
          format: int64
          minimum: 0
          nullable: true
          description: Raw floor of balance divided by mint price
        allocated_mints:
          type: integer
          format: int64
          minimum: 0
          description: Mints allocated to forecasted intended drops
        fully_funded_drops:
          type: integer
          format: int64
          minimum: 0
          description: >-
            Consecutive fully funded intended drops beginning with the immediate
            next intended drop
        funded_through:
          allOf:
            - $ref: "#/components/schemas/ApiSubscriptionCoveragePoint"
          nullable: true
        next_unfunded:
          allOf:
            - $ref: "#/components/schemas/ApiSubscriptionCoverageNextUnfunded"
          nullable: true
        minimum_top_up:
          allOf:
            - $ref: "#/components/schemas/ApiSubscriptionCoverageMinimumTopUp"
          nullable: true
        recommended_top_up:
          allOf:
            - $ref: "#/components/schemas/ApiSubscriptionCoverageRecommendedTopUp"
          nullable: true
        forecast:
          $ref: "#/components/schemas/ApiSubscriptionCoverageForecast"
    ApiSubscriptionCoverageDeadlineBasis:
      type: string
      enum:
        - AUTHORITATIVE
        - UNAVAILABLE
    ApiSubscriptionCoverageEligibilityBasis:
      type: string
      enum:
        - CURRENT_ELIGIBILITY
    ApiSubscriptionCoverageForecast:
      type: object
      required:
        - eligibility_basis
        - schedule_basis
        - deadline_basis
        - forecast_truncated
        - horizon_start_token_id
        - horizon_end_token_id
        - horizon_drop_count
        - calculation_version
        - forecast_fingerprint
        - unknown_reason
      properties:
        eligibility_basis:
          $ref: "#/components/schemas/ApiSubscriptionCoverageEligibilityBasis"
        schedule_basis:
          $ref: "#/components/schemas/ApiSubscriptionCoverageScheduleBasis"
        deadline_basis:
          $ref: "#/components/schemas/ApiSubscriptionCoverageDeadlineBasis"
        forecast_truncated:
          type: boolean
        horizon_start_token_id:
          type: integer
          format: int64
          nullable: true
        horizon_end_token_id:
          type: integer
          format: int64
          nullable: true
        horizon_drop_count:
          type: integer
          format: int64
          minimum: 0
        calculation_version:
          type: integer
          format: int64
          minimum: 1
        forecast_fingerprint:
          type: string
        unknown_reason:
          allOf:
            - $ref: "#/components/schemas/ApiSubscriptionCoverageUnknownReason"
          nullable: true
    ApiSubscriptionCoverageMinimumTopUp:
      type: object
      required:
        - additional_mints
        - amount_eth
        - resulting_fully_funded_drops
        - projected_through
      properties:
        additional_mints:
          type: integer
          format: int64
          minimum: 1
        amount_eth:
          type: string
          description: Exact additional ETH required
        resulting_fully_funded_drops:
          type: integer
          format: int64
          minimum: 1
        projected_through:
          $ref: "#/components/schemas/ApiSubscriptionCoveragePoint"
    ApiSubscriptionCoverageMode:
      type: string
      enum:
        - AUTOMATIC
        - MANUAL
    ApiSubscriptionCoverageNextUnfunded:
      type: object
      required:
        - token_id
        - mint_at
        - requested_mints
        - funded_mints
        - missing_mints
        - required_eth
        - shortfall_eth
        - top_up_deadline
        - source
      properties:
        token_id:
          type: integer
          format: int64
        mint_at:
          type: string
          format: date-time
        requested_mints:
          type: integer
          format: int64
          minimum: 1
        funded_mints:
          type: integer
          format: int64
          minimum: 0
        missing_mints:
          type: integer
          format: int64
          minimum: 1
        required_eth:
          type: string
          description: Exact total ETH required for this intended drop
        shortfall_eth:
          type: string
          description: Exact additional ETH needed to fully fund this drop
        top_up_deadline:
          type: string
          format: date-time
          nullable: true
          description: >-
            Authoritative subscription-finalization cutoff, or null when the
            backend has no such cutoff
        source:
          $ref: "#/components/schemas/ApiSubscriptionCoverageSource"
    ApiSubscriptionCoverageNotificationRisk:
      type: object
      required:
        - token_id
        - mint_at
        - requested_mints
        - funded_mints
        - missing_mints
      properties:
        token_id:
          type: integer
          format: int64
        mint_at:
          type: string
          format: date-time
        requested_mints:
          type: integer
          format: int64
          minimum: 1
        funded_mints:
          type: integer
          format: int64
          minimum: 0
        missing_mints:
          type: integer
          format: int64
          minimum: 1
    ApiSubscriptionCoveragePoint:
      type: object
      required:
        - token_id
        - mint_at
      properties:
        token_id:
          type: integer
          format: int64
        mint_at:
          type: string
          format: date-time
    ApiSubscriptionCoverageRecommendedTopUp:
      type: object
      required:
        - target_fully_funded_drops
        - additional_mints
        - amount_eth
        - projected_through
      properties:
        target_fully_funded_drops:
          type: integer
          format: int64
          minimum: 1
        additional_mints:
          type: integer
          format: int64
          minimum: 1
        amount_eth:
          type: string
          description: Exact additional ETH required
        projected_through:
          $ref: "#/components/schemas/ApiSubscriptionCoveragePoint"
    ApiSubscriptionCoverageScheduleBasis:
      type: string
      enum:
        - PROJECTED
    ApiSubscriptionCoverageSource:
      type: string
      enum:
        - AUTOMATIC
        - MANUAL
    ApiSubscriptionCoverageStatus:
      type: string
      enum:
        - NOT_SET_UP
        - NO_CURRENT_ELIGIBILITY
        - NO_UPCOMING_SELECTIONS
        - COVERED
        - EARLY_WARNING
        - RUNNING_LOW
        - ACTION_REQUIRED
        - UNKNOWN
    ApiSubscriptionCoverageUnknownReason:
      type: string
      enum:
        - BALANCE_INVALID
        - MODE_UNAVAILABLE
        - SCHEDULE_UNAVAILABLE
        - INPUT_INCONSISTENT
    ApiSubwavesSort:
      type: string
      enum:
        - NAME
        - CREATED_AT
    ApiTargetAndSubscriptionActions:
      type: object
      required:
        - target
        - actions
      properties:
        target:
          description: Wave or drop or identity
          type: object
        actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiIdentitySubscriptionTargetAction"
    ApiTdhEdition:
      type: object
      required:
        - contract
        - id
        - edition_id
        - balance
        - days_held
        - hodl_rate
      properties:
        contract:
          type: string
        id:
          type: integer
          format: int64
        edition_id:
          type: integer
          format: int64
        balance:
          type: integer
          format: int64
        hodl_rate:
          type: integer
          format: int64
        days_held:
          type: integer
          format: int64
        wallet:
          type: string
          nullable: true
        consolidation_key:
          type: string
          nullable: true
        profile:
          $ref: "#/components/schemas/ApiProfileMin"
          nullable: true
    ApiTdhEditionsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiTdhEdition"
    ApiToggleHideLinkPreviewRequest:
      type: object
      properties:
        hide_link_preview:
          type: boolean
          description: >-
            Desired final hidden-preview state. Omit to keep legacy toggle
            behavior.
    ApiTokenTdh:
      type: object
      properties:
        id:
          type: integer
          format: int64
        balance:
          type: integer
          format: int64
        hodl_rate:
          type: number
          format: double
        tdh:
          type: integer
          format: int64
        tdh__raw:
          type: integer
          format: int64
        days_held_per_edition:
          type: array
          items:
            type: integer
            format: int64
    ApiTokenTdhRank:
      type: object
      properties:
        id:
          type: integer
          format: int64
        rank:
          type: integer
          format: int64
    ApiTransaction:
      type: object
      required:
        - transaction
        - block
        - created_at
        - transaction_date
        - from_address
        - to_address
        - contract
        - token_id
        - token_count
        - value
        - royalties
        - gas_gwei
        - gas_price
        - gas_price_gwei
        - gas
        - primary_proceeds
        - eth_price_usd
        - value_usd
        - gas_usd
        - from_display
        - to_display
      properties:
        transaction:
          type: string
        block:
          type: integer
          format: int64
        created_at:
          type: string
          format: date-time
        transaction_date:
          type: string
          format: date-time
        from_address:
          type: string
        to_address:
          type: string
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        token_count:
          type: integer
          format: int64
        value:
          type: number
          format: double
        royalties:
          type: number
          format: double
        gas_gwei:
          type: number
          format: double
        gas_price:
          type: number
          format: double
        gas_price_gwei:
          type: number
          format: double
        gas:
          type: number
          format: double
        primary_proceeds:
          type: number
          format: double
        eth_price_usd:
          type: number
          format: double
        value_usd:
          type: number
          format: double
        gas_usd:
          type: number
          format: double
        from_display:
          type: string
          nullable: true
        to_display:
          type: string
    ApiTransactionPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiTransaction"
    ApiUndiscoveredDrop:
      type: object
      required:
        - drop
        - left_to_vote_in_current_round
        - total_count
      properties:
        drop:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiDrop"
        left_to_vote_in_current_round:
          type: integer
          format: int64
        total_count:
          type: integer
          format: int64
    ApiUpcomingMemeSubscriptionStatus:
      type: object
      required:
        - subscribed
        - eligibility
      properties:
        subscribed:
          type: boolean
        eligibility:
          type: integer
          format: int64
        count:
          type: integer
          format: int64
        source:
          type: string
          enum:
            - automatic
            - manual
    ApiUpdateDropRequest:
      type: object
      allOf:
        - $ref: "#/components/schemas/ApiCreateWaveDropRequest"
    ApiUpdateProfileNotificationCategories:
      type: object
      additionalProperties: false
      properties:
        direct_messages:
          type: boolean
          description: >-
            Direct-message and wave-activity notifications, including new waves,
            all-drops subscriptions, and priority alerts.
        mentions_replies_quotes:
          type: boolean
        reactions_votes_boosts:
          type: boolean
        new_followers:
          type: boolean
        rep_and_nic:
          type: boolean
        subscription_coverage:
          type: boolean
    ApiUpdateProfilePreferences:
      type: object
      minProperties: 1
      additionalProperties: false
      properties:
        direct_message_policy:
          type: string
          enum:
            - EVERYONE
            - PEOPLE_I_FOLLOW
            - NOBODY
        notification_level:
          type: string
          enum:
            - ALL
            - ESSENTIAL_ONLY
        notifications:
          $ref: "#/components/schemas/ApiUpdateProfileNotificationCategories"
    ApiUpdateProxyActionRequest:
      type: object
      properties:
        credit_amount:
          type: number
          format: int64
          example: 1000
        end_time:
          type: number
          format: int64
          nullable: true
          example: 1719850339996
    ApiUpdateWaveDecisionPause:
      required:
        - id
        - start_time
        - end_time
      properties:
        id:
          type: integer
          format: int64
          nullable: true
          description: null when new pause is created. Only supply when editing a pause.
        start_time:
          type: integer
          format: int64
          nullable: false
          description: >-
            Decisions after this time will not be made. Should not overlap with
            other pauses. Needs to be in the future. Can not be updated after
            pause creation.
        end_time:
          type: integer
          format: int64
          nullable: false
          description: >-
            Decisions before this time will not be made. Should not overlap with
            other pauses. Needs to be after start_time, after now and after
            wave.next_decision_time
    ApiUpdateWaveNotificationPreferencesRequest:
      type: object
      properties:
        subscribed:
          type: boolean
        enabled_group_notifications:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropGroupMention"
    ApiUpdateWaveParticipationConfig:
      type: object
      required:
        - scope
        - required_metadata
        - signature_required
        - no_of_applications_allowed_per_participant
        - required_media
        - terms
      properties:
        scope:
          $ref: "#/components/schemas/ApiCreateNewWaveScope"
        no_of_applications_allowed_per_participant:
          description: >-
            The number of applications allowed per participant. Infinite if
            omitted.
          type: integer
          format: int64
          nullable: true
          minimum: 1
        required_media:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveParticipationRequirement"
        required_metadata:
          description: |
            The metadata that must be provided by the participant. 
            Empty array if nothing is required.
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveRequiredMetadata"
        signature_required:
          description: If true then the votes must be signed by voters.
          type: boolean
        terms:
          description: >-
            If this is and the "signature_required" is set then this will be
            embedded as a signature input data component for each drop.
          type: string
          nullable: true
        period:
          $ref: "#/components/schemas/ApiIntRange"
        submission_strategy:
          description: >-
            If omitted, the existing submission strategy is preserved. Set
            explicitly to null to clear it.
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiWaveParticipationSubmissionStrategy"
    ApiUpdateWaveRequest:
      type: object
      required:
        - name
        - picture
        - voting
        - visibility
        - participation
        - chat
        - wave
      properties:
        name:
          description: The name of the wave
          type: string
          maxLength: 250
        picture:
          description: The picture of the wave
          type: string
          example: https://example.com/picture.jpg
          nullable: true
        voting:
          $ref: "#/components/schemas/ApiCreateNewWaveVotingConfig"
        visibility:
          $ref: "#/components/schemas/ApiCreateNewWaveVisibilityConfig"
        participation:
          $ref: "#/components/schemas/ApiUpdateWaveParticipationConfig"
        chat:
          $ref: "#/components/schemas/ApiCreateNewWaveChatConfig"
        wave:
          description: >-
            Wave configuration. `type` is immutable after creation and must
            match the existing wave type on update.
          $ref: "#/components/schemas/ApiCreateWaveConfig"
    ApiUploadItem:
      type: object
      required:
        - date
        - block
        - url
      properties:
        date:
          type: string
          format: date-time
        block:
          type: integer
          format: int64
        url:
          type: string
    ApiUploadPartOfMultipartUploadRequest:
      required:
        - upload_id
        - key
        - part_no
      properties:
        upload_id:
          type: string
        key:
          type: string
        part_no:
          type: integer
          format: int64
    ApiUploadPartOfMultipartUploadResponse:
      required:
        - upload_url
      properties:
        upload_url:
          type: string
    ApiUploadsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiUploadItem"
    ApiValidateProfileCmsAgentPatchRequest:
      type: object
      required:
        - agent_patch
      properties:
        agent_patch:
          $ref: "#/components/schemas/ApiCmsAgentPatch"
        apply:
          type: boolean
          description: Must not be used to authorize writes; validation is read-only.
        enforce_hashes:
          type: boolean
    ApiValidateProfileCmsPackageRequest:
      type: object
      required:
        - cms_package
      properties:
        cms_package:
          type: object
          additionalProperties: true
        allow_fixture_signatures:
          type: boolean
        allow_fixture_storage:
          type: boolean
        enforce_hashes:
          type: boolean
    ApiWallet:
      type: object
      required:
        - wallet
        - display
        - tdh
      properties:
        wallet:
          type: string
        display:
          type: string
        tdh:
          type: integer
          format: int64
    ApiWalletDistributionAllocation:
      type: object
      required:
        - phase
        - spots_airdrop
        - spots_allowlist
      properties:
        phase:
          type: string
          enum:
            - Phase 0
            - Phase 1
            - Phase 2
            - Public
        spots_airdrop:
          type: integer
          format: int64
          minimum: 0
        spots_allowlist:
          type: integer
          format: int64
          minimum: 0
    ApiWalletDistributionAllocations:
      type: object
      required:
        - has_distribution
        - allocations
      properties:
        has_distribution:
          type: boolean
          description: Whether normalized distribution data exists for the card
        allocations:
          type: array
          items:
            $ref: "#/components/schemas/ApiWalletDistributionAllocation"
    ApiWave:
      type: object
      required:
        - id
        - serial_no
        - author
        - name
        - picture
        - description_drop
        - voting
        - visibility
        - participation
        - chat
        - wave
        - created_at
        - last_drop_time
        - contributors_overview
        - subscribed_actions
        - metrics
        - pauses
        - pinned
        - identity_wave
      properties:
        id:
          description: The ID of the wave
          type: string
        serial_no:
          description: Sequence number of the wave in Seize
          type: number
          format: int64
        author:
          $ref: "#/components/schemas/ApiProfileMin"
        name:
          description: The name of the wave
          type: string
        picture:
          description: The picture of the wave
          type: string
          example: https://example.com/picture.jpg
          nullable: true
        created_at:
          type: number
          format: int64
        last_drop_time:
          description: Unix timestamp in milliseconds of the most recent drop in this wave
          type: number
          format: int64
        description_drop:
          $ref: "#/components/schemas/ApiDrop"
        voting:
          $ref: "#/components/schemas/ApiWaveVotingConfig"
        visibility:
          $ref: "#/components/schemas/ApiWaveVisibilityConfig"
        participation:
          $ref: "#/components/schemas/ApiWaveParticipationConfig"
        chat:
          $ref: "#/components/schemas/ApiWaveChatConfig"
        wave:
          $ref: "#/components/schemas/ApiWaveConfig"
        contributors_overview:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveContributorOverview"
        subscribed_actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveSubscriptionTargetAction"
        metrics:
          $ref: "#/components/schemas/ApiWaveMetrics"
        pauses:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveDecisionPause"
        pinned:
          type: boolean
        identity_wave:
          type: boolean
        parent_wave:
          $ref: "#/components/schemas/ApiWaveOverview"
        has_subwaves:
          type: boolean
        wave_rep:
          $ref: "#/components/schemas/ApiWaveRepSummary"
        wave_score:
          $ref: "#/components/schemas/ApiWaveScore"
    ApiWaveChatConfig:
      type: object
      required:
        - scope
        - enabled
        - links_disabled
        - authenticated_user_eligible
      properties:
        scope:
          $ref: "#/components/schemas/ApiWaveScope"
        enabled:
          type: boolean
        links_disabled:
          type: boolean
        authenticated_user_eligible:
          type: boolean
        next_drop_allowed:
          type: integer
          format: int64
        slow_mode_cooldown_ms:
          type: integer
          format: int64
          minimum: 1000
    ApiWaveConfig:
      type: object
      required:
        - type
        - time_lock_ms
        - winning_threshold
        - winning_threshold_min_duration_ms
        - max_winners
        - max_votes_per_identity_to_drop
        - admin_group
        - authenticated_user_eligible_for_admin
        - decisions_strategy
        - next_decision_time
        - admin_drop_deletion_enabled
        - total_no_of_decisions
        - no_of_decisions_done
        - no_of_decisions_left
      properties:
        type:
          $ref: "#/components/schemas/ApiWaveType"
        winning_threshold:
          description: >-
            Single positive threshold a drop must reach to win. Null for
            non-APPROVE waves
          type: integer
          format: int64
          minimum: 1
          nullable: true
        winning_threshold_min_duration_ms:
          description: >-
            Milliseconds a drop must continuously stay at or above
            winning_threshold before winning an APPROVE wave. Null for
            non-APPROVE waves. When time_lock_ms is set, this duration is
            measured against the time-scaled weighted vote.
          type: integer
          format: int64
          minimum: 0
          nullable: true
        max_winners:
          description: >-
            Total number of APPROVE decisions this wave may produce. Null means
            unlimited. Null for non-APPROVE waves
          type: integer
          format: int64
          minimum: 1
          nullable: true
        max_votes_per_identity_to_drop:
          description: >-
            Maximum absolute vote one identity can hold on a single drop. Null
            means unlimited. Null for CHAT waves
          type: integer
          format: int64
          minimum: 1
          nullable: true
        time_lock_ms:
          nullable: true
          description: >-
            When set, vote totals use a trailing time-scaled weighted average
            over this duration, so new vote changes gradually gain or lose
            influence. If not set, votes are counted immediately.
          type: integer
          format: int64
          minimum: 1
        admin_group:
          $ref: "#/components/schemas/ApiWaveScope"
        authenticated_user_eligible_for_admin:
          type: boolean
        decisions_strategy:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiWaveDecisionsStrategy"
        next_decision_time:
          type: number
          format: int64
          nullable: true
        admin_drop_deletion_enabled:
          type: boolean
        total_no_of_decisions:
          type: integer
          format: int64
          minimum: 1
          nullable: true
        no_of_decisions_done:
          type: integer
          format: int64
          minimum: 0
          nullable: true
        no_of_decisions_left:
          type: integer
          format: int64
          minimum: 0
          nullable: true
    ApiWaveContributorOverview:
      required:
        - contributor_identity
        - contributor_pfp
      properties:
        contributor_identity:
          type: string
        contributor_pfp:
          type: string
    ApiWaveCreditNft:
      type: object
      required:
        - contract
        - token_id
      properties:
        contract:
          $ref: "#/components/schemas/ApiEthereumAddress"
        token_id:
          type: integer
          format: int64
          minimum: 0
    ApiWaveCreditScope:
      enum:
        - WAVE
        - DROP
    ApiWaveCreditType:
      type: string
      description: |
        What will be counted as a credit.
      enum:
        - TDH
        - REP
        - XTDH
        - TDH_PLUS_XTDH
        - CARD_SET_TDH
    ApiWaveCuration:
      type: object
      required:
        - id
        - name
        - wave_id
        - group_id
        - created_at
        - updated_at
        - priority_order
      properties:
        id:
          type: string
        name:
          type: string
        wave_id:
          type: string
        group_id:
          type: string
        created_at:
          type: number
          format: int64
        updated_at:
          type: number
          format: int64
        priority_order:
          type: integer
          format: int32
          minimum: 1
    ApiWaveCurationRequest:
      type: object
      required:
        - name
        - group_id
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 50
        group_id:
          type: string
        priority_order:
          type: integer
          format: int32
          minimum: 1
    ApiWaveDecision:
      type: object
      required:
        - decision_time
        - winners
      properties:
        decision_time:
          type: integer
          format: int62
        winners:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveDecisionWinner"
    ApiWaveDecisionAward:
      type: object
      required:
        - type
        - description
      properties:
        type:
          $ref: "#/components/schemas/ApiWaveOutcomeType"
        subtype:
          $ref: "#/components/schemas/ApiWaveOutcomeSubType"
        description:
          type: string
        credit:
          $ref: "#/components/schemas/ApiWaveOutcomeCredit"
        rep_category:
          type: string
        amount:
          type: number
          format: int64
    ApiWaveDecisionPause:
      required:
        - id
        - start_time
        - end_time
      properties:
        id:
          type: integer
          format: int64
          nullable: false
        start_time:
          type: integer
          format: int64
          nullable: false
        end_time:
          type: integer
          format: int64
          nullable: false
    ApiWaveDecisionsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveDecision"
    ApiWaveDecisionsPageV2:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveDecisionV2"
    ApiWaveDecisionsStrategy:
      type: object
      required:
        - first_decision_time
        - subsequent_decisions
        - is_rolling
      properties:
        first_decision_time:
          type: number
          format: int64
          description: >-
            When the first decision will be made. All subsequent decision times
            will be calculated based on this.
        subsequent_decisions:
          type: array
          items:
            type: number
            format: int64
            minimum: 1
          description: >-
            Each element in this array represents the milliseconds passed from
            previous decision when new decision is made. When is_rolling=true
            then after last decision, the next decision will be made again
            first-element-of-the-array milliseconds later than the previous one.
            And it will continue like this forever.
        is_rolling:
          type: boolean
          description: >-
            If false then there will be length(subsequent_decisions) + 1
            decisions in total. If true then there will be infinite number of
            decisions (see description of subsequent_decisions). Also if true
            then there needs to be at least one element in subsequent_decisions
            array.
    ApiWaveDecisionV2:
      type: object
      required:
        - decision_time
        - winners
      properties:
        decision_time:
          type: integer
          format: int62
        winners:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveDecisionWinnerV2"
    ApiWaveDecisionWinner:
      type: object
      required:
        - place
        - awards
        - drop
      properties:
        place:
          type: integer
          format: int64
        awards:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveDecisionAward"
        drop:
          $ref: "#/components/schemas/ApiDrop"
    ApiWaveDecisionWinnerV2:
      type: object
      required:
        - place
        - awards
        - drop
      properties:
        place:
          type: integer
          format: int64
        awards:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveDecisionAward"
        drop:
          $ref: "#/components/schemas/ApiDropV2"
    ApiWaveDropsFeed:
      type: object
      required:
        - wave
        - drops
      properties:
        wave:
          $ref: "#/components/schemas/ApiWaveMin"
        drops:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropWithoutWave"
        root_drop:
          $ref: "#/components/schemas/ApiDropWithoutWave"
        trace:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropTraceItem"
    ApiWaveDropsFeedV2:
      type: object
      required:
        - wave
        - drops
      properties:
        wave:
          $ref: "#/components/schemas/ApiWaveOverview"
        drops:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropV2"
        root_drop:
          $ref: "#/components/schemas/ApiDropV2"
        trace:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropTraceItem"
    ApiWaveGroupRole:
      type: string
      enum:
        - PARTICIPATION
        - VOTING
        - CHAT
        - ADMIN
    ApiWaveGroupValidationRequest:
      type: object
      required:
        - visibility_group_id
      properties:
        visibility_group_id:
          description: Null means everyone can view the Wave.
          type: string
          nullable: true
        participation_group_id:
          description: Omit when Drop access is inactive; null means Everyone.
          type: string
          nullable: true
        voting_group_id:
          description: Omit when Vote access is inactive; null means Everyone.
          type: string
          nullable: true
        chat_group_id:
          description: Omit when Chat is disabled; null means Everyone.
          type: string
          nullable: true
        admin_group_id:
          description: >-
            The explicit Admin group to check. Omit or use null when there is no
            Admin group, including when creation will make only the
            authenticated profile an Admin.
          type: string
          nullable: true
        include_authenticated_user_as_admin:
          description: >-
            Also require the authenticated acting profile to belong to the View
            group.
          type: boolean
          default: false
    ApiWaveGroupValidationResponse:
      type: object
      required:
        - valid
        - invalid_roles
      properties:
        valid:
          type: boolean
        invalid_roles:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveGroupRole"
    ApiWaveLog:
      type: object
      required:
        - id
        - action
        - wave_id
        - drop_id
        - invoker
        - created_at
        - contents
      properties:
        id:
          type: string
        action:
          type: string
        wave_id:
          type: string
        drop_id:
          type: string
        drop_author:
          $ref: "#/components/schemas/ApiProfileMin"
        invoker:
          $ref: "#/components/schemas/ApiProfileMin"
        invoker_proxy:
          $ref: "#/components/schemas/ApiProfileMin"
        created_at:
          type: string
          format: date-time
        contents:
          type: object
          additionalProperties: true
    ApiWaveMentionSearchResult:
      type: object
      required:
        - id
        - handle
        - display
        - pfp
      properties:
        id:
          type: string
        handle:
          type: string
        display:
          type: string
          nullable: true
        pfp:
          type: string
          nullable: true
    ApiWaveMetadata:
      type: object
      required:
        - id
        - data_key
        - data_value
      properties:
        id:
          type: integer
          format: int64
        data_key:
          type: string
          maxLength: 500
        data_value:
          type: string
          maxLength: 8000
    ApiWaveMetadataType:
      type: string
      enum:
        - STRING
        - NUMBER
    ApiWaveMetrics:
      required:
        - subscribers_count
        - drops_count
        - latest_drop_timestamp
        - your_participation_drops_count
        - your_latest_drop_timestamp
        - your_unread_drops_count
        - your_latest_read_timestamp
        - muted
      properties:
        subscribers_count:
          type: number
          format: int64
        drops_count:
          type: number
          format: int64
        latest_drop_timestamp:
          type: number
          format: int64
        your_drops_count:
          type: number
          format: int64
        your_participation_drops_count:
          type: number
          format: int64
        your_latest_drop_timestamp:
          type: number
          format: int64
        your_unread_drops_count:
          type: number
          format: int64
        first_unread_drop_serial_no:
          type: number
          format: int64
        your_latest_read_timestamp:
          type: number
          format: int64
        muted:
          type: boolean
    ApiWaveMin:
      required:
        - id
        - name
        - picture
        - description_drop_id
        - last_drop_time
        - submission_type
        - authenticated_user_eligible_to_vote
        - authenticated_user_eligible_to_participate
        - authenticated_user_eligible_to_chat
        - authenticated_user_admin
        - voting_period_start
        - voting_period_end
        - voting_credit_type
        - voting_credit_scope
        - voting_credit_nfts
        - visibility_group_id
        - participation_group_id
        - chat_group_id
        - voting_group_id
        - admin_group_id
        - admin_drop_deletion_enabled
        - forbid_negative_votes
        - pinned
        - identity_wave
      properties:
        id:
          type: string
        name:
          type: string
        picture:
          type: string
          nullable: true
        description_drop_id:
          type: string
        last_drop_time:
          description: Unix timestamp in milliseconds of the most recent drop in this wave
          type: number
          format: int64
        submission_type:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiWaveParticipationSubmissionStrategyType"
        authenticated_user_eligible_to_vote:
          type: boolean
        authenticated_user_eligible_to_participate:
          type: boolean
        authenticated_user_eligible_to_chat:
          type: boolean
        authenticated_user_admin:
          type: boolean
        visibility_group_id:
          type: string
          nullable: true
        participation_group_id:
          type: string
          nullable: true
        chat_group_id:
          type: string
          nullable: true
        voting_group_id:
          type: string
          nullable: true
        admin_group_id:
          type: string
          nullable: true
        voting_period_start:
          type: number
          format: int64
          nullable: true
        voting_period_end:
          type: number
          format: int64
          nullable: true
        voting_credit_type:
          $ref: "#/components/schemas/ApiWaveCreditType"
        voting_credit_scope:
          $ref: "#/components/schemas/ApiWaveCreditScope"
        voting_credit_nfts:
          anyOf:
            - type: "null"
            - type: array
              minItems: 1
              items:
                $ref: "#/components/schemas/ApiWaveCreditNft"
        admin_drop_deletion_enabled:
          type: boolean
        forbid_negative_votes:
          type: boolean
        pinned:
          type: boolean
        identity_wave:
          type: boolean
    ApiWaveNotificationPreferences:
      type: object
      required:
        - subscribed
        - enabled_group_notifications
      properties:
        subscribed:
          type: boolean
        enabled_group_notifications:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropGroupMention"
    ApiWaveOutcome:
      type: object
      required:
        - type
        - description
        - index
      properties:
        type:
          $ref: "#/components/schemas/ApiWaveOutcomeType"
        subtype:
          $ref: "#/components/schemas/ApiWaveOutcomeSubType"
        description:
          type: string
        credit:
          $ref: "#/components/schemas/ApiWaveOutcomeCredit"
        rep_category:
          type: string
        amount:
          type: number
          format: int64
        index:
          type: number
          format: int64
    ApiWaveOutcomeCredit:
      type: string
      enum:
        - REP
        - CIC
    ApiWaveOutcomeDistributionItem:
      type: object
      required:
        - index
      properties:
        index:
          type: number
          format: int64
        amount:
          type: number
          format: int64
          nullable: true
        description:
          type: string
          nullable: true
    ApiWaveOutcomeDistributionItemsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveOutcomeDistributionItem"
    ApiWaveOutcomesPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveOutcome"
    ApiWaveOutcomeSubType:
      type: string
      enum:
        - CREDIT_DISTRIBUTION
    ApiWaveOutcomeType:
      type: string
      enum:
        - AUTOMATIC
        - MANUAL
    ApiWaveOverview:
      type: object
      required:
        - id
        - name
        - creator
        - last_drop_time
        - created_at
        - subscribers_count
        - has_competition
        - is_dm_wave
        - links_disabled
        - description_drop
        - total_drops_count
        - is_private
      properties:
        id:
          type: string
        name:
          type: string
        pfp:
          type: string
        creator:
          $ref: "#/components/schemas/ApiProfileMin"
        last_drop_time:
          type: integer
          format: int64
        created_at:
          type: integer
          format: int64
        subscribers_count:
          type: integer
          format: int64
        has_competition:
          type: boolean
        is_dm_wave:
          type: boolean
        links_disabled:
          type: boolean
        description_drop:
          $ref: "#/components/schemas/ApiWaveOverviewDescriptionDrop"
        total_drops_count:
          type: integer
          format: int64
        is_private:
          type: boolean
        contributors:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveOverviewContributor"
        context_profile_context:
          $ref: "#/components/schemas/ApiWaveOverviewContextProfileContext"
        parent_wave:
          $ref: "#/components/schemas/ApiWaveOverview"
        has_subwaves:
          type: boolean
        wave_rep:
          $ref: "#/components/schemas/ApiWaveRepSummary"
        wave_score:
          $ref: "#/components/schemas/ApiWaveScore"
    ApiWaveOverviewContextProfileContext:
      type: object
      required:
        - subscribed
        - pinned
        - can_chat
        - unread_drops
        - muted
      properties:
        subscribed:
          type: boolean
        pinned:
          type: boolean
        can_chat:
          type: boolean
        next_drop_allowed:
          type: integer
          format: int64
        unread_drops:
          type: integer
          format: int64
        first_unread_drop_serial_no:
          type: integer
          format: int64
        subwave_unread_drops:
          type: integer
          format: int64
          description: >-
            Unread drops across all visible subwaves, independent of whether the
            authenticated profile follows each subwave.
        followed_subwaves_count:
          type: integer
          format: int64
        latest_followed_subwave_activity_timestamp:
          type: integer
          format: int64
        hidden_followed_subwave_unread_drops:
          type: integer
          format: int64
        first_hidden_followed_subwave_unread_drop_serial_no:
          type: integer
          format: int64
        muted:
          type: boolean
    ApiWaveOverviewContributor:
      type: object
      required:
        - handle
        - pfp
      properties:
        handle:
          type: string
          nullable: true
        pfp:
          type: string
          nullable: true
    ApiWaveOverviewDescriptionDrop:
      type: object
      properties:
        contents:
          type: string
        media:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropMedia"
    ApiWaveOverviewPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveOverview"
    ApiWaveParticipationConfig:
      type: object
      required:
        - scope
        - required_metadata
        - signature_required
        - no_of_applications_allowed_per_participant
        - required_media
        - authenticated_user_eligible
        - terms
      properties:
        scope:
          $ref: "#/components/schemas/ApiWaveScope"
        no_of_applications_allowed_per_participant:
          description: >-
            The number of applications allowed per participant. Infinite if
            omitted.
          type: integer
          format: int64
          minimum: 1
          nullable: true
        required_metadata:
          description: |
            The metadata that must be provided by the participant. 
            Empty array if nothing is required.
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveRequiredMetadata"
        required_media:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveParticipationRequirement"
        signature_required:
          description: If true then the votes must be signed by voters.
          type: boolean
        period:
          $ref: "#/components/schemas/ApiIntRange"
        authenticated_user_eligible:
          type: boolean
        terms:
          type: string
          nullable: true
        submission_strategy:
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiWaveParticipationSubmissionStrategy"
    ApiWaveParticipationIdentitySubmissionAllowDuplicates:
      type: string
      enum:
        - ALWAYS_ALLOW
        - ALLOW_AFTER_WIN
        - NEVER_ALLOW
    ApiWaveParticipationIdentitySubmissionWhoCanBeSubmitted:
      type: string
      enum:
        - ONLY_MYSELF
        - ONLY_OTHERS
        - EVERYONE
    ApiWaveParticipationRequirement:
      type: string
      enum:
        - IMAGE
        - AUDIO
        - VIDEO
    ApiWaveParticipationSubmissionStrategy:
      type: object
      required:
        - type
        - config
      properties:
        type:
          $ref: "#/components/schemas/ApiWaveParticipationSubmissionStrategyType"
        config:
          $ref: >-
            #/components/schemas/ApiWaveParticipationSubmissionStrategyIdentityConf
    ApiWaveParticipationSubmissionStrategyIdentityConf:
      type: object
      required:
        - duplicates
        - who_can_be_submitted
      properties:
        duplicates:
          $ref: >-
            #/components/schemas/ApiWaveParticipationIdentitySubmissionAllowDuplicates
        who_can_be_submitted:
          $ref: >-
            #/components/schemas/ApiWaveParticipationIdentitySubmissionWhoCanBeSubmitted
    ApiWaveParticipationSubmissionStrategyType:
      type: string
      enum:
        - IDENTITY
    ApiWavePoll:
      type: object
      required:
        - id
        - wave_id
        - drop_id
        - created_at
        - options
        - voted
        - multichoice
        - anonymous
        - only_droppers_can_respond
        - closing_time
        - is_open
      properties:
        id:
          type: string
        wave_id:
          type: string
        drop_id:
          type: string
        created_at:
          type: integer
          format: int64
        options:
          type: array
          items:
            $ref: "#/components/schemas/ApiDropPollOption"
        voted:
          description: Option numbers voted for by the authenticated context profile.
          type: array
          items:
            type: integer
            format: int64
            minimum: 1
        multichoice:
          type: boolean
        anonymous:
          type: boolean
        only_droppers_can_respond:
          type: boolean
        closing_time:
          type: integer
          format: int64
        is_open:
          type: boolean
    ApiWaveRepCategoriesPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveRepCategory"
    ApiWaveRepCategory:
      type: object
      required:
        - category
        - total_rep
        - contributor_count
        - authenticated_user_contribution
        - top_contributors
      properties:
        category:
          type: string
        total_rep:
          type: number
          format: int64
        contributor_count:
          type: number
          format: int64
        authenticated_user_contribution:
          type: number
          format: int64
          nullable: true
        top_contributors:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveRepContributor"
    ApiWaveRepCategorySummary:
      type: object
      required:
        - category
        - total_rep
        - contributor_count
      properties:
        category:
          type: string
        total_rep:
          type: number
          format: int64
        contributor_count:
          type: number
          format: int64
    ApiWaveRepContributor:
      type: object
      required:
        - contribution
        - profile
      properties:
        contribution:
          type: number
          format: int64
        profile:
          $ref: "#/components/schemas/ApiProfileMin"
    ApiWaveRepContributorsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveRepContributor"
    ApiWaveRepOverview:
      type: object
      required:
        - total_rep
        - positive_rep
        - negative_rep
        - authenticated_user_contribution
        - contributor_count
        - contributors
      properties:
        total_rep:
          type: number
          format: int64
        positive_rep:
          type: number
          format: int64
        negative_rep:
          type: number
          format: int64
        authenticated_user_contribution:
          type: number
          format: int64
          nullable: true
        contributor_count:
          type: number
          format: int64
        contributors:
          $ref: "#/components/schemas/ApiWaveRepContributorsPage"
    ApiWaveRepRating:
      type: object
      required:
        - rating
      properties:
        rating:
          type: number
          format: int64
    ApiWaveRepSummary:
      type: object
      required:
        - total_rep
        - positive_rep
        - negative_rep
        - contributor_count
        - positive_contributor_count
        - negative_contributor_count
        - authenticated_user_contribution
        - categories
      properties:
        total_rep:
          type: number
          format: int64
        positive_rep:
          type: number
          format: int64
        negative_rep:
          type: number
          format: int64
        contributor_count:
          type: number
          format: int64
        positive_contributor_count:
          type: number
          format: int64
        negative_contributor_count:
          type: number
          format: int64
        authenticated_user_contribution:
          type: number
          format: int64
          nullable: true
        categories:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveRepCategorySummary"
    ApiWaveRequiredMetadata:
      type: object
      required:
        - name
        - type
      properties:
        name:
          description: Metadata key
          type: string
        type:
          $ref: "#/components/schemas/ApiWaveMetadataType"
    ApiWaveScope:
      description: A scope of audience
      type: object
      required:
        - group
      properties:
        group:
          description: If null, everyone is included
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiGroup"
    ApiWaveScore:
      type: object
      required:
        - score_version
        - visibility_tier
        - quality_score
        - hotness_score
        - rep_sort_score
        - visibility_score
        - components
        - penalties
        - quality_gate
        - formula
        - calculated_at
      properties:
        score_version:
          type: string
        visibility_tier:
          $ref: "#/components/schemas/ApiWaveVisibilityTier"
        quality_score:
          type: number
          format: double
        hotness_score:
          type: number
          format: double
        rep_sort_score:
          type: number
          format: double
        visibility_score:
          type: number
          format: double
        components:
          $ref: "#/components/schemas/ApiWaveScoreComponents"
        penalties:
          $ref: "#/components/schemas/ApiWaveScorePenalties"
        quality_gate:
          $ref: "#/components/schemas/ApiWaveScoreQualityGate"
        formula:
          $ref: "#/components/schemas/ApiWaveScoreFormula"
        calculated_at:
          type: integer
          format: int64
    ApiWaveScoreComponents:
      type: object
      required:
        - creator_score
        - level_weighted_participation_score
        - trusted_diversity_score
        - wave_rep_component_score
        - trusted_subscription_score
        - recent_trusted_activity_score
      properties:
        creator_score:
          type: number
          format: double
        level_weighted_participation_score:
          type: number
          format: double
        trusted_diversity_score:
          type: number
          format: double
        wave_rep_component_score:
          type: number
          format: double
        trusted_subscription_score:
          type: number
          format: double
        recent_trusted_activity_score:
          type: number
          format: double
    ApiWaveScoreFormula:
      type: object
      required:
        - max_level_raw_for_score
        - max_wave_rep_for_score
        - trusted_level_raw
        - low_trust_level_raw
        - recent_activity_window_ms
        - recent_activity_half_life_ms
        - participation_saturation_scale
        - trusted_diversity_saturation_scale
        - trusted_subscription_saturation_scale
        - recent_activity_saturation_scale
        - trusted_visible_min_visibility_score
        - exploration_neutral_min_visibility_score
        - demoted_min_visibility_score
        - quality_component_weights
        - hotness_component_weights
        - visibility_component_weights
      properties:
        max_level_raw_for_score:
          type: integer
          format: int64
        max_wave_rep_for_score:
          type: integer
          format: int64
        trusted_level_raw:
          type: integer
          format: int64
        low_trust_level_raw:
          type: integer
          format: int64
        recent_activity_window_ms:
          type: integer
          format: int64
        recent_activity_half_life_ms:
          type: integer
          format: int64
        participation_saturation_scale:
          type: number
          format: double
        trusted_diversity_saturation_scale:
          type: number
          format: double
        trusted_subscription_saturation_scale:
          type: number
          format: double
        recent_activity_saturation_scale:
          type: number
          format: double
        trusted_visible_min_visibility_score:
          type: number
          format: double
        exploration_neutral_min_visibility_score:
          type: number
          format: double
        demoted_min_visibility_score:
          type: number
          format: double
        quality_component_weights:
          $ref: "#/components/schemas/ApiWaveScoreQualityComponentWeights"
        hotness_component_weights:
          $ref: "#/components/schemas/ApiWaveScoreHotnessComponentWeights"
        visibility_component_weights:
          $ref: "#/components/schemas/ApiWaveScoreVisibilityComponentWeights"
    ApiWaveScoreHotnessComponentWeights:
      type: object
      required:
        - recent_trusted_activity_score
        - quality_score
      properties:
        recent_trusted_activity_score:
          type: number
          format: double
        quality_score:
          type: number
          format: double
    ApiWaveScorePenalties:
      type: object
      required:
        - single_actor_penalty
        - low_trust_flood_penalty
        - cross_post_pressure
        - cross_post_penalty
        - negative_rep_penalty
        - safety_multiplier
      properties:
        single_actor_penalty:
          type: number
          format: double
        low_trust_flood_penalty:
          type: number
          format: double
        cross_post_pressure:
          type: number
          format: double
        cross_post_penalty:
          type: number
          format: double
        negative_rep_penalty:
          type: number
          format: double
        safety_multiplier:
          type: number
          format: double
    ApiWaveScoreQualityComponentWeights:
      type: object
      required:
        - creator_score
        - level_weighted_participation_score
        - trusted_diversity_score
        - trusted_subscription_score
        - wave_rep_component_score
      properties:
        creator_score:
          type: number
          format: double
        level_weighted_participation_score:
          type: number
          format: double
        trusted_diversity_score:
          type: number
          format: double
        trusted_subscription_score:
          type: number
          format: double
        wave_rep_component_score:
          type: number
          format: double
    ApiWaveScoreQualityGate:
      type: object
      required:
        - threshold
        - multiplier
        - gated_hotness_score
      properties:
        threshold:
          type: number
          format: double
        multiplier:
          type: number
          format: double
        gated_hotness_score:
          type: number
          format: double
    ApiWaveScoreSort:
      type: string
      enum:
        - BALANCED
        - QUALITY
        - HOTNESS
        - REP
    ApiWaveScoreVisibilityComponentWeights:
      type: object
      required:
        - quality_score
        - gated_hotness_score
      properties:
        quality_score:
          type: number
          format: double
        gated_hotness_score:
          type: number
          format: double
    ApiWaveSearchAuthor:
      type: object
      required:
        - id
        - handle
        - pfp
      properties:
        id:
          type: string
        handle:
          type: string
        pfp:
          type: string
          nullable: true
    ApiWavesOverviewType:
      type: string
      enum:
        - MOST_SUBSCRIBED
        - RECENTLY_DROPPED_TO
        - SCORED_RECENTLY_DROPPED_TO
    ApiWavesPinFilter:
      type: string
      enum:
        - PINNED
        - NOT_PINNED
    ApiWaveSubscriptionActions:
      type: object
      required:
        - actions
      properties:
        actions:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveSubscriptionTargetAction"
    ApiWaveSubscriptionTargetAction:
      type: string
      enum:
        - DROP_CREATED
    ApiWavesV2ListType:
      type: string
      enum:
        - SEARCH
        - OVERVIEW
        - HOT
        - FAVOURITES
    ApiWaveType:
      type: string
      enum:
        - APPROVE
        - RANK
        - CHAT
    ApiWaveV3:
      type: object
      additionalProperties: false
      required:
        - id
        - name
        - picture
        - created_at
        - capabilities
        - permissions
      properties:
        id:
          type: string
        name:
          type: string
        picture:
          type: string
          nullable: true
        created_at:
          type: integer
          format: int64
        capabilities:
          $ref: "#/components/schemas/ApiWaveV3Capabilities"
        permissions:
          $ref: "#/components/schemas/ApiWaveV3Permissions"
    ApiWaveV3Capabilities:
      type: object
      additionalProperties: false
      required:
        - chat
        - competitions
      properties:
        chat:
          type: boolean
        competitions:
          type: boolean
    ApiWaveV3Permissions:
      type: object
      additionalProperties: false
      required:
        - view
        - chat
        - administer
      properties:
        view:
          type: boolean
        chat:
          type: boolean
        administer:
          type: boolean
    ApiWaveVisibilityConfig:
      type: object
      required:
        - scope
      properties:
        scope:
          $ref: "#/components/schemas/ApiWaveScope"
    ApiWaveVisibilityTier:
      type: string
      enum:
        - TRUSTED_VISIBLE
        - EXPLORATION_NEUTRAL
        - DEMOTED
        - SUPPRESSED
    ApiWaveVoter:
      type: object
      required:
        - voter
        - votes_summed
        - positive_votes_summed
        - negative_votes_summed
        - absolute_votes_summed
        - min_vote
        - max_vote
        - different_drops_voted
        - average_vote
      properties:
        voter:
          $ref: "#/components/schemas/ApiProfileMin"
        votes_summed:
          type: integer
          format: int64
        positive_votes_summed:
          type: integer
          format: int64
        negative_votes_summed:
          type: number
          format: int64
        absolute_votes_summed:
          type: number
          format: int64
        min_vote:
          type: number
          format: int64
        max_vote:
          type: number
          format: int64
        different_drops_voted:
          type: number
          format: int64
        average_vote:
          type: number
          format: int64
    ApiWaveVotersPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiWaveVoter"
    ApiWaveVotingConfig:
      type: object
      required:
        - scope
        - credit_type
        - credit_scope
        - credit_category
        - credit_nfts
        - signature_required
        - creditor
        - authenticated_user_eligible
        - forbid_negative_votes
      properties:
        scope:
          $ref: "#/components/schemas/ApiWaveScope"
        credit_type:
          $ref: "#/components/schemas/ApiWaveCreditType"
        credit_scope:
          $ref: "#/components/schemas/ApiWaveCreditScope"
        credit_category:
          description: >-
            Only relevant when credit_type=REP. The REP category which is usable
            as credit. If not set then all categories will be usable as voting
            credits.
          type: string
          nullable: true
        credit_nfts:
          description: Only relevant when credit_type=CARD_SET_TDH
          anyOf:
            - type: "null"
            - type: array
              items:
                $ref: "#/components/schemas/ApiWaveCreditNft"
        creditor:
          description: Only relevant when credit_type=REP
          anyOf:
            - type: "null"
            - $ref: "#/components/schemas/ApiProfileMin"
        signature_required:
          description: If true then the votes must be signed by voters.
          type: boolean
        period:
          $ref: "#/components/schemas/ApiIntRange"
        authenticated_user_eligible:
          type: boolean
        forbid_negative_votes:
          type: boolean
    ApiXTdhCollection:
      type: object
      required:
        - contract
        - collection_name
        - xtdh
        - xtdh_rate
        - total_token_count
        - active_token_count
        - total_contributor_count
        - active_contributor_count
      properties:
        contract:
          type: string
        collection_name:
          type: string
          nullable: true
        xtdh:
          type: number
          format: float
        xtdh_rate:
          type: number
          format: float
        total_token_count:
          type: number
          format: int64
        active_token_count:
          type: number
          format: int64
        total_contributor_count:
          type: number
          format: int64
        active_contributor_count:
          type: number
          format: int64
    ApiXTdhCollectionsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiXTdhCollection"
    ApiXTdhContribution:
      type: object
      required:
        - xtdh
        - xtdh_rate
      properties:
        grant:
          $ref: "#/components/schemas/ApiXTdhGrant"
        grantor:
          $ref: "#/components/schemas/ApiProfileMin"
        xtdh:
          type: number
          format: float
        xtdh_rate:
          type: number
          format: float
        total_grant_count:
          type: number
          format: int64
        active_grant_count:
          type: number
          format: int64
    ApiXTdhContributionsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiXTdhContribution"
    ApiXTdhCreateGrant:
      type: object
      required:
        - target_chain
        - target_contract
        - target_tokens
        - valid_to
        - rate
        - is_irrevocable
      properties:
        target_chain:
          $ref: "#/components/schemas/ApiXTdhGrantTargetChain"
        target_contract:
          type: string
        target_tokens:
          type: array
          items:
            type: string
          description: >-
            List of token numbers. Each element can also be a span in form of
            start-end. Leave empty if all tokens are targets.
        valid_to:
          type: number
          format: int64
          nullable: true
        rate:
          type: number
          format: int64
        is_irrevocable:
          type: boolean
          description: If true then the grant must be covered with lock contracts
    ApiXTdhGlobalStats:
      type: object
      required:
        - xtdh
        - xtdh_rate
        - multiplier
        - outgoing_rate
        - outgoing_total
        - outgoing_collections_count
        - outgoing_tokens_count
      properties:
        xtdh:
          type: number
          format: double
        xtdh_rate:
          type: number
          format: double
        multiplier:
          type: number
          format: double
        outgoing_rate:
          type: number
          format: double
        outgoing_total:
          type: number
          format: double
        outgoing_collections_count:
          type: number
          format: int64
        outgoing_tokens_count:
          type: number
          format: int64
    ApiXTdhGrant:
      type: object
      required:
        - id
        - grantor
        - target_chain
        - target_contract
        - target_tokens_count
        - target_collection_name
        - created_at
        - updated_at
        - valid_from
        - valid_to
        - rate
        - error_details
        - status
        - is_irrevocable
        - total_granted
      properties:
        id:
          type: string
        grantor:
          $ref: "#/components/schemas/ApiProfileMin"
        target_chain:
          $ref: "#/components/schemas/ApiXTdhGrantTargetChain"
        target_contract:
          type: string
        target_token_mode:
          $ref: "#/components/schemas/ApiXTdhGrantTargetTokenMode"
        target_tokens_count:
          type: number
          format: int64
        target_collection_name:
          type: string
          nullable: true
        created_at:
          type: number
          format: int64
        updated_at:
          type: number
          format: int64
        valid_from:
          type: number
          format: int64
          nullable: true
        valid_to:
          type: number
          format: int64
          nullable: true
        rate:
          type: number
          format: int64
        error_details:
          type: string
          nullable: true
        status:
          $ref: "#/components/schemas/ApiXTdhGrantStatus"
        is_irrevocable:
          type: boolean
          description: If true then the grant must be covered with lock contracts
        total_granted:
          type: number
          format: int64
    ApiXTdhGrantee:
      type: object
      required:
        - grantee
        - collections_count
        - tokens_count
        - xtdh
        - xtdh_rate
      properties:
        grantee:
          $ref: "#/components/schemas/ApiProfileMin"
        xtdh:
          type: number
          format: float
        xtdh_rate:
          type: number
          format: float
        collections_count:
          type: number
          format: int64
        tokens_count:
          type: number
          format: int64
    ApiXTdhGranteesPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiXTdhGrantee"
    ApiXTdhGrantsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiXTdhGrant"
    ApiXTdhGrantStatus:
      type: string
      enum:
        - PENDING
        - FAILED
        - GRANTED
        - DISABLED
    ApiXTdhGrantTargetChain:
      type: string
      enum:
        - ETHEREUM_MAINNET
    ApiXTdhGrantTargetTokenMode:
      type: string
      enum:
        - ALL
        - INCLUDE
    ApiXTdhGrantToken:
      type: object
      required:
        - token
        - xtdh
      properties:
        token:
          type: string
        xtdh:
          type: number
          format: float
    ApiXTdhGrantTokensPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiXTdhGrantToken"
    ApiXTdhGrantUpdateRequest:
      type: object
      required:
        - valid_to
      properties:
        valid_to:
          type: number
          format: int64
          description: >-
            If valid_to-valid_from does not allow for at least one xTDH
            increment then old grant is disabled and substitute wont be created
    ApiXTdhStats:
      type: object
      required:
        - identity
        - xtdh
        - xtdh_rate
        - multiplier
        - outgoing_rate
        - outgoing_total
        - outgoing_collections_count
        - outgoing_tokens_count
        - incoming_rate
        - incoming_total
        - generation_rate
        - generated_total
        - unused_rate
      properties:
        identity:
          $ref: "#/components/schemas/ApiIdentity"
        xtdh:
          type: number
          format: double
        xtdh_rate:
          type: number
          format: double
        multiplier:
          type: number
          format: double
        outgoing_rate:
          type: number
          format: double
        outgoing_total:
          type: number
          format: double
        outgoing_collections_count:
          type: number
          format: int64
        outgoing_tokens_count:
          type: number
          format: int64
        incoming_rate:
          type: number
          format: double
        incoming_total:
          type: number
          format: double
        generated_total:
          type: number
          format: double
        generation_rate:
          type: number
          format: double
        unused_rate:
          type: number
          format: double
    ApiXTdhToken:
      type: object
      required:
        - contract
        - token
        - owner
        - xtdh
        - xtdh_rate
        - total_contributor_count
        - active_contributor_count
      properties:
        contract:
          type: string
        token:
          type: number
          format: int64
        owner:
          $ref: "#/components/schemas/ApiProfileMin"
        xtdh:
          type: number
          format: float
        xtdh_rate:
          type: number
          format: float
        total_contributor_count:
          type: number
          format: int64
        active_contributor_count:
          type: number
          format: int64
    ApiXTdhTokensPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithoutCount"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/ApiXTdhToken"
    DistributionNormalized:
      type: object
      required:
        - card_id
        - contract
        - wallet
        - wallet_display
        - airdrops
        - total_spots
        - total_count
        - minted
      properties:
        card_id:
          type: integer
          format: int64
        contract:
          type: string
        wallet:
          type: string
        wallet_display:
          type: string
        card_name:
          type: string
          nullable: true
        mint_date:
          type: string
          format: date-time
          nullable: true
        airdrops:
          type: integer
          format: int64
        total_spots:
          type: integer
          format: int64
        total_count:
          type: integer
          format: int64
        minted:
          type: integer
          format: int64
        allowlist:
          type: array
          nullable: true
          items:
            $ref: "#/components/schemas/AllowlistNormalizedEntry"
        phases:
          type: array
          nullable: true
          items:
            type: string
    DistributionNormalizedPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/DistributionNormalized"
    DistributionOverview:
      type: object
      required:
        - photos_count
        - is_normalized
        - artist_airdrops_addresses
        - artist_airdrops_count
        - team_airdrops_addresses
        - team_airdrops_count
      properties:
        photos_count:
          type: integer
          format: int64
          description: Number of photos for this distribution
        is_normalized:
          type: boolean
          description: Whether the distribution has been normalized
        artist_airdrops_addresses:
          type: integer
          format: int64
          description: Count of unique addresses in the Airdrop - Artist phase
        artist_airdrops_count:
          type: integer
          format: int64
          description: Total count in the Airdrop - Artist phase
        team_airdrops_addresses:
          type: integer
          format: int64
          description: Count of unique addresses in the Airdrop - Team phase
        team_airdrops_count:
          type: integer
          format: int64
          description: Total count in the Airdrop - Team phase
    DistributionPhasesPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            type: string
    DistributionPhoto:
      type: object
      required:
        - id
        - card_id
        - contract
        - link
      properties:
        id:
          type: integer
          format: int64
        card_id:
          type: integer
          format: int64
        contract:
          type: string
        link:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    DistributionPhotoCompleteRequest:
      type: object
      required:
        - photos
      properties:
        photos:
          type: array
          minItems: 1
          items:
            $ref: "#/components/schemas/DistributionPhotoCompleteRequestPhoto"
    DistributionPhotoCompleteRequestPhoto:
      type: object
      required:
        - media_url
      properties:
        media_url:
          type: string
          description: The CloudFront URL of the uploaded photo
    DistributionPhotoCompleteResponse:
      type: object
      required:
        - success
        - photos
      properties:
        success:
          type: boolean
        photos:
          type: array
          items:
            type: string
            description: CloudFront URLs of the saved photos
    DistributionPhotosPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/DistributionPhoto"
    MintingClaim:
      type: object
      required:
        - drop_id
        - contract
        - claim_id
        - description
        - name
        - attributes
      properties:
        drop_id:
          type: string
        contract:
          type: string
        claim_id:
          type: integer
          format: int64
        image_location:
          type: string
          nullable: true
        animation_location:
          type: string
          nullable: true
        metadata_location:
          type: string
          nullable: true
        media_uploading:
          type: boolean
        edition_size:
          type: integer
          format: int32
          description: Maximum signed 32-bit integer.
          maximum: 2147483647
          nullable: true
        description:
          type: string
        name:
          type: string
        image_url:
          type: string
          nullable: true
        external_url:
          type: string
          nullable: true
        attributes:
          type: array
          items:
            $ref: "#/components/schemas/MintingClaimAttribute"
        image_details:
          $ref: "#/components/schemas/MintingClaimImageDetails"
          nullable: true
        animation_url:
          type: string
          nullable: true
        animation_details:
          oneOf:
            - $ref: "#/components/schemas/MintingClaimAnimationDetailsVideo"
            - $ref: "#/components/schemas/MintingClaimAnimationDetailsHtml"
            - $ref: "#/components/schemas/MintingClaimAnimationDetailsGlb"
          nullable: true
    MintingClaimAnimationDetailsGlb:
      type: object
      required:
        - bytes
        - format
        - sha256
      properties:
        bytes:
          type: integer
          format: int64
          minimum: 0
        format:
          type: string
          enum:
            - GLB
        sha256:
          type: string
    MintingClaimAnimationDetailsHtml:
      type: object
      required:
        - format
      properties:
        format:
          type: string
          enum:
            - HTML
    MintingClaimAnimationDetailsVideo:
      type: object
      required:
        - bytes
        - format
        - duration
        - sha256
        - width
        - height
        - codecs
      properties:
        bytes:
          type: integer
          format: int64
          minimum: 0
        format:
          type: string
        duration:
          type: number
          minimum: 0
        sha256:
          type: string
        width:
          type: integer
          format: int32
          minimum: 0
        height:
          type: integer
          format: int32
          minimum: 0
        codecs:
          type: array
          items:
            type: string
    MintingClaimAttribute:
      type: object
      required:
        - trait_type
        - value
      properties:
        trait_type:
          type: string
        value:
          oneOf:
            - type: string
            - type: number
        display_type:
          type: string
        max_value:
          type: number
    MintingClaimImageDetails:
      type: object
      required:
        - bytes
        - format
        - sha256
        - width
        - height
      properties:
        bytes:
          type: integer
          format: int64
          minimum: 0
        format:
          type: string
        sha256:
          type: string
        width:
          type: integer
          format: int32
          minimum: 0
        height:
          type: integer
          format: int32
          minimum: 0
    MintingClaimsPageResponse:
      type: object
      required:
        - claims
        - count
        - page
        - page_size
        - next
      properties:
        claims:
          type: array
          items:
            $ref: "#/components/schemas/MintingClaim"
        count:
          type: integer
          format: int64
          description: Total number of claims
        page:
          type: integer
          format: int64
        page_size:
          type: integer
          format: int64
        next:
          type: boolean
          description: True if there is a next page
    MintingClaimsProofItem:
      type: object
      required:
        - merkle_proof
        - value
      properties:
        merkle_proof:
          type: array
          items:
            type: string
          description: Hex merkle proof hashes
        value:
          type: integer
          format: int64
          description: Spot index (value) for this proof
    MintingClaimsProofsResponse:
      type: object
      required:
        - proofs
      properties:
        proofs:
          type: array
          items:
            $ref: "#/components/schemas/MintingClaimsProofItem"
    MintingClaimsResponse:
      type: object
      required:
        - claims
      properties:
        claims:
          type: array
          items:
            $ref: "#/components/schemas/MintingClaim"
    MintingClaimsRootItem:
      type: object
      required:
        - phase
        - merkle_root
        - addresses_count
        - total_spots
      properties:
        phase:
          type: string
          description: Phase name
        merkle_root:
          type: string
          description: 0x-prefixed hex merkle root
        addresses_count:
          type: integer
          format: int64
          description: Number of unique addresses in this phase
        total_spots:
          type: integer
          format: int64
          description: Sum of mint spots for this phase
    MintingClaimUpdateRequest:
      type: object
      properties:
        edition_size:
          type: integer
          format: int32
          description: Maximum signed 32-bit integer.
          maximum: 2147483647
          nullable: true
        description:
          type: string
        name:
          type: string
        image_url:
          type: string
          nullable: true
        external_url:
          type: string
          nullable: true
        attributes:
          type: array
          items:
            $ref: "#/components/schemas/MintingClaimAttribute"
        animation_url:
          type: string
          nullable: true
    NFTFinalSubscription:
      type: object
      required:
        - consolidation_key
        - contract
        - token_id
        - subscribed_count
        - airdrop_address
        - balance
      properties:
        id:
          type: integer
          format: int64
        consolidation_key:
          type: string
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        subscribed_count:
          type: integer
          format: int64
        airdrop_address:
          type: string
        balance:
          type: number
          format: double
        subscribed_at:
          type: string
          nullable: true
        phase:
          type: string
          nullable: true
        phase_subscriptions:
          type: integer
          format: int64
        phase_position:
          type: integer
          format: int64
        redeemed_count:
          type: integer
          format: int64
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    NFTFinalSubscriptionUpload:
      type: object
      required:
        - contract
        - token_id
        - upload_url
      properties:
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        date:
          type: string
          nullable: true
        upload_url:
          type: string
        created_at:
          type: string
          format: date-time
    NFTFinalSubscriptionUploadPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/NFTFinalSubscriptionUpload"
    NFTSubscription:
      type: object
      required:
        - consolidation_key
        - contract
        - token_id
        - subscribed
        - subscribed_count
      properties:
        consolidation_key:
          type: string
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        subscribed:
          type: boolean
        subscribed_count:
          type: integer
          format: int64
    PhaseAirdrop:
      type: object
      required:
        - wallet
        - amount
      properties:
        wallet:
          $ref: "#/components/schemas/ApiEthereumAddress"
        amount:
          type: integer
          format: int64
          minimum: 0
    RedeemedSubscription:
      type: object
      required:
        - contract
        - token_id
        - address
        - transaction
        - consolidation_key
        - value
        - balance_after
        - count
      properties:
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        address:
          type: string
        transaction:
          type: string
        transaction_date:
          type: string
          format: date-time
          nullable: true
        consolidation_key:
          type: string
        value:
          type: number
          format: double
        balance_after:
          type: number
          format: double
        count:
          type: integer
          format: int64
        created_at:
          type: string
          format: date-time
    RedeemedSubscriptionCounts:
      type: object
      required:
        - contract
        - token_id
        - count
        - name
        - image_url
        - mint_date
        - szn
      properties:
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        count:
          type: integer
          format: int64
        name:
          type: string
        image_url:
          type: string
        mint_date:
          type: string
        szn:
          type: integer
          format: int64
    RedeemedSubscriptionCountsPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/RedeemedSubscriptionCounts"
    RedeemedSubscriptionPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/RedeemedSubscription"
    SubscribeAllEditionsResponse:
      type: object
      required:
        - consolidation_key
        - subscribe_all_editions
      properties:
        consolidation_key:
          type: string
        subscribe_all_editions:
          type: boolean
    SubscriptionCountResponse:
      type: object
      required:
        - consolidation_key
        - contract
        - token_id
        - count
      properties:
        consolidation_key:
          type: string
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        count:
          type: integer
          format: int64
    SubscriptionCounts:
      type: object
      required:
        - contract
        - token_id
        - count
      properties:
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        count:
          type: integer
          format: int64
    SubscriptionDetails:
      type: object
      required:
        - consolidation_key
        - last_update
        - balance
        - automatic
        - subscribe_all_editions
        - subscription_eligibility_count
      properties:
        consolidation_key:
          type: string
        last_update:
          type: integer
          format: int64
        balance:
          type: number
          format: double
        automatic:
          type: boolean
        subscribe_all_editions:
          type: boolean
        subscription_eligibility_count:
          type: integer
          format: int64
    SubscriptionLog:
      type: object
      required:
        - consolidation_key
        - log
      properties:
        id:
          type: integer
          format: int64
        consolidation_key:
          type: string
        log:
          type: string
        additional_info:
          type: string
          nullable: true
        created_at:
          type: string
          format: date-time
    SubscriptionLogPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/SubscriptionLog"
    SubscriptionModeResponse:
      type: object
      required:
        - consolidation_key
        - automatic
      properties:
        consolidation_key:
          type: string
        automatic:
          type: boolean
    SubscriptionResponse:
      type: object
      required:
        - consolidation_key
        - contract
        - token_id
        - subscribed
        - subscribed_count
      properties:
        consolidation_key:
          type: string
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        subscribed:
          type: boolean
        subscribed_count:
          type: integer
          format: int64
    SubscriptionTopUp:
      type: object
      required:
        - hash
        - block
        - transaction_date
        - from_wallet
        - amount
      properties:
        hash:
          type: string
        block:
          type: integer
          format: int64
        transaction_date:
          type: string
          format: date-time
        from_wallet:
          type: string
        amount:
          type: number
          format: double
        created_at:
          type: string
          format: date-time
    SubscriptionTopUpPage:
      type: object
      required:
        - data
      allOf:
        - $ref: "#/components/schemas/ApiPageWithNextUriBase"
      properties:
        data:
          type: array
          items:
            $ref: "#/components/schemas/SubscriptionTopUp"
    UpdateSubscribeAllEditionsRequest:
      type: object
      required:
        - subscribe_all_editions
      properties:
        subscribe_all_editions:
          type: boolean
    UpdateSubscriptionCountRequest:
      type: object
      required:
        - contract
        - token_id
        - count
      properties:
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        count:
          type: integer
          format: int64
    UpdateSubscriptionModeRequest:
      type: object
      required:
        - automatic
      properties:
        automatic:
          type: boolean
    UpdateSubscriptionRequest:
      type: object
      required:
        - contract
        - token_id
        - subscribed
      properties:
        contract:
          type: string
        token_id:
          type: integer
          format: int64
        subscribed:
          type: boolean
security:
  - bearerAuth: []
