{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/0xinsider-com/json-schema/0xinsider-com-pick-of-the-day-schema.json",
  "title": "PickOfTheDay",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/0xinsider-com-openapi.json#/components/schemas/PickOfTheDay",
  "type": "object",
  "required": [
    "state",
    "supersedes_pick_id"
  ],
  "properties": {
    "state": {
      "type": "string",
      "enum": [
        "full"
      ],
      "description": "Full success containing entitled proof-readable picks."
    },
    "pick_date": {
      "type": "string",
      "format": "date",
      "description": "The pick's local publication date (YYYY-MM-DD)."
    },
    "pick_rank": {
      "type": "integer",
      "minimum": 1,
      "maximum": 30,
      "description": "Deprecated compatibility daily release slot; use pick_id for identity and publication_order for scheduling.",
      "deprecated": true
    },
    "picks": {
      "type": "array",
      "description": "Published picks for this product day in the returned display order. Use pick_id for identity.",
      "items": {
        "$ref": "#/$defs/PickOfTheDay"
      }
    },
    "pick_count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 25,
      "description": "Number of items in `picks`: the proof-readable picks. Picks held in `proof_pending_picks` are not counted."
    },
    "scheduled_picks": {
      "type": "array",
      "description": "Rank-ordered entitled selections that have not released. Every row retains release_at and kickoff; unauthorized scheduled ranks appear only in identity-free locked_picks.",
      "items": {
        "$ref": "#/$defs/ScheduledPickSlot"
      }
    },
    "matchup": {
      "type": "string",
      "description": "Human-readable matchup (e.g. \"Portugal vs. Uzbekistan\")."
    },
    "category": {
      "type": "string",
      "description": "Recorded canonical sport category. Prefer display_category for the public competition label."
    },
    "display_category": {
      "type": "string",
      "description": "Frozen public presentation category. Tennis uses the provider-verified ATP or WTA tour, including Wimbledon and doubles; unknown tours retain Tennis. Every men's and women's cricket competition uses Cricket. Other sports use the curated league, esports title or soccer competition label, then the provider series name without its season year, then category when no competition is known. The canonical category and measured cohort are unchanged: an esports title still uses the pooled Esports category. Optional for mixed-version client compatibility."
    },
    "platform": {
      "type": "string",
      "enum": [
        "polymarket"
      ],
      "description": "Provider platform. Always polymarket."
    },
    "release_at": {
      "type": "string",
      "format": "date-time",
      "description": "The pick's stored release instant. Use the returned timestamp; published_at records when publication occurred."
    },
    "is_locked": {
      "type": "boolean",
      "description": "True only before the pick's stored release instant (a pre-release embargo flag); effectively always false on a served, already-published pick. To detect that the backed game has kicked off, use `game_started`."
    },
    "game_started": {
      "type": "boolean",
      "description": "True once the backed game's kickoff has passed (kickoff <= now). When true the snapshotted pre-game price is no longer actionable. Absent for a legacy pick with no stored kickoff (treat as not-started)."
    },
    "game_ended": {
      "type": "boolean",
      "description": "Whether the backed game is over according to the cached live scoreboard, read at serve time. Tells a finished game from one still in play before `outcome` settles. Omitted when the pick has no event slug or no scoreboard is cached for it; absence is unknown, never false."
    },
    "outcome": {
      "type": "string",
      "enum": [
        "pending",
        "win",
        "loss",
        "void"
      ],
      "description": "Settlement outcome of the backed side; 'pending' until the market resolves."
    },
    "outcome_display": {
      "type": "string",
      "description": "Pre-formatted SETTLEMENT STATUS for display: \"Win\" / \"Loss\" / \"Void\" / \"Pending\" -- the outcome enum above as a label. Convenience only; outcome is the source value. NOTE: this is the win/loss STATUS, not the backed side. The backed side is pick_outcome_label (\"Belgium (-2.5)\") -- a different field answering a different question."
    },
    "pick_outcome_label": {
      "type": "string",
      "description": "The backed side phrased as a bet: a team for a moneyline (e.g. \"Portugal\"), the handicap line for a spread (e.g. \"Belgium (-2.5)\"), or \"{team} to advance\" for a knockout advancement market (e.g. \"Spain to advance\")."
    },
    "token_id": {
      "type": "string",
      "description": "The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the backed outcome; omitted when unavailable (e.g. unsynced markets)."
    },
    "position": {
      "type": "string",
      "description": "The backed side phrased as a bet (e.g. \"Portugal to win\")."
    },
    "side_summary": {
      "type": "string",
      "description": "One-line summary of which side sharp money is backing. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof."
    },
    "sharp_wallet_count": {
      "type": "integer",
      "description": "S/A wallet count on the backed side in the public V1 compatibility projection."
    },
    "smart_wallet_count": {
      "type": "integer",
      "deprecated": true,
      "description": "Deprecated spelling of sharp_wallet_count with the same value."
    },
    "top_grade": {
      "type": "string",
      "description": "Best recorded S/A grade in the public V1 compatibility projection."
    },
    "sharp_usd": {
      "type": "number",
      "description": "Recorded sharp-money magnitude in USD when available."
    },
    "smart_usd": {
      "type": "number",
      "deprecated": true,
      "description": "Deprecated spelling of sharp_usd with the same value."
    },
    "backed_price": {
      "type": "number",
      "description": "Frozen pre-game probability (0..1) for the backed side, written once at publication. It is the Polymarket CLOB order book midpoint at release, not an executed fill: a buyer lifts the ask, so a subscriber's own entry is usually a little worse than this price."
    },
    "entry_price_note": {
      "type": "string",
      "description": "Full-only disclosure when backed_price was recovered from provider history within 30 seconds before publication. Render beside the price. Absent for ordinary publication captures and teasers; this is a historical reference, not an executed fill."
    },
    "odds_display": {
      "type": "string",
      "description": "Pre-formatted backed_price as cents-on-the-dollar odds, to ONE decimal: \"62.0c\" / \"99.9c\". Never rounded to a whole cent -- a 99.9c favorite is not a 100c certainty. Convenience only; backed_price is the source value. Omitted when backed_price is."
    },
    "stake_usd": {
      "type": "number",
      "description": "The flat stake the published record puts on every pick, in USD: 1000 since 2026-09-22 (it was 100 before). Present exactly when return_usd is, so a reader never has to know the stake from anywhere else."
    },
    "return_usd": {
      "type": "number",
      "description": "Gross return of stake_usd at the frozen midpoint price (stake_usd / backed_price). A real fill pays the ask, so an executed stake usually returns a little less. Omitted with backed_price."
    },
    "return_per_100": {
      "type": "number",
      "description": "The same return on a literal $100 (100 / backed_price), kept for compatibility: the field predates stake_usd and its name promises the $100 basis, so a client that scales it to its own stake stays right. Present exactly when return_usd is."
    },
    "payout_display": {
      "type": "string",
      "description": "Pre-formatted return_usd as USD with cents and thousands separators: \"$1,612.90\" / \"$12,500.00\". The GROSS return (the stake included), so it carries no sign. Convenience only; return_usd is the source value. Omitted when return_usd is."
    },
    "profit_display": {
      "type": "string",
      "description": "Pre-formatted PROFIT on the stake -- return_usd minus stake_usd, i.e. the payout net of what you put in -- as a signed USD string: \"+$612.90\". Distinct from payout_display, which is gross. Omitted when return_usd is."
    },
    "clv_status": {
      "type": "string",
      "description": "Backend-owned CLV capture disposition. \"pending\" means no capture decision exists yet; terminal provider or quality statuses remain distinguishable. The raw close price and timestamp are never serialized."
    },
    "clv_basis": {
      "type": "string",
      "description": "Backend-owned CLV evidence basis. `frozen_displayed_entry` uses the persisted displayed entry. `historical_provider_entry` uses a known-CLOB point at or before publication. `historical_provider_price_match` requires the latest point in the prior hour to match. `historical_provider_nearby_price_match` requires a matching point within five minutes before publication. Source-null bases preserve unknown original provenance."
    },
    "clv_pct": {
      "type": "number",
      "description": "Closing-line value toward the backed side, computed as (close / entry - 1) * 100. The basis-specific provider p entry must match the stored display; historical_provider_price_match also requires source provenance to remain null and its latest entry to be within the one-hour window at or before publication. Every basis requires a later quality-checked p close from the same series in the bounded post-entry, pre-kickoff window. Omitted when not measured."
    },
    "clv_display": {
      "type": "string",
      "description": "Backend-formatted signed CLV percentage, present exactly when clv_pct is present."
    },
    "clv_explanation": {
      "type": "string",
      "description": "Backend-owned CLV formula text with the entry probability, close probability, and rounded result. Provider timestamps remain private."
    },
    "unit_score": {
      "type": "number",
      "description": "Net return for the pick in stake units (return_usd / stake_usd - 1); one unit is one stake_usd stake, and the figure is the same under any stake size. Omitted when the outcome is not valued."
    },
    "unit_score_display": {
      "type": "string",
      "description": "Backend-formatted signed unit score, present exactly when unit_score is present."
    },
    "sharp_pct": {
      "type": "number",
      "description": "Recorded sharp-money share as a 0..1 fraction when available. This is not a winning probability."
    },
    "market_pct": {
      "type": "number",
      "description": "Recorded market-implied probability as a 0..1 fraction when available."
    },
    "qualifying_expert": {
      "type": "object",
      "description": "Optional recorded specialist facts on a full response. These describe the trader, not the pick's win probability. Omitted when no recorded specialist is available.",
      "properties": {
        "address": {
          "type": "string",
          "description": "Trader wallet address."
        },
        "name": {
          "type": [
            "string",
            "null"
          ],
          "description": "Provider display name, or null for an unnamed wallet."
        },
        "grade": {
          "type": [
            "string",
            "null"
          ],
          "description": "Recorded trader grade. Public V1 preserves its S/A compatibility projection."
        },
        "canonical_category": {
          "type": "string",
          "description": "The canonical sport bucket the win rate was measured over (for example Basketball). Can be BROADER than the pick's display_category, which names an exact league such as NBA — label the rate with this field, never with display_category."
        },
        "win_rate": {
          "type": [
            "number",
            "null"
          ],
          "description": "Share of the trader’s resolved markets in canonical_category with positive realized P&L, as a 0..1 fraction. Null when not measured. This is a trader statistic, not the pick’s probability of winning."
        },
        "n_resolved": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Number of resolved markets behind win_rate; null when not measured."
        },
        "position_usd": {
          "type": "number",
          "description": "Recorded Polymarket position value on the backed outcome, in USD. It can change after this snapshot."
        },
        "opposite_position_usd": {
          "type": "number",
          "description": "Recorded position value on the other outcome of this market, in USD. Omitted when not recorded; zero is a measured value."
        },
        "stats_computed_at": {
          "type": "string",
          "format": "date-time",
          "description": "Timestamp of the recorded trader statistics."
        }
      },
      "required": [
        "address",
        "name",
        "grade",
        "canonical_category",
        "win_rate",
        "n_resolved",
        "position_usd",
        "stats_computed_at"
      ]
    },
    "traders": {
      "type": "integer",
      "description": "Public V1 S/A wallet count on the backed side, equal to sharp_wallet_count."
    },
    "backed_sharp_usd": {
      "type": "number",
      "description": "Recorded aggregate backed-side position value in USD when available, not a live balance or entry cost. The display_holders roster can include additional wallets; use the returned aggregate rather than summing that roster."
    },
    "holders": {
      "type": "array",
      "description": "Bounded S/A holder display projection from the recorded snapshot. Historical rows retain their recorded display shape.",
      "items": {
        "$ref": "#/$defs/PickHolder"
      }
    },
    "display_holders": {
      "type": "array",
      "description": "Optional recorded holder roster in display order, with lead_backer first when present. Preserve the returned order. The roster can include wallets outside the recorded count and aggregate fields; do not derive holder_count, wallet counts or backed_sharp_usd from its length or a sum. Position values are gross holdings on the backed outcome and can coexist with holdings on the other outcome. Historical rows retain their recorded display shape.",
      "items": {
        "$ref": "#/$defs/PickHolder"
      }
    },
    "holder_count": {
      "type": "integer",
      "description": "S/A holder count for the public V1 compatibility projection. display_holders can include additional grades."
    },
    "thesis": {
      "type": "string",
      "description": "Display-ready explanation of the recorded pick. Render the returned text rather than reconstructing it from holder counts or grades."
    },
    "market_url": {
      "type": "string",
      "description": "Canonical web market URL."
    },
    "polymarket_url": {
      "type": "string",
      "description": "Where this pick's outbound Polymarket link lands: Polymarket's own redirect answer for `/event/<event_slug>`, carrying the referral tag. Omitted until that redirect has been resolved; link to the event page instead when it is absent."
    },
    "event_slug": {
      "type": "string",
      "description": "The canonical /event game-page slug (one neutral page per game); omitted when the game has no neutral event page."
    },
    "event_link_slug": {
      "type": [
        "string",
        "null"
      ],
      "description": "Backend-resolved /event destination slug for the source market. Omitted outside full responses; null is an authoritative no-link decision."
    },
    "sports_context": {
      "allOf": [
        {
          "$ref": "#/$defs/PickSportsContext"
        }
      ],
      "description": "Provider-first sports context for the pick's market (team logos, league branding, live score). Full-state only; omitted when the pick is not a team-sports market."
    },
    "disclaimer": {
      "type": "string",
      "description": "Risk disclaimer shown with every pick."
    },
    "proof_pending_picks": {
      "type": "array",
      "description": "Entitled published picks whose holder proof is unreadable, ordered by rank. Unauthorized ranks appear only in locked_picks and cannot trigger proof warming. Read retry_at for the next read.",
      "items": {
        "$ref": "#/$defs/ProofPendingPickSlot"
      }
    },
    "entry_authorization": {
      "$ref": "#/$defs/PotdEntryAuthorization",
      "description": "Optional full-response entry authorization. Missing or expired authorization cannot authorize an automated entry."
    },
    "locked_picks": {
      "type": "array",
      "description": "Unauthorized unresolved published or scheduled ranks. Contains no game, provider identity, price, or identifying clock. Pro may upgrade to Max to open these ranks.",
      "items": {
        "type": "object",
        "required": [
          "pick_rank",
          "required_tier"
        ],
        "properties": {
          "pick_rank": {
            "type": "integer",
            "minimum": 1,
            "maximum": 30
          },
          "required_tier": {
            "type": "string",
            "enum": [
              "max"
            ]
          }
        }
      }
    },
    "message": {
      "type": "string",
      "description": "Actionable status, including Upgrade to Max when only locked ranks are published."
    },
    "pick_id": {
      "type": "string",
      "pattern": "^[1-9][0-9]*$",
      "description": "Stable pick row identity as decimal text. Never use a quality rank as identity."
    },
    "publication_order": {
      "type": "integer",
      "description": "Compatibility release slot. No quality claim; historic scheduling order is retained."
    },
    "is_free_selection": {
      "type": "boolean",
      "description": "Viewer-independent free selection designation. New rows store it explicitly; historic null storage uses the original free slot."
    },
    "supersedes_pick_id": {
      "deprecated": true,
      "type": [
        "string",
        "null"
      ],
      "pattern": "^[1-9][0-9]*$",
      "description": "Deprecated (#24157): always null. No replacement lineage was ever recorded in this field; the key stays so existing V1 clients keep parsing. Identify a pick by pick_id."
    },
    "lead_backer": {
      "$ref": "#/$defs/PickLeadBacker",
      "description": "Optional full-only lead wallet publication facts. Omitted on legacy picks or when the recorded evidence is unavailable."
    }
  },
  "$defs": {
    "PickHolder": {
      "type": "object",
      "required": [
        "address",
        "name",
        "grade",
        "last_traded_at",
        "shares"
      ],
      "properties": {
        "address": {
          "type": "string"
        },
        "name": {
          "type": [
            "string",
            "null"
          ]
        },
        "grade": {
          "type": [
            "string",
            "null"
          ],
          "description": "All-time trader grade (S, A, B, C, D, F)."
        },
        "last_traded_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time",
          "description": "The wallet's most recent recorded trade time, stamped at serve time from its current trader record rather than frozen with the pick. Always sent; null when no trade time is recorded."
        },
        "profile_segment": {
          "type": "string",
          "description": "0xinsider profile path segment this wallet links to: `@<username>` when that username resolves to this wallet alone, otherwise the lowercase wallet. Percent-encode the part after `@` and append to `https://0xinsider.com/profile/`. Stamped at serve time; absent on a body cached before the field shipped."
        },
        "shares": {
          "type": "number"
        },
        "entry_value_usd": {
          "type": "number",
          "description": "USD entry value of this wallet's position: `shares` times the pick's frozen `backed_price`. An entry valuation, never a live balance or the provider's current value. Omitted when the holder snapshot has no valid price."
        },
        "category_win_rate": {
          "type": "number",
          "minimum": 0,
          "maximum": 1,
          "description": "This wallet's win rate in the pick's canonical category bucket (the pick's `category` field, e.g. Basketball -- label the rate with it, never with the narrower `display_category` league, except when `category_win_rate_game` is present, in which case the rate is that game's or league's and is labelled with it): the share of the wallet's resolved markets in that category whose realized P&L closed positive, as a 0..1 fraction. Present only with `category_win_rate_status` = `measured`, on `display_holders` entries, and only when the wallet clears the resolved-market floor; recomputed at serve time from the current category read model, not frozen with the pick. Absent on `holders` entries, legacy rows, and payloads predating the field."
        },
        "category_win_record": {
          "type": "object",
          "required": [
            "wins",
            "decided"
          ],
          "properties": {
            "wins": {
              "type": "integer",
              "minimum": 0,
              "description": "Resolved markets in the category that this wallet closed with a profit."
            },
            "decided": {
              "type": "integer",
              "minimum": 0,
              "description": "Resolved markets in the category that this wallet closed with a profit or a loss. A market resolved at zero realized P&L is in neither count."
            }
          },
          "description": "The two counts `category_win_rate` is the ratio of, read from the same row: `wins / decided` equals the rate. Counts every resolved Polymarket market the wallet traded in the pick's canonical category (or in its game or league, when `category_win_rate_game` is present), at any position size; the counts are rebuilt daily. Present only with `category_win_rate_status` = `measured`; absent otherwise and on payloads predating the field."
        },
        "category_avg_price": {
          "type": "number",
          "minimum": 0,
          "maximum": 1,
          "description": "The wallet's average entry price in the pick's canonical category, as a 0..1 fraction of $1 (0.98 is 98 cents). Its sample is the wallet's settled markets in that category of $20 or more where it bought one side at a known price, so it can differ from the `category_win_record` sample. A wallet that buys near-certain outcomes wins almost every time, so read the win rate beside this price. Present only with `category_win_rate_status` = `measured`, and only when that sample has at least 5 markets. When `category_win_rate_game` is present the price is still the whole `category` bucket's: this field has no per-game or per-league price. Absent otherwise and on payloads predating the field."
        },
        "category_win_rate_game": {
          "type": "string",
          "description": "Where `category_win_rate` and `category_win_record` were measured, by the same name the pick's `display_category` uses for it: for an esports pick the game (`LoL`, `CS2`, `Dota 2`, `Valorant`, `Call of Duty`, `Honor of Kings`, `Mobile Legends: Bang Bang`, `Overwatch`, `Rainbow Six Siege`, `Rocket League` or `StarCraft II`), and for a pick in a registered league that league (`NBA`, `NFL`, `NHL`, `MLB`, `UFC`, `ATP`, `WTA`, `LaLiga`, `Premier League`, `Serie A`, `UEFA Champions League`, `MLS` and the other registered leagues). Present only when the wallet's record there clears the 5-resolved-market floor, in which case the rate and record are the game's or league's rather than the whole `category` bucket's. Absent when the rate is the bucket's (the wallet's history there is under the floor, or the competition is not a registered league), on every other pick, beside every non-measured status, and on payloads predating the field. Label the rate with this when present and with `category` otherwise."
        },
        "category_win_rate_status": {
          "type": "string",
          "enum": [
            "measured",
            "not_enough_data",
            "unavailable"
          ],
          "description": "Why `category_win_rate` is present or absent on a `display_holders` entry: `measured` (rate present), `not_enough_data` (the wallet is below the resolved-market floor of 5 in the category), or `unavailable` (the annotation read failed; retry later). Absent entirely on `holders` entries, legacy rows, and payloads predating the field -- absence means the roster was never annotated, not a small sample."
        },
        "wallet_age_days": {
          "type": [
            "number",
            "null"
          ],
          "description": "Whole days since this wallet's first trade, rounded down (3.6 days reads 3), so it changes once a day, not on every request, and the pick's ETag holds between requests. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped."
        },
        "is_new_wallet": {
          "type": "boolean",
          "description": "True when the wallet's first trade was under 30 days ago. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped."
        },
        "markets_traded": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Distinct markets this wallet has traded. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped."
        },
        "is_bot": {
          "type": "boolean",
          "description": "True when the wallet has traded 10,000 or more distinct markets, the breadth floor 0xinsider uses to mark automated wallets. It is a breadth rule, not proof of automation. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped."
        },
        "x_username": {
          "type": [
            "string",
            "null"
          ],
          "description": "The wallet's X handle from its Polymarket profile, normalized to 1-15 characters of [A-Za-z0-9_] with no `@`. Link it as `https://x.com/<handle>`. Stamped at serve time from the wallet's current trader record, never frozen with the pick. The five badge fields are present together, and only for a wallet that carries at least one badge; all absent means no badge, or a body cached before the fields shipped."
        }
      }
    },
    "PickLeadBacker": {
      "type": "object",
      "description": "Recorded lead wallet facts on a full response when available. Position and category history are frozen at publication; they are not live balances or pick win probabilities.",
      "properties": {
        "address": {
          "type": "string",
          "description": "Lead trader wallet address."
        },
        "name": {
          "type": [
            "string",
            "null"
          ],
          "description": "Recorded provider display name."
        },
        "grade": {
          "type": "string",
          "description": "Trader grade recorded at publication."
        },
        "category": {
          "type": "string",
          "description": "Canonical sport of the recorded directional history."
        },
        "position_usd": {
          "type": "number",
          "description": "Provider-reported position value on the backed outcome at publication, in USD. It is the gross value on that outcome and does not subtract shares the wallet held on the other outcome; see net_position_usd. It is not the entry cost or a live balance."
        },
        "net_position_usd": {
          "type": "number",
          "description": "Net value of the lead's position toward the backed outcome at publication, in USD: shares held on the backed outcome minus shares held on the other outcome of the same market, valued at the backed outcome's provider price at publication. Present only when the wallet also held the other outcome; absent for a one-sided position, whose net equals position_usd. It is not a live balance."
        },
        "position_observed_at": {
          "type": "string",
          "format": "date-time",
          "description": "Start time of the provider position fetch used at publication. This conservative observation clock precedes completion; the position is not a live balance."
        },
        "directional_event_count": {
          "type": "integer",
          "description": "Distinct directional events in the recorded category history."
        },
        "profitable_event_count": {
          "type": "integer",
          "minimum": 0,
          "maximum": 4294967295,
          "description": "Events with strictly positive native terminal P&L in the same frozen category sample as directional_event_count, realized_pnl_usd and roi. Multiple market positions in one event contribute one combined event result. Zero-profit events remain in directional_event_count but do not increase this count. This is a recorded wallet result, not a market win rate or the pick's win probability."
        },
        "realized_pnl_usd": {
          "type": "number",
          "description": "Realized P&L over the recorded directional category sample, in USD. Excludes open positions and later changes."
        },
        "entry_basis_usd": {
          "type": "number",
          "description": "Recorded entry basis of that directional sample, in USD; not a claim of complete trading costs or fees."
        },
        "roi": {
          "type": "number",
          "description": "Realized P&L divided by recorded entry basis, as a fraction: 0.10 means 10%. This is a wallet statistic, not a pick win probability."
        },
        "max_realized_drawdown_usd": {
          "type": "number",
          "description": "Peak-to-trough realized P&L drawdown after each event result in the recorded sample, in USD. Excludes intragame, unrealized, and account equity drawdown."
        },
        "recorded_at": {
          "type": "string",
          "format": "date-time",
          "description": "Timestamp when the directional history evidence was recorded, separate from the provider position snapshot clock."
        }
      },
      "required": [
        "address",
        "name",
        "grade",
        "category",
        "position_usd",
        "position_observed_at",
        "directional_event_count",
        "profitable_event_count",
        "realized_pnl_usd",
        "entry_basis_usd",
        "roi",
        "max_realized_drawdown_usd",
        "recorded_at"
      ]
    },
    "PickOfTheDay": {
      "type": "object",
      "required": [
        "state",
        "supersedes_pick_id"
      ],
      "properties": {
        "state": {
          "type": "string",
          "enum": [
            "full"
          ],
          "description": "Full success containing entitled proof-readable picks."
        },
        "pick_date": {
          "type": "string",
          "format": "date",
          "description": "The pick's local publication date (YYYY-MM-DD)."
        },
        "pick_rank": {
          "type": "integer",
          "minimum": 1,
          "maximum": 30,
          "description": "Deprecated compatibility daily release slot; use pick_id for identity and publication_order for scheduling.",
          "deprecated": true
        },
        "picks": {
          "type": "array",
          "description": "Published picks for this product day in the returned display order. Use pick_id for identity.",
          "items": {
            "$ref": "#/$defs/PickOfTheDay"
          }
        },
        "pick_count": {
          "type": "integer",
          "minimum": 0,
          "maximum": 25,
          "description": "Number of items in `picks`: the proof-readable picks. Picks held in `proof_pending_picks` are not counted."
        },
        "scheduled_picks": {
          "type": "array",
          "description": "Rank-ordered entitled selections that have not released. Every row retains release_at and kickoff; unauthorized scheduled ranks appear only in identity-free locked_picks.",
          "items": {
            "$ref": "#/$defs/ScheduledPickSlot"
          }
        },
        "matchup": {
          "type": "string",
          "description": "Human-readable matchup (e.g. \"Portugal vs. Uzbekistan\")."
        },
        "category": {
          "type": "string",
          "description": "Recorded canonical sport category. Prefer display_category for the public competition label."
        },
        "display_category": {
          "type": "string",
          "description": "Frozen public presentation category. Tennis uses the provider-verified ATP or WTA tour, including Wimbledon and doubles; unknown tours retain Tennis. Every men's and women's cricket competition uses Cricket. Other sports use the curated league, esports title or soccer competition label, then the provider series name without its season year, then category when no competition is known. The canonical category and measured cohort are unchanged: an esports title still uses the pooled Esports category. Optional for mixed-version client compatibility."
        },
        "platform": {
          "type": "string",
          "enum": [
            "polymarket"
          ],
          "description": "Provider platform. Always polymarket."
        },
        "release_at": {
          "type": "string",
          "format": "date-time",
          "description": "The pick's stored release instant. Use the returned timestamp; published_at records when publication occurred."
        },
        "is_locked": {
          "type": "boolean",
          "description": "True only before the pick's stored release instant (a pre-release embargo flag); effectively always false on a served, already-published pick. To detect that the backed game has kicked off, use `game_started`."
        },
        "game_started": {
          "type": "boolean",
          "description": "True once the backed game's kickoff has passed (kickoff <= now). When true the snapshotted pre-game price is no longer actionable. Absent for a legacy pick with no stored kickoff (treat as not-started)."
        },
        "game_ended": {
          "type": "boolean",
          "description": "Whether the backed game is over according to the cached live scoreboard, read at serve time. Tells a finished game from one still in play before `outcome` settles. Omitted when the pick has no event slug or no scoreboard is cached for it; absence is unknown, never false."
        },
        "outcome": {
          "type": "string",
          "enum": [
            "pending",
            "win",
            "loss",
            "void"
          ],
          "description": "Settlement outcome of the backed side; 'pending' until the market resolves."
        },
        "outcome_display": {
          "type": "string",
          "description": "Pre-formatted SETTLEMENT STATUS for display: \"Win\" / \"Loss\" / \"Void\" / \"Pending\" -- the outcome enum above as a label. Convenience only; outcome is the source value. NOTE: this is the win/loss STATUS, not the backed side. The backed side is pick_outcome_label (\"Belgium (-2.5)\") -- a different field answering a different question."
        },
        "pick_outcome_label": {
          "type": "string",
          "description": "The backed side phrased as a bet: a team for a moneyline (e.g. \"Portugal\"), the handicap line for a spread (e.g. \"Belgium (-2.5)\"), or \"{team} to advance\" for a knockout advancement market (e.g. \"Spain to advance\")."
        },
        "token_id": {
          "type": "string",
          "description": "The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the backed outcome; omitted when unavailable (e.g. unsynced markets)."
        },
        "position": {
          "type": "string",
          "description": "The backed side phrased as a bet (e.g. \"Portugal to win\")."
        },
        "side_summary": {
          "type": "string",
          "description": "One-line summary of which side sharp money is backing. Required on every item in `picks`: a current-day published pick whose required holder proof is not safely readable is listed in `proof_pending_picks` instead of being served with a partial success shape or a synthetic zero, and the route returns 503 read_model_warming only when no published pick has readable proof."
        },
        "sharp_wallet_count": {
          "type": "integer",
          "description": "S/A wallet count on the backed side in the public V1 compatibility projection."
        },
        "smart_wallet_count": {
          "type": "integer",
          "deprecated": true,
          "description": "Deprecated spelling of sharp_wallet_count with the same value."
        },
        "top_grade": {
          "type": "string",
          "description": "Best recorded S/A grade in the public V1 compatibility projection."
        },
        "sharp_usd": {
          "type": "number",
          "description": "Recorded sharp-money magnitude in USD when available."
        },
        "smart_usd": {
          "type": "number",
          "deprecated": true,
          "description": "Deprecated spelling of sharp_usd with the same value."
        },
        "backed_price": {
          "type": "number",
          "description": "Frozen pre-game probability (0..1) for the backed side, written once at publication. It is the Polymarket CLOB order book midpoint at release, not an executed fill: a buyer lifts the ask, so a subscriber's own entry is usually a little worse than this price."
        },
        "entry_price_note": {
          "type": "string",
          "description": "Full-only disclosure when backed_price was recovered from provider history within 30 seconds before publication. Render beside the price. Absent for ordinary publication captures and teasers; this is a historical reference, not an executed fill."
        },
        "odds_display": {
          "type": "string",
          "description": "Pre-formatted backed_price as cents-on-the-dollar odds, to ONE decimal: \"62.0c\" / \"99.9c\". Never rounded to a whole cent -- a 99.9c favorite is not a 100c certainty. Convenience only; backed_price is the source value. Omitted when backed_price is."
        },
        "stake_usd": {
          "type": "number",
          "description": "The flat stake the published record puts on every pick, in USD: 1000 since 2026-09-22 (it was 100 before). Present exactly when return_usd is, so a reader never has to know the stake from anywhere else."
        },
        "return_usd": {
          "type": "number",
          "description": "Gross return of stake_usd at the frozen midpoint price (stake_usd / backed_price). A real fill pays the ask, so an executed stake usually returns a little less. Omitted with backed_price."
        },
        "return_per_100": {
          "type": "number",
          "description": "The same return on a literal $100 (100 / backed_price), kept for compatibility: the field predates stake_usd and its name promises the $100 basis, so a client that scales it to its own stake stays right. Present exactly when return_usd is."
        },
        "payout_display": {
          "type": "string",
          "description": "Pre-formatted return_usd as USD with cents and thousands separators: \"$1,612.90\" / \"$12,500.00\". The GROSS return (the stake included), so it carries no sign. Convenience only; return_usd is the source value. Omitted when return_usd is."
        },
        "profit_display": {
          "type": "string",
          "description": "Pre-formatted PROFIT on the stake -- return_usd minus stake_usd, i.e. the payout net of what you put in -- as a signed USD string: \"+$612.90\". Distinct from payout_display, which is gross. Omitted when return_usd is."
        },
        "clv_status": {
          "type": "string",
          "description": "Backend-owned CLV capture disposition. \"pending\" means no capture decision exists yet; terminal provider or quality statuses remain distinguishable. The raw close price and timestamp are never serialized."
        },
        "clv_basis": {
          "type": "string",
          "description": "Backend-owned CLV evidence basis. `frozen_displayed_entry` uses the persisted displayed entry. `historical_provider_entry` uses a known-CLOB point at or before publication. `historical_provider_price_match` requires the latest point in the prior hour to match. `historical_provider_nearby_price_match` requires a matching point within five minutes before publication. Source-null bases preserve unknown original provenance."
        },
        "clv_pct": {
          "type": "number",
          "description": "Closing-line value toward the backed side, computed as (close / entry - 1) * 100. The basis-specific provider p entry must match the stored display; historical_provider_price_match also requires source provenance to remain null and its latest entry to be within the one-hour window at or before publication. Every basis requires a later quality-checked p close from the same series in the bounded post-entry, pre-kickoff window. Omitted when not measured."
        },
        "clv_display": {
          "type": "string",
          "description": "Backend-formatted signed CLV percentage, present exactly when clv_pct is present."
        },
        "clv_explanation": {
          "type": "string",
          "description": "Backend-owned CLV formula text with the entry probability, close probability, and rounded result. Provider timestamps remain private."
        },
        "unit_score": {
          "type": "number",
          "description": "Net return for the pick in stake units (return_usd / stake_usd - 1); one unit is one stake_usd stake, and the figure is the same under any stake size. Omitted when the outcome is not valued."
        },
        "unit_score_display": {
          "type": "string",
          "description": "Backend-formatted signed unit score, present exactly when unit_score is present."
        },
        "sharp_pct": {
          "type": "number",
          "description": "Recorded sharp-money share as a 0..1 fraction when available. This is not a winning probability."
        },
        "market_pct": {
          "type": "number",
          "description": "Recorded market-implied probability as a 0..1 fraction when available."
        },
        "qualifying_expert": {
          "type": "object",
          "description": "Optional recorded specialist facts on a full response. These describe the trader, not the pick's win probability. Omitted when no recorded specialist is available.",
          "properties": {
            "address": {
              "type": "string",
              "description": "Trader wallet address."
            },
            "name": {
              "type": [
                "string",
                "null"
              ],
              "description": "Provider display name, or null for an unnamed wallet."
            },
            "grade": {
              "type": [
                "string",
                "null"
              ],
              "description": "Recorded trader grade. Public V1 preserves its S/A compatibility projection."
            },
            "canonical_category": {
              "type": "string",
              "description": "The canonical sport bucket the win rate was measured over (for example Basketball). Can be BROADER than the pick's display_category, which names an exact league such as NBA — label the rate with this field, never with display_category."
            },
            "win_rate": {
              "type": [
                "number",
                "null"
              ],
              "description": "Share of the trader’s resolved markets in canonical_category with positive realized P&L, as a 0..1 fraction. Null when not measured. This is a trader statistic, not the pick’s probability of winning."
            },
            "n_resolved": {
              "type": [
                "integer",
                "null"
              ],
              "description": "Number of resolved markets behind win_rate; null when not measured."
            },
            "position_usd": {
              "type": "number",
              "description": "Recorded Polymarket position value on the backed outcome, in USD. It can change after this snapshot."
            },
            "opposite_position_usd": {
              "type": "number",
              "description": "Recorded position value on the other outcome of this market, in USD. Omitted when not recorded; zero is a measured value."
            },
            "stats_computed_at": {
              "type": "string",
              "format": "date-time",
              "description": "Timestamp of the recorded trader statistics."
            }
          },
          "required": [
            "address",
            "name",
            "grade",
            "canonical_category",
            "win_rate",
            "n_resolved",
            "position_usd",
            "stats_computed_at"
          ]
        },
        "traders": {
          "type": "integer",
          "description": "Public V1 S/A wallet count on the backed side, equal to sharp_wallet_count."
        },
        "backed_sharp_usd": {
          "type": "number",
          "description": "Recorded aggregate backed-side position value in USD when available, not a live balance or entry cost. The display_holders roster can include additional wallets; use the returned aggregate rather than summing that roster."
        },
        "holders": {
          "type": "array",
          "description": "Bounded S/A holder display projection from the recorded snapshot. Historical rows retain their recorded display shape.",
          "items": {
            "$ref": "#/$defs/PickHolder"
          }
        },
        "display_holders": {
          "type": "array",
          "description": "Optional recorded holder roster in display order, with lead_backer first when present. Preserve the returned order. The roster can include wallets outside the recorded count and aggregate fields; do not derive holder_count, wallet counts or backed_sharp_usd from its length or a sum. Position values are gross holdings on the backed outcome and can coexist with holdings on the other outcome. Historical rows retain their recorded display shape.",
          "items": {
            "$ref": "#/$defs/PickHolder"
          }
        },
        "holder_count": {
          "type": "integer",
          "description": "S/A holder count for the public V1 compatibility projection. display_holders can include additional grades."
        },
        "thesis": {
          "type": "string",
          "description": "Display-ready explanation of the recorded pick. Render the returned text rather than reconstructing it from holder counts or grades."
        },
        "market_url": {
          "type": "string",
          "description": "Canonical web market URL."
        },
        "polymarket_url": {
          "type": "string",
          "description": "Where this pick's outbound Polymarket link lands: Polymarket's own redirect answer for `/event/<event_slug>`, carrying the referral tag. Omitted until that redirect has been resolved; link to the event page instead when it is absent."
        },
        "event_slug": {
          "type": "string",
          "description": "The canonical /event game-page slug (one neutral page per game); omitted when the game has no neutral event page."
        },
        "event_link_slug": {
          "type": [
            "string",
            "null"
          ],
          "description": "Backend-resolved /event destination slug for the source market. Omitted outside full responses; null is an authoritative no-link decision."
        },
        "sports_context": {
          "allOf": [
            {
              "$ref": "#/$defs/PickSportsContext"
            }
          ],
          "description": "Provider-first sports context for the pick's market (team logos, league branding, live score). Full-state only; omitted when the pick is not a team-sports market."
        },
        "disclaimer": {
          "type": "string",
          "description": "Risk disclaimer shown with every pick."
        },
        "proof_pending_picks": {
          "type": "array",
          "description": "Entitled published picks whose holder proof is unreadable, ordered by rank. Unauthorized ranks appear only in locked_picks and cannot trigger proof warming. Read retry_at for the next read.",
          "items": {
            "$ref": "#/$defs/ProofPendingPickSlot"
          }
        },
        "entry_authorization": {
          "$ref": "#/$defs/PotdEntryAuthorization",
          "description": "Optional full-response entry authorization. Missing or expired authorization cannot authorize an automated entry."
        },
        "locked_picks": {
          "type": "array",
          "description": "Unauthorized unresolved published or scheduled ranks. Contains no game, provider identity, price, or identifying clock. Pro may upgrade to Max to open these ranks.",
          "items": {
            "type": "object",
            "required": [
              "pick_rank",
              "required_tier"
            ],
            "properties": {
              "pick_rank": {
                "type": "integer",
                "minimum": 1,
                "maximum": 30
              },
              "required_tier": {
                "type": "string",
                "enum": [
                  "max"
                ]
              }
            }
          }
        },
        "message": {
          "type": "string",
          "description": "Actionable status, including Upgrade to Max when only locked ranks are published."
        },
        "pick_id": {
          "type": "string",
          "pattern": "^[1-9][0-9]*$",
          "description": "Stable pick row identity as decimal text. Never use a quality rank as identity."
        },
        "publication_order": {
          "type": "integer",
          "description": "Compatibility release slot. No quality claim; historic scheduling order is retained."
        },
        "is_free_selection": {
          "type": "boolean",
          "description": "Viewer-independent free selection designation. New rows store it explicitly; historic null storage uses the original free slot."
        },
        "supersedes_pick_id": {
          "deprecated": true,
          "type": [
            "string",
            "null"
          ],
          "pattern": "^[1-9][0-9]*$",
          "description": "Deprecated (#24157): always null. No replacement lineage was ever recorded in this field; the key stays so existing V1 clients keep parsing. Identify a pick by pick_id."
        },
        "lead_backer": {
          "$ref": "#/$defs/PickLeadBacker",
          "description": "Optional full-only lead wallet publication facts. Omitted on legacy picks or when the recorded evidence is unavailable."
        }
      }
    },
    "PickSportsContext": {
      "type": "object",
      "required": [
        "league_name",
        "league_logo",
        "yes_team",
        "no_team",
        "event_matchup"
      ],
      "description": "Provider-first sports context for a Pick of the Day market: team crests, league branding, and live score. Each team `logo` is a registered club crest or national flag as a same-origin path where one exists, and provider artwork otherwise.",
      "properties": {
        "league_name": {
          "type": [
            "string",
            "null"
          ],
          "description": "League or competition display name (e.g. \"Premier League\")."
        },
        "competition_label": {
          "type": "string",
          "description": "Provider-owned event taxonomy from Gamma eventMetadata, joined in league · serie · tournament order with blanks and case-insensitive duplicates removed. A tennis qualifying match ends in \", Qualification\", including an ATP Challenger qualifying match, which Gamma marks only in eventMetadata.tennisFixtureSource. Separate from league_name; omitted when the provider does not supply the metadata."
        },
        "league_logo": {
          "type": [
            "string",
            "null"
          ],
          "description": "League logo URL (provider-owned)."
        },
        "yes_team": {
          "oneOf": [
            {
              "$ref": "#/$defs/PickSportsTeam"
            },
            {
              "type": "null"
            }
          ],
          "description": "The team mapped to the market's YES outcome, or the parent-event home/first team when event_matchup is true."
        },
        "no_team": {
          "oneOf": [
            {
              "$ref": "#/$defs/PickSportsTeam"
            },
            {
              "type": "null"
            }
          ],
          "description": "The team mapped to the market's NO outcome, or the parent-event away/second team when event_matchup is true."
        },
        "game_id": {
          "type": "integer",
          "description": "Provider game identifier (Polymarket Gamma gameId); omitted when the provider supplies none."
        },
        "event_matchup": {
          "type": "boolean",
          "description": "Always present. True when the two teams are the parent-event match identity for a teamless binary leg (e.g. a draw, totals, or prop market), not the market's own outcomes."
        },
        "event_subject_team": {
          "allOf": [
            {
              "$ref": "#/$defs/PickSportsTeam"
            }
          ],
          "description": "Present only alongside event_matchup: the event team the binary leg is about (provider group_item_title matched to a matchup team, e.g. Belgium for \"Will Belgium win?\"), i.e. the winner on a Yes resolution. Omitted for teamless legs (draw, totals, prop)."
        },
        "matchup_title": {
          "type": "string",
          "description": "The two teams as a single whole-game label, joined \"<home> – <away>\" (en-dash) in provider display order (e.g. \"Portugal – Uzbekistan\"). Composed server-side from the provider team names (no title/slug parsing). Present when both teams resolve a name; omitted for single-subject, teamless, or non-two-team contexts."
        }
      }
    },
    "PickSportsTeam": {
      "type": "object",
      "description": "A single sports team or competitor in a Pick of the Day market's sports context. Identity and score fields are provider-owned and nullable. The structured score fields (`sets`, `format`, `sets_won`) and the tennis fields (`headshot`, `headshot_revision`, `tour`) are backend-owned and are OMITTED rather than null when they do not apply, so a consumer must treat an absent key and a null the same way.",
      "required": [
        "label",
        "short_label",
        "full_name",
        "provider_id",
        "logo",
        "logo_mark_dark",
        "color",
        "record",
        "score"
      ],
      "properties": {
        "label": {
          "type": [
            "string",
            "null"
          ],
          "description": "Team display label as it appears on the market outcome (e.g. \"Portugal\")."
        },
        "short_label": {
          "type": [
            "string",
            "null"
          ],
          "description": "Abbreviated team label (e.g. \"POR\")."
        },
        "full_name": {
          "type": [
            "string",
            "null"
          ],
          "description": "The name to show for this team or competitor, the same on every surface (e.g. \"UCF Knights\", \"Oklahoma City Thunder\", \"Portugal\"). `label` keeps the market outcome's own spelling."
        },
        "provider_id": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Provider team identifier (Polymarket /teams id)."
        },
        "logo": {
          "type": [
            "string",
            "null"
          ],
          "description": "Team crest or flag URL. Official NFL (32), WNBA (15), NBA (30), NHL (32), and MLB (30) club crests use same-origin relative paths (`/api/sports/team-logos/{league}/{abbr}.svg?v=<content hash>`); resolve relative URLs against the API origin. Vendored soccer club crests use the same path with `.png`. National teams in the registered national-team competitions use the same path with `.svg`: the official national flag, drawn whole at its own aspect. Other teams use provider artwork, including country flags for tennis players. Novelty rows, and national-team rows that are not exactly one country, retain provider artwork."
        },
        "logo_mark_dark": {
          "type": "boolean",
          "description": "True when artwork measurements show that the team mark needs a light plate on a dark background. Vendored crest verdicts are tied to the exact asset bytes; provider artwork is measured by the teams sync. Always sent; false when no current measurement marks the logo dark."
        },
        "color": {
          "type": [
            "string",
            "null"
          ],
          "description": "Team brand color as a hex string (provider-owned)."
        },
        "record": {
          "type": [
            "string",
            "null"
          ],
          "description": "Win-loss record as a display string (e.g. \"12-4\")."
        },
        "score": {
          "type": [
            "string",
            "null"
          ],
          "description": "Live or final score as a display string when the game is in play or settled."
        },
        "headshot": {
          "type": "string",
          "description": "Tennis player headshot URL, served same-origin. Present only for a tennis competitor the headshot resolver matched; absent for team sports and for unmatched players, where `logo` stays the fallback."
        },
        "tour": {
          "type": "string",
          "enum": [
            "atp",
            "wta",
            "itf"
          ],
          "description": "Tennis tour this competitor belongs to. Present for every tennis entry whether or not `headshot` resolved, so a consumer can tell a tennis player with no photo from a non-tennis team. Absent for every other sport. Only `atp` and `wta` name a gender; the ITF World Tennis Tour runs men's and women's events and the provider does not say which, so `itf` means tennis with gender unknown."
        },
        "sets": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/ScoreCell"
          },
          "description": "Per-set score cells for this side, in set order. Backend-owned: render these rather than parsing `score`. Omitted entirely when the provider score is not a structured multi-set match or could not be parsed, so an absent array and an empty one carry the same meaning."
        },
        "format": {
          "$ref": "#/$defs/ScoreFormat"
        },
        "sets_won": {
          "type": "integer",
          "description": "Completed sets won by this side. Present only when both sides expose the same set columns, so a partially parsed scoreline reports no tally rather than a misleading one."
        },
        "headshot_revision": {
          "type": "integer",
          "format": "int64",
          "minimum": 0,
          "description": "Optional monotonic photo revision for this tennis player, independent of the sports score revision. Legacy stored photos start at zero. Successful new or changed image bytes advance it; source checks and attribution changes do not. Compare only for the same tour and provider_id: a higher revision replaces the portrait, an equal revision may fill a missing portrait, and a lower revision must not replace a newer one. Absent when no photo resolved."
        },
        "ranking": {
          "allOf": [
            {
              "$ref": "#/$defs/TennisRanking"
            }
          ],
          "description": "Optional latest retrieved ATP/WTA singles rank for this player. Absent for unranked, ambiguous, doubles, expired, or unavailable identities. This is not rank at match time."
        }
      }
    },
    "PotdEntryAuthorization": {
      "type": "object",
      "required": [
        "version",
        "authorization_id",
        "policy_version",
        "condition_id",
        "token_id",
        "outcome_index",
        "category",
        "canonical_event_id",
        "max_entry_price",
        "reference_best_ask",
        "reference_book_hash",
        "reference_book_at",
        "issued_at",
        "expires_at"
      ],
      "properties": {
        "version": {
          "type": "integer",
          "enum": [
            1
          ]
        },
        "authorization_id": {
          "type": "string",
          "format": "uuid"
        },
        "policy_version": {
          "type": "integer",
          "enum": [
            7,
            8
          ],
          "description": "Identifier for the policy recorded with this authorization. It does not replace the returned max_entry_price or expires_at. Existing grants retain their recorded values."
        },
        "condition_id": {
          "type": "string"
        },
        "token_id": {
          "type": "string"
        },
        "outcome_index": {
          "type": "integer",
          "enum": [
            0,
            1
          ]
        },
        "category": {
          "type": "string",
          "description": "Canonical sport bucket, not display_category."
        },
        "canonical_event_id": {
          "type": "string",
          "description": "Exact provider parent event ID, or provider event ID when no parent exists."
        },
        "max_entry_price": {
          "type": "string",
          "description": "Maximum authorized order price as an exact decimal string, excluding fees. Quote a current executable book for the actual stake and keep the submitted order price at or below this bound. Actual fills may be lower; this limit does not guarantee a fill or define fair probability."
        },
        "reference_best_ask": {
          "type": "string",
          "description": "Selected-token best ask from the recorded reference book at issuance. This is a reference quote, not the authorized order-price limit; use max_entry_price for that limit."
        },
        "reference_book_hash": {
          "type": "string"
        },
        "reference_book_at": {
          "type": "string",
          "format": "date-time"
        },
        "issued_at": {
          "type": "string",
          "format": "date-time"
        },
        "expires_at": {
          "type": "string",
          "format": "date-time",
          "description": "Authorization expiry timestamp. Existing grants do not extend; an expired authorization cannot authorize a new automated entry."
        }
      },
      "description": "Returned entry permission bound to the named market, token and outcome. Honor the immutable max_entry_price and expires_at, and quote a current executable book for the actual stake. The submitted order price must remain within the returned limit; fills may be lower. Fees are separate, and this grant does not guarantee liquidity, execution or positive expected value."
    },
    "ProofPendingPickSlot": {
      "type": "object",
      "description": "One PUBLISHED same-day pick whose holder proof is not readable yet: its stable slot rank, the release and kickoff instants, and the instant before which a retry cannot succeed. Every item in `picks` carries its full required shape, so a pick that cannot meet it is listed here instead of being served with missing fields or a synthetic zero.",
      "required": [
        "pick_rank",
        "release_at",
        "retry_at",
        "pick_id",
        "publication_order",
        "is_free_selection",
        "supersedes_pick_id"
      ],
      "properties": {
        "pick_rank": {
          "type": "integer",
          "minimum": 1,
          "maximum": 30,
          "description": "Deprecated compatibility daily release slot; use pick_id for identity and publication_order for scheduling.",
          "deprecated": true
        },
        "release_at": {
          "type": "string",
          "format": "date-time",
          "description": "The pick's stored release instant."
        },
        "kickoff": {
          "type": "string",
          "format": "date-time",
          "description": "The backed game's frozen kickoff instant; absent for a legacy row without one."
        },
        "retry_at": {
          "type": "string",
          "format": "date-time",
          "description": "Recommended next read: 30 seconds ahead while pre-game proof is warming, one hour ahead for a post-kickoff pending legacy row that only settlement can make readable. Schedule against it instead of polling."
        },
        "pick_id": {
          "type": "string",
          "pattern": "^[1-9][0-9]*$",
          "description": "Stable pick row identity as decimal text. Never use a quality rank as identity."
        },
        "publication_order": {
          "type": "integer",
          "description": "Compatibility release slot. No quality claim; historic scheduling order is retained."
        },
        "is_free_selection": {
          "type": "boolean",
          "description": "Viewer-independent free selection designation. New rows store it explicitly; historic null storage uses the original free slot."
        },
        "supersedes_pick_id": {
          "deprecated": true,
          "type": [
            "string",
            "null"
          ],
          "pattern": "^[1-9][0-9]*$",
          "description": "Deprecated (#24157): always null. No replacement lineage was ever recorded in this field; the key stays so existing V1 clients keep parsing. Identify a pick by pick_id."
        }
      }
    },
    "ScheduledPickSlot": {
      "type": "object",
      "description": "An entitled same-day slot with a future scheduled release: stable identity and backend-owned release/kickoff instants. It leaves this list at its release instant; an unpublished slot is never a delayed recommendation. No matchup, category, platform, side, price, or holder fields appear before release. Unauthorized scheduled ranks appear only in locked_picks.",
      "required": [
        "pick_rank",
        "release_at",
        "kickoff",
        "pick_id",
        "publication_order",
        "is_free_selection",
        "supersedes_pick_id"
      ],
      "properties": {
        "pick_rank": {
          "type": "integer",
          "minimum": 1,
          "maximum": 30,
          "description": "Deprecated compatibility daily release slot; use pick_id for identity and publication_order for scheduling.",
          "deprecated": true
        },
        "release_at": {
          "type": "string",
          "format": "date-time",
          "description": "The slot's future release instant. Remove this preview at that instant and read again for published picks; a scheduled slot does not guarantee publication."
        },
        "kickoff": {
          "type": "string",
          "format": "date-time",
          "description": "The backed game's current kickoff instant."
        },
        "pick_id": {
          "type": "string",
          "pattern": "^[1-9][0-9]*$",
          "description": "Stable pick row identity as decimal text. Never use a quality rank as identity."
        },
        "publication_order": {
          "type": "integer",
          "description": "Compatibility release slot. No quality claim; historic scheduling order is retained."
        },
        "is_free_selection": {
          "type": "boolean",
          "description": "Viewer-independent free selection designation. New rows store it explicitly; historic null storage uses the original free slot."
        },
        "supersedes_pick_id": {
          "deprecated": true,
          "type": [
            "string",
            "null"
          ],
          "pattern": "^[1-9][0-9]*$",
          "description": "Deprecated (#24157): always null. No replacement lineage was ever recorded in this field; the key stays so existing V1 clients keep parsing. Identify a pick by pick_id."
        }
      }
    },
    "ScoreCell": {
      "type": "object",
      "description": "One side's score in a single set. The verbatim provider text stays on the team's `score` string; this is the parsed form.",
      "required": [
        "games"
      ],
      "properties": {
        "games": {
          "type": "integer",
          "description": "Games won in this set."
        },
        "tiebreak": {
          "type": "integer",
          "description": "Tiebreak points won in this set. Omitted when the set had no tiebreak; absence and zero are different."
        }
      }
    },
    "ScoreFormat": {
      "type": "string",
      "enum": [
        "two_side",
        "multi_set",
        "esports_series"
      ],
      "description": "Shape the provider score string was parsed into. `two_side` is one aggregate per side (basketball `105-98`), `multi_set` is per-set columns (tennis `6-7(5-7), 6-0, 1-0`), `esports_series` is a maps/sets/format triplet (`000-000|2-0|Bo3`). Omitted when the score could not be parsed."
    },
    "TennisRanking": {
      "type": "object",
      "description": "A provider-reported ATP/WTA singles rank with independent retrieval and expiry clocks. API-Tennis provides no ranking publication date. Retrieval time does not establish when the tour published the ranking.",
      "required": [
        "rank",
        "tour",
        "source",
        "observed_at",
        "expires_at"
      ],
      "additionalProperties": false,
      "properties": {
        "rank": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295,
          "description": "Provider-reported singles rank."
        },
        "tour": {
          "type": "string",
          "enum": [
            "atp",
            "wta"
          ],
          "description": "The player ranking tour."
        },
        "source": {
          "type": "string",
          "enum": [
            "api_tennis"
          ],
          "description": "The standings provider."
        },
        "observed_at": {
          "type": "string",
          "format": "date-time",
          "description": "Successful snapshot retrieval time in UTC, not ranking publication date."
        },
        "expires_at": {
          "type": "string",
          "format": "date-time",
          "description": "UTC deadline after which clients must hide this rank, including when an older game or pick response remains cached."
        }
      }
    }
  }
}