lumify-ai · Schema

IntelligenceResponse

CompanySportsAIReal-timeBetting

Properties

Name Type Description
event_id object Lumify event ID this intelligence describes. Present on the standalone endpoint; omitted when inlined under an event via include_intelligence.
available boolean False when no predictive `bets[]` have been computed for this event yet. `forecasts[]` can still populate on MLB / NFL / NCAAF / NBA / NCAAB / NHL / tennis. The request is free only when `available` i
odds_source object Bookmaker `bets[].market` prices were sourced from. For predictive intelligence this is the assessment's market_book (not a live `?bookmaker=` overlay).
sport object Sport slug for this event.
league object League slug for this event, if any.
players object Home/away (or p1/p2) participant identification, keyed by role: {role: {name, player_id, team_id}}.
has_recommend object True when at least one bet meets the recommendation threshold; false when none do; null when intelligence has not been computed for this event. For predictive-framework sports a recommendation require
match_overview object Natural-language pre-game preview of the matchup — form, context, and what to watch. Written before kickoff by a Search-backed overlay on every event sport (MLB, NFL, NCAAF, NBA, NCAAB, NHL, soccer, t
rationale object 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. Null when not generated
intelligence_updated_at object ISO-8601 UTC timestamp of the most recent change anywhere in this payload — the maximum of the per-bet `computed_at` values for predictive-framework sports. Because individual markets are only rewritt
bets array One entry per priced bet token on the predictive intelligence surface. Outcomes of the same market sum to 1.
forecasts array Forecasted Over/Under player-prop wagers for this event from the same rate model as `GET /v1/intelligence/forecasts`. `selected` marks the top-conviction rows that also appear on the daily slate; the
matchup object Not returned. Use `GET /v1/events/{id}/stats` for pitcher/lineup Data.
View JSON Schema on GitHub

JSON Schema

lumify-ai-intelligence-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/lumify-ai/json-schema/lumify-ai-intelligence-response-schema.json",
  "title": "IntelligenceResponse",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/lumify-ai-openapi.json#/components/schemas/IntelligenceResponse",
  "properties": {
    "event_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Event Id",
      "description": "Lumify event ID this intelligence describes. Present on the standalone endpoint; omitted when inlined under an event via include_intelligence."
    },
    "available": {
      "type": "boolean",
      "title": "Available",
      "description": "False when no predictive `bets[]` have been computed for this event yet. `forecasts[]` can still populate on MLB / NFL / NCAAF / NBA / NCAAB / NHL / tennis. The request is free only when `available` is false and `forecasts` is empty.",
      "default": false
    },
    "odds_source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Odds Source",
      "description": "Bookmaker `bets[].market` prices were sourced from. For predictive intelligence this is the assessment's market_book (not a live `?bookmaker=` overlay)."
    },
    "sport": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Sport",
      "description": "Sport slug for this event."
    },
    "league": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "League",
      "description": "League slug for this event, if any."
    },
    "players": {
      "additionalProperties": true,
      "type": "object",
      "title": "Players",
      "description": "Home/away (or p1/p2) participant identification, keyed by role: {role: {name, player_id, team_id}}.",
      "default": {}
    },
    "has_recommend": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Has Recommend",
      "description": "True when at least one bet meets the recommendation threshold; false when none do; null when intelligence has not been computed for this event. For predictive-framework sports a recommendation requires a non-null `tier` derived from `edge`, so this is false while Edge is not yet published (current MLB/soccer/tennis Stage 1)."
    },
    "match_overview": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Match Overview",
      "description": "Natural-language pre-game preview of the matchup — form, context, and 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 so tennis does not invent pitchers. The request path only reads the stored row. Null when the pre-kickoff job has not run or the fixture was not eligible."
    },
    "rationale": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Rationale",
      "description": "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. Null when not generated."
    },
    "intelligence_updated_at": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Intelligence Updated At",
      "description": "ISO-8601 UTC timestamp of the most recent change anywhere in this payload — the maximum of the per-bet `computed_at` values for predictive-framework sports. Because individual markets are only rewritten when they move, use the per-bet `computed_at` to reason about a specific bet rather than this event-level maximum."
    },
    "bets": {
      "items": {
        "$ref": "#/$defs/BetIntelligence"
      },
      "type": "array",
      "title": "Bets",
      "description": "One entry per priced bet token on the predictive intelligence surface. Outcomes of the same market sum to 1.",
      "default": []
    },
    "forecasts": {
      "items": {
        "$ref": "#/$defs/ForecastWager"
      },
      "type": "array",
      "title": "Forecasts",
      "description": "Forecasted Over/Under player-prop wagers for this event from the same rate model as `GET /v1/intelligence/forecasts`. `selected` marks the top-conviction rows that also appear on the daily slate; the rest of the event catalog is included with `selected: false`. Empty when the sport is outside MLB / NFL / NCAAF / NBA / NCAAB / NHL / tennis, or no strictly-matched two-way main is in range (props) / no ranked two-way moneyline (tennis). Same wager object as the slate — see `ForecastWager`.",
      "default": []
    },
    "matchup": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "title": "Matchup",
      "description": "Not returned. Use `GET /v1/events/{id}/stats` for pitcher/lineup Data."
    }
  },
  "additionalProperties": true,
  "type": "object",
  "$defs": {
    "BetIntelligence": {
      "properties": {
        "bet_type": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Bet Type",
          "description": "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."
        },
        "player_role": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Player Role",
          "description": "'home'/'away' for team sports or 'p1'/'p2' for head-to-head sports. Null for match-level tokens (OVER, UNDER, ML_DRAW), which are not about either side."
        },
        "player_id": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Player Id",
          "description": "Player ID when this bet is about an individual player; null for team bets and match-level tokens (OVER, UNDER, ML_DRAW)."
        },
        "team_id": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Team Id",
          "description": "Team ID when this bet is about a team; null for individual-player bets and match-level tokens (OVER, UNDER, ML_DRAW). A draw is not a bet on either team, so ML_DRAW carries no team_id — safe to sum exposure by team_id across bets without double-counting the draw."
        },
        "player_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Player Name",
          "description": "Display name of the player or team this bet is about; null for match-level tokens (OVER, UNDER, ML_DRAW). Duplicates `players[player_role].name` for convenience when flattening bets[]."
        },
        "market": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Market",
          "description": "Market quote used for this bet: {price: American odds, line: handicap/total line or null for moneyline, book: bookmaker slug when known}. For predictive-framework sports `book` is always populated from the assessment; for legacy sports it may be omitted. Present for every sport."
        },
        "computed_at": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Computed At",
          "description": "ISO-8601 UTC timestamp of when this bet's numbers last materially changed — not when they were last checked. The publisher re-runs on a schedule but only rewrites a row when the price, line, or probability moves beyond a tolerance, so an older `computed_at` means 'unchanged since', not 'stale'. Values legitimately differ between bets on the same event because each market moves independently."
        },
        "tier": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Tier",
          "description": "Recommendation tier: 'very_high', 'strong', 'moderate', or 'avoid'. Null whenever `edge` is null — a tier ranks a bet against its price."
        },
        "confidence_score": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Confidence Score",
          "description": "Not published. Use `probability`."
        },
        "confidence_score_pre_validator": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Confidence Score Pre Validator",
          "description": "Not published."
        },
        "coverage": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Coverage",
          "description": "Not published."
        },
        "signals": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Signals",
          "description": "Not published."
        },
        "validator": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Validator",
          "description": "Not published."
        },
        "narrative": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Narrative",
          "description": "Pick-defense rationale for a high-confidence main-line side — why THIS token hits, not a match preview or stat recap. Present only when Lumify made a pick on this token (`forecasts[]` row with `selected: true`, matching `bet_type`, and a research note). Null on the opposite side, on coin-flip markets, and when no pick was made."
        },
        "rationale": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "title": "Rationale",
          "description": "Not published. Event-level context chips live on the top-level `rationale` of IntelligenceResponse.",
          "default": []
        },
        "attribution": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "title": "Attribution",
          "description": "Not published.",
          "default": []
        },
        "probability": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Probability",
          "description": "Published probability for this outcome, 0-1. Outcomes of the same market (e.g. ML_HOME + ML_DRAW + ML_AWAY) sum to 1. Present on the customer surface for MLB, soccer, and tennis."
        },
        "interval": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "title": "Interval",
          "description": "[lo, hi] band around `probability`, 0-1. Read it as 'how much evidence backs this number', not as a statistical confidence interval. A freshly-opened, unmoved line gets a wider band than a heavily-traded one. Thin evidence widens this band rather than removing the response. Present on the customer surface for MLB, soccer, and tennis."
        },
        "p_model": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "P Model",
          "description": "Internal — omitted from customer payloads (MLB/soccer/tennis). Fitted model probability before blending with the market."
        },
        "p_market": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "P Market",
          "description": "Internal — omitted from customer payloads (MLB/soccer/tennis). De-vigged market probability before blending; use `probability` / `fair_price` instead."
        },
        "blend_w": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Blend W",
          "description": "Internal — omitted from customer payloads (MLB/soccer/tennis). Weight on the model when blending with the market."
        },
        "fair_price": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Fair Price",
          "description": "American-odds fair price implied by `probability` — the vig-free line. Comparing it to `market.price` gives the bookmaker's margin on this side. Predictive-framework sports only."
        },
        "edge": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Edge",
          "description": "Expected profit per 1 unit staked at `market.price`, i.e. `probability x decimal_odds - 1`. Positive means the price pays more than the probability justifies. Null when no model-backed edge is published (current MLB/soccer/tennis Stage 1). Present on the customer surface — null today, reserved for future recommend gating."
        },
        "sufficiency": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Sufficiency",
          "description": "Internal — omitted from customer payloads (MLB/soccer/tennis). Evidence strength 0-1 used internally to set interval width."
        },
        "phase": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Phase",
          "description": "Internal — omitted from customer payloads (MLB/soccer/tennis). Pipeline stage (`quant` / `full`)."
        },
        "model_version": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Model Version",
          "description": "Internal — omitted from customer payloads (MLB/soccer/tennis). Parameter-set identifier for traceability."
        },
        "drivers": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "type": "array",
          "title": "Drivers",
          "description": "Internal — omitted from customer payloads (MLB/soccer/tennis). Signed contributions to probability used in the assessment pipeline.",
          "default": []
        },
        "alignment": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Alignment",
          "description": "Internal — omitted from customer payloads (MLB/soccer/tennis). Qualitative-overlay agreement detail."
        },
        "fair": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Fair",
          "description": "Sharp-consensus fair price for this outcome: {probability, books, n_books, is_consensus}. `probability` is distinct from `p_market` (the *priced* book's own de-vigged probability) and from `fair_price` (American odds implied by the published `probability`, above) — it is the sharp-book reference a cross-book price gap is measured against (MLS: Pinnacle / `SOCCER_SHARP_BOOKS`; MLB: Pinnacle+Circa / `MLB_SHARP_BOOKS`). `is_consensus` is false whenever `n_books` < 2. Populated for MLS and MLB; null for other leagues until their market plane is wired. Predictive-framework sports only."
        },
        "edges_by_book": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Edges By Book",
          "description": "Price gap versus the sharp-reference fair probability (`fair.probability`), keyed by bookmaker — `fair.probability × decimal_odds − 1` at each book's posted price. A line-shopping metric: rank soft books by these gaps (largest gap = furthest above the sharp reference). Populated for MLS (retail soft books for Price — Edge archive stays FanDuel/Hard Rock) and MLB (retail soft books: DK/FD/BetMGM/Caesars/Bet365/Hard Rock/BetOnline — Price surface; Edge allowlist remains independence-cleared DK/FD only). Null for other leagues or markets with no soft quote. Predictive-framework sports only."
        },
        "best": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Best",
          "description": "Highest price-gap book across `edges_by_book`: {book, price, edge, quote_age_seconds}. Same metric as `edges_by_book`: price gap versus a de-vigged sharp reference. On MLB, `best_*` is Tier C / informational line-shopping even when the gap is positive (DK/FD ML and RL/totals are hard-null for Edge). Use `best.book`/`best.price` as the line-shopping target. `quote_age_seconds` is `best.book`'s posted-price age at publish — quotes older than 30 minutes are excluded. Populated for MLS and MLB; null otherwise or when `edges_by_book` is empty. Predictive-framework sports only."
        },
        "ev": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Ev",
          "description": "**Beta.** Customer-facing expected-value estimate: {beta: true, book, price, ev_pct, kelly_fraction, quote_age_seconds, n_books}. `ev_pct` is the selected book's price gap × 100 (`fair.probability × decimal − 1`); `kelly_fraction` is the full-Kelly stake, capped at 1.0. Not a new measurement — re-packages the same sharp-fair price gap as `best`/`edges_by_book`. Main-line tokens (moneyline, spreads, totals; tennis totals unpublished). A single sharp book (n=1 Pinnacle) is a valid fair reference; soccer and tennis never have a two-book sharp consensus. Gaps ≤ 0 or above 25% (stale-line artifact) are dropped. When `best` is a suppressed MLB moneyline book (DraftKings/FanDuel proven null, or BetMGM/Bet365/BetOnline unscreened), the next eligible book in `edges_by_book` is used. Spreads/totals do not inherit that suppression. Unverified market-consensus estimate — see docs/internal/sports/PREDICTIVE_CLAIM_LADDER.md."
        }
      },
      "additionalProperties": true,
      "type": "object",
      "title": "BetIntelligence"
    },
    "ForecastDriver": {
      "properties": {
        "id": {
          "type": "string",
          "title": "Id",
          "description": "Namespaced driver id. Player-prop rows: typically `player.l10_rate` — the recent-form counting-stat rate that fed the Poisson step (also `player.season_rate` when L10 is too thin). Main-line rows would use a different namespace (e.g. a rating or surface split) once a main-line forecast model ships."
        },
        "input": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Input",
          "description": "Measured rate/rating behind this driver, in the units native to the underlying model (e.g. 0.27 runs/game, 7.4 strikeouts/start for the prop rate model). This is λ before the Poisson vs the posted line on prop rows."
        },
        "effect": {
          "type": "number",
          "title": "Effect",
          "description": "Signed shift in `p_hit` versus a baseline case on the same line, in probability units. Positive / `direction=up` means this driver lifts the chosen outcome. 0.0 on yardage markets (league means are diluted by backups)."
        },
        "direction": {
          "type": "string",
          "title": "Direction",
          "description": "`up` when `effect` > 0, `down` when `effect` < 0, `neutral` at zero."
        }
      },
      "additionalProperties": true,
      "type": "object",
      "required": [
        "id",
        "effect",
        "direction"
      ],
      "title": "ForecastDriver"
    },
    "ForecastWager": {
      "properties": {
        "event_id": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Event Id",
          "description": "Lumify event ID. Present on the daily slate (`GET /v1/intelligence/forecasts`); omitted on `GET /v1/events/{id}/intelligence` `forecasts[]` (the event is the path)."
        },
        "sport": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Sport",
          "description": "Sport slug. Slate only."
        },
        "league": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "League",
          "description": "League slug, if any. Slate only."
        },
        "commence_time": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Commence Time",
          "description": "ISO-8601 UTC scheduled start. Slate only."
        },
        "home_team": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Home Team",
          "description": "Home team display name. Slate only."
        },
        "away_team": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Away Team",
          "description": "Away team display name. Slate only."
        },
        "player": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Player",
          "description": "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)."
        },
        "player_id": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Player Id",
          "description": "Lumify player ID. Bound by exact / Jr-stripped name match to the priced line. Null on main-line rows with no player attribution."
        },
        "bet_type": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Bet Type",
          "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 `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, ranking Bradley-Terry), `SPREAD_P1`/`SPREAD_P2` (game handicap), and `OVER`/`UNDER` (total games — soft-book game-unit lines only, never Pinnacle's set-unit total). NFL / NCAAF / MLB / soccer set the same tokens from a high-confidence assessment lean (one side per market; coin flips are not emitted as picks)."
        },
        "player_role": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Player Role",
          "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)."
        },
        "market": {
          "type": "string",
          "title": "Market",
          "description": "Player-prop rows: prop category — counting stats. MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing_yards, rushing_yards, receiving_yards, receptions, passing_tds, rushing_tds, touchdowns (anytime-TD combo: rushing + receiving + defensive TDs), rush_rec_yards, pass_rush_yards. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (when `bet_type` is set): the main-line family — `h2h`, `spreads`, or `totals`."
        },
        "line": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Line",
          "description": "Posted line the model was scored against. Player-prop and `totals` main-line rows: Over/Under number. `spreads` main-line rows: the spread number. Null on `h2h`/moneyline rows."
        },
        "side": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Side",
          "description": "Player-prop rows: `over` or `under` — the more likely side given the player's shrunken rate versus `line`. The model always picks one when the line is in range. Null on main-line rows — read the picked outcome from `bet_type` instead."
        },
        "p_hit": {
          "type": "number",
          "title": "P Hit",
          "description": "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."
        },
        "interval": {
          "items": {
            "type": "number"
          },
          "type": "array",
          "title": "Interval",
          "description": "`[lo, hi]` stated band around `p_hit`. Wider when `sufficiency` is low (thin recent sample). A stated evidence band, not a statistical confidence interval."
        },
        "sufficiency": {
          "type": "number",
          "title": "Sufficiency",
          "description": "Evidence weight on 0–1: n / (n + 12), where n is the recent-form game count (typically L10). A player with 10 recent games has sufficiency ≈ 0.45 — about half the rate is player-observed, half prior. The wager still ships at any sufficiency; this field tells you how much of `p_hit` is earned from this player's own boxes."
        },
        "reliability": {
          "type": "string",
          "title": "Reliability",
          "description": "Badge on this sport×market cell: `emerging`, `moderate`, `high`, or `informational`. v0 ships `emerging` for every wager; cells promote as a scored history accumulates."
        },
        "conviction": {
          "type": "number",
          "title": "Conviction",
          "description": "Board rank key on 0–1: |p_hit − 0.5| × 2 × sufficiency × research multiplier. A 0.76 call on a thin sample ranks below a 0.62 call on a long one. Highest conviction first on the daily slate."
        },
        "model_version": {
          "type": "string",
          "title": "Model Version",
          "description": "Scorer version, e.g. `forecast-v0`."
        },
        "selected": {
          "type": "boolean",
          "title": "Selected",
          "description": "True when this wager is on the daily board (top conviction, up to 3 per event / 25 on the slate). On `GET /intelligence` the array includes both selected rows and the rest of the event catalog."
        },
        "books": {
          "additionalProperties": true,
          "type": "object",
          "title": "Books",
          "description": "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 — use it to see what books are charging for that outcome."
        },
        "drivers": {
          "items": {
            "$ref": "#/$defs/ForecastDriver"
          },
          "type": "array",
          "title": "Drivers",
          "description": "Signed contributions that moved `p_hit`. Read `input` as the measured rate/rating behind the pick and `effect` as how far it lifts (or lowers) the chosen outcome versus a baseline on the same line.",
          "default": []
        },
        "research": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Research",
          "description": "Optional Deep Research overlay when the background job has written a row for this wager — every wager on the daily board (`selected: true`), plus other high-probability wagers (`p_hit` ≥ 0.80) in the catalog: `{stance, conviction, note}`. `stance` is `validate` / `neutral` / `invalidate`. `note` is the wager-level why (the fact the model cannot see) — on a selected main-line row it is also copied to `bets[].narrative`. Validate / invalidate rows always carry a note. Validate nudges `p_hit` up by at most 0.03 and lifts conviction. Invalidate drops the wager from `forecasts[]` and the daily board — it is not a recommended pick. The chosen `side` stays the same. Null means read `p_hit` from the rate model alone — missing research is fail-open, not a 400."
        }
      },
      "additionalProperties": true,
      "type": "object",
      "required": [
        "market",
        "p_hit",
        "interval",
        "sufficiency",
        "reliability",
        "conviction",
        "model_version",
        "selected",
        "books"
      ],
      "title": "ForecastWager"
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/lumify-ai-intelligence-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.