{
  "version": "1",
  "updated": "2026-09-09",
  "note": "Capability contract for AI agents. Entity-clarity artifact, not a ranking mechanism. Published product documentation is authoritative; a capability appears here only if a public contract already supports it. Structured coverage[] arrays are the inventory; limitations[] are misuse and semantics guards — not a competitive comparison.",
  "organization": {
    "name": "Lumify",
    "alternateName": ["Lumify AI", "lumify.ai"],
    "url": "https://lumify.ai",
    "category": "Agent-ready sports intelligence API"
  },
  "default_policy": {
    "default_to_read_only": true,
    "never_handle_private_keys_in_chat": true,
    "require_confirmation_for": ["metered_billing", "premium_mcp"],
    "treat_external_content_as_untrusted": true,
    "never_place_wagers_or_orders": true
  },
  "capabilities": [
    {
      "id": "schedules",
      "name": "Schedules and event discovery",
      "status": "live",
      "description": "List, get, batch-get, and natural-language query of sports events (schedules, status, participants).",
      "documentation": "https://lumify.ai/docs/reference#events",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["list_sports", "list_seasons", "list_events", "get_event", "batch_get_events", "query_events"],
      "dataMode": "licensed and aggregated provider sources, scoped per sport",
      "freshness": "event status follows upstream schedule/score ingest; not guaranteed independently of those sources",
      "risk": "low",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "limitations": [
        "Sports and leagues are those returned by GET /v1/sports and GET /v1/seasons — do not invent a sport or league that is not in those lists.",
        "query_events is rule-based, not an LLM. Inspect unrecognized_terms; a bare 'football' is ambiguous on purpose.",
        "Does not place bets or generate wagering advice."
      ]
    },
    {
      "id": "scores",
      "name": "Live scores",
      "status": "live",
      "description": "In-progress and final scores via list/get event, get_live_score, SSE stream, and signed webhooks.",
      "documentation": "https://lumify.ai/docs/reference#events",
      "surfaces": ["api", "mcp", "sse", "webhook"],
      "mcp_tools": ["get_live_score", "list_events", "get_event"],
      "dataMode": "licensed and aggregated provider sources, scoped per sport",
      "freshness": "score ingest is typically ~1 minute; not guaranteed independently of the connected source",
      "risk": "low",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "limitations": [
        "SSE connections recycle at 5 minutes (server sends event: reconnect).",
        "Does not place bets or generate wagering advice."
      ]
    },
    {
      "id": "odds",
      "name": "Sportsbook odds and line history",
      "status": "live",
      "description": "Current multi-book odds (pregame and in-play) and line-movement history. Default book is Pinnacle; bookmaker=all returns the full set. In-play omits books that have not quoted since kickoff.",
      "documentation": "https://lumify.ai/docs/reference#event-odds",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["get_odds", "get_odds_history"],
      "coverage": {
        "books": ["pinnacle", "fanduel", "draftkings", "betmgm", "caesars", "bet365", "circa", "westgate", "wynn", "south_point", "stations", "hardrock", "betonline", "betr", "betrivers", "lowvig", "bovada"],
        "markets": ["h2h", "spreads", "totals"]
      },
      "dataMode": "aggregated sportsbook quotes from licensed/provider feeds",
      "freshness": "odds ingest is typically ~10 minutes; not guaranteed independently of the connected source",
      "risk": "medium",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "requires_explicit_confirmation": false,
      "limitations": [
        "v1 public markets are moneyline, spread, and totals (3-way ML for soccer). Alternate rungs via include_alts=true; default is mains. In-play cadence follows odds ingest (~10 min), not a sub-second push feed.",
        "Player props live on GET /v1/events/{id}/player-props (NFL + NCAAF + NBA + NCAAB + NHL + MLB mains), not on /odds. Team totals live on GET /v1/events/{id}/team-props (NFL + NCAAF + MLB + soccer mains), not on /odds. Period markets live on GET /v1/events/{id}/period-odds (NFL/NCAAF/NBA/NCAAB/soccer 1H + MLB F5 + tennis S1), not on /odds. Futures are not on the public v1 surface.",
        "Historical queries are capped at 90 days per request.",
        "A price gap between books is not expected value.",
        "Read-only: never places trades, routes orders, or advises on wagers."
      ]
    },
    {
      "id": "player-props",
      "name": "Player-prop lines and live settlement",
      "status": "live",
      "description": "NFL, NCAAF, NBA, NCAAB, NHL, MLB, and Soccer player-prop mains joined to this-event player box counts. Grades over/under/push when current is present; dnp / no_stat at final when it is not.",
      "documentation": "https://lumify.ai/docs/player-props",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["get_player_props"],
      "coverage": {
        "sports": ["nfl", "nba", "ncaaf", "ncaab", "nhl", "mlb", "soccer"],
        "settleable_markets": ["passing_yards", "passing_tds", "rushing_yards", "rushing_tds", "receiving_yards", "receptions", "touchdowns", "rush_rec_yards", "pass_rush_yards", "points", "rebounds", "assists", "steals", "blocks", "threes_made", "pts_rebs", "pts_asts", "rebs_asts", "pts_rebs_asts", "double_double", "triple_double", "goals", "hockey_assists", "shots_on_goal", "hockey_points", "hits", "runs", "rbis", "home_runs", "stolen_bases", "strikeouts_batter", "total_bases", "hits_runs_rbis", "strikeouts_pitcher", "hits_allowed", "earned_runs", "outs_recorded", "soccer_goals", "soccer_assists", "shots_on_target", "fouls_committed"],
        "deferred_markets": []
      },
      "dataMode": "persisted sportsbook prop mains joined to ingested player box counts — no request-time vendor fan-out",
      "freshness": "prop lines follow odds ingest (~10 min); live box follows live player-box ingest (~1 min while in progress)",
      "risk": "medium",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "requires_explicit_confirmation": false,
      "limitations": [
        "Sports outside coverage.sports return HTTP 400.",
        "settleable_markets grade over/under/push once the event is final and current is present. At final with no current: dnp when box ingest landed and the player has zero rows; no_stat when the player played but this slug never landed, the name never matched, or the box has not landed yet. deferred_markets are returned as lines with settleable=false and result=null. novig is a props-only book (not on GET /odds); it is the current soccer props book and a large NFL props book.",
        "GET /odds stays on moneyline, spread, and totals — this is the public settleable surface.",
        "Futures are not on the public v1 surface.",
        "Read-only: never places trades, routes orders, or advises on wagers."
      ]
    },
    {
      "id": "team-props",
      "name": "Team-total lines and live settlement",
      "status": "live",
      "description": "NFL, NCAAF, MLB, and soccer team-total mains (each team's full-game points/runs/goals Over/Under) joined to this-event participant scores. Grades over/under/push.",
      "documentation": "https://lumify.ai/docs/reference#event-team-props",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["get_team_props"],
      "coverage": {
        "sports": ["nfl", "ncaaf", "mlb", "soccer"],
        "markets": ["team_total"]
      },
      "dataMode": "persisted Pinnacle team-total mains joined to ingested participant scores — no request-time vendor fan-out",
      "freshness": "team-total lines follow odds ingest (~10 min); current score follows live score ingest (~1 min while in progress)",
      "risk": "medium",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "requires_explicit_confirmation": false,
      "limitations": [
        "Sports outside coverage.sports return HTTP 400.",
        "GET /odds stays on moneyline, spread, and totals — this is the public settleable surface.",
        "Read-only: never places trades, routes orders, or advises on wagers."
      ]
    },
    {
      "id": "period-odds",
      "name": "Period / partial market lines and settlement",
      "status": "live",
      "description": "NFL, NCAAF, NBA, NCAAB, and soccer first-half, MLB first-five, and tennis first-set mains joined to this-event period scores. Grades the period, not the full game.",
      "documentation": "https://lumify.ai/docs/reference#event-period-odds",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["get_period_odds"],
      "coverage": {
        "sports": ["nfl", "ncaaf", "nba", "ncaab", "mlb", "soccer", "tennis"],
        "markets": ["first_half_spreads", "first_half_totals"],
        "scopes": ["1H", "F5", "S1"]
      },
      "dataMode": "persisted first_half_* mains joined to ingested period scores — no request-time vendor fan-out",
      "freshness": "period lines follow odds ingest (~10 min); period scores follow live score ingest (~1 min while in progress)",
      "risk": "medium",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "requires_explicit_confirmation": false,
      "limitations": [
        "Sports outside coverage.sports return HTTP 400.",
        "GET /odds stays on moneyline, spread, and totals — this is the public settleable surface.",
        "Pinnacle v2 period 1 is ingested for soccer (1H). Football period 1+ stays dropped (1H vs Q1 unconfirmed).",
        "Read-only: never places trades, routes orders, or advises on wagers."
      ]
    },
    {
      "id": "splits",
      "name": "Public betting splits",
      "status": "live",
      "description": "Ticket % and handle % per side, with a per-bookmaker breakdown using the same slugs as /odds.",
      "documentation": "https://lumify.ai/docs/reference#event-splits",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["get_splits"],
      "coverage": {
        "sports": ["mlb", "nba", "nhl", "nfl", "ncaaf", "ncaab"]
      },
      "dataMode": "aggregated public-split feeds for supported sports",
      "freshness": "follows the splits source; unavailable events return available=false (unbilled)",
      "risk": "low",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "limitations": [
        "Sports outside coverage.sports return available=false.",
        "Splits are public-money context (ticket% vs handle%)."
      ]
    },
    {
      "id": "stats",
      "name": "Raw match statistics (Data layer)",
      "status": "live",
      "description": "Deterministic team/player/match aggregates. Sport-specific payload shapes. No scoring, tiers, or narrative.",
      "documentation": "https://lumify.ai/docs/reference#event-stats",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["get_stats"],
      "coverage": {
        "sports": ["soccer", "mlb", "tennis", "nfl", "nba", "nhl", "ncaaf", "ncaab"]
      },
      "dataMode": "persisted box/rate aggregates from licensed and public provider sources",
      "freshness": "follows the stats ingest for that sport; available=false when participants have not resolved",
      "risk": "low",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "limitations": [
        "Sports outside coverage.sports return HTTP 400.",
        "Payload shape is sport-specific — do not reuse one sport's field names on another.",
        "This is the Data layer. Judgment, confidence, and rationale live on /intelligence.",
        "Tennis doubles and qualifying return available=false."
      ]
    },
    {
      "id": "intelligence",
      "name": "Bet intelligence",
      "status": "live",
      "description": "Predictive bet intelligence: vig-stripped probability, fair_price, Price overlay, and main-line ev (Beta) for MLB, tennis, soccer (MLS + big-five), NFL, and NCAAF.",
      "documentation": "https://lumify.ai/docs/reference#event-intelligence",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["get_intelligence", "list_ev"],
      "coverage": {
        "sports": ["mlb", "tennis", "soccer", "nfl", "ncaaf"]
      },
      "dataMode": "Lumify-computed intelligence over licensed sportsbook and stats sources",
      "freshness": "rows rewrite when price/line/probability move beyond a tolerance — an older computed_at means unchanged since, not stale",
      "risk": "high",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "requires_explicit_confirmation": true,
      "limitations": [
        "Soccer intelligence is MLS plus the big-five leagues. Other club competitions have schedules, scores, and odds; intelligence returns available:false.",
        "edge and tier are unpublished (null) and has_recommend is false — vig-stripped fair-price and line-shopping.",
        "best.edge and edges_by_book are line-shopping price gaps vs sharp consensus. ev (Beta) on main-line tokens (h2h, spreads, totals; tennis totals unpublished) packages the same gap as EV% + Kelly. Scan a sport with GET /v1/intelligence/ev?market= (MCP list_ev).",
        "GET /intelligence also returns forecasts[] (player-prop rate model on team sports; high-confidence main-line picks on tennis, NFL, NCAAF, MLB, and soccer — one side per moneyline/spread/total when the uncertainty band does not include a coin flip) when a two-way main is in range. p_hit is P(the picked outcome hits); ranked by conviction. Daily board: GET /v1/intelligence/forecasts (MCP list_forecasts). How + field catalog: https://lumify.ai/docs/forecasts."
      ]
    },
    {
      "id": "forecasts",
      "name": "Forecast intelligence",
      "status": "live",
      "description": "Daily board of forecasted wagers from a model prediction, not a beat-the-market claim (no OOS/independence gate). Player-prop Over/Under from a shrunken rate model (MLB, NCAAF, NFL, NBA, NCAAB, NHL). High-confidence main-line picks on tennis, NFL, NCAAF, MLB, and soccer (moneyline, spread, total — one side per market when the lean is not a coin flip). Tennis moneyline from ranking Bradley-Terry; tennis spreads/totals from a Normal-approx games model. reliability is emerging on v0.",
      "documentation": "https://lumify.ai/docs/forecasts",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["list_forecasts"],
      "coverage": {
        "sports": ["mlb", "ncaaf", "nfl", "nba", "ncaab", "nhl", "tennis", "soccer"]
      },
      "dataMode": "Lumify-computed rate model over persisted player-prop lines and player game stats",
      "freshness": "compute-on-read from persisted lumify_odds + lumify_player_game_stats; research overlay is persist-then-read from lumify_forecast_research; published snapshots append to lumify_forecast_log and settle from the player-props grader",
      "risk": "high",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "requires_explicit_confirmation": true,
      "limitations": [
        "p_hit is the model's probability the picked outcome hits. Props: shrunken counting-stat rate vs the line. Tennis: ranking Bradley-Terry moneyline / games-model spreads and totals. NFL / NCAAF / MLB / soccer: high-confidence assessment lean (interval stays above a coin flip). Ranked by conviction. Use list_ev to scan main lines by sharp-fair price gap. Coin-flip main-lines are not picked. v0 labels reliability emerging.",
        "One-sided longshots and low-count lines the rate model already treats as certain (p≥0.95) are dropped. Yardage markets skip that Poisson cut.",
        "Only 1:1 counting markets make the daily slate. Combos, touchdowns, and home-run binaries are scored per-event but not selected.",
        "Player bind is exact / Jr-stripped only. Last-token fuzzy match is Data-plane only and does not produce a forecast.",
        "Empty slate is still 200 and still 1 credit. Research overlay is fail-open (null).",
        "No wagering advice, selections, or guaranteed outcomes are generated on any surface."
      ]
    },
    {
      "id": "resolve-player",
      "name": "Player identity resolve",
      "status": "live",
      "description": "Map a messy player name plus optional sport, team, event, or position clues to a Lumify player_id. Returns ambiguous or not_found instead of guessing.",
      "documentation": "https://lumify.ai/docs/reference#resolve-player",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["resolve_player"],
      "dataMode": "catalog match against persisted player identity; no request-time vendor fan-out",
      "freshness": "follows player-catalog ingest",
      "risk": "low",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "limitations": [
        "A unique bind below the auto-resolve confidence floor is returned as ambiguous, not resolved.",
        "Two close candidates are always ambiguous — never auto-pick candidates[0].",
        "search_players is a LIKE list, not this resolver. Prefer resolve_player when the name is a fragment, initial, or nickname.",
        "Does not grade props and does not invent players missing from the catalog.",
        "Does not place bets or generate wagering advice."
      ]
    },
    {
      "id": "grade-slip",
      "name": "Structured slip grading",
      "status": "live",
      "description": "Grade settleable player-prop legs against this-event box counts, plus structured and free-text game markets (h2h / spreads / totals) against the official score and the submitted ticket line, and team totals on nfl/ncaaf/mlb/soccer. Same over/under/push/in_progress/dnp/no_stat engine as GET /player-props for props; spreads and moneylines return won/lost/void. Free-text grades only when team/player and event resolve uniquely — a bare Over 47.5 never picks the first slate game. Call POST /v1/grade/slip or MCP grade_slip with an API key. The public /grade sheet (Grade a bet slip) uses the same engine without a key (20/IP/day; Visual + JSON). How-to: https://lumify.ai/docs/grade. Attribution is always Graded by Lumify.",
      "documentation": "https://lumify.ai/grade",
      "surfaces": ["api", "mcp", "html"],
      "mcp_tools": ["grade_slip"],
      "coverage": {
        "sports": ["nfl", "nba", "ncaaf", "ncaab", "nhl", "mlb", "soccer"],
        "game_markets": "h2h / spreads / totals on any sport GET /odds already settles; team_total on nfl/ncaaf/mlb/soccer"
      },
      "dataMode": "structured legs graded from persisted prop lines and player box counts — no request-time vendor fan-out",
      "freshness": "prop lines follow odds ingest (~10 min); live box follows player-box ingest (~1 min while in progress)",
      "risk": "medium",
      "mode": "read_only",
      "secrets_required": true,
      "money_movement": false,
      "limitations": [
        "Player-prop markets on nfl/nba/ncaaf/ncaab/nhl/mlb/soccer. Game markets (h2h/spreads/totals) on any sport GET /odds already settles. Tennis props stay unmapped; tennis spreads/totals stay unmapped (set-string scores); tennis moneyline grades.",
        "market_key accepts common aliases (moneyline/ml -> h2h, spread -> spreads, total/ou -> totals). side=draw only grades on soccer h2h; off soccer it is unmapped. Spreads line is signed to the submitted side, not the favorite.",
        "Cap 8 legs. Structured game legs omit player_id. team_total requires team_id and is nfl/ncaaf/mlb/soccer only. Free-text player props and game phrases (Chiefs -3.5, Over 47.5 vs Bills, Yankees ML) grade only when team/player and event resolve uniquely — never auto-picks a candidate, and a bare Over 47.5 never binds the first slate game. Ambiguous binds stay on resolve / team_resolve / event_resolve.",
        "Prefer legs[].market and legs[].resolve.player_id for the graded IDs; input is parse echo.",
        "The public /grade sheet is 20 grades per IP per day and does not require an API key. POST /v1/grade/slip and MCP grade_slip use an API key.",
        "In-play props and period markets may freeze at kickoff. This is not a live trading pipe.",
        "Does not place bets or generate wagering advice."
      ]
    },
    {
      "id": "mcp",
      "name": "Hosted MCP",
      "status": "live",
      "description": "Streamable-HTTP MCP at one URL. Tools, resources, and prompts. Per-call credit metering in _meta.credits_used.",
      "documentation": "https://lumify.ai/docs/guides#mcp",
      "surfaces": ["mcp"],
      "mcp": {
        "transport": "streamable-http",
        "url": "https://lumify.ai/mcp",
        "status": "live",
        "serverCard": "https://lumify.ai/.well-known/mcp/server-card.json",
        "stdio": "npx -y @lumifyai/mcp",
        "documentation": "https://lumify.ai/docs/guides#mcp"
      },
      "dataMode": "same as the REST capabilities each tool wraps",
      "freshness": "inherits the wrapped REST capability",
      "risk": "medium",
      "mode": "premium_mcp",
      "secrets_required": true,
      "money_movement": false,
      "requires_explicit_confirmation": true,
      "limitations": [
        "initialize, tools/list, resources/list, prompts/list, ping, and estimate_cost are free; tools/call is metered at the equivalent REST cost. Discover the live catalog via tools/list.",
        "ChatGPT and Claude.ai web connectors need OAuth, which is not yet supported. Desktop/IDE MCP clients work.",
        "A Bearer API key is required for tools/call. Never paste a key into chat.",
        "Read-only: never places trades, routes orders, or advises on wagers."
      ]
    },
    {
      "id": "agent-skill",
      "name": "Lumify Agent Skill",
      "status": "live",
      "description": "Prompt-only Agent Skill that routes an agent to the hosted MCP when public snapshot data is insufficient.",
      "documentation": "https://lumify.ai/SKILL.md",
      "source": "https://github.com/lumifyai/sports-intelligence-skills",
      "surfaces": ["agent-skill"],
      "dataMode": "instructions only — no local code, no embedded proprietary data",
      "freshness": "n/a (routing text)",
      "risk": "medium",
      "mode": "premium_mcp",
      "secrets_required": true,
      "money_movement": false,
      "requires_explicit_confirmation": true,
      "limitations": [
        "Requires a Lumify API key and network access to https://lumify.ai/mcp.",
        "Do not use when the user only wants a keyless public-scoreboard snapshot.",
        "Does not place bets or generate wagering advice."
      ]
    }
  ],
  "notPublished": {
    "reason": "Capabilities that no public contract currently supports are omitted rather than listed with a provisional status.",
    "examples": [
      "A public futures odds surface.",
      "Player props outside NFL, NCAAF, NBA, NCAAB, NHL, and MLB.",
      "OAuth for ChatGPT / Claude.ai web MCP connectors.",
      "A separate agent.txt brief. /.well-known/agent.json is the short discovery manifest; /llms.txt is the full brief."
    ]
  },
  "policy": {
    "customerNames": "not published on machine-readable surfaces",
    "programNote": "Named sportsbooks, data providers, and any program logos are sources or participation only — not endorsement, investment, or a customer relationship.",
    "regulatedContent": "No picks, tips, selections, wagering advice, or guaranteed outcomes on any surface.",
    "performanceClaims": "No performance claim is published without a repeatable, published benchmark. Internal evaluation figures are not part of this contract.",
    "humanControl": "Outputs are informational. Any wager or trade is the user's own action on another surface."
  }
}
