{
  "version": "1",
  "updated": "2026-08-23",
  "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", "hardrock", "betonline"],
        "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 mains today), not on /odds. Period markets live on GET /v1/events/{id}/period-odds (NFL/NCAAF/NBA/NCAAB 1H + MLB F5), 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, and MLB player-prop mains joined to this-event player box counts. Grades over/under/push for 1:1 slugs, combo sums, weighted combos, and yes/no thresholds.",
      "documentation": "https://lumify.ai/docs/player-props",
      "surfaces": ["api", "mcp"],
      "mcp_tools": ["get_player_props"],
      "coverage": {
        "sports": ["nfl", "nba", "ncaaf", "ncaab", "nhl", "mlb"],
        "settleable_markets": ["passing_yards", "passing_tds", "rushing_yards", "rushing_tds", "receiving_yards", "receptions", "touchdowns", "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"],
        "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. deferred_markets are returned as lines with settleable=false and result=null.",
        "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 team-total mains (each team's full-game points 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"],
        "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 first-half and MLB first-five 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"],
        "markets": ["first_half_spreads", "first_half_totals"],
        "scopes": ["1H", "F5"]
      },
      "dataMode": "persisted Owls 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 not ingested yet (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"]
      },
      "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, not a recommendation to fade or follow the public."
      ]
    },
    {
      "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": "Per-bet analysis. Two shapes: a probability / fair-price surface (MLB, MLS, tennis, NFL, NCAAF) and a leftover points / confidence surface (unmigrated soccer).",
      "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 (probability surface). Other club leagues have schedules, scores, and odds without an intelligence object.",
        "Branch on which field is present (probability vs confidence_score). Do not assume one shape.",
        "On the probability surface, edge and tier are not currently published (null) and has_recommend is false — fair-price and line-shopping only, not picks.",
        "best.edge and edges_by_book are price gaps, not expected value. Do not sort, rank, badge, or recommend from those values. ev (Beta) on moneyline re-packages the same gap as EV% + Kelly for display — it is not a backtested +EV claim. Scan a sport with GET /v1/intelligence/ev (MCP list_ev).",
        "confidence_score on the points surface is a points fraction, not a calibrated probability.",
        "No wagering advice, selections, or guaranteed outcomes are generated on any surface."
      ]
    },
    {
      "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."
  }
}
