Skip to main content
Glama

Lumify Sports Intelligence

get_intelligence

Read-onlyIdempotent

Get predictive bet intelligence for an event: vig-stripped probability, fair_price, Price overlay, main-line ev (Beta), and forecasts[] — forecasted wagers from the model (same objects as list_forecasts): player props plus tennis moneyline/spreads/totals. bets[] is live for MLB, tennis, soccer (MLS + big-five), NFL, and NCAAF. forecasts[] covers MLB, NFL, NCAAF, NBA, NCAAB, NHL, and tennis and can populate when available is false. Fair-price + line-shopping on bets[] today (edge/tier null; has_recommend false). bookmaker is ignored. Match-level tokens (OVER, UNDER, ML_DRAW) have null player/team attribution. Free only when available is false and forecasts is empty. Field catalog: https://lumify.ai/docs/reference#event-intelligence

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
event_idYesEvent id, from list_events, query_events, or search results.
bookmakerNoIgnored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
betsNo
sportNoSport slug for this event.
leagueNoLeague slug for this event, if any.
matchupNoNot returned. Use get_stats for pitcher/lineup Data.
playersNoHome/away (or p1/p2) participant identification, keyed by role: {role: {name, player_id, team_id}}.
event_idNoLumify event ID this intelligence describes.
availableNoFalse when no predictive bets[] have been computed for this event yet. forecasts[] can still populate on MLB/NFL/NCAAF/NBA/NCAAB/NHL. Free only when available is false and forecasts is empty.
forecastsNoForecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows on team sports; tennis main-line via bet_type ML_P1/ML_P2 (moneyline), SPREAD_P1/SPREAD_P2 (game handicap), OVER/UNDER (total games). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts
rationaleNoEvent-level factual pre-game matchup chips (injuries, recent form, lineup/availability news — sport-shaped). Written before kickoff; the request path only reads the stored row.
odds_sourceNoBookmaker bets[].market prices were sourced from. For probability-model sports this is the book the assessment was priced against, not a bookmaker overlay; per-bet market.book is authoritative if they ever differ.
has_recommendNoTrue when at least one bet meets the recommendation threshold; null when intelligence has not been computed. False while Edge is not published (current MLB/soccer/tennis Stage 1) — a recommendation requires a non-null tier derived from edge.
match_overviewNoNatural-language pre-game matchup preview — form, context, what to watch. Written before kickoff by a Search-backed overlay on every event sport (MLB, NFL, NCAAF, NBA, NCAAB, NHL, soccer, tennis); sport-shaped queries. The request path only reads the stored row. Null when the pre-kickoff job has not run or the fixture was not eligible.
intelligence_updated_atNoISO-8601 UTC timestamp of the most recent change anywhere in this payload (max of per-bet computed_at). Use per-bet computed_at to reason about a specific bet.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changed
    • changedInput schema / properties / bookmaker / description
      Previous value: -"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers."New value: +"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig."
  2. Changed1 schema field changed
    • changedOutput schema / properties / forecasts / items / properties / market / description
      Previous value: -"Player-prop rows: Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (bet_type set): the main-line family — h2h, spreads, or totals."New value: +"Player-prop rows: prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (bet_type set): the main-line family — h2h, spreads, or totals."
  3. Changed1 schema field changed
    • changedInput schema / properties / bookmaker / description
      Previous value: -"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline."New value: +"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers."
  4. Changed2 schema fields changed
    • changedOutput schema / properties / match_overview / description
      Previous value: -"Natural-language matchup preview — form, context, what to watch. Search-backed context overlay on every event sport (MLB, NFL, NCAAF, NBA, NCAAB, NHL, soccer, tennis); sport-shaped queries. Null when no narrative has been generated."New value: +"Natural-language pre-game matchup preview — form, context, what to watch. Written before kickoff by a Search-backed overlay on every event sport (MLB, NFL, NCAAF, NBA, NCAAB, NHL, soccer, tennis); sport-shaped queries. The request path only reads the stored row. Null when the pre-kickoff job has not run or the fixture was not eligible."
    • changedOutput schema / properties / rationale / description
      Previous value: -"Event-level factual matchup chips (injuries, recent form, lineup/availability news — sport-shaped). Search-backed context overlay; may populate on first get_intelligence, later calls reuse the stored row."New value: +"Event-level factual pre-game matchup chips (injuries, recent form, lineup/availability news — sport-shaped). Written before kickoff; the request path only reads the stored row."
  5. Changed2 schema fields changed
    • changedOutput schema / properties / forecasts / description
      Previous value: -"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows on team sports; tennis moneyline via bet_type ML_P1/ML_P2. selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts"New value: +"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows on team sports; tennis main-line via bet_type ML_P1/ML_P2 (moneyline), SPREAD_P1/SPREAD_P2 (game handicap), OVER/UNDER (total games). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts"
    • changedOutput schema / properties / forecasts / items / properties / bet_type / description
      Previous value: -"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis moneyline rows set ML_P1 / ML_P2."New value: +"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis sets ML_P1/ML_P2 (moneyline), SPREAD_P1/SPREAD_P2 (game handicap), and OVER/UNDER (total games)."
  6. Changed2 schema fields changed
    • changedOutput schema / properties / forecasts / description
      Previous value: -"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows today; schema also carries main-line rows via bet_type (none shipped yet). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts"New value: +"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows on team sports; tennis moneyline via bet_type ML_P1/ML_P2. selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts"
    • changedOutput schema / properties / forecasts / items / properties / bet_type / description
      Previous value: -"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. No sport ships a non-null bet_type here yet."New value: +"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis moneyline rows set ML_P1 / ML_P2."
  7. Changed19 schema fields changed
    • changedOutput schema / properties / forecasts / description
      Previous value: -"Forecasted Over/Under player-prop wagers for this event (same object as list_forecasts). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(side hits the posted line) from the player's shrunken rate. How + field catalog: https://lumify.ai/docs/forecasts"New value: +"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows today; schema also carries main-line rows via bet_type (none shipped yet). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts"
    • addedOutput schema / properties / forecasts / items / properties / bet_type
      Added value: +{
      +  "description": "Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. No sport ships a non-null bet_type here yet.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / forecasts / items / properties / books / description
      Previous value: -"American price for the chosen side, keyed by bookmaker slug (e.g. {draftkings: -453}). Posted market price for the side the model picked."New value: +"American price for the picked outcome, keyed by bookmaker slug (e.g. {draftkings: -453}). Posted market price for the side/bet_type the model picked."
    • changedOutput schema / properties / forecasts / items / properties / drivers / description
      Previous value: -"Signed contributions that moved p_hit. Read input as the player's measured rate and effect as how far that rate lifts the chosen side versus a league-mean player."New value: +"Signed contributions that moved p_hit. Read input as the measured rate/rating behind the pick and effect as how far it lifts the chosen outcome versus a baseline."
    • changedOutput schema / properties / forecasts / items / properties / drivers / items / properties / effect / description
      Previous value: -"Signed shift in p_hit versus a league-mean player on the same line. 0.0 on yardage markets."New value: +"Signed shift in p_hit versus a baseline case on the same line. 0.0 on yardage markets."
    • changedOutput schema / properties / forecasts / items / properties / drivers / items / properties / id / description
      Previous value: -"e.g. player.l10_rate — the recent-form rate that fed Poisson."New value: +"Prop rows: typically player.l10_rate — the recent-form rate that fed Poisson. Main-line rows would use a different namespace once a main-line forecast model ships."
    • changedOutput schema / properties / forecasts / items / properties / drivers / items / properties / input / description
      Previous value: -"Measured rate in counting-stat units per game after shrinkage."New value: +"Measured rate/rating behind this driver, in native units."
    • changedOutput schema / properties / forecasts / items / properties / line / description
      Previous value: -"Posted Over/Under main line the model was scored against."New value: +"Posted line the model was scored against. Prop and totals main-line rows: Over/Under number. Spreads main-line rows: the spread number. Null on h2h/moneyline rows."
    • changedOutput schema / properties / forecasts / items / properties / line / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / properties / forecasts / items / properties / market / description
      Previous value: -"Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal."New value: +"Player-prop rows: Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (bet_type set): the main-line family — h2h, spreads, or totals."
    • changedOutput schema / properties / forecasts / items / properties / p_hit / description
      Previous value: -"Model probability (0–1) that side hits line, from the player's shrunken counting-stat rate (Poisson vs the posted Over/Under). Optional research may nudge this by at most ±0.03; the side stays."New value: +"Model probability (0–1) that the picked outcome (side on prop rows, bet_type on main-line rows) hits. Prop rows: built from the player's shrunken counting-stat rate (Poisson vs the posted Over/Under). Optional research may nudge a prop's p_hit by at most ±0.03; the chosen side stays the same."
    • changedOutput schema / properties / forecasts / items / properties / player / description
      Previous value: -"Player display name from the priced line."New value: +"Player display name from the priced line. Null on main-line rows with no player attribution (bet_type is a match-level token like OVER/UNDER/ML_DRAW)."
    • changedOutput schema / properties / forecasts / items / properties / player / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / forecasts / items / properties / player_id / description
      Previous value: -"Lumify player ID. Bound by exact / Jr-stripped name match."New value: +"Lumify player ID. Bound by exact / Jr-stripped name match. Null on main-line rows with no player attribution."
    • changedOutput schema / properties / forecasts / items / properties / player_id / type
      Previous value: -"integer"New value: +[
      +  "integer",
      +  "null"
      +]
    • addedOutput schema / properties / forecasts / items / properties / player_role
      Added value: +{
      +  "description": "'home'/'away' for team sports or 'p1'/'p2' for head-to-head sports, set only alongside a non-null bet_type. Null for player-prop rows and for match-level main-line tokens (OVER, UNDER, ML_DRAW).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / forecasts / items / properties / research / description
      Previous value: -"Optional Deep Research overlay: {stance, conviction, note}. stance is validate / neutral / invalidate. Validate nudges p_hit up by at most 0.03 and lifts conviction; invalidate does the reverse. The chosen side stays. Null means read p_hit from the rate model alone."New value: +"Optional Deep Research overlay on high-probability wagers (p_hit ≥ 0.80): {stance, conviction, note}. stance is validate / neutral / invalidate. note is the wager-level why. Validate / invalidate rows always carry a note. Validate nudges p_hit up by at most 0.03 and lifts conviction; invalidate does the reverse. The chosen side stays. Null means read p_hit from the rate model alone."
    • changedOutput schema / properties / forecasts / items / properties / side / description
      Previous value: -"'over' or 'under' — the more likely side given the player's shrunken rate versus line."New value: +"Prop rows: 'over' or 'under' — the more likely side given the player's shrunken rate versus line. Null on main-line rows — read the picked outcome from bet_type instead."
    • changedOutput schema / properties / forecasts / items / properties / side / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
  8. Changed2 schema fields changed
    • changedOutput schema / properties / match_overview / description
      Previous value: -"Natural-language matchup preview — form, context, what to watch. On predictive MLB may be a Search-backed context overlay. Null when no narrative has been generated."New value: +"Natural-language matchup preview — form, context, what to watch. Search-backed context overlay on every event sport (MLB, NFL, NCAAF, NBA, NCAAB, NHL, soccer, tennis); sport-shaped queries. Null when no narrative has been generated."
    • changedOutput schema / properties / rationale / description
      Previous value: -"Event-level factual matchup chips (starting pitchers, injuries, form). Event-level context overlay. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."New value: +"Event-level factual matchup chips (injuries, recent form, lineup/availability news — sport-shaped). Search-backed context overlay; may populate on first get_intelligence, later calls reuse the stored row."
  9. Changed5 schema fields changed
    • changedOutput schema / properties / bets / items / properties / best / description
      Previous value: -"Highest price-gap pick across edges_by_book: {book, price, edge, quote_age_seconds}. Price gap ≠ EV; Tier C informational line-shopping."New value: +"Highest price-gap book across edges_by_book: {book, price, edge, quote_age_seconds}. Tier C informational line-shopping."
    • changedOutput schema / properties / bets / items / properties / edges_by_book / description
      Previous value: -"Price gap versus fair.probability per soft book (fair.probability × decimal_odds − 1). Line-shopping only, NOT EV / NOT a recommend."New value: +"Price gap versus fair.probability per soft book (fair.probability × decimal_odds − 1). Line-shopping metric: rank soft books by gap."
    • changedOutput schema / properties / bets / items / properties / fair / description
      Previous value: -"Sharp-consensus fair: {probability, books, n_books, is_consensus}. MLB/NFL: Pinnacle+Circa; MLS/tennis: Pinnacle. Price-gap reference for edges_by_book/best — not EV."New value: +"Sharp-consensus fair: {probability, books, n_books, is_consensus}. MLB/NFL: Pinnacle+Circa; MLS/tennis: Pinnacle. Price-gap reference for edges_by_book/best."
    • changedOutput schema / properties / match_overview / description
      Previous value: -"Natural-language matchup preview — form, context, what to watch. On predictive MLB may be a Search-backed context overlay (not a recommendation). Null when no narrative has been generated."New value: +"Natural-language matchup preview — form, context, what to watch. On predictive MLB may be a Search-backed context overlay. Null when no narrative has been generated."
    • changedOutput schema / properties / rationale / description
      Previous value: -"Event-level factual matchup chips (starting pitchers, injuries, form). Context overlay only — not a pick. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."New value: +"Event-level factual matchup chips (starting pitchers, injuries, form). Event-level context overlay. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."
  10. Changed2 schema fields changed
    • changedOutput schema / properties / available / description
      Previous value: -"False when no intelligence has been computed for this event yet — every other field is then null/empty and the request is not charged."New value: +"False when no predictive bets[] have been computed for this event yet. forecasts[] can still populate on MLB/NFL/NCAAF/NBA/NCAAB/NHL. Free only when available is false and forecasts is empty."
    • addedOutput schema / properties / forecasts
      Added value: +{
      +  "description": "Forecasted Over/Under player-prop wagers for this event (same object as list_forecasts). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(side hits the posted line) from the player's shrunken rate. How + field catalog: https://lumify.ai/docs/forecasts",
      +  "items": {
      +    "properties": {
      +      "away_team": {
      +        "description": "Away team display name. Slate only.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "books": {
      +        "description": "American price for the chosen side, keyed by bookmaker slug (e.g. {draftkings: -453}). Posted market price for the side the model picked.",
      +        "type": "object"
      +      },
      +      "commence_time": {
      +        "description": "ISO-8601 UTC scheduled start. Slate only.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "conviction": {
      +        "description": "Board rank key on 0–1: |p_hit−0.5|×2×sufficiency×research. A high p_hit on a thin sample ranks below a moderate p_hit on a long one. Highest conviction first on the daily slate.",
      +        "type": "number"
      +      },
      +      "drivers": {
      +        "description": "Signed contributions that moved p_hit. Read input as the player's measured rate and effect as how far that rate lifts the chosen side versus a league-mean player.",
      +        "items": {
      +          "properties": {
      +            "direction": {
      +              "description": "up / down / neutral from the sign of effect.",
      +              "type": "string"
      +            },
      +            "effect": {
      +              "description": "Signed shift in p_hit versus a league-mean player on the same line. 0.0 on yardage markets.",
      +              "type": "number"
      +            },
      +            "id": {
      +              "description": "e.g. player.l10_rate — the recent-form rate that fed Poisson.",
      +              "type": "string"
      +            },
      +            "input": {
      +              "description": "Measured rate in counting-stat units per game after shrinkage.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "event_id": {
      +        "description": "Lumify event ID. Present on list_forecasts; omitted on get_intelligence.forecasts (the event is the argument).",
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "home_team": {
      +        "description": "Home team display name. Slate only.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "interval": {
      +        "description": "[lo, hi] stated band around p_hit. Wider when sufficiency is low. A stated evidence band, not a statistical confidence interval.",
      +        "items": {
      +          "type": "number"
      +        },
      +        "type": "array"
      +      },
      +      "league": {
      +        "description": "League slug, if any. Slate only.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "line": {
      +        "description": "Posted Over/Under main line the model was scored against.",
      +        "type": "number"
      +      },
      +      "market": {
      +        "description": "Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal.",
      +        "type": "string"
      +      },
      +      "model_version": {
      +        "description": "Scorer version, e.g. forecast-v0.",
      +        "type": "string"
      +      },
      +      "p_hit": {
      +        "description": "Model probability (0–1) that side hits line, from the player's shrunken counting-stat rate (Poisson vs the posted Over/Under). Optional research may nudge this by at most ±0.03; the side stays.",
      +        "type": "number"
      +      },
      +      "player": {
      +        "description": "Player display name from the priced line.",
      +        "type": "string"
      +      },
      +      "player_id": {
      +        "description": "Lumify player ID. Bound by exact / Jr-stripped name match.",
      +        "type": "integer"
      +      },
      +      "reliability": {
      +        "description": "Badge on this sport×market cell: emerging, moderate, high, or informational. v0 ships emerging for every wager.",
      +        "type": "string"
      +      },
      +      "research": {
      +        "description": "Optional Deep Research overlay: {stance, conviction, note}. stance is validate / neutral / invalidate. Validate nudges p_hit up by at most 0.03 and lifts conviction; invalidate does the reverse. The chosen side stays. Null means read p_hit from the rate model alone.",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "selected": {
      +        "description": "True when this wager is on the daily board (top conviction). On get_intelligence the array includes selected and the rest of the event catalog.",
      +        "type": "boolean"
      +      },
      +      "side": {
      +        "description": "'over' or 'under' — the more likely side given the player's shrunken rate versus line.",
      +        "type": "string"
      +      },
      +      "sport": {
      +        "description": "Sport slug. Slate only.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "sufficiency": {
      +        "description": "Evidence weight on 0–1: n/(n+12), where n is the recent-form game count (typically L10). A player with 10 games has sufficiency ≈ 0.45. The wager still ships; this field tells you how much of p_hit is earned from this player's own boxes.",
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  11. Changed10 schema fields changed
    • changedInput schema / properties / bookmaker / description
      Previous value: -"Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. No effect for probability-model sports (MLS soccer and MLB), which report the book their assessment was priced against."New value: +"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline."
    • changedOutput schema / properties / bets / items / properties / attribution / description
      Previous value: -"Attribution keys backing rationale, same order. Points-model sports only."New value: +"Not published."
    • changedOutput schema / properties / bets / items / properties / confidence_score / description
      Previous value: -"Points-engine score, 0-1, not a calibrated probability. Points-model sports only."New value: +"Not published. Use probability."
    • changedOutput schema / properties / bets / items / properties / coverage / description
      Previous value: -"Signal-coverage fraction, 0-1. Points-model sports only."New value: +"Not published."
    • changedOutput schema / properties / bets / items / properties / narrative / description
      Previous value: -"Per-bet narrative sentence. Points-model sports only."New value: +"Not published."
    • changedOutput schema / properties / bets / items / properties / rationale / description
      Previous value: -"Per-bet signal-strength bullets. Points-model sports only. Distinct from top-level rationale (event-level context chips)."New value: +"Not published. Top-level rationale is the event-level context overlay."
    • changedOutput schema / properties / bets / items / properties / signals / description
      Previous value: -"Per-signal point breakdown. Points-model sports only."New value: +"Not published."
    • changedOutput schema / properties / bets / items / properties / validator / description
      Previous value: -"Qualitative-validator verdict: {stance, confidence, delta, validated_at}. Points-model sports only."New value: +"Not published."
    • changedOutput schema / properties / matchup / description
      Previous value: -"Legacy points-engine probable-starter context. Not returned on the MLB predictive customer surface — use get_stats for pitcher/lineup Data."New value: +"Not returned. Use get_stats for pitcher/lineup Data."
    • changedOutput schema / properties / rationale / description
      Previous value: -"Event-level factual matchup chips (starting pitchers, injuries, form). Context overlay only — not a pick. Distinct from bets[].rationale on points-model sports. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."New value: +"Event-level factual matchup chips (starting pitchers, injuries, form). Context overlay only — not a pick. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."
  12. Changed1 schema field changed
    • addedOutput schema / properties / bets / items / properties / ev
      Added value: +{
      +  "description": "Beta. Customer-facing EV estimate: {beta: true, book, price, ev_pct, kelly_fraction, quote_age_seconds, n_books}. Re-packages the same fair price gap for direct display. Moneyline only. n=1 Pinnacle is a valid fair (soccer/tennis). Null when the gap is ≤0, above 25% (stale-line), or only suppressed books remain (MLB ML × DK/FD proven null; BetMGM/Bet365/BetOnline unscreened).",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  13. Changed2 schema fields changed
    • changedOutput schema / properties / bets / items / properties / fair / description
      Previous value: -"Sharp-consensus fair: {probability, books, n_books, is_consensus}. MLB: Pinnacle+Circa; MLS/tennis: Pinnacle. Price-gap reference for edges_by_book/best — not EV."New value: +"Sharp-consensus fair: {probability, books, n_books, is_consensus}. MLB/NFL: Pinnacle+Circa; MLS/tennis: Pinnacle. Price-gap reference for edges_by_book/best — not EV."
    • changedOutput schema / properties / bets / items / properties / probability / description
      Previous value: -"Published probability for this outcome, 0-1. Outcomes of one market sum to 1. Customer surface for MLB, soccer, tennis."New value: +"Published probability for this outcome, 0-1. Outcomes of one market sum to 1. Customer surface for MLB, soccer, tennis, NFL."
  14. Changed4 schema fields changed
    • removedOutput schema / properties / analyst_take
      Removed value: -{
      -  "description": "Short natural-language read on the event as a whole. Null when no narrative has been generated.",
      -  "type": [
      -    "string",
      -    "null"
      -  ]
      -}
    • changedOutput schema / properties / bets / items / properties / rationale / description
      Previous value: -"Human-readable rationale bullets. Points-model sports only."New value: +"Per-bet signal-strength bullets. Points-model sports only. Distinct from top-level rationale (event-level context chips)."
    • changedOutput schema / properties / match_overview / description
      Previous value: -"Longer natural-language matchup preview — form, context, what to watch. Null when no narrative has been generated."New value: +"Natural-language matchup preview — form, context, what to watch. On predictive MLB may be a Search-backed context overlay (not a recommendation). Null when no narrative has been generated."
    • addedOutput schema / properties / rationale
      Added value: +{
      +  "description": "Event-level factual matchup chips (starting pitchers, injuries, form). Context overlay only — not a pick. Distinct from bets[].rationale on points-model sports. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  15. Changed20 schema fields changed
    • changedOutput schema / properties / bets / items / properties / alignment / description
      Previous value: -"Qualitative-overlay agreement detail. Populated only when phase is 'full'; null for every 'quant' assessment. Probability-model sports only."New value: +"Internal — omitted from customer payloads (MLB/soccer/tennis)."
    • changedOutput schema / properties / bets / items / properties / best / description
      Previous value: -"Highest price-gap pick across edges_by_book: {book, price, edge, quote_age_seconds}. Same caveats as edges_by_book — price gap, not EV. On MLB treat as Tier C informational line-shopping (DK/FD ML and RL/totals are hard-null for Edge). Use best.book/best.price as the line-shopping target; do not read best.edge as EV. Stale quotes (>30 min) excluded. Populated for MLS and MLB; null otherwise. Probability-model sports only."New value: +"Highest price-gap pick across edges_by_book: {book, price, edge, quote_age_seconds}. Price gap ≠ EV; Tier C informational line-shopping."
    • changedOutput schema / properties / bets / items / properties / blend_w / description
      Previous value: -"Weight on p_model when blending with p_market, 0-1. 0 means the published probability is purely the de-vigged market. Enabled per league and per bet token. Probability-model sports only."New value: +"Internal — omitted from customer payloads (MLB/soccer/tennis)."
    • changedOutput schema / properties / bets / items / properties / coverage / description
      Previous value: -"Signal-coverage fraction, 0-1. Points-model sports only — the probability model uses sufficiency instead."New value: +"Signal-coverage fraction, 0-1. Points-model sports only."
    • changedOutput schema / properties / bets / items / properties / drivers / description
      Previous value: -"Named, signed contributions to probability: {id, input, effect, direction, evidence} where effect is the probability shift, direction is up/down/neutral, and evidence is null (quant drivers) or a list of {fact_id, as_of} citations into the Fact Ledger (evidence-derived drivers) — never an embedded quote/URL. Normally empty when no model contributed (blend_w 0); two exceptions carry effect 0 and never move probability: Stage 6 Match Context drivers (soccer.match_context.*, evidence-backed) and soccer.cross_book_edge (market-anchored price gap vs. the sharp consensus; input is the same gap already published in edges_by_book — a line-shopping signal, not an expected-value claim). Probability-model sports only."New value: +"Internal — omitted from customer payloads (MLB/soccer/tennis)."
    • changedOutput schema / properties / bets / items / properties / edge / description
      Previous value: -"Expected profit per 1 unit staked at market.price (probability x decimal_odds - 1). Null whenever blend_w is 0, since a market-derived probability has no honest edge against its own price. Probability-model sports only."New value: +"Expected profit per 1 unit staked at market.price. Null while no model-backed edge is published (Stage 1). Present on customer surface for recommend gating."
    • changedOutput schema / properties / bets / items / properties / edges_by_book / description
      Previous value: -"Price gap versus the sharp-reference fair.probability, keyed by bookmaker (fair.probability × decimal_odds − 1). A price-gap / line-shopping metric, NOT expected value and NOT a claim-ladder Edge badge. Rank soft books by gap for line-shopping; do not treat a positive gap as EV or badge '+EV'. Populated for MLS (FanDuel/Hard Rock) and MLB (retail soft books — Price surface; Edge allowlist remains DK/FD). Null otherwise. Probability-model sports only."New value: +"Price gap versus fair.probability per soft book (fair.probability × decimal_odds − 1). Line-shopping only, NOT EV / NOT a recommend."
    • changedOutput schema / properties / bets / items / properties / fair / description
      Previous value: -"Sharp-consensus fair price: {probability, books, n_books, is_consensus}. Distinct from p_market (the priced book's own de-vig) and fair_price (odds implied by probability) — this is the sharp-book reference a cross-book edge is measured against. is_consensus is false at n_books < 2 (true for every soccer row today — Pinnacle is the only soccer sharp book). Populated for MLS as of Stage 5 v1 (2026-07-29); null for every other league until its own multi-book fetch is wired. Probability-model sports only."New value: +"Sharp-consensus fair: {probability, books, n_books, is_consensus}. MLB: Pinnacle+Circa; MLS/tennis: Pinnacle. Price-gap reference for edges_by_book/best — not EV."
    • changedOutput schema / properties / bets / items / properties / fair_price / description
      Previous value: -"American-odds fair price implied by probability — the vig-free line. Compare to market.price for the book's margin on this side. Probability-model sports only."New value: +"American-odds fair price implied by probability — the vig-free line. Compare to market.price for the book's margin on this side."
    • changedOutput schema / properties / bets / items / properties / interval / description
      Previous value: -"[lo, hi] band around probability driven by sufficiency — how much evidence backs the number, not a statistical confidence interval. When blend_w is 0 it reflects how mature and well-traded the quoted line is. Probability-model sports only."New value: +"[lo, hi] band around probability — how much evidence backs the number, not a statistical confidence interval."
    • changedOutput schema / properties / bets / items / properties / model_version / description
      Previous value: -"Parameter-set identifier so a number can be traced to the version that produced it. 'market_anchor' means no fitted model contributed. Per bet. Probability-model sports only."New value: +"Internal — omitted from customer payloads (MLB/soccer/tennis)."
    • changedOutput schema / properties / bets / items / properties / p_market / description
      Previous value: -"De-vigged market probability, pre-blend. Vig is removed across the whole market so outcomes sum to 1 — not recoverable from one price by implied-probability math. Probability-model sports only."New value: +"Internal — omitted from customer payloads (MLB/soccer/tennis). Use probability/fair_price."
    • changedOutput schema / properties / bets / items / properties / p_model / description
      Previous value: -"The fitted model's own probability, pre-blend. Null for leagues with no model cleared for publication — currently every soccer league. Probability-model sports only."New value: +"Internal — omitted from customer payloads (MLB/soccer/tennis)."
    • changedOutput schema / properties / bets / items / properties / phase / description
      Previous value: -"'quant' when purely deterministic; 'full' once a qualitative overlay (lineups, injuries, research) is attached, which is when alignment is populated. Probability-model sports only."New value: +"Internal — omitted from customer payloads (MLB/soccer/tennis)."
    • changedOutput schema / properties / bets / items / properties / probability / description
      Previous value: -"Published probability for this outcome, 0-1. Equals p_market when blend_w is 0; otherwise the blend of p_model and p_market. Outcomes of one market sum to 1. Probability-model sports only."New value: +"Published probability for this outcome, 0-1. Outcomes of one market sum to 1. Customer surface for MLB, soccer, tennis."
    • changedOutput schema / properties / bets / items / properties / signals / description
      Previous value: -"Per-signal point breakdown. Points-model sports only — the probability model uses drivers instead."New value: +"Per-signal point breakdown. Points-model sports only."
    • changedOutput schema / properties / bets / items / properties / sufficiency / description
      Previous value: -"How much evidence backs this assessment, 0-1; sets interval width and caps tier. While blend_w is 0 it measures the quoted line's maturity (movement count and hours since first quote); once a model carries weight it reflects model sample depth. Probability-model sports only."New value: +"Internal — omitted from customer payloads (MLB/soccer/tennis)."
    • changedOutput schema / properties / bets / items / properties / tier / description
      Previous value: -"Confidence tier: 'very_high', 'strong', 'moderate', or 'avoid'. Present for both shapes. For probability-model sports it is null whenever edge is null — a tier ranks a bet against its price."New value: +"Confidence tier: 'very_high', 'strong', 'moderate', or 'avoid'. Null whenever edge is null. Present on MLB customer surface and all other shapes."
    • changedOutput schema / properties / has_recommend / description
      Previous value: -"True when at least one bet meets the recommendation threshold; null when intelligence has not been computed. False for any probability-model event whose bets are all market-anchored (blend_w 0), since a recommendation requires an edge."New value: +"True when at least one bet meets the recommendation threshold; null when intelligence has not been computed. False while Edge is not published (current MLB/soccer/tennis Stage 1) — a recommendation requires a non-null tier derived from edge."
    • changedOutput schema / properties / matchup / description
      Previous value: -"MLB-only probable-starter context (home_starter/away_starter with name/hand/era/confirmed). Absent for every other sport."New value: +"Legacy points-engine probable-starter context. Not returned on the MLB predictive customer surface — use get_stats for pitcher/lineup Data."
  16. Changed1 schema field changed
    • changedOutput schema / properties / bets / items / properties / edges_by_book / description
      Previous value: -"Price gap versus the sharp-reference fair.probability, keyed by bookmaker (fair.probability × decimal_odds − 1). A price-gap / line-shopping metric, NOT expected value and NOT a claim-ladder Edge badge. Rank soft books by gap for line-shopping; do not treat a positive gap as EV or badge '+EV'. Populated for MLS (FanDuel/Hard Rock) and MLB (Owls retail soft books — Price surface; Edge allowlist remains DK/FD). Null otherwise. Probability-model sports only."New value: +"Price gap versus the sharp-reference fair.probability, keyed by bookmaker (fair.probability × decimal_odds − 1). A price-gap / line-shopping metric, NOT expected value and NOT a claim-ladder Edge badge. Rank soft books by gap for line-shopping; do not treat a positive gap as EV or badge '+EV'. Populated for MLS (FanDuel/Hard Rock) and MLB (retail soft books — Price surface; Edge allowlist remains DK/FD). Null otherwise. Probability-model sports only."
  17. Changed3 schema fields changed
    • changedInput schema / properties / bookmaker / description
      Previous value: -"Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. No effect for probability-model sports (currently soccer/MLS), which report the book their assessment was priced against."New value: +"Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. No effect for probability-model sports (MLS soccer and MLB), which report the book their assessment was priced against."
    • changedOutput schema / properties / bets / items / properties / best / description
      Previous value: -"Highest price-gap pick across edges_by_book: {book, price, edge, quote_age_seconds}. edge is the raw max (shrinkage=0.0 — won't-fit at N=2). Same caveats as edges_by_book: a price gap versus a de-vigged sharp reference, NOT an expected-value claim; at N=2 winner's-curse ≈171% of mean positive gap and closing-time N=2 backfill realized ≈−2.5% on positive-gap picks. Use best.book/best.price as the line-shopping target for this outcome; do not read best.edge as EV or as a bet recommendation. quote_age_seconds is best.book's posted-price age; stale quotes (>30 min) are excluded before selection. Populated for MLS as of Stage 5 v1; null otherwise. Probability-model sports only."New value: +"Highest price-gap pick across edges_by_book: {book, price, edge, quote_age_seconds}. Same caveats as edges_by_book — price gap, not EV. On MLB treat as Tier C informational line-shopping (DK/FD ML and RL/totals are hard-null for Edge). Use best.book/best.price as the line-shopping target; do not read best.edge as EV. Stale quotes (>30 min) excluded. Populated for MLS and MLB; null otherwise. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / edges_by_book / description
      Previous value: -"Price gap versus the sharp-reference fair.probability, keyed by bookmaker (fair.probability × decimal_odds − 1 at each book's posted price). A price-gap / line-shopping metric, NOT an expected-value recommendation: at N=2 soft-book coverage the measured winner's-curse component of a max-of-N pick is ~171% of the mean positive gap, and a closing-time N=2 backfill simulation realized ≈−2.5% on the positive-gap population (SOCCER_PROGRAM_PLAN.md §5.0 E/tenth pass). Rank soft books by these gaps for line-shopping (largest gap = furthest above the sharp reference); do not treat a positive gap as EV or as a bet recommendation, and do not badge picks as '+EV'. Populated for MLS as of Stage 5 v1 (FanDuel/Hard Rock); null otherwise. Probability-model sports only."New value: +"Price gap versus the sharp-reference fair.probability, keyed by bookmaker (fair.probability × decimal_odds − 1). A price-gap / line-shopping metric, NOT expected value and NOT a claim-ladder Edge badge. Rank soft books by gap for line-shopping; do not treat a positive gap as EV or badge '+EV'. Populated for MLS (FanDuel/Hard Rock) and MLB (Owls retail soft books — Price surface; Edge allowlist remains DK/FD). Null otherwise. Probability-model sports only."
  18. Changed1 schema field changed
    • changedOutput schema / properties / bets / items / properties / drivers / description
      Previous value: -"Named, signed contributions to probability: {id, input, effect, direction, evidence} where effect is the probability shift, direction is up/down/neutral, and evidence is null (quant drivers) or a list of {fact_id, as_of} citations into the Fact Ledger (evidence-derived drivers) — never an embedded quote/URL. Normally empty when no model contributed (blend_w 0); exception: Stage 6 Match Context drivers (soccer.match_context.*) cite the Fact Ledger with effect 0 and never move probability. Probability-model sports only."New value: +"Named, signed contributions to probability: {id, input, effect, direction, evidence} where effect is the probability shift, direction is up/down/neutral, and evidence is null (quant drivers) or a list of {fact_id, as_of} citations into the Fact Ledger (evidence-derived drivers) — never an embedded quote/URL. Normally empty when no model contributed (blend_w 0); two exceptions carry effect 0 and never move probability: Stage 6 Match Context drivers (soccer.match_context.*, evidence-backed) and soccer.cross_book_edge (market-anchored price gap vs. the sharp consensus; input is the same gap already published in edges_by_book — a line-shopping signal, not an expected-value claim). Probability-model sports only."
  19. Changed1 schema field changed
    • changedOutput schema / properties / bets / items / properties / drivers / description
      Previous value: -"Named, signed contributions to probability: {id, input, effect, direction, evidence} where effect is the probability shift, direction is up/down/neutral, and evidence is null (quant drivers) or a list of {fact_id, as_of} citations into the Fact Ledger (evidence-derived drivers) — never an embedded quote/URL. Empty whenever no model contributed (blend_w 0). Probability-model sports only."New value: +"Named, signed contributions to probability: {id, input, effect, direction, evidence} where effect is the probability shift, direction is up/down/neutral, and evidence is null (quant drivers) or a list of {fact_id, as_of} citations into the Fact Ledger (evidence-derived drivers) — never an embedded quote/URL. Normally empty when no model contributed (blend_w 0); exception: Stage 6 Match Context drivers (soccer.match_context.*) cite the Fact Ledger with effect 0 and never move probability. Probability-model sports only."
  20. Changed2 schema fields changed
    • changedOutput schema / properties / bets / items / properties / best / description
      Previous value: -"Highest price-gap pick across edges_by_book: {book, price, edge, quote_age_seconds}. edge is the raw max (shrinkage=0.0 — won't-fit at N=2). Same caveats as edges_by_book: a price gap versus a de-vigged sharp reference, NOT an expected-value claim; at N=2 winner's-curse ≈171% of mean positive gap and closing-time N=2 backfill realized ≈−2.5% on positive-gap picks. Do not sort, rank, badge, or recommend on it. quote_age_seconds is best.book's posted-price age; stale quotes (>30 min) are excluded before selection. Populated for MLS as of Stage 5 v1; null otherwise. Probability-model sports only."New value: +"Highest price-gap pick across edges_by_book: {book, price, edge, quote_age_seconds}. edge is the raw max (shrinkage=0.0 — won't-fit at N=2). Same caveats as edges_by_book: a price gap versus a de-vigged sharp reference, NOT an expected-value claim; at N=2 winner's-curse ≈171% of mean positive gap and closing-time N=2 backfill realized ≈−2.5% on positive-gap picks. Use best.book/best.price as the line-shopping target for this outcome; do not read best.edge as EV or as a bet recommendation. quote_age_seconds is best.book's posted-price age; stale quotes (>30 min) are excluded before selection. Populated for MLS as of Stage 5 v1; null otherwise. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / edges_by_book / description
      Previous value: -"Price gap versus the sharp-reference fair.probability, keyed by bookmaker (fair.probability × decimal_odds − 1 at each book's posted price). A price-gap / line-shopping metric, NOT an expected-value recommendation: at N=2 soft-book coverage the measured winner's-curse component of a max-of-N pick is ~171% of the mean positive gap, and a closing-time N=2 backfill simulation realized ≈−2.5% on the positive-gap population (SOCCER_PROGRAM_PLAN.md §5.0 E/tenth pass). Do not sort, rank, badge, or recommend on these values. Populated for MLS as of Stage 5 v1 (FanDuel/Hard Rock); null otherwise. Probability-model sports only."New value: +"Price gap versus the sharp-reference fair.probability, keyed by bookmaker (fair.probability × decimal_odds − 1 at each book's posted price). A price-gap / line-shopping metric, NOT an expected-value recommendation: at N=2 soft-book coverage the measured winner's-curse component of a max-of-N pick is ~171% of the mean positive gap, and a closing-time N=2 backfill simulation realized ≈−2.5% on the positive-gap population (SOCCER_PROGRAM_PLAN.md §5.0 E/tenth pass). Rank soft books by these gaps for line-shopping (largest gap = furthest above the sharp reference); do not treat a positive gap as EV or as a bet recommendation, and do not badge picks as '+EV'. Populated for MLS as of Stage 5 v1 (FanDuel/Hard Rock); null otherwise. Probability-model sports only."
  21. Changed2 schema fields changed
    • changedOutput schema / properties / bets / items / properties / best / description
      Previous value: -"Best pick across edges_by_book: {book, price, edge, quote_age_seconds}. edge is the raw max — shrinkage=0.0 (no winner's-curse correction) until fitted against multi-book historical odds, so treat as v1. quote_age_seconds is best.book's posted-price age at publish time; a stale soft-book price (>30 min) is excluded before selection. Populated for MLS as of Stage 5 v1 (2026-07-29); null otherwise. Probability-model sports only."New value: +"Highest price-gap pick across edges_by_book: {book, price, edge, quote_age_seconds}. edge is the raw max (shrinkage=0.0 — won't-fit at N=2). Same caveats as edges_by_book: a price gap versus a de-vigged sharp reference, NOT an expected-value claim; at N=2 winner's-curse ≈171% of mean positive gap and closing-time N=2 backfill realized ≈−2.5% on positive-gap picks. Do not sort, rank, badge, or recommend on it. quote_age_seconds is best.book's posted-price age; stale quotes (>30 min) are excluded before selection. Populated for MLS as of Stage 5 v1; null otherwise. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / edges_by_book / description
      Previous value: -"Expected value per 1 unit staked against fair.probability, keyed by bookmaker, for every independently-eligible soft book — the cross-book +EV surface. Populated for MLS as of Stage 5 v1 (FanDuel/Hard Rock, both cleared by the book-independence screen); null for every other league, and null for any market with no eligible soft book quoting it. Probability-model sports only."New value: +"Price gap versus the sharp-reference fair.probability, keyed by bookmaker (fair.probability × decimal_odds − 1 at each book's posted price). A price-gap / line-shopping metric, NOT an expected-value recommendation: at N=2 soft-book coverage the measured winner's-curse component of a max-of-N pick is ~171% of the mean positive gap, and a closing-time N=2 backfill simulation realized ≈−2.5% on the positive-gap population (SOCCER_PROGRAM_PLAN.md §5.0 E/tenth pass). Do not sort, rank, badge, or recommend on these values. Populated for MLS as of Stage 5 v1 (FanDuel/Hard Rock); null otherwise. Probability-model sports only."
  22. Changed3 schema fields changed
    • changedOutput schema / properties / bets / items / properties / best / description
      Previous value: -"Winner's-curse-corrected best pick across edges_by_book: {book, price, edge}. edge is shrunk toward the field median, never the raw max. Null until shrinkage is fitted against multi-book historical odds. Probability-model sports only."New value: +"Best pick across edges_by_book: {book, price, edge, quote_age_seconds}. edge is the raw max — shrinkage=0.0 (no winner's-curse correction) until fitted against multi-book historical odds, so treat as v1. quote_age_seconds is best.book's posted-price age at publish time; a stale soft-book price (>30 min) is excluded before selection. Populated for MLS as of Stage 5 v1 (2026-07-29); null otherwise. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / edges_by_book / description
      Previous value: -"Expected value per 1 unit staked against fair.probability, keyed by bookmaker, for every independently-eligible soft book — the cross-book +EV surface. Null until the book-independence gate and multi-book fetch are wired. Probability-model sports only."New value: +"Expected value per 1 unit staked against fair.probability, keyed by bookmaker, for every independently-eligible soft book — the cross-book +EV surface. Populated for MLS as of Stage 5 v1 (FanDuel/Hard Rock, both cleared by the book-independence screen); null for every other league, and null for any market with no eligible soft book quoting it. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / fair / description
      Previous value: -"Sharp-consensus fair price: {probability, books, n_books, is_consensus}. Distinct from p_market (the priced book's own de-vig) and fair_price (odds implied by probability) — this is the sharp-book reference a cross-book edge is measured against. is_consensus is false at n_books < 2. Null until Stage 5's multi-book fetch is wired at publish time. Probability-model sports only."New value: +"Sharp-consensus fair price: {probability, books, n_books, is_consensus}. Distinct from p_market (the priced book's own de-vig) and fair_price (odds implied by probability) — this is the sharp-book reference a cross-book edge is measured against. is_consensus is false at n_books < 2 (true for every soccer row today — Pinnacle is the only soccer sharp book). Populated for MLS as of Stage 5 v1 (2026-07-29); null for every other league until its own multi-book fetch is wired. Probability-model sports only."
  23. Changed4 schema fields changed
    • addedOutput schema / properties / bets / items / properties / best
      Added value: +{
      +  "description": "Winner's-curse-corrected best pick across edges_by_book: {book, price, edge}. edge is shrunk toward the field median, never the raw max. Null until shrinkage is fitted against multi-book historical odds. Probability-model sports only.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / bets / items / properties / drivers / description
      Previous value: -"Named, signed contributions to probability: {id, input, effect, direction} where effect is the probability shift and direction is up/down/neutral. Empty whenever no model contributed (blend_w 0). Probability-model sports only."New value: +"Named, signed contributions to probability: {id, input, effect, direction, evidence} where effect is the probability shift, direction is up/down/neutral, and evidence is null (quant drivers) or a list of {fact_id, as_of} citations into the Fact Ledger (evidence-derived drivers) — never an embedded quote/URL. Empty whenever no model contributed (blend_w 0). Probability-model sports only."
    • addedOutput schema / properties / bets / items / properties / edges_by_book
      Added value: +{
      +  "description": "Expected value per 1 unit staked against fair.probability, keyed by bookmaker, for every independently-eligible soft book — the cross-book +EV surface. Null until the book-independence gate and multi-book fetch are wired. Probability-model sports only.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / fair
      Added value: +{
      +  "description": "Sharp-consensus fair price: {probability, books, n_books, is_consensus}. Distinct from p_market (the priced book's own de-vig) and fair_price (odds implied by probability) — this is the sharp-book reference a cross-book edge is measured against. is_consensus is false at n_books < 2. Null until Stage 5's multi-book fetch is wired at publish time. Probability-model sports only.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  24. Changed33 schema fields changed
    • changedInput schema / properties / bookmaker / description
      Previous value: -"Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. No effect for predictive-framework sports (currently soccer/MLS)."New value: +"Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. No effect for probability-model sports (currently soccer/MLS), which report the book their assessment was priced against."
    • addedOutput schema / properties / analyst_take / description
      Added value: +"Short natural-language read on the event as a whole. Null when no narrative has been generated."
    • changedOutput schema / properties / bets / items / properties / alignment / description
      Previous value: -"Qualitative-overlay agreement detail; populated only when phase is 'full' (a later stage). Predictive-framework sports only."New value: +"Qualitative-overlay agreement detail. Populated only when phase is 'full'; null for every 'quant' assessment. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / attribution / description
      Previous value: -"Attribution keys backing rationale, same order. Legacy sports only."New value: +"Attribution keys backing rationale, same order. Points-model sports only."
    • changedOutput schema / properties / bets / items / properties / blend_w / description
      Previous value: -"Weight on p_model in the blend, 0-1. Always 0 in Stage 1. Predictive-framework sports only."New value: +"Weight on p_model when blending with p_market, 0-1. 0 means the published probability is purely the de-vigged market. Enabled per league and per bet token. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / computed_at / description
      Previous value: -"When this row was last computed/published, ISO-8601."New value: +"ISO-8601 UTC time this bet's numbers last materially changed — not when last checked. Rows are only rewritten when price, line, or probability moves beyond a tolerance, so an older value means 'unchanged since', not 'stale'. Differs between bets on one event because markets move independently."
    • changedOutput schema / properties / bets / items / properties / confidence_score / description
      Previous value: -"Legacy points-engine score, 0-1, not a calibrated probability. Legacy sports only."New value: +"Points-engine score, 0-1, not a calibrated probability. Points-model sports only."
    • changedOutput schema / properties / bets / items / properties / coverage / description
      Previous value: -"Legacy signal-coverage fraction, 0-1. Legacy sports only — superseded by sufficiency below."New value: +"Signal-coverage fraction, 0-1. Points-model sports only — the probability model uses sufficiency instead."
    • changedOutput schema / properties / bets / items / properties / drivers / description
      Previous value: -"Named, signed contributions to probability: {id, input, effect, direction}. Replaces signals. Always empty in Stage 1. Predictive-framework sports only."New value: +"Named, signed contributions to probability: {id, input, effect, direction} where effect is the probability shift and direction is up/down/neutral. Empty whenever no model contributed (blend_w 0). Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / edge / description
      Previous value: -"Expected value per unit staked at market.price. Null whenever the model carried no blend weight — always null in Stage 1. Predictive-framework sports only."New value: +"Expected profit per 1 unit staked at market.price (probability x decimal_odds - 1). Null whenever blend_w is 0, since a market-derived probability has no honest edge against its own price. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / fair_price / description
      Previous value: -"American-odds fair price implied by probability. Predictive-framework sports only."New value: +"American-odds fair price implied by probability — the vig-free line. Compare to market.price for the book's margin on this side. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / interval / description
      Previous value: -"[lo, hi] uncertainty band around probability. Predictive-framework sports only."New value: +"[lo, hi] band around probability driven by sufficiency — how much evidence backs the number, not a statistical confidence interval. When blend_w is 0 it reflects how mature and well-traded the quoted line is. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / market / description
      Previous value: -"Market quote: {price: American odds, line: handicap/total line or null for moneyline, book: bookmaker slug when known (always set for predictive-framework sports)}."New value: +"Market quote: {price: American odds, line: handicap/total line or null for moneyline, book: bookmaker slug when known (always set for probability-model sports)}."
    • changedOutput schema / properties / bets / items / properties / model_version / description
      Previous value: -"Parameter-set identifier, e.g. 'market_anchor' (Stage 1: no fitted model). Predictive-framework sports only."New value: +"Parameter-set identifier so a number can be traced to the version that produced it. 'market_anchor' means no fitted model contributed. Per bet. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / narrative / description
      Previous value: -"Legacy per-bet narrative sentence. Legacy sports only."New value: +"Per-bet narrative sentence. Points-model sports only."
    • changedOutput schema / properties / bets / items / properties / p_market / description
      Previous value: -"De-vigged market probability, pre-blend. Predictive-framework sports only."New value: +"De-vigged market probability, pre-blend. Vig is removed across the whole market so outcomes sum to 1 — not recoverable from one price by implied-probability math. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / p_model / description
      Previous value: -"The fitted model's own probability, pre-blend. Null until a model exists (all of Stage 1). Predictive-framework sports only."New value: +"The fitted model's own probability, pre-blend. Null for leagues with no model cleared for publication — currently every soccer league. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / phase / description
      Previous value: -"'quant' (deterministic stack) or 'full' (qualitative overlay, a later stage). Predictive-framework sports only."New value: +"'quant' when purely deterministic; 'full' once a qualitative overlay (lineups, injuries, research) is attached, which is when alignment is populated. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / player_id / description
      Previous value: -"Set when this bet is about an individual player."New value: +"Set when this bet is about an individual player. Null for team bets and match-level tokens."
    • changedOutput schema / properties / bets / items / properties / player_name / description
      Previous value: -"Display name of the player or team this bet is about."New value: +"Display name of the player or team this bet is about. Null for match-level tokens. Duplicates players[player_role].name."
    • changedOutput schema / properties / bets / items / properties / player_role / description
      Previous value: -"'home'/'away' or 'p1'/'p2'. Null for match-level tokens (OVER/UNDER)."New value: +"'home'/'away' or 'p1'/'p2'. Null for match-level tokens (OVER, UNDER, ML_DRAW)."
    • changedOutput schema / properties / bets / items / properties / probability / description
      Previous value: -"Published probability, 0-1. Pure de-vigged market price in Stage 1. Predictive-framework sports only."New value: +"Published probability for this outcome, 0-1. Equals p_market when blend_w is 0; otherwise the blend of p_model and p_market. Outcomes of one market sum to 1. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / rationale / description
      Previous value: -"Legacy human-readable rationale bullets. Legacy sports only."New value: +"Human-readable rationale bullets. Points-model sports only."
    • changedOutput schema / properties / bets / items / properties / signals / description
      Previous value: -"Legacy per-signal point breakdown. Legacy sports only — superseded by drivers below."New value: +"Per-signal point breakdown. Points-model sports only — the probability model uses drivers instead."
    • changedOutput schema / properties / bets / items / properties / sufficiency / description
      Previous value: -"Evidence strength, 0-1. In Stage 1: max of per-market movement depth and hours-since-first-quote maturity — not team-form sample size. Predictive-framework sports only."New value: +"How much evidence backs this assessment, 0-1; sets interval width and caps tier. While blend_w is 0 it measures the quoted line's maturity (movement count and hours since first quote); once a model carries weight it reflects model sample depth. Probability-model sports only."
    • changedOutput schema / properties / bets / items / properties / team_id / description
      Previous value: -"Set when this bet is about a team."New value: +"Set when this bet is about a team. Null for match-level tokens (OVER, UNDER, ML_DRAW) — a draw is not a bet on either team, so summing exposure by team_id never double-counts it."
    • changedOutput schema / properties / bets / items / properties / tier / description
      Previous value: -"Confidence tier: 'very_high', 'strong', 'moderate', or 'avoid'. Present for both shapes; always null in predictive-framework Stage 1 (no edge yet to rank)."New value: +"Confidence tier: 'very_high', 'strong', 'moderate', or 'avoid'. Present for both shapes. For probability-model sports it is null whenever edge is null — a tier ranks a bet against its price."
    • changedOutput schema / properties / bets / items / properties / validator / description
      Previous value: -"Legacy qualitative-validator verdict: {stance, confidence, delta, validated_at}. Legacy sports only."New value: +"Qualitative-validator verdict: {stance, confidence, delta, validated_at}. Points-model sports only."
    • addedOutput schema / properties / event_id / description
      Added value: +"Lumify event ID this intelligence describes."
    • changedOutput schema / properties / has_recommend / description
      Previous value: -"Legacy: true when a bet is recommended. Predictive Stage 1 (MLS): always false when assessments exist; null when unavailable."New value: +"True when at least one bet meets the recommendation threshold; null when intelligence has not been computed. False for any probability-model event whose bets are all market-anchored (blend_w 0), since a recommendation requires an edge."
    • changedOutput schema / properties / intelligence_updated_at / description
      Previous value: -"UTC datetime of last intelligence update. Predictive sports: max(assessments.computed_at)."New value: +"ISO-8601 UTC timestamp of the most recent change anywhere in this payload (max of per-bet computed_at). Use per-bet computed_at to reason about a specific bet."
    • addedOutput schema / properties / match_overview / description
      Added value: +"Longer natural-language matchup preview — form, context, what to watch. Null when no narrative has been generated."
    • changedOutput schema / properties / odds_source / description
      Previous value: -"Bookmaker bets[].market prices were sourced from. Predictive sports: assessments.market_book (not a ?bookmaker= overlay)."New value: +"Bookmaker bets[].market prices were sourced from. For probability-model sports this is the book the assessment was priced against, not a bookmaker overlay; per-bet market.book is authoritative if they ever differ."
  25. Changed39 schema fields changed
    • changedInput schema / properties / bookmaker / description
      Previous value: -"Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline."New value: +"Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. No effect for predictive-framework sports (currently soccer/MLS)."
    • addedOutput schema / properties / available / description
      Added value: +"False when no intelligence has been computed for this event yet — every other field is then null/empty and the request is not charged."
    • addedOutput schema / properties / bets / items / properties / alignment
      Added value: +{
      +  "description": "Qualitative-overlay agreement detail; populated only when phase is 'full' (a later stage). Predictive-framework sports only.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / attribution / description
      Added value: +"Attribution keys backing rationale, same order. Legacy sports only."
    • addedOutput schema / properties / bets / items / properties / bet_type / description
      Added value: +"Canonical bet token, e.g. ML_HOME/ML_AWAY/ML_DRAW (soccer), ML_P1/ML_P2 (head-to-head sports), SPREAD_HOME/SPREAD_AWAY, OVER, UNDER."
    • addedOutput schema / properties / bets / items / properties / blend_w
      Added value: +{
      +  "description": "Weight on p_model in the blend, 0-1. Always 0 in Stage 1. Predictive-framework sports only.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / computed_at
      Added value: +{
      +  "description": "When this row was last computed/published, ISO-8601.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / confidence_score / description
      Added value: +"Legacy points-engine score, 0-1, not a calibrated probability. Legacy sports only."
    • changedOutput schema / properties / bets / items / properties / confidence_score / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / bets / items / properties / coverage / description
      Added value: +"Legacy signal-coverage fraction, 0-1. Legacy sports only — superseded by sufficiency below."
    • changedOutput schema / properties / bets / items / properties / coverage / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / bets / items / properties / drivers
      Added value: +{
      +  "description": "Named, signed contributions to probability: {id, input, effect, direction}. Replaces signals. Always empty in Stage 1. Predictive-framework sports only.",
      +  "items": {
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / bets / items / properties / edge
      Added value: +{
      +  "description": "Expected value per unit staked at market.price. Null whenever the model carried no blend weight — always null in Stage 1. Predictive-framework sports only.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / fair_price
      Added value: +{
      +  "description": "American-odds fair price implied by probability. Predictive-framework sports only.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / interval
      Added value: +{
      +  "description": "[lo, hi] uncertainty band around probability. Predictive-framework sports only.",
      +  "items": {
      +    "type": "number"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / market / description
      Added value: +"Market quote: {price: American odds, line: handicap/total line or null for moneyline, book: bookmaker slug when known (always set for predictive-framework sports)}."
    • addedOutput schema / properties / bets / items / properties / model_version
      Added value: +{
      +  "description": "Parameter-set identifier, e.g. 'market_anchor' (Stage 1: no fitted model). Predictive-framework sports only.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / narrative / description
      Added value: +"Legacy per-bet narrative sentence. Legacy sports only."
    • addedOutput schema / properties / bets / items / properties / p_market
      Added value: +{
      +  "description": "De-vigged market probability, pre-blend. Predictive-framework sports only.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / p_model
      Added value: +{
      +  "description": "The fitted model's own probability, pre-blend. Null until a model exists (all of Stage 1). Predictive-framework sports only.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / phase
      Added value: +{
      +  "description": "'quant' (deterministic stack) or 'full' (qualitative overlay, a later stage). Predictive-framework sports only.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / player_id
      Added value: +{
      +  "description": "Set when this bet is about an individual player.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / player_name
      Added value: +{
      +  "description": "Display name of the player or team this bet is about.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / player_role
      Added value: +{
      +  "description": "'home'/'away' or 'p1'/'p2'. Null for match-level tokens (OVER/UNDER).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / probability
      Added value: +{
      +  "description": "Published probability, 0-1. Pure de-vigged market price in Stage 1. Predictive-framework sports only.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / rationale / description
      Added value: +"Legacy human-readable rationale bullets. Legacy sports only."
    • addedOutput schema / properties / bets / items / properties / signals / description
      Added value: +"Legacy per-signal point breakdown. Legacy sports only — superseded by drivers below."
    • addedOutput schema / properties / bets / items / properties / sufficiency
      Added value: +{
      +  "description": "Evidence strength, 0-1. In Stage 1: max of per-market movement depth and hours-since-first-quote maturity — not team-form sample size. Predictive-framework sports only.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / team_id
      Added value: +{
      +  "description": "Set when this bet is about a team.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / bets / items / properties / tier / description
      Added value: +"Confidence tier: 'very_high', 'strong', 'moderate', or 'avoid'. Present for both shapes; always null in predictive-framework Stage 1 (no edge yet to rank)."
    • changedOutput schema / properties / bets / items / properties / tier / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / bets / items / properties / validator / description
      Added value: +"Legacy qualitative-validator verdict: {stance, confidence, delta, validated_at}. Legacy sports only."
    • addedOutput schema / properties / has_recommend / description
      Added value: +"Legacy: true when a bet is recommended. Predictive Stage 1 (MLS): always false when assessments exist; null when unavailable."
    • addedOutput schema / properties / intelligence_updated_at / description
      Added value: +"UTC datetime of last intelligence update. Predictive sports: max(assessments.computed_at)."
    • addedOutput schema / properties / league
      Added value: +{
      +  "description": "League slug for this event, if any.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / matchup
      Added value: +{
      +  "description": "MLB-only probable-starter context (home_starter/away_starter with name/hand/era/confirmed). Absent for every other sport.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / odds_source
      Added value: +{
      +  "description": "Bookmaker bets[].market prices were sourced from. Predictive sports: assessments.market_book (not a ?bookmaker= overlay).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / players
      Added value: +{
      +  "description": "Home/away (or p1/p2) participant identification, keyed by role: {role: {name, player_id, team_id}}.",
      +  "type": "object"
      +}
    • addedOutput schema / properties / sport
      Added value: +{
      +  "description": "Sport slug for this event.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  26. Changed1 schema field changed
    • changedInput schema / properties / bookmaker / description
      Previous value: -"Bookmaker slug; defaults to pinnacle."New value: +"Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline."
  27. Changed8 schema fields changed
    • changedOutput schema / properties / analyst_take / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / bets / items / properties / market / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / bets / items / properties / narrative / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / bets / items / properties / signals / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / bets / items / properties / validator / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / has_recommend / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedOutput schema / properties / intelligence_updated_at / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / match_overview / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
  28. Changed3 schema fields changed
    • addedInput schema / properties / bookmaker / description
      Added value: +"Bookmaker slug; defaults to pinnacle."
    • addedInput schema / properties / event_id / description
      Added value: +"Event id, from list_events, query_events, or search results."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "analyst_take": {
      +      "type": "string"
      +    },
      +    "available": {
      +      "type": "boolean"
      +    },
      +    "bets": {
      +      "items": {
      +        "properties": {
      +          "attribution": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "bet_type": {
      +            "type": "string"
      +          },
      +          "confidence_score": {
      +            "type": "number"
      +          },
      +          "coverage": {
      +            "type": "number"
      +          },
      +          "market": {
      +            "type": "object"
      +          },
      +          "narrative": {
      +            "type": "string"
      +          },
      +          "rationale": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "signals": {
      +            "type": "object"
      +          },
      +          "tier": {
      +            "type": "string"
      +          },
      +          "validator": {
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "event_id": {
      +      "type": "integer"
      +    },
      +    "has_recommend": {
      +      "type": "boolean"
      +    },
      +    "intelligence_updated_at": {
      +      "type": "string"
      +    },
      +    "match_overview": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  29. First observed

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral context beyond the readOnlyHint/idempotentHint annotations: bookmaker is ignored, match-level tokens have null player/team attribution, edge/tier are null, has_recommend is false, and forecasts[] can populate when available is false. These are the exact caveats an agent needs to interpret results correctly, and nothing contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but information-dense: every clause covers a meaningful scope, caveat, or field behavior. It is not as cleanly structured as a bulleted field list, and it repeats bookmaker being ignored from the schema, but the complexity of the tool warrants most of the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose, live sports coverage, forecast coverage, attribution null cases, pricing caveats, and even points to a field catalog link. Given the tool's complexity, an agent has enough context to invoke it correctly and interpret the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both parameters at 100% coverage; event_id includes its source and bookmaker already states it is ignored with the valid values listed. The description adds little beyond the schema, so the schema-heavy baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get predictive bet intelligence for an event,' and then enumerates the concrete fields returned, such as vig-stripped probability, fair_price, and forecasts[]. It clearly distinguishes this tool from siblings like list_forecasts and get_event by describing its unique composite payload and by stating that bookmaker is ignored.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong contextual guidance about when the tool is relevant: it supports specific sports for bets[] and forecasts[] and even states a condition for free access ('Free only when available is false and forecasts is empty'). It does not explicitly say 'use list_forecasts instead of this tool when...', so it stops just short of fully spelled-out when-not alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.4/5.0
Disambiguation5/5

Each tool maps to a distinct data resource or operation: events, live scores, odds, odds history, splits, stats, intelligence, player props, players, teams, sports, and seasons. Pairs like list_events vs query_events and get_event vs get_live_score are clearly differentiated by structured vs natural-language filtering and lightweight vs full detail.

Naming Consistency5/5

Tool names consistently follow a verb_noun snake_case pattern: get_*, list_*, search_*, query_*, batch_get_*, and estimate_cost. The naming conventions make the resource family immediately obvious, and deviations like batch_get_events are still predictable variants.

Tool Count4/5

19 tools is on the higher side, but each tool covers a specific sports-intelligence data product or workflow with little redundancy. The count feels intentional for the breadth of the domain rather than bloated.

Completeness4/5

The surface covers event discovery and retrieval, live scores, odds and line movement, splits, statistics, player props, intelligence, player/team/sport/season lookups, batch fetching, and cost estimation. Minor gaps like team standings or full rosters are not exposed, but core agent workflows are well supported.