{
  "openapi": "3.0.0",
  "paths": {
    "/": {
      "get": {
        "operationId": "HealthRootController_root",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "HealthRoot"
        ]
      }
    },
    "/health": {
      "get": {
        "operationId": "HealthRootController_health",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "tags": [
          "HealthRoot"
        ]
      }
    },
    "/api/meta/http-surface": {
      "get": {
        "operationId": "HttpMetaController_getHttpSurface",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "HTTP surface map — Nest-owned routes and remaining shared-handler surfaces",
        "tags": [
          "meta"
        ]
      }
    },
    "/api/parlay/health/live": {
      "get": {
        "operationId": "ParlayHealthController_healthLive",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Process alive"
          }
        },
        "summary": "Liveness (k8s) — /api/parlay",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/health/ready": {
      "get": {
        "operationId": "ParlayHealthController_healthReady",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Ready"
          },
          "503": {
            "description": "Not ready"
          }
        },
        "summary": "Readiness (k8s) — /api/parlay",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/health": {
      "get": {
        "operationId": "ParlayHealthController_healthAggregate",
        "parameters": [],
        "responses": {
          "200": {
            "description": "All subsystems healthy"
          },
          "503": {
            "description": "One or more subsystems unhealthy"
          }
        },
        "summary": "Aggregate service health (quote, chain, resolution, fees, engines, …)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/conditions": {
      "get": {
        "operationId": "ParlayConditionsController_getConditions",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Active conditions / markets for betting",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/fees/config": {
      "get": {
        "operationId": "ParlayFeesOddsController_getFeesConfig",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Fee configuration (bps + display percentages)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/fees/stats": {
      "get": {
        "operationId": "ParlayFeesOddsController_getFeesStats",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Fee statistics and APY estimates",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/fees/preview/{stake}": {
      "get": {
        "operationId": "ParlayFeesOddsController_getFeesPreview",
        "parameters": [
          {
            "name": "stake",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Preview fees for stake amount (wei string)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/odds/{outcomeId}": {
      "get": {
        "operationId": "ParlayFeesOddsController_getOdds",
        "parameters": [
          {
            "name": "outcomeId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cached odds for an outcome id",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/markets": {
      "get": {
        "operationId": "ParlayMarketsController_listMarkets",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List sports markets (Python engine / Odds API)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/markets/{matchId}/sgp-menu": {
      "get": {
        "operationId": "ParlayMarketsController_sgpMenu",
        "parameters": [
          {
            "name": "matchId",
            "required": true,
            "in": "path",
            "description": "Match / condition id for SGP menu or player props",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_combos",
            "required": false,
            "in": "query",
            "schema": {}
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "SGP menu for a match (Python engine)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/markets/{matchId}/player-props": {
      "get": {
        "operationId": "ParlayMarketsController_playerProps",
        "parameters": [
          {
            "name": "matchId",
            "required": true,
            "in": "path",
            "description": "Match / condition id for SGP menu or player props",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Player props for a match (Python engine)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/markets/{marketId}": {
      "get": {
        "operationId": "ParlayMarketsController_marketDetail",
        "parameters": [
          {
            "name": "marketId",
            "required": true,
            "in": "path",
            "description": "Market or condition id",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Single market by id (Python engine, else Polymarket cache)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/winnings": {
      "get": {
        "operationId": "ParlayBettorReadsController_winnings",
        "parameters": [
          {
            "name": "address",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Total parlay winnings for a bettor (won parlays)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/history": {
      "get": {
        "operationId": "ParlayBettorReadsController_history",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Parlay history for bettor (tickets shape)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/tickets": {
      "get": {
        "operationId": "ParlayBettorReadsController_tickets",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Parlay tickets by filters",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/users/{address}/nonce": {
      "get": {
        "operationId": "ParlayBettorReadsController_userNonce",
        "parameters": [
          {
            "name": "address",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Current parlay nonce for wallet (quote signing)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/users/{address}/stats": {
      "get": {
        "operationId": "ParlayBettorReadsController_userStats",
        "parameters": [
          {
            "name": "address",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "User nonce stats (aggregate)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/ticket/{parlayId}": {
      "get": {
        "operationId": "ParlayBettorReadsController_ticketDetail",
        "parameters": [
          {
            "name": "parlayId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Parlay ticket by id (frontend-compatible)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/status/{parlayId}": {
      "get": {
        "operationId": "ParlayLookupController_status",
        "parameters": [
          {
            "name": "parlayId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Lightweight parlay status",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/bettor/{address}": {
      "get": {
        "operationId": "ParlayLookupController_bettorParlays",
        "parameters": [
          {
            "name": "address",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Parlays for bettor (indexed DB list)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/builders/european-saturday": {
      "get": {
        "operationId": "ParlayBuildersController_europeanSaturday",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "European Saturday builder (Python engine)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/builders/same-team-run": {
      "get": {
        "operationId": "ParlayBuildersController_sameTeamRun",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Same-team run builder (Python engine)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/legs/validate": {
      "post": {
        "operationId": "ParlayQuoteController_validateLegs",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Validate sports legs against Python SGP rules (no pricing)",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/quote": {
      "post": {
        "operationId": "ParlayQuoteController_createQuote",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Generate signed parlay quote",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/quote/{quoteId}": {
      "get": {
        "operationId": "ParlayQuoteController_getQuote",
        "parameters": [
          {
            "name": "quoteId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Quote status from DB",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/quote/validate": {
      "post": {
        "operationId": "ParlayQuoteController_validateQuote",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Validate quote still usable",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/claim/{parlayId}": {
      "post": {
        "operationId": "ParlayClaimController_claim",
        "parameters": [
          {
            "name": "parlayId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Claim / settle parlay — calldata for resolveParlays",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/parlay/{parlayId}": {
      "get": {
        "operationId": "ParlayEnrichedDetailController_enrichedDetail",
        "parameters": [
          {
            "name": "parlayId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Parlay detail (enriched) by bytes32 id",
        "tags": [
          "parlay"
        ]
      }
    },
    "/api/lp/pool": {
      "get": {
        "operationId": "LpController_getPool",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "LP pool stats (chain-cached)",
        "tags": [
          "lp",
          "parlay"
        ]
      }
    },
    "/api/lp/apy": {
      "get": {
        "operationId": "LpController_getApy",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "LP APY and fee earnings",
        "tags": [
          "lp",
          "parlay"
        ]
      }
    },
    "/api/lp/position/{address}": {
      "get": {
        "operationId": "LpController_getPosition",
        "parameters": [
          {
            "name": "address",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "LP position for wallet",
        "tags": [
          "lp",
          "parlay"
        ]
      }
    },
    "/api/lp/add-liquidity/quote": {
      "post": {
        "operationId": "LpController_postAddLiquidityQuote",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Quote for add liquidity",
        "tags": [
          "lp",
          "parlay"
        ]
      }
    },
    "/api/lp/remove-liquidity/quote": {
      "post": {
        "operationId": "LpController_postRemoveLiquidityQuote",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Quote for remove liquidity",
        "tags": [
          "lp",
          "parlay"
        ]
      }
    },
    "/api/lp/compartments": {
      "get": {
        "operationId": "LpController_getCompartments",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Compartment allocation (cached)",
        "tags": [
          "lp",
          "parlay"
        ]
      }
    },
    "/api/lp/exposure-breakdown": {
      "get": {
        "operationId": "LpController_getExposureBreakdown",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Exposure by compartment and bettor",
        "tags": [
          "lp",
          "parlay"
        ]
      }
    },
    "/api/lp/bettor/{address}/exposure": {
      "get": {
        "operationId": "LpController_getBettorExposure",
        "parameters": [
          {
            "name": "address",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Bettor-specific exposure",
        "tags": [
          "lp",
          "parlay"
        ]
      }
    },
    "/bento/tournaments/by-wallet/{wallet}": {
      "get": {
        "operationId": "BentoTournamentsByWalletController_byWalletRoute",
        "parameters": [
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournament entries for wallet (UserProfileView Predictions tab)",
        "tags": [
          "bento",
          "bento-tournaments"
        ]
      }
    },
    "/api/tournaments/health": {
      "get": {
        "operationId": "TournamentPublicHealthController_getHealth",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournament service quick health",
        "tags": [
          "tournaments",
          "tournaments-health"
        ]
      }
    },
    "/api/tournaments/platform-leaderboard-aggregate": {
      "get": {
        "operationId": "TournamentPlatformAggregateController_platformLeaderboardAggregate",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournaments + parlays totals for one collateral stack (unified global leaderboard)",
        "tags": [
          "tournaments",
          "tournaments-platform"
        ]
      }
    },
    "/api/tournaments/global-leaderboard": {
      "get": {
        "operationId": "TournamentGlobalLeaderboardController_getGlobalLeaderboard",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cross-tournament winnings leaderboard (optional wallets filter; timeframe=all|weekly|monthly)",
        "tags": [
          "tournaments",
          "tournaments-global-leaderboard"
        ]
      }
    },
    "/api/tournaments": {
      "get": {
        "operationId": "TournamentListController_list",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List tournaments (optional ownerWallet requires Bearer token matching ownerWallet)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/user/{wallet}/stats": {
      "get": {
        "operationId": "TournamentUserWalletStatsController_userWalletStats",
        "parameters": [
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Per-wallet tournament history and aggregate stats",
        "tags": [
          "tournaments",
          "tournaments-user-stats"
        ]
      }
    },
    "/api/tournaments/{id}/cancel-request": {
      "get": {
        "operationId": "TournamentCancelRequestController_getLatest",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Creator: latest cancellation request for tournament (wallet auth required; must be owner)",
        "tags": [
          "tournaments"
        ]
      },
      "post": {
        "operationId": "TournamentCancelRequestController_create",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Creator: submit cancellation request (does not cancel tournament)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/enter": {
      "post": {
        "operationId": "TournamentEnterController_enter",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Enter tournament after deposit (body: depositTxHash, isReentry; wallet auth required)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/deposit": {
      "post": {
        "operationId": "TournamentDepositController_deposit",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Vault deposit instructions (body: wallet, stageIndex?, isReentry?)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/withdraw": {
      "post": {
        "operationId": "TournamentWithdrawController_withdraw",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Withdraw entry before tournament starts (wallet auth)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/stages/{stageId}/picks": {
      "post": {
        "operationId": "TournamentPicksController_placePicks",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Place picks for a stage (wallet auth; body: picks[])",
        "tags": [
          "tournaments"
        ]
      },
      "get": {
        "operationId": "TournamentPicksController_getPicks",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Authenticated wallet's picks + chips summary for a stage",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/picks/{pickId}": {
      "delete": {
        "operationId": "TournamentPicksController_cancelPick",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pickId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cancel a pick (wallet auth)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/creator": {
      "get": {
        "operationId": "TournamentCreatorApiController_creatorRoot",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Reserved — single-segment /creator is not a tournament id; use /creator/eligibility etc.",
        "tags": [
          "tournaments",
          "tournaments-creator"
        ]
      }
    },
    "/api/tournaments/creator/eligibility": {
      "get": {
        "operationId": "TournamentCreatorApiController_eligibility",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Creator bond / whitelist eligibility for an expected prize pool",
        "tags": [
          "tournaments",
          "tournaments-creator"
        ]
      }
    },
    "/api/tournaments/creator/create-flow-eligibility": {
      "get": {
        "operationId": "TournamentCreatorApiController_createFlowEligibility",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Create-tournament flow: bond + max active, from stage1 buy-in × min entries",
        "tags": [
          "tournaments",
          "tournaments-creator"
        ]
      }
    },
    "/api/tournaments/creator/bond-requirement": {
      "get": {
        "operationId": "TournamentCreatorApiController_bondRequirement",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Bond USDC required for a wallet and expected prize pool",
        "tags": [
          "tournaments",
          "tournaments-creator"
        ]
      }
    },
    "/api/tournaments/creator/{wallet}/stats": {
      "get": {
        "operationId": "TournamentCreatorApiController_creatorWalletStats",
        "parameters": [
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Creator's public stats (tournaments won/active, reputation)",
        "tags": [
          "tournaments",
          "tournaments-creator"
        ]
      }
    },
    "/api/tournaments/creator/deposit-bond": {
      "post": {
        "operationId": "TournamentCreatorBondController_depositBond",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Deposit creator bond (authenticated wallet)",
        "tags": [
          "tournaments",
          "tournaments-creator"
        ]
      }
    },
    "/api/tournaments/creator/withdraw-bond": {
      "post": {
        "operationId": "TournamentCreatorBondController_withdrawBond",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Withdraw creator bond when no active tournaments",
        "tags": [
          "tournaments",
          "tournaments-creator"
        ]
      }
    },
    "/api/tournaments/{id}/stages/{stageId}/groups": {
      "get": {
        "operationId": "TournamentStageTableController_groups",
        "parameters": [
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Groups (and per-group standings) for a stage",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/stages/{stageId}/standings": {
      "get": {
        "operationId": "TournamentStageTableController_standings",
        "parameters": [
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "League table standings for a stage",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/bracket/status": {
      "get": {
        "operationId": "TournamentBracketStatusController_bracketStatus",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Bracket progress status",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/bracket": {
      "get": {
        "operationId": "TournamentBracketController_bracket",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Bracket structure + LMSR odds",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/stages/{stageId}/fixtures": {
      "get": {
        "operationId": "TournamentStageFixturesController_fixtures",
        "parameters": [
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Stage fixtures (markets) grouped by round",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/format-info": {
      "get": {
        "operationId": "TournamentFormatInfoController_formatInfo",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournament format info for UI rendering",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/leaderboard": {
      "get": {
        "operationId": "TournamentLeaderboardEligibilityController_leaderboard",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournament leaderboard + aggregate stats",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/eligibility": {
      "get": {
        "operationId": "TournamentLeaderboardEligibilityController_eligibility",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Wallet eligibility to enter / re-enter (query: wallet)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/stages/{stageId}/odds": {
      "get": {
        "operationId": "TournamentOddsPayoutController_getStageOdds",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Current odds for all markets in a stage",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/estimate-payout": {
      "post": {
        "operationId": "TournamentOddsPayoutController_estimatePayout",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Estimated payout for a potential pick",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/payouts": {
      "get": {
        "operationId": "TournamentOddsPayoutController_getPayouts",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Payout breakdown for a completed tournament",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/prize-pool": {
      "get": {
        "operationId": "TournamentOddsPayoutController_getPrizePool",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Current / projected prize pool",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/claim-proof": {
      "get": {
        "operationId": "TournamentClaimRefundController_getClaimProof",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Merkle proof for on-chain claim (query: wallet)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/confirm-claim": {
      "post": {
        "operationId": "TournamentClaimRefundController_confirmClaim",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Mark entry claimed after successful on-chain claim (body: wallet, txHash)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/refund-proof": {
      "get": {
        "operationId": "TournamentClaimRefundController_getRefundProof",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Merkle proof for refund on cancelled tournament (query: wallet)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/my-status": {
      "get": {
        "operationId": "TournamentMyStatusController_getMyStatus",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Entry status, chips, rank, projected payout (query: wallet)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/dispute-windows": {
      "get": {
        "operationId": "TournamentDisputesController_getDisputeWindows",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Dispute window status for all stages",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/stages/{stageId}/dispute-window": {
      "get": {
        "operationId": "TournamentDisputesController_getStageDisputeWindow",
        "parameters": [
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Dispute window status for a stage",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/stages/{stageId}/disputeable-markets": {
      "get": {
        "operationId": "TournamentDisputesController_getDisputeableMarkets",
        "parameters": [
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Markets disputeable in a stage (query: wallet)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/stages/{stageId}/disputes": {
      "get": {
        "operationId": "TournamentDisputesController_getStageDisputes",
        "parameters": [
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Disputes filed for a stage",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/stages/{stageId}/markets/{marketId}/dispute": {
      "post": {
        "operationId": "TournamentDisputesController_postStageMarketDispute",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "stageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "marketId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "File a dispute for a market (per-stage)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/markets/{marketId}/dispute-window": {
      "get": {
        "operationId": "TournamentDisputesController_getMarketDisputeWindow",
        "parameters": [
          {
            "name": "marketId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Dispute window for a market (legacy path)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/markets/{marketId}/dispute": {
      "post": {
        "operationId": "TournamentDisputesController_postMarketDispute",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "marketId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "File a dispute for a market (legacy path)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/markets/{marketId}/disputes": {
      "get": {
        "operationId": "TournamentDisputesController_getMarketDisputes",
        "parameters": [
          {
            "name": "marketId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Disputes for a market",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/payout-status": {
      "get": {
        "operationId": "TournamentDisputesController_getPayoutStatus",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Whether payouts are frozen due to disputes",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/{id}/disputes": {
      "get": {
        "operationId": "TournamentDisputesController_getTournamentDisputes",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "All disputes for the tournament",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/tournaments/chat/messages/{tournamentId}": {
      "get": {
        "operationId": "TournamentChatPublicController_getMessages",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournament chat history (optional `x-wallet-address` for reaction highlights)",
        "tags": [
          "tournaments",
          "tournaments-chat"
        ]
      }
    },
    "/api/tournaments/chat/unread-count/{tournamentId}": {
      "get": {
        "operationId": "TournamentChatPublicController_getUnreadCount",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Unread chat count since timestamp (query: since)",
        "tags": [
          "tournaments",
          "tournaments-chat"
        ]
      }
    },
    "/api/tournaments/chat/reactions/{messageId}": {
      "get": {
        "operationId": "TournamentChatPublicController_getReactions",
        "parameters": [
          {
            "name": "messageId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Reactions for a message (optional `x-wallet-address`)",
        "tags": [
          "tournaments",
          "tournaments-chat"
        ]
      }
    },
    "/api/tournaments/chat/messages": {
      "post": {
        "operationId": "TournamentChatWalletController_postMessage",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Send chat message (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-chat"
        ]
      }
    },
    "/api/tournaments/chat/ably-token": {
      "get": {
        "operationId": "TournamentChatWalletController_getAblyToken",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Ably token for realtime (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-chat"
        ]
      }
    },
    "/api/tournaments/chat/typing": {
      "post": {
        "operationId": "TournamentChatWalletController_postTyping",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Typing indicator (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-chat"
        ]
      }
    },
    "/api/tournaments/chat/reactions": {
      "post": {
        "operationId": "TournamentChatWalletController_postReaction",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Add/remove reaction (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-chat"
        ]
      }
    },
    "/api/tournaments/f1/dashboard/external": {
      "get": {
        "operationId": "TournamentF1PublicController_dashboardExternal",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "External F1 dashboard (SportMonks)",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/dashboard/external/full": {
      "get": {
        "operationId": "TournamentF1PublicController_dashboardExternalFull",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Full external F1 dashboard (SportMonks, iOS-shaped)",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/user/{wallet}/predictions/{eventId}": {
      "get": {
        "operationId": "TournamentF1PublicController_userPredictions",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "eventId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 user predictions for an event",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/rounds/{roundId}/matchups": {
      "get": {
        "operationId": "TournamentF1PublicController_roundMatchups",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "roundId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 H2H side-bet matchups for a round",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/rounds/{roundId}/side-bet-heatmap": {
      "get": {
        "operationId": "TournamentF1PublicController_sideBetHeatmap",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "roundId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 side-bet crowd heatmap (percentages)",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/rounds/{roundId}": {
      "get": {
        "operationId": "TournamentF1PublicController_roundDetail",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "roundId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 round detail (events + results)",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/rounds": {
      "get": {
        "operationId": "TournamentF1PublicController_rounds",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 rounds list",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/user/{wallet}/stats": {
      "get": {
        "operationId": "TournamentF1PublicController_userStats",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 user season stats",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/user/{wallet}/my-picks": {
      "get": {
        "operationId": "TournamentF1PublicController_userMyPicks",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 user my-picks bundle (stats + weekends + side bets)",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/heatmap/{eventId}": {
      "get": {
        "operationId": "TournamentF1PublicController_heatmap",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "eventId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 crowd heatmap for an event",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/eligibility/{wallet}": {
      "get": {
        "operationId": "TournamentF1PublicController_eligibility",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 entry / re-entry eligibility",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/race-analytics/{roundId}": {
      "get": {
        "operationId": "TournamentF1PublicController_raceAnalytics",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "roundId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 race analytics (SportMonks)",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/results/{roundId}": {
      "get": {
        "operationId": "TournamentF1PublicController_roundResults",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "roundId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 results breakdown for a round",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/drivers": {
      "get": {
        "operationId": "TournamentF1PublicController_drivers",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 driver pool from tournament config",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/leaderboard/weekend/{roundId}": {
      "get": {
        "operationId": "TournamentF1PublicController_leaderboardWeekend",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "roundId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 weekend leaderboard for a round",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/leaderboard/season": {
      "get": {
        "operationId": "TournamentF1PublicController_leaderboardSeason",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 season points leaderboard",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/leaderboard/elo": {
      "get": {
        "operationId": "TournamentF1PublicController_leaderboardElo",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 Elo leaderboard",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/dashboard": {
      "get": {
        "operationId": "TournamentF1PublicController_dashboard",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 tournament dashboard bundle",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/payouts": {
      "get": {
        "operationId": "TournamentF1PublicController_payouts",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 payout breakdown",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/my-payout": {
      "get": {
        "operationId": "TournamentF1PublicController_myPayout",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 wallet payout",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/claim-proof": {
      "get": {
        "operationId": "TournamentF1PublicController_claimProof",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 payout Merkle claim proof",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}": {
      "get": {
        "operationId": "TournamentF1PublicController_tournamentDetail",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 tournament detail",
        "tags": [
          "tournaments",
          "tournaments-f1"
        ]
      }
    },
    "/api/tournaments/f1/create": {
      "post": {
        "operationId": "TournamentF1WalletController_create",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Create F1 tournament (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-f1-wallet"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/rounds/{roundId}/side-bets": {
      "get": {
        "operationId": "TournamentF1WalletController_mySideBets",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "roundId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Get my side-bets for round (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-f1-wallet"
        ]
      },
      "post": {
        "operationId": "TournamentF1WalletController_sideBets",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "roundId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Submit side-bets for round (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-f1-wallet"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/enter": {
      "post": {
        "operationId": "TournamentF1WalletController_enter",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Enter F1 tournament (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-f1-wallet"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/reenter": {
      "post": {
        "operationId": "TournamentF1WalletController_reenter",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Re-enter F1 tournament (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-f1-wallet"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/events/{eventId}/predict": {
      "post": {
        "operationId": "TournamentF1WalletController_predict",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "eventId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Submit F1 predictions (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-f1-wallet"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/predictions/{predictionId}": {
      "put": {
        "operationId": "TournamentF1WalletController_updatePrediction",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "predictionId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Update F1 prediction (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-f1-wallet"
        ]
      },
      "delete": {
        "operationId": "TournamentF1WalletController_deletePrediction",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "predictionId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Delete F1 prediction (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-f1-wallet"
        ]
      }
    },
    "/api/tournaments/f1/{tournamentId}/events/{eventId}/lock-my-predictions": {
      "post": {
        "operationId": "TournamentF1WalletController_lockPredictions",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "eventId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Lock my predictions for event (wallet auth)",
        "tags": [
          "tournaments",
          "tournaments-f1-wallet"
        ]
      }
    },
    "/api/tournaments/{id}": {
      "get": {
        "operationId": "TournamentDetailController_getDetail",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "description": "Tournament id",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet",
            "required": false,
            "in": "query",
            "description": "Viewer wallet for userEntry and userPicks",
            "schema": {}
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournament detail + stages + leaderboard + optional wallet picks (query: wallet)",
        "tags": [
          "tournaments"
        ]
      }
    },
    "/api/agents/skill.md": {
      "get": {
        "operationId": "AgentSkillDocsController_getSkillMd",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Agent self-registration skill documentation (markdown)",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/skill.json": {
      "get": {
        "operationId": "AgentSkillDocsController_getSkillJson",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Agent self-registration skill documentation (JSON)",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/skills": {
      "get": {
        "operationId": "AgentSkillsController_listSkills",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List available agent skill documentation endpoints",
        "tags": [
          "agents",
          "agent-skills"
        ]
      }
    },
    "/api/agents/skills/bento_tournament": {
      "get": {
        "operationId": "AgentSkillsController_bentoTournament",
        "parameters": [
          {
            "name": "accept",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Bento Tournament skill (markdown or JSON by Accept)",
        "tags": [
          "agents",
          "agent-skills"
        ]
      }
    },
    "/api/agents/skills/bento_parlays": {
      "get": {
        "operationId": "AgentSkillsController_bentoParlays",
        "parameters": [
          {
            "name": "accept",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Bento Parlays skill (markdown or JSON by Accept)",
        "tags": [
          "agents",
          "agent-skills"
        ]
      }
    },
    "/api/agents/skills/complete": {
      "get": {
        "operationId": "AgentSkillsController_complete",
        "parameters": [
          {
            "name": "accept",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Combined Bento skills documentation",
        "tags": [
          "agents",
          "agent-skills"
        ]
      }
    },
    "/api/agents/skills/moltbot": {
      "get": {
        "operationId": "AgentSkillsController_moltbot",
        "parameters": [
          {
            "name": "accept",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Moltbot integration guide",
        "tags": [
          "agents",
          "agent-skills"
        ]
      }
    },
    "/api/agents/skills/{category}/{file}": {
      "get": {
        "operationId": "AgentSkillsController_categoryFile",
        "parameters": [
          {
            "name": "category",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "file",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "accept",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Skill docs under `tournament/` or `parlay/` (e.g. SKILL.md)",
        "tags": [
          "agents",
          "agent-skills"
        ]
      }
    },
    "/api/agents/public/feed": {
      "get": {
        "operationId": "AgentPublicController_feed",
        "parameters": [
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "actionType",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Public feed of successful agent actions",
        "tags": [
          "agents",
          "agent-public"
        ]
      }
    },
    "/api/agents/public/leaderboard": {
      "get": {
        "operationId": "AgentPublicController_leaderboard",
        "parameters": [
          {
            "name": "sortBy",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Agent leaderboard",
        "tags": [
          "agents",
          "agent-public"
        ]
      }
    },
    "/api/agents/public/stats": {
      "get": {
        "operationId": "AgentPublicController_stats",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Global agent statistics",
        "tags": [
          "agents",
          "agent-public"
        ]
      }
    },
    "/api/agents/public/{id}/activity": {
      "get": {
        "operationId": "AgentPublicController_activity",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Activity for one agent",
        "tags": [
          "agents",
          "agent-public"
        ]
      }
    },
    "/api/agents/public/{id}": {
      "get": {
        "operationId": "AgentPublicController_profile",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Public agent profile",
        "tags": [
          "agents",
          "agent-public"
        ]
      }
    },
    "/api/agents/register": {
      "post": {
        "operationId": "AgentRegistrationController_postRegister",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Agent self-registration (claim code)",
        "tags": [
          "agents",
          "agent-registration"
        ]
      }
    },
    "/api/agents/register/{code}": {
      "get": {
        "operationId": "AgentRegistrationController_getRegisterByCode",
        "parameters": [
          {
            "name": "code",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Registration status by claim code",
        "tags": [
          "agents",
          "agent-registration"
        ]
      }
    },
    "/api/agents/claim/{code}": {
      "post": {
        "operationId": "AgentRegistrationController_postClaim",
        "parameters": [
          {
            "name": "code",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "x-wallet-address",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Human claims a pending agent registration",
        "tags": [
          "agents",
          "agent-registration"
        ]
      }
    },
    "/api/agents/external/register": {
      "post": {
        "operationId": "AgentExternalRegisterController_postRegister",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Register an external agent (API key; optional Alchemy managed wallet)",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/me": {
      "get": {
        "operationId": "AgentExternalAuthedController_getMe",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Current agent profile and balance (external API key / wallet auth)",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/activity": {
      "get": {
        "operationId": "AgentExternalAuthedController_getActivity",
        "parameters": [
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Recent agent action logs",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/tournaments": {
      "get": {
        "operationId": "AgentExternalAuthedController_getTournamentList",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List live tournaments (tournament skill required)",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/tournaments/create": {
      "post": {
        "operationId": "AgentExternalAuthedController_postTournamentCreate",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Create a tournament (tournament:create skill)",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/tournaments/{id}": {
      "get": {
        "operationId": "AgentExternalAuthedController_getTournamentById",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournament detail with markets",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/tournaments/{id}/markets": {
      "get": {
        "operationId": "AgentExternalAuthedController_getTournamentMarkets",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Markets for a tournament",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/tournaments/{id}/entry": {
      "get": {
        "operationId": "AgentExternalAuthedController_getTournamentEntry",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Agent entry state for a tournament",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/tournaments/{id}/enter": {
      "post": {
        "operationId": "AgentExternalAuthedController_postTournamentEnter",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Enter a tournament",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/tournaments/{id}/picks": {
      "post": {
        "operationId": "AgentExternalAuthedController_postTournamentPicks",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Place picks",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/parlays/mine": {
      "get": {
        "operationId": "AgentExternalAuthedController_getParlayMine",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List parlays for the authenticated agent",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/parlays/markets": {
      "get": {
        "operationId": "AgentExternalAuthedController_getParlayMarketsList",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List open parlay markets",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/parlays/markets/{id}": {
      "get": {
        "operationId": "AgentExternalAuthedController_getParlayMarketById",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Parlay market detail by id or condition id",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/parlays/preview": {
      "post": {
        "operationId": "AgentExternalAuthedController_postParlayPreview",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Preview parlay odds / payout",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/parlays/place": {
      "post": {
        "operationId": "AgentExternalAuthedController_postParlayPlace",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Place or stage a parlay (managed vs external flow)",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/skills": {
      "get": {
        "operationId": "AgentExternalAuthedController_getSkills",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List installed skills and catalog (external API key / wallet auth)",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/external/skills/install": {
      "post": {
        "operationId": "AgentExternalAuthedController_installSkill",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Install a skill",
        "tags": [
          "agents",
          "agent-external"
        ]
      }
    },
    "/api/agents/v1/tournaments": {
      "get": {
        "operationId": "AgentApiV1AuthedController_getTournamentList",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List tournaments (programmatic agent API v1)",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/tournaments/{tournamentId}/enter": {
      "post": {
        "operationId": "AgentApiV1AuthedController_postTournamentEnter",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Enter a tournament",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/tournaments/{tournamentId}/picks": {
      "post": {
        "operationId": "AgentApiV1AuthedController_postTournamentPicks",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Submit stage picks",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/tournaments/{tournamentId}/analyze": {
      "post": {
        "operationId": "AgentApiV1AuthedController_postTournamentAnalyze",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "LLM analysis for suggested picks",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/tournaments/{tournamentId}": {
      "get": {
        "operationId": "AgentApiV1AuthedController_getTournamentById",
        "parameters": [
          {
            "name": "tournamentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournament detail with markets",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/me": {
      "get": {
        "operationId": "AgentApiV1AuthedController_getMe",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Agent profile and stats (x-agent-id + x-agent-key)",
        "tags": [
          "agents",
          "agents-v1"
        ]
      },
      "patch": {
        "operationId": "AgentApiV1AuthedController_patchMe",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Update strategy, custom instructions, and skill parameters",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/parlays/markets": {
      "get": {
        "operationId": "AgentApiV1AuthedController_getParlayMarketsList",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List unresolved parlay conditions (open markets)",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/parlays/markets/{marketId}": {
      "get": {
        "operationId": "AgentApiV1AuthedController_getParlayMarketById",
        "parameters": [
          {
            "name": "marketId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Parlay market detail by condition id",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/parlays/history": {
      "get": {
        "operationId": "AgentApiV1AuthedController_getParlayHistory",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Parlay action log history",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/parlays/place": {
      "post": {
        "operationId": "AgentApiV1AuthedController_postParlayPlace",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Validate parlay and return tx hints (or 501 for managed wallet)",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/balance": {
      "get": {
        "operationId": "AgentApiV1AuthedController_getBalance",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "USDC/ETH balance for agent server wallet",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents/v1/withdraw": {
      "post": {
        "operationId": "AgentApiV1AuthedController_postWithdraw",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Withdraw USDC to owner",
        "tags": [
          "agents",
          "agents-v1"
        ]
      }
    },
    "/api/agents": {
      "get": {
        "operationId": "AgentWalletManagementController_list",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List agents for authenticated wallet",
        "tags": [
          "agents"
        ]
      },
      "post": {
        "operationId": "AgentWalletManagementController_create",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Create agent for authenticated wallet",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}/activity": {
      "get": {
        "operationId": "AgentWalletManagementController_activity",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Agent activity feed",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}/tournaments": {
      "get": {
        "operationId": "AgentWalletManagementController_tournaments",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tournaments for agent",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}/balance": {
      "get": {
        "operationId": "AgentWalletManagementController_balance",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Agent balance",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}": {
      "get": {
        "operationId": "AgentWalletManagementController_getById",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Get agent by id (owner)",
        "tags": [
          "agents"
        ]
      },
      "patch": {
        "operationId": "AgentWalletManagementController_patch",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Update agent",
        "tags": [
          "agents"
        ]
      },
      "delete": {
        "operationId": "AgentWalletManagementController_remove",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Delete agent",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}/generate-api-key": {
      "post": {
        "operationId": "AgentWalletManagementController_generateApiKey",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Rotate / generate API key",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}/activate": {
      "post": {
        "operationId": "AgentWalletManagementController_activate",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Activate agent",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}/pause": {
      "post": {
        "operationId": "AgentWalletManagementController_pause",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Pause agent",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}/resume": {
      "post": {
        "operationId": "AgentWalletManagementController_resume",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Resume agent",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}/withdraw": {
      "post": {
        "operationId": "AgentWalletManagementController_withdraw",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Withdraw for agent",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/agents/{id}/mint-test-usdc": {
      "post": {
        "operationId": "AgentWalletManagementController_mintTestUsdc",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Mint test USDC (dev)",
        "tags": [
          "agents"
        ]
      }
    },
    "/api/config/keys": {
      "get": {
        "operationId": "ConfigKeysController_getKeys",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Key bundle + issuedAt + expiresIn"
          },
          "401": {
            "description": "Wallet auth required"
          }
        },
        "summary": "Scoped read-only provider keys (wallet auth + rate limit)",
        "tags": [
          "api-config"
        ]
      }
    },
    "/api/config/keys/rotate": {
      "post": {
        "operationId": "ConfigKeysController_rotate",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          },
          "401": {
            "description": ""
          }
        },
        "summary": "Same as GET /keys; POST signals client cache dump",
        "tags": [
          "api-config"
        ]
      }
    },
    "/api/rpc/bsc": {
      "post": {
        "operationId": "RpcProxyController_postBsc",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Upstream JSON (verbatim)"
          },
          "400": {
            "description": ""
          },
          "401": {
            "description": "Wallet auth required"
          },
          "502": {
            "description": ""
          },
          "503": {
            "description": "ALCHEMY_API_KEY not set"
          }
        },
        "summary": "BSC mainnet JSON-RPC (read whitelisted methods via Alchemy)",
        "tags": [
          "rpc"
        ]
      }
    },
    "/api/rpc/solana": {
      "post": {
        "operationId": "RpcProxyController_postSolana",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "502": {
            "description": ""
          },
          "503": {
            "description": "HELIUS_SOLANA_RPC_KEY not set"
          }
        },
        "summary": "Solana mainnet JSON-RPC (read + sendTransaction, Helius key server-side)",
        "tags": [
          "rpc"
        ]
      }
    },
    "/user/auth/check": {
      "get": {
        "operationId": "UserAuthController_check",
        "parameters": [
          {
            "name": "address",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "exists: true"
          },
          "400": {
            "description": "Invalid address"
          }
        },
        "summary": "Check wallet — gameplay has no User table; valid address → exists",
        "tags": [
          "auth"
        ]
      }
    },
    "/user/auth/login": {
      "post": {
        "operationId": "UserAuthController_login",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": ""
          },
          "401": {
            "description": ""
          },
          "500": {
            "description": ""
          }
        },
        "summary": "Wallet signature login → JWT",
        "tags": [
          "auth"
        ]
      }
    },
    "/bento/hashtags/trending": {
      "get": {
        "operationId": "BentoHashtagsController_trending",
        "parameters": [
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "windowH",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Trending tags (rolling window)",
        "tags": [
          "bento",
          "hashtags"
        ]
      }
    },
    "/bento/hashtags/me/follows": {
      "get": {
        "operationId": "BentoHashtagsController_myFollows",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tags the caller follows",
        "tags": [
          "bento",
          "hashtags"
        ]
      }
    },
    "/bento/hashtags/{tag}/activities": {
      "get": {
        "operationId": "BentoHashtagsController_activities",
        "parameters": [
          {
            "name": "tag",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Paginated activities for tag",
        "tags": [
          "bento",
          "hashtags"
        ]
      }
    },
    "/bento/hashtags/{tag}": {
      "get": {
        "operationId": "BentoHashtagsController_getTag",
        "parameters": [
          {
            "name": "tag",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "authorization",
            "required": true,
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Tag metadata (+ optional isFollowing)",
        "tags": [
          "bento",
          "hashtags"
        ]
      }
    },
    "/bento/hashtags/{tag}/follow": {
      "post": {
        "operationId": "BentoHashtagsController_follow",
        "parameters": [
          {
            "name": "tag",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Follow tag (idempotent)",
        "tags": [
          "bento",
          "hashtags"
        ]
      },
      "delete": {
        "operationId": "BentoHashtagsController_unfollow",
        "parameters": [
          {
            "name": "tag",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Unfollow tag (idempotent)",
        "tags": [
          "bento",
          "hashtags"
        ]
      }
    },
    "/bento/feeds/topics/trending": {
      "get": {
        "operationId": "BentoFeedsTopicsController_trending",
        "parameters": [
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "windowH",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Trending Stream topics",
        "tags": [
          "bento",
          "feeds-topics"
        ]
      }
    },
    "/bento/feeds/topics/{topic}/activities": {
      "get": {
        "operationId": "BentoFeedsTopicsController_activities",
        "parameters": [
          {
            "name": "topic",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Activities for topic",
        "tags": [
          "bento",
          "feeds-topics"
        ]
      }
    },
    "/bento/stories": {
      "post": {
        "operationId": "BentoStoriesController_create",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Create a 24h story",
        "tags": [
          "bento",
          "stories"
        ]
      }
    },
    "/bento/stories/feed": {
      "get": {
        "operationId": "BentoStoriesController_feed",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Story rail feed (followed + self)",
        "tags": [
          "bento",
          "stories"
        ]
      }
    },
    "/bento/stories/{id}/seen": {
      "post": {
        "operationId": "BentoStoriesController_seen",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Mark story seen (idempotent)",
        "tags": [
          "bento",
          "stories"
        ]
      }
    },
    "/bento/comments/{commentId}/vote": {
      "post": {
        "operationId": "BentoCommentsController_votePost",
        "parameters": [
          {
            "name": "commentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Up/down vote on comment overlay",
        "tags": [
          "bento",
          "comments"
        ]
      },
      "delete": {
        "operationId": "BentoCommentsController_voteDelete",
        "parameters": [
          {
            "name": "commentId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Clear vote on comment overlay",
        "tags": [
          "bento",
          "comments"
        ]
      }
    },
    "/bento/comments/by-activity/{activityId}": {
      "get": {
        "operationId": "BentoCommentsController_byActivity",
        "parameters": [
          {
            "name": "activityId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List comment overlay rows for activity",
        "tags": [
          "bento",
          "comments"
        ]
      }
    },
    "/bento/og/preview": {
      "get": {
        "operationId": "BentoOgController_preview",
        "parameters": [
          {
            "name": "url",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Server-side OG preview (SSRF-hardened)",
        "tags": [
          "bento",
          "og"
        ]
      }
    },
    "/bento/feed/interest/signal": {
      "post": {
        "operationId": "BentoInterestSignalController_signal",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Record interest signal for For You ranking",
        "tags": [
          "bento",
          "feed",
          "interest"
        ]
      }
    },
    "/bento/feed/interest/profile/me": {
      "get": {
        "operationId": "BentoInterestSignalController_profileMe",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Read caller interest profile weights",
        "tags": [
          "bento",
          "feed",
          "interest"
        ]
      }
    },
    "/bento/feed/for-you": {
      "get": {
        "operationId": "BentoForYouFeedController_forYou",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Ranked For You activity page",
        "tags": [
          "bento",
          "feed",
          "for-you"
        ]
      }
    },
    "/bento/feed/aggregations": {
      "get": {
        "operationId": "BentoForYouFeedController_aggregations",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Jinja2 aggregation rules for feed UI (public)",
        "tags": [
          "bento",
          "feed",
          "for-you"
        ]
      }
    },
    "/bento/feeds/activities": {
      "post": {
        "operationId": "BentoFeedsInfraController_createActivity",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Create feed activity (visibility + Stream)",
        "tags": [
          "bento",
          "feeds"
        ]
      }
    },
    "/bento/feeds/query": {
      "get": {
        "operationId": "BentoFeedsInfraController_query",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Query mirrored Feed rows",
        "tags": [
          "bento",
          "feeds"
        ]
      }
    },
    "/bento/feeds/activities/{id}": {
      "get": {
        "operationId": "BentoFeedsInfraController_getActivity",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Get single activity (visibility-filtered)",
        "tags": [
          "bento",
          "feeds"
        ]
      }
    },
    "/bento/feeds/{id}/metadata": {
      "patch": {
        "operationId": "BentoFeedsInfraController_patchMetadata",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Patch feed metadata (<group>:<feedId>)",
        "tags": [
          "bento",
          "feeds"
        ]
      }
    },
    "/bento/feeds/{group}/{id}/activities": {
      "get": {
        "operationId": "BentoFeedsInfraController_listActivities",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List feed activities (visibility-filtered)",
        "tags": [
          "bento",
          "feeds"
        ]
      }
    },
    "/bento/cdn/upload-via-stream": {
      "post": {
        "operationId": "BentoStreamCdnController_uploadViaStream",
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Multipart image → Stream CDN URL",
        "tags": [
          "bento",
          "cdn"
        ]
      }
    },
    "/bento/home/live-feed": {
      "get": {
        "operationId": "BentoHomeController_liveFeed",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Home tab multi-sport live + upcoming aggregator",
        "tags": [
          "bento",
          "bento-home"
        ]
      }
    },
    "/bento/fixture/{fixtureId}/stats": {
      "get": {
        "operationId": "BentoFixtureController_stats",
        "parameters": [
          {
            "name": "fixtureId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Per-fixture team/player stats (Sportmonks, TTL-cached)",
        "tags": [
          "bento",
          "bento-fixture"
        ]
      }
    },
    "/bento/highlights/match": {
      "get": {
        "operationId": "BentoHighlightsController_getMatch",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Per-match Highlightly clips (stable matchId)",
        "tags": [
          "bento",
          "bento-highlights"
        ]
      }
    },
    "/bento/highlights/recent": {
      "get": {
        "operationId": "BentoHighlightsController_getRecent",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Recent highlights lookback (server-side SWR)",
        "tags": [
          "bento",
          "bento-highlights"
        ]
      }
    },
    "/bento/highlights": {
      "get": {
        "operationId": "BentoHighlightsController_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Highlightly — match or daily slate",
        "tags": [
          "bento",
          "bento-highlights"
        ]
      }
    },
    "/bento/user/profile/{address}": {
      "get": {
        "operationId": "BentoUserProfileController_getProfile",
        "parameters": [
          {
            "name": "address",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Public profile (200 + shell if missing)",
        "tags": [
          "bento",
          "bento-user"
        ]
      }
    },
    "/bento/user/profile": {
      "post": {
        "operationId": "BentoUserProfileController_postProfile",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Upsert authenticated user profile",
        "tags": [
          "bento",
          "bento-user"
        ]
      }
    },
    "/bento/user/profile/batch": {
      "post": {
        "operationId": "BentoUserProfileController_postProfileBatch",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Batch profile lookup (unauthenticated, max 100)",
        "tags": [
          "bento",
          "bento-user"
        ]
      }
    },
    "/bento/user/notifications/register-device": {
      "post": {
        "operationId": "BentoUserNotificationController_register",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "APNs device token registration",
        "tags": [
          "bento",
          "bento-user"
        ]
      }
    },
    "/bento/user/notifications/unregister-device": {
      "post": {
        "operationId": "BentoUserNotificationController_unregister",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Remove device token",
        "tags": [
          "bento",
          "bento-user"
        ]
      }
    },
    "/bento/user/me/notifications": {
      "get": {
        "operationId": "BentoUserMeNotificationsController_list",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Paginated bell notifications",
        "tags": [
          "bento",
          "user",
          "notifications"
        ]
      }
    },
    "/bento/user/me/notifications/mark-read": {
      "post": {
        "operationId": "BentoUserMeNotificationsController_markRead",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Mark notifications read",
        "tags": [
          "bento",
          "user",
          "notifications"
        ]
      }
    },
    "/bento/user/me/notifications/diagnostics": {
      "get": {
        "operationId": "BentoUserMeNotificationsController_diagnostics",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Bell / push pipeline diagnostics (wallet authed)",
        "tags": [
          "bento",
          "user",
          "notifications"
        ]
      }
    },
    "/bento/user/me/followings": {
      "get": {
        "operationId": "BentoUserMeFollowingsController_list",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List the authenticated user’s follows (union of wallet + entity follows)",
        "tags": [
          "bento",
          "user"
        ]
      },
      "post": {
        "operationId": "BentoUserMeFollowingsController_add",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Add a follow (team/player/league/f1_driver/… or user) — idempotent",
        "tags": [
          "bento",
          "user"
        ]
      }
    },
    "/bento/user/me/followings/{id}": {
      "delete": {
        "operationId": "BentoUserMeFollowingsController_remove",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Remove a follow by composite id (\"user:<addr>\" | \"entity:<cuid>\")",
        "tags": [
          "bento",
          "user"
        ]
      }
    },
    "/bento/user/me/profile": {
      "get": {
        "operationId": "BentoUserMeFollowingsController_profile",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Persisted profile fields for launch (displayName, photo, bio)",
        "tags": [
          "bento",
          "user"
        ]
      }
    },
    "/bento/user/timezone": {
      "post": {
        "operationId": "BentoUserFavoritesController_timezone",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Set IANA timezone + optional locale",
        "tags": [
          "bento",
          "bento-user"
        ]
      }
    },
    "/bento/user/followed/{followedId}/prefs": {
      "get": {
        "operationId": "BentoUserFavoritesController_getPrefs",
        "parameters": [
          {
            "name": "followedId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Merged notification prefs for a followed entity",
        "tags": [
          "bento",
          "bento-user"
        ]
      },
      "put": {
        "operationId": "BentoUserFavoritesController_putPrefs",
        "parameters": [
          {
            "name": "followedId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Merge-patch notification prefs",
        "tags": [
          "bento",
          "bento-user"
        ]
      }
    },
    "/bento/users/search": {
      "get": {
        "operationId": "BentoUsersStatsController_search",
        "parameters": [
          {
            "name": "q",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "User search",
        "tags": [
          "bento",
          "bento-users"
        ]
      }
    },
    "/bento/users/suggested": {
      "get": {
        "operationId": "BentoUsersStatsController_suggested",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Suggested creators",
        "tags": [
          "bento",
          "bento-users"
        ]
      }
    },
    "/bento/users/{wallet}/stats": {
      "get": {
        "operationId": "BentoUsersStatsController_stats",
        "parameters": [
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Public parlay/social stats for a wallet",
        "tags": [
          "bento",
          "bento-users"
        ]
      }
    },
    "/bento/follow": {
      "post": {
        "operationId": "BentoFollowController_follow",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Follow a wallet",
        "tags": [
          "bento",
          "bento-follow"
        ]
      },
      "delete": {
        "operationId": "BentoFollowController_unfollow",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Unfollow",
        "tags": [
          "bento",
          "bento-follow"
        ]
      }
    },
    "/bento/follow/check": {
      "get": {
        "operationId": "BentoFollowController_check",
        "parameters": [
          {
            "name": "target",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Whether current user follows target",
        "tags": [
          "bento",
          "bento-follow"
        ]
      }
    },
    "/bento/follow/followers/{wallet}": {
      "get": {
        "operationId": "BentoFollowController_followers",
        "parameters": [
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Followers of wallet",
        "tags": [
          "bento",
          "bento-follow"
        ]
      }
    },
    "/bento/follow/following/{wallet}": {
      "get": {
        "operationId": "BentoFollowController_following",
        "parameters": [
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Accounts wallet follows",
        "tags": [
          "bento",
          "bento-follow"
        ]
      }
    },
    "/bento/follow/counts/{wallet}": {
      "get": {
        "operationId": "BentoFollowController_counts",
        "parameters": [
          {
            "name": "wallet",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Follower / following counts",
        "tags": [
          "bento",
          "bento-follow"
        ]
      }
    },
    "/bento/follow/team/{teamId}/stats": {
      "get": {
        "operationId": "BentoFollowController_teamStats",
        "parameters": [
          {
            "name": "teamId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Public team season stats (no wallet auth)",
        "tags": [
          "bento",
          "bento-follow"
        ]
      }
    },
    "/bento/user/me/device-tokens": {
      "post": {
        "operationId": "BentoUserMeDeviceTokensController_register",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Register/upsert an APNs device token for the current wallet",
        "tags": [
          "bento",
          "user",
          "device-tokens"
        ]
      },
      "delete": {
        "operationId": "BentoUserMeDeviceTokensController_unregister",
        "parameters": [
          {
            "name": "token",
            "required": true,
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Unregister a device token",
        "tags": [
          "bento",
          "user",
          "device-tokens"
        ]
      },
      "get": {
        "operationId": "BentoUserMeDeviceTokensController_list",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List current wallet's registered device tokens",
        "tags": [
          "bento",
          "user",
          "device-tokens"
        ]
      }
    },
    "/bento/chat/groups": {
      "post": {
        "operationId": "BentoChatController_postGroup",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Register XMTP group for discovery",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/groups/discover": {
      "get": {
        "operationId": "BentoChatController_getGroupsDiscover",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List discoverable groups",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/groups/{groupId}": {
      "get": {
        "operationId": "BentoChatController_getGroup",
        "parameters": [
          {
            "name": "groupId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Get one group",
        "tags": [
          "bento",
          "bento-chat"
        ]
      },
      "patch": {
        "operationId": "BentoChatController_patchGroup",
        "parameters": [
          {
            "name": "groupId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Update group metadata (creator)",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/groups/{groupId}/invites": {
      "post": {
        "operationId": "BentoChatController_postGroupInvites",
        "parameters": [
          {
            "name": "groupId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Create or rotate invite",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/invites/{code}/redeem": {
      "post": {
        "operationId": "BentoChatController_postInviteRedeem",
        "parameters": [
          {
            "name": "code",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Redeem invite",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/groups/{groupId}/join-requests": {
      "get": {
        "operationId": "BentoChatController_getJoinRequests",
        "parameters": [
          {
            "name": "groupId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List join requests (admin)",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/join-requests/{id}/approve": {
      "post": {
        "operationId": "BentoChatController_postJoinRequestApprove",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Approve join request",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/join-requests/{id}/deny": {
      "post": {
        "operationId": "BentoChatController_postJoinRequestDeny",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Deny join request",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/payments": {
      "post": {
        "operationId": "BentoChatController_postPayment",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Log a chat payment",
        "tags": [
          "bento",
          "bento-chat"
        ]
      },
      "get": {
        "operationId": "BentoChatController_getPaymentsList",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List payments by wallet (public)",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/payments/{txHash}": {
      "get": {
        "operationId": "BentoChatController_getPayment",
        "parameters": [
          {
            "name": "txHash",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Get one payment by tx hash (public)",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/payments/{txHash}/reconcile": {
      "post": {
        "operationId": "BentoChatController_postPaymentReconcile",
        "parameters": [
          {
            "name": "txHash",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Reconcile payment on-chain",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/archives": {
      "post": {
        "operationId": "BentoChatController_postArchive",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Register archive metadata",
        "tags": [
          "bento",
          "bento-chat"
        ]
      },
      "get": {
        "operationId": "BentoChatController_getArchives",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List archives for wallet",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/archives/latest": {
      "get": {
        "operationId": "BentoChatController_getArchivesLatest",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Latest archive for wallet",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/archives/{id}": {
      "delete": {
        "operationId": "BentoChatController_deleteArchive",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Delete archive metadata",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/reports": {
      "post": {
        "operationId": "BentoChatController_postReport",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "File a report",
        "tags": [
          "bento",
          "bento-chat"
        ]
      },
      "get": {
        "operationId": "BentoChatController_getReportsAdmin",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Admin: list reports",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/reports/my": {
      "get": {
        "operationId": "BentoChatController_getReportsMine",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Current user's reports",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/reports/{id}/resolve": {
      "patch": {
        "operationId": "BentoChatController_patchReportResolve",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Admin: resolve report",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/push/subscribe": {
      "post": {
        "operationId": "BentoChatController_postPushSubscribe",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Subscribe device to XMTP push topics",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/push/unsubscribe": {
      "post": {
        "operationId": "BentoChatController_postPushUnsubscribe",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Unsubscribe device topics",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/chat/push/notify": {
      "post": {
        "operationId": "BentoChatController_postPushNotify",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Sender push notify fallback",
        "tags": [
          "bento",
          "bento-chat"
        ]
      }
    },
    "/bento/fantasy/contests": {
      "get": {
        "operationId": "FantasyContestsController_list",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List fantasy contests",
        "tags": [
          "bento",
          "fantasy"
        ]
      }
    },
    "/bento/fantasy/contests/{contestId}/roster": {
      "get": {
        "operationId": "FantasyContestsController_roster",
        "parameters": [
          {
            "name": "contestId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Contest player roster",
        "tags": [
          "bento",
          "fantasy"
        ]
      }
    },
    "/bento/fantasy/contests/{contestId}": {
      "get": {
        "operationId": "FantasyContestsController_getById",
        "parameters": [
          {
            "name": "contestId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Get one contest",
        "tags": [
          "bento",
          "fantasy"
        ]
      }
    },
    "/bento/fantasy/entries": {
      "post": {
        "operationId": "FantasyEntriesController_create",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Submit fantasy entry roster",
        "tags": [
          "bento",
          "fantasy"
        ]
      }
    },
    "/bento/fantasy/entries/me": {
      "get": {
        "operationId": "FantasyEntriesController_listMine",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List my entries",
        "tags": [
          "bento",
          "fantasy"
        ]
      }
    },
    "/bento/fantasy/leaderboard": {
      "get": {
        "operationId": "FantasyLeaderboardController_get",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Weekly fantasy leaderboard",
        "tags": [
          "bento",
          "fantasy"
        ]
      }
    },
    "/bento/fantasy/leaderboard/daily": {
      "get": {
        "operationId": "FantasyLeaderboardController_getDaily",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Daily fantasy leaderboard snapshot (worker-written)",
        "tags": [
          "bento",
          "fantasy"
        ]
      }
    },
    "/bento/fantasy/players/{playerId}/stats": {
      "get": {
        "operationId": "FantasyPlayersController_getStats",
        "parameters": [
          {
            "name": "playerId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Player stats (Sportmonks / CricAPI)",
        "tags": [
          "bento",
          "fantasy"
        ]
      }
    },
    "/bento/stream-chat/market-channel-map": {
      "post": {
        "operationId": "StreamChatController_postMarketChannelMap",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Map a market to a Stream channel",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/token": {
      "post": {
        "operationId": "StreamChatController_postToken",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Stream Chat JWT",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/ensure-user": {
      "post": {
        "operationId": "StreamChatController_postEnsureUser",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Upsert Stream user",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/token/refresh": {
      "post": {
        "operationId": "StreamChatController_postTokenRefresh",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Refresh Stream Chat token",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/groups/create": {
      "post": {
        "operationId": "StreamChatController_postGroupsCreate",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Create group channel",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/groups/join": {
      "post": {
        "operationId": "StreamChatController_postGroupsJoin",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Join by invite code",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/groups/request-join": {
      "post": {
        "operationId": "StreamChatController_postGroupsRequestJoin",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Request to join",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/groups/approve-join": {
      "post": {
        "operationId": "StreamChatController_postGroupsApproveJoin",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Approve join (admin)",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/groups/discover": {
      "get": {
        "operationId": "StreamChatController_getGroupsDiscover",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "List discoverable groups",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/groups/{channelId}/requests": {
      "get": {
        "operationId": "StreamChatController_getGroupsChannelRequests",
        "parameters": [
          {
            "name": "channelId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Pending join requests",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/groups/reject-join": {
      "post": {
        "operationId": "StreamChatController_postGroupsRejectJoin",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Reject join (admin)",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/groups/{channelId}/invite-code": {
      "get": {
        "operationId": "StreamChatController_getGroupsInviteCode",
        "parameters": [
          {
            "name": "channelId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Get invite code (member)",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/profile/sync": {
      "post": {
        "operationId": "StreamChatController_postProfileSync",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Sync profile to Stream",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/market-channel-map/{marketId}": {
      "get": {
        "operationId": "StreamChatController_getMarketChannelMap",
        "parameters": [
          {
            "name": "marketId",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Channels for a market",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/polymarket-event-channel-map": {
      "post": {
        "operationId": "StreamChatController_postPolymarketEventChannelMap",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Map a Polymarket event share to a Stream channel",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-chat/polymarket-event-channel-map/{slug}": {
      "get": {
        "operationId": "StreamChatController_getPolymarketEventChannelMap",
        "parameters": [
          {
            "name": "slug",
            "required": true,
            "in": "path",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Channels where a Polymarket event was shared",
        "tags": [
          "bento",
          "stream-chat"
        ]
      }
    },
    "/bento/stream-feeds/token": {
      "post": {
        "operationId": "StreamFeedsController_postToken",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Stream Feeds user JWT + API key",
        "tags": [
          "bento",
          "stream-feeds"
        ]
      }
    },
    "/bento/stream-feeds/notify": {
      "post": {
        "operationId": "StreamFeedsController_postNotify",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Write one notification activity",
        "tags": [
          "bento",
          "stream-feeds"
        ]
      }
    },
    "/bento/stream-feeds/notify-followers": {
      "post": {
        "operationId": "StreamFeedsController_postNotifyFollowers",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Fan-out new post to followers",
        "tags": [
          "bento",
          "stream-feeds"
        ]
      }
    },
    "/bento/stream-feeds/feed-config": {
      "get": {
        "operationId": "StreamFeedsController_getFeedConfig",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Public API key + feed group names",
        "tags": [
          "bento",
          "stream-feeds"
        ]
      }
    },
    "/bento/stream-feeds/webhook": {
      "post": {
        "operationId": "StreamFeedsController_postWebhook",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "GetStream webhook (HMAC, no wallet auth)",
        "tags": [
          "bento",
          "stream-feeds"
        ]
      }
    },
    "/bento/webhooks/stream-feeds": {
      "post": {
        "operationId": "StreamFeedsPushWebhookController_postWebhook",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Stream Feeds webhook → fan feeds.activity.added to followers via APNs (HMAC, no wallet auth)",
        "tags": [
          "bento",
          "stream-feeds",
          "webhook"
        ]
      }
    },
    "/assets/team-logo": {
      "get": {
        "operationId": "AssetsController_teamLogo",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Resolve team logo URL (cached)",
        "tags": [
          "provider-proxies",
          "assets"
        ]
      }
    },
    "/bento/nba/proxy": {
      "post": {
        "operationId": "BentoNbaProxyController_proxy",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Cached api-sports NBA v2 proxy (iOS Home)",
        "tags": [
          "bento",
          "nba"
        ]
      }
    },
    "/api/v1/feeds/spotlight": {
      "get": {
        "operationId": "FeedsSpotlightController_spotlight",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Home spotlight catalogue",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/api/v1/feeds/screen": {
      "get": {
        "operationId": "FeedsV1Controller_screen",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Composite Feeds screen payload",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/api/v1/feeds/related-markets": {
      "get": {
        "operationId": "FeedsV1Controller_relatedMarkets",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Fixture-scoped related markets",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/api/v1/feeds/claim-push/parlay-settled": {
      "post": {
        "operationId": "FeedsV1Controller_claimPushParlaySettled",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Enqueue parlay-settled claim push (admin)",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/api/v1/feeds/claim-push/polymarket-redeemable": {
      "post": {
        "operationId": "FeedsV1Controller_claimPushPolymarketRedeemable",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Enqueue Polymarket redeemable claim push (admin)",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/api/v1/feeds/claim-push/scan-polymarket": {
      "post": {
        "operationId": "FeedsV1Controller_claimPushScanPolymarket",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Sweep wallets for redeemable Polymarket positions (admin)",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/feeds/fixtures": {
      "get": {
        "operationId": "FeedsGranularController_fixtures",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Sportmonks fixtures for a league window",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/feeds/standings": {
      "get": {
        "operationId": "FeedsGranularController_standings",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Sportmonks standings for league + season",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/feeds/screen/sections": {
      "get": {
        "operationId": "FeedsGranularController_screenSections",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Feeds screen section catalogue",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/feeds/calendar": {
      "get": {
        "operationId": "FeedsGranularController_calendar",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Match-day calendar dot counts",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/feeds/top-players": {
      "get": {
        "operationId": "FeedsGranularController_topPlayers",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Feeds top players for fixtures",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/feeds/news": {
      "get": {
        "operationId": "FeedsGranularController_news",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Feeds news slice",
        "tags": [
          "provider-proxies",
          "feeds"
        ]
      }
    },
    "/f1/calendar": {
      "get": {
        "operationId": "F1CalendarController_calendar",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Canonical F1 season calendar rounds",
        "tags": [
          "provider-proxies",
          "f1"
        ]
      }
    },
    "/api/polymarket/events": {
      "get": {
        "operationId": "PolymarketProxyController_events",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Gamma events listing proxy",
        "tags": [
          "provider-proxies",
          "polymarket"
        ]
      }
    },
    "/api/polymarket/event/{slug}": {
      "get": {
        "operationId": "PolymarketProxyController_eventBySlug",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Gamma event by slug",
        "tags": [
          "provider-proxies",
          "polymarket"
        ]
      }
    },
    "/api/polymarket/search": {
      "get": {
        "operationId": "PolymarketProxyController_search",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Gamma public-search proxy",
        "tags": [
          "provider-proxies",
          "polymarket"
        ]
      }
    },
    "/bento/f1/driver/{driverNumber}/season-stats": {
      "get": {
        "operationId": "BentoF1Controller_driverSeasonStats",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 driver season stats (Sportmonks + OpenF1)",
        "tags": [
          "provider-proxies",
          "f1"
        ]
      }
    },
    "/bento/f1/race-replay/{sessionKey}": {
      "get": {
        "operationId": "BentoF1Controller_raceReplay",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "F1 race replay document (disk/Redis-backed)",
        "tags": [
          "provider-proxies",
          "f1"
        ]
      }
    },
    "/bento/sportmonks/football/fixture/{fixtureId}/snapshot": {
      "get": {
        "operationId": "BentoSportmonksFootballFixtureController_snapshot",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Per-fixture football snapshot",
        "tags": [
          "provider-proxies",
          "sportmonks"
        ]
      }
    },
    "/bento/sportmonks/football/team/{teamId}/squad": {
      "get": {
        "operationId": "BentoSportmonksFootballTeamController_squad",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Current-season football squad",
        "tags": [
          "provider-proxies",
          "sportmonks"
        ]
      }
    },
    "/bento/sportmonks/football/team/{teamId}/season-stats": {
      "get": {
        "operationId": "BentoSportmonksFootballTeamController_seasonStats",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Single-season football team aggregates",
        "tags": [
          "provider-proxies",
          "sportmonks"
        ]
      }
    },
    "/bento/cricket/live": {
      "get": {
        "operationId": "BentoCricketController_live",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cricket live index snapshot",
        "tags": [
          "provider-proxies",
          "cricket"
        ]
      }
    },
    "/bento/cricket/live/{fixtureId}": {
      "get": {
        "operationId": "BentoCricketController_liveFixture",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cricket live fixture snapshot",
        "tags": [
          "provider-proxies",
          "cricket"
        ]
      }
    },
    "/bento/cricket/fixtures": {
      "get": {
        "operationId": "BentoCricketController_fixtures",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cricket fixtures by date or league",
        "tags": [
          "provider-proxies",
          "cricket"
        ]
      }
    },
    "/bento/cricket/fixture/{id}": {
      "get": {
        "operationId": "BentoCricketController_fixture",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cricket fixture detail",
        "tags": [
          "provider-proxies",
          "cricket"
        ]
      }
    },
    "/bento/cricket/standings": {
      "get": {
        "operationId": "BentoCricketController_standings",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cricket standings",
        "tags": [
          "provider-proxies",
          "cricket"
        ]
      }
    },
    "/bento/cricket/squad/{teamId}/{seasonId}": {
      "get": {
        "operationId": "BentoCricketController_squad",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cricket squad",
        "tags": [
          "provider-proxies",
          "cricket"
        ]
      }
    },
    "/bento/cricket/leagues": {
      "get": {
        "operationId": "BentoCricketController_leagues",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cricket leagues catalogue",
        "tags": [
          "provider-proxies",
          "cricket"
        ]
      }
    },
    "/bento/cricket/top-players/{teamId}/{seasonId}": {
      "get": {
        "operationId": "BentoCricketController_topPlayersBySeason",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cricket top players for team + season",
        "tags": [
          "provider-proxies",
          "cricket"
        ]
      }
    },
    "/bento/cricket/top-players/{teamId}": {
      "get": {
        "operationId": "BentoCricketController_topPlayers",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "Cricket top players (auto season)",
        "tags": [
          "provider-proxies",
          "cricket"
        ]
      }
    },
    "/bento/nfl/fixtures/players": {
      "get": {
        "operationId": "BentoNflController_fixturesPlayers",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "NFL fixture players (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "nfl"
        ]
      }
    },
    "/bento/nfl/fixtures/statistics": {
      "get": {
        "operationId": "BentoNflController_fixturesStatistics",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "NFL fixture statistics (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "nfl"
        ]
      }
    },
    "/bento/nfl/fixtures": {
      "get": {
        "operationId": "BentoNflController_fixtures",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "NFL fixtures (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "nfl"
        ]
      }
    },
    "/bento/nfl/standings": {
      "get": {
        "operationId": "BentoNflController_standings",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "NFL standings (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "nfl"
        ]
      }
    },
    "/bento/nfl/teams": {
      "get": {
        "operationId": "BentoNflController_teams",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "NFL teams (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "nfl"
        ]
      }
    },
    "/bento/nfl/players": {
      "get": {
        "operationId": "BentoNflController_players",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "NFL players (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "nfl"
        ]
      }
    },
    "/bento/mlb/games/statistics/teams": {
      "get": {
        "operationId": "BentoMlbController_gamesStatisticsTeams",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "MLB game team statistics (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "mlb"
        ]
      }
    },
    "/bento/mlb/games/statistics/players": {
      "get": {
        "operationId": "BentoMlbController_gamesStatisticsPlayers",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "MLB game player statistics (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "mlb"
        ]
      }
    },
    "/bento/mlb/games": {
      "get": {
        "operationId": "BentoMlbController_games",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "MLB games (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "mlb"
        ]
      }
    },
    "/bento/mlb/standings": {
      "get": {
        "operationId": "BentoMlbController_standings",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "MLB standings (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "mlb"
        ]
      }
    },
    "/bento/mlb/teams": {
      "get": {
        "operationId": "BentoMlbController_teams",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "MLB teams (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "mlb"
        ]
      }
    },
    "/bento/mlb/players": {
      "get": {
        "operationId": "BentoMlbController_players",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "MLB players (api-sports proxy)",
        "tags": [
          "provider-proxies",
          "mlb"
        ]
      }
    },
    "/bento/funkit/uda/create": {
      "post": {
        "operationId": "BentoFunkitUdaController_create",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "FunKit UDA create",
        "tags": [
          "provider-proxies",
          "funkit"
        ]
      }
    },
    "/bento/funkit/uda/assets": {
      "get": {
        "operationId": "BentoFunkitUdaController_assets",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "FunKit supported assets",
        "tags": [
          "provider-proxies",
          "funkit"
        ]
      }
    },
    "/bento/funkit/uda/quote": {
      "post": {
        "operationId": "BentoFunkitUdaController_quote",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "FunKit UDA quote",
        "tags": [
          "provider-proxies",
          "funkit"
        ]
      }
    },
    "/bento/funkit/uda/status/{address}": {
      "get": {
        "operationId": "BentoFunkitUdaController_status",
        "parameters": [],
        "responses": {
          "200": {
            "description": ""
          }
        },
        "summary": "FunKit UDA status",
        "tags": [
          "provider-proxies",
          "funkit"
        ]
      }
    },
    "/bento/funkit/uda/meld/session": {
      "post": {
        "operationId": "BentoFunkitUdaController_meldSession",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "FunKit Meld session (frog.fun.xyz)",
        "tags": [
          "provider-proxies",
          "funkit"
        ]
      }
    },
    "/bento/funkit/uda/meld/quotes": {
      "post": {
        "operationId": "BentoFunkitUdaController_meldQuotes",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "FunKit Meld quotes (ranked)",
        "tags": [
          "provider-proxies",
          "funkit"
        ]
      }
    },
    "/bento/funkit/uda/meld/best-provider": {
      "post": {
        "operationId": "BentoFunkitUdaController_meldBestProvider",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "FunKit Meld best provider",
        "tags": [
          "provider-proxies",
          "funkit"
        ]
      }
    },
    "/bento/webhooks/stream-chat": {
      "post": {
        "operationId": "BentoWebhooksController_streamChat",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Stream Chat message.new webhook",
        "tags": [
          "provider-proxies",
          "webhooks"
        ]
      }
    },
    "/bento/odds-api/proxy": {
      "post": {
        "operationId": "BentoOddsApiProxyController_proxy",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "The Odds API v4 cached proxy",
        "tags": [
          "provider-proxies",
          "odds-api"
        ]
      }
    },
    "/bento/openf1/proxy": {
      "post": {
        "operationId": "BentoOpenF1ProxyController_proxy",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "OpenF1 cached proxy",
        "tags": [
          "provider-proxies",
          "openf1"
        ]
      }
    },
    "/bento/sportmonks/cricket-v2/proxy": {
      "post": {
        "operationId": "BentoSportmonksCricketV2ProxyController_proxy",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Sportmonks Cricket v2 proxy",
        "tags": [
          "provider-proxies",
          "sportmonks"
        ]
      }
    },
    "/bento/sportmonks/proxy": {
      "post": {
        "operationId": "BentoSportmonksProxyController_proxy",
        "parameters": [],
        "responses": {
          "201": {
            "description": ""
          }
        },
        "summary": "Sportmonks v3 proxy",
        "tags": [
          "provider-proxies",
          "sportmonks"
        ]
      }
    }
  },
  "info": {
    "title": "Parlay & Tournaments API",
    "description": "Parlay, tournaments, agents, bento user/chat, fantasy. **OpenAPI lists Nest `@Controller` routes** (probes, LP, config, P2 bento, provider proxies). Provider proxy paths are served by Nest `ProviderProxiesModule` controllers.",
    "version": "1.0",
    "contact": {}
  },
  "tags": [
    {
      "name": "meta",
      "description": "HTTP surface + discovery (GET /api/meta/*)"
    },
    {
      "name": "api-config",
      "description": "GET/POST /api/config/keys (Nest)"
    },
    {
      "name": "auth",
      "description": "GET/POST /user/auth/* (Nest)"
    },
    {
      "name": "rpc",
      "description": "POST /api/rpc/bsc, /api/rpc/solana (Nest)"
    },
    {
      "name": "parlay",
      "description": "Parlay & LP — Nest controllers + shared ops for `/api/parlay/*` and `/api/lp/*`"
    },
    {
      "name": "tournaments",
      "description": "Nest-first tournaments controllers (public + admin + F1, no tournament runtime delegates) + bento by-wallet"
    },
    {
      "name": "agents",
      "description": "Agents controllers (skills, public, external, v1, registration, owner wallet)"
    },
    {
      "name": "bento",
      "description": "P2 + user + follow + stream-chat + fantasy + bento chat + stream-feeds (feeds when enabled): Nest controllers"
    },
    {
      "name": "fantasy",
      "description": "GET/POST /bento/fantasy/* — `FantasyModule` (Nest controllers)"
    }
  ],
  "servers": [],
  "components": {
    "securitySchemes": {
      "bearer": {
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "type": "http"
      }
    },
    "schemas": {}
  }
}
