Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,536Letters: 14Defects: 1,322counted 3 min ago
teppi

Server definition

Hash
sha256:8f8055dbc599d094bc066deb572e4248a19b995c1d29c7889974f29145eec240
What it is
What a remote MCP server returned when asked what it offers: 28 tools

The blob, as servednamed by its sha256

{ "instructions": "Lumify sports intelligence. Read the lumify://docs/quickstart resource to get started (including the zero-signup instant-key auth path). Authenticate with a Lumify API key (Bearer lmfy-...) before tools/call. Use tools/list, resources/list, and prompts/list to discover capabilities.", "tools": [ { "description": "Get multiple events by id in one call — for agents that already have a list of ids and want full detail for each without one call per event. Max 25 ids. Returns full detail for every id that exists plus a not_found list for any that don't (never billed). Use get_event for a single id, or list_events / query_events to discover ids first.", "inputSchema": { "properties": { "bookmaker": { "description": "Bookmaker for inlined odds and intelligence market prices. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all.", "type": "string" }, "event_ids": { "description": "Event ids to fetch (max 25); duplicates are billed once.", "items": { "type": "integer" }, "maxItems": 25, "type": "array" }, "include_intelligence": { "default": false, "description": "Inline bet intelligence on each event. Does not add credits.", "type": "boolean" }, "include_odds": { "default": false, "description": "Inline current odds scoped by bookmaker (default: pinnacle). Does not add credits — each found event stays 1 credit.", "type": "boolean" } }, "required": [ "event_ids" ], "type": "object" }, "name": "batch_get_events", "outputSchema": { "properties": { "events": { "description": "Full event detail (same shape as get_event) for every found id.", "items": { "type": "object" }, "type": "array" }, "not_found": { "description": "Requested event_ids that don't exist. Never billed.", "items": { "type": "integer" }, "type": "array" }, "total": { "type": "integer" } }, "type": "object" } }, { "description": "Estimate the credit cost of one or more planned tool calls before making them — no credits are spent. Costs are data-dependent (e.g. odds/intelligence/splits not yet ingested for an event are free, and batch_get_events ids that don't exist cost nothing), so this returns a [min_credits, max_credits] range per call rather than a single number. Pass the exact tool name and arguments you're considering, e.g. {\"tool\": \"get_event\", \"arguments\": {\"event_id\": 123, \"include_odds\": true}}.", "inputSchema": { "properties": { "calls": { "items": { "properties": { "arguments": { "description": "Same arguments you'd pass to that tool.", "type": "object" }, "tool": { "description": "Tool name to estimate, e.g. get_event, batch_get_events, get_odds.", "type": "string" } }, "required": [ "tool" ], "type": "object" }, "maxItems": 50, "minItems": 1, "type": "array" } }, "required": [ "calls" ], "type": "object" }, "name": "estimate_cost", "outputSchema": { "properties": { "estimates": { "items": { "properties": { "max_credits": { "type": "integer" }, "min_credits": { "type": "integer" }, "note": { "type": [ "string", "null" ] }, "tool": { "type": "string" } }, "type": "object" }, "type": "array" }, "total_max_credits": { "type": "integer" }, "total_min_credits": { "type": "integer" } }, "type": "object" } }, { "description": "Get a single event with participants and venue. Optionally inline current odds and/or bet intelligence (same 1 credit as the event call). Raises a not-found error if event_id doesn't exist. Use list_events / query_events to discover ids first, or batch_get_events to fetch several ids in one call.", "inputSchema": { "properties": { "bookmaker": { "description": "Bookmaker for inlined odds and intelligence market prices. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all.", "type": "string" }, "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" }, "include_intelligence": { "default": false, "description": "Inline bet intelligence. Does not add credits.", "type": "boolean" }, "include_odds": { "default": false, "description": "Inline current odds scoped by bookmaker (default: pinnacle). Does not add credits — the event call stays 1 credit.", "type": "boolean" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_event", "outputSchema": { "properties": { "id": { "type": "integer" }, "inprogress_since": { "description": "ISO-8601 UTC when status first became inprogress (first live tick). Null until then; stays set after final.", "type": [ "string", "null" ] }, "league": { "type": "string" }, "name": { "type": "string" }, "participants": { "items": { "properties": { "is_winner": { "type": [ "boolean", "null" ] }, "participant_id": { "type": "integer" }, "player": { "type": [ "object", "null" ] }, "role": { "type": "string" }, "score": { "type": [ "string", "null" ] }, "team": { "type": [ "object", "null" ] } }, "type": "object" }, "type": "array" }, "sport": { "type": "string" }, "starts_at": { "type": "string" }, "status": { "type": "string" }, "updated_at": { "type": [ "string", "null" ] }, "venue": { "type": [ "object", "null" ] } }, "type": "object" } }, { "description": "Beta. Get late-breaking player injury and availability status for an event (out / doubtful / questionable / probable / day_to_day / ir / suspended / available), with previous_status, body_part, note, source_url, and severity (info / material / critical). Beta coverage: NFL and MLB (more sports rolling out). NFL monitoring starts ~4.5 days before kickoff (Wednesday/Thursday practice reports); MLB stays on a 48-hour window. Returns available:false with no charge until the injury monitor has written a first structured report. Checks run on cadence, on a significant main-market odds move, and at a guaranteed pre-kickoff checkpoint. Subscribe to webhook event_type=injury for material/critical changes. No in-game feed. Use exclude_status to drop noisy long-standing designations (e.g. ir) from the response — does not affect available or credit cost.", "inputSchema": { "properties": { "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" }, "exclude_status": { "description": "Comma-separated statuses to drop, e.g. \"ir\" to hide injured-reserve/long-term-IL rows (long-standing roster designations, not late-breaking news). Valid values: out, doubtful, questionable, probable, day_to_day, ir, suspended, available.", "type": "string" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_injuries", "outputSchema": { "properties": { "available": { "type": "boolean" }, "confirmed_at": { "type": [ "string", "null" ] }, "event_id": { "type": "integer" }, "injuries": { "description": "Per-player rows: player, player_id, team, team_id, status, previous_status, body_part, note, source_url, severity, last_changed_at. team/team_id prefer the player's current roster team when that team is a participant in this event.", "items": { "type": "object" }, "type": "array" }, "last_checked_at": { "type": [ "string", "null" ] }, "next_check_at": { "type": [ "string", "null" ] } }, "type": "object" } }, { "description": "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 high-confidence main-line picks on tennis, NFL, NCAAF, MLB, and soccer. bets[] is live for MLB, tennis, soccer (MLS + big-five), NFL, and NCAAF. forecasts[] covers MLB, NFL, NCAAF, NBA, NCAAB, NHL, tennis, and soccer 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", "inputSchema": { "properties": { "bookmaker": { "description": "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, bovada.", "type": "string" }, "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_intelligence", "outputSchema": { "properties": { "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. Free only when available is false and forecasts is empty.", "type": "boolean" }, "bets": { "items": { "properties": { "alignment": { "description": "Internal — omitted from customer payloads (MLB/soccer/tennis).", "type": [ "object", "null" ] }, "attribution": { "description": "Not published.", "items": { "type": "string" }, "type": "array" }, "best": { "description": "Highest price-gap book across edges_by_book: {book, price, edge, quote_age_seconds}. Tier C informational line-shopping.", "type": [ "object", "null" ] }, "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.", "type": "string" }, "blend_w": { "description": "Internal — omitted from customer payloads (MLB/soccer/tennis).", "type": [ "number", "null" ] }, "computed_at": { "description": "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.", "type": [ "string", "null" ] }, "confidence_score": { "description": "Not published. Use probability.", "type": [ "number", "null" ] }, "coverage": { "description": "Not published.", "type": [ "number", "null" ] }, "drivers": { "description": "Internal — omitted from customer payloads (MLB/soccer/tennis).", "items": { "type": "object" }, "type": "array" }, "edge": { "description": "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.", "type": [ "number", "null" ] }, "edges_by_book": { "description": "Price gap versus fair.probability per soft book (fair.probability × decimal_odds − 1). Line-shopping metric: rank soft books by gap.", "type": [ "object", "null" ] }, "ev": { "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" ] }, "fair": { "description": "Sharp-consensus fair: {probability, books, n_books, is_consensus}. MLB/NFL: Pinnacle+Circa; MLS/tennis: Pinnacle. Price-gap reference for edges_by_book/best.", "type": [ "object", "null" ] }, "fair_price": { "description": "American-odds fair price implied by probability — the vig-free line. Compare to market.price for the book's margin on this side.", "type": [ "integer", "null" ] }, "interval": { "description": "[lo, hi] band around probability — how much evidence backs the number, not a statistical confidence interval.", "items": { "type": "number" }, "type": [ "array", "null" ] }, "market": { "description": "Market quote: {price: American odds, line: handicap/total line or null for moneyline, book: bookmaker slug when known (always set for probability-model sports)}.", "type": [ "object", "null" ] }, "model_version": { "description": "Internal — omitted from customer payloads (MLB/soccer/tennis).", "type": [ "string", "null" ] }, "narrative": { "description": "Pick-defense rationale for a selected main-line side. Present only when a matching forecasts[] row is selected: true. Null when no pick was made on this token.", "type": [ "string", "null" ] }, "p_market": { "description": "Internal — omitted from customer payloads (MLB/soccer/tennis). Use probability/fair_price.", "type": [ "number", "null" ] }, "p_model": { "description": "Internal — omitted from customer payloads (MLB/soccer/tennis).", "type": [ "number", "null" ] }, "phase": { "description": "Internal — omitted from customer payloads (MLB/soccer/tennis).", "type": [ "string", "null" ] }, "player_id": { "description": "Set when this bet is about an individual player. Null for team bets and match-level tokens.", "type": [ "integer", "null" ] }, "player_name": { "description": "Display name of the player or team this bet is about. Null for match-level tokens. Duplicates players[player_role].name.", "type": [ "string", "null" ] }, "player_role": { "description": "'home'/'away' or 'p1'/'p2'. Null for match-level tokens (OVER, UNDER, ML_DRAW).", "type": [ "string", "null" ] }, "probability": { "description": "Published probability for this outcome, 0-1. Outcomes of one market sum to 1. Customer surface for MLB, soccer, tennis, NFL.", "type": [ "number", "null" ] }, "rationale": { "description": "Not published. Top-level rationale is the event-level context overlay.", "items": { "type": "string" }, "type": "array" }, "signals": { "description": "Not published.", "type": [ "object", "null" ] }, "sufficiency": { "description": "Internal — omitted from customer payloads (MLB/soccer/tennis).", "type": [ "number", "null" ] }, "team_id": { "description": "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.", "type": [ "integer", "null" ] }, "tier": { "description": "Confidence tier: 'very_high', 'strong', 'moderate', or 'avoid'. Null whenever edge is null. Present on MLB customer surface and all other shapes.", "type": [ "string", "null" ] }, "validator": { "description": "Not published.", "type": [ "object", "null" ] } }, "type": "object" }, "type": "array" }, "event_id": { "description": "Lumify event ID this intelligence describes.", "type": "integer" }, "forecasts": { "description": "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; high-confidence main-line picks on tennis, NFL, NCAAF, MLB, and soccer via bet_type (ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_*/OVER/UNDER). selected marks the pick — high-confidence main-lines and the top-conviction prop rows on the daily slate. Coin-flip main-lines are not picked. A selected main-line research.note is copied to bets[].narrative. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts", "items": { "properties": { "away_team": { "description": "Away team display name. Slate only.", "type": [ "string", "null" ] }, "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 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).", "type": [ "string", "null" ] }, "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.", "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 measured rate/rating behind the pick and effect as how far it lifts the chosen outcome versus a baseline.", "items": { "properties": { "direction": { "description": "up / down / neutral from the sign of effect.", "type": "string" }, "effect": { "description": "Signed shift in p_hit versus a baseline case on the same line. 0.0 on yardage markets.", "type": "number" }, "id": { "description": "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.", "type": "string" }, "input": { "description": "Measured rate/rating behind this driver, in native units.", "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 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.", "type": [ "number", "null" ] }, "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/rushing/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 (bet_type set): the main-line family — h2h, spreads, or totals.", "type": "string" }, "model_version": { "description": "Scorer version, e.g. forecast-v0.", "type": "string" }, "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.", "type": "number" }, "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).", "type": [ "string", "null" ] }, "player_id": { "description": "Lumify player ID. Bound by exact / Jr-stripped name match. Null on main-line rows with no player attribution.", "type": [ "integer", "null" ] }, "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).", "type": [ "string", "null" ] }, "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 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 — 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. 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": "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.", "type": [ "string", "null" ] }, "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" }, "has_recommend": { "description": "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.", "type": [ "boolean", "null" ] }, "intelligence_updated_at": { "description": "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.", "type": [ "string", "null" ] }, "league": { "description": "League slug for this event, if any.", "type": [ "string", "null" ] }, "match_overview": { "description": "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.", "type": [ "string", "null" ] }, "matchup": { "description": "Not returned. Use get_stats for pitcher/lineup Data.", "type": [ "object", "null" ] }, "odds_source": { "description": "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.", "type": [ "string", "null" ] }, "players": { "description": "Home/away (or p1/p2) participant identification, keyed by role: {role: {name, player_id, team_id}}.", "type": "object" }, "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.", "items": { "type": "string" }, "type": [ "array", "null" ] }, "sport": { "description": "Sport slug for this event.", "type": [ "string", "null" ] } }, "type": "object" } }, { "description": "Get a lightweight live score snapshot for an event: status, period, clock, per-participant score and period-by-period scores, and last-updated time. Cheaper and faster than get_event when you only need the score, not participants or venue. Capped at 20 calls/min per key (shared with GET /v1/events/{id}/score and list_events include_scores=true). For live updates prefer the SSE stream. Raises a not-found error if event_id doesn't exist.", "inputSchema": { "properties": { "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_live_score", "outputSchema": { "properties": { "clock": { "type": [ "string", "null" ] }, "event_id": { "type": "integer" }, "finished": { "type": "boolean" }, "period": { "type": [ "string", "null" ] }, "scores": { "items": { "properties": { "abbreviation": { "type": [ "string", "null" ] }, "is_winner": { "type": [ "boolean", "null" ] }, "name": { "type": "string" }, "period_scores": { "items": { "type": "object" }, "type": "array" }, "role": { "type": "string" }, "score": { "type": [ "string", "null" ] } }, "type": "object" }, "type": "array" }, "status": { "type": "string" }, "updated_at": { "type": [ "string", "null" ] } }, "type": "object" } }, { "description": "Get current betting odds for an event: per-bookmaker lines and last-updated time. Includes in-play quotes while the event is underway; books that have not quoted since kickoff are omitted. bookmaker defaults to pinnacle. Use 'all' or a comma-separated list for multiple books — still 1 credit. Default is main lines (is_main=true); set include_alts for alternate spread/total rungs. Final events include result (won/lost/push/void) graded from the pre-kickoff close. MLB, tennis, and soccer (MLS + big-five) mains also include fair_price and consensus mirrored from published assessments. Returns available:false with no charge if odds aren't posted for this event yet. If bookmaker is omitted and Pinnacle hasn't posted a line yet (common for the first/last games of a preseason slate), falls back to the best-covered other book and adds requested_bookmaker='pinnacle' plus fallback_bookmaker to the response instead of reporting no odds; an explicit bookmaker='pinnacle' never falls back. Use get_odds_history for line movement over time.", "inputSchema": { "properties": { "bookmaker": { "description": "Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all, or a comma-separated list.", "type": "string" }, "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" }, "include_alts": { "description": "Include alternate spread/total rungs. Default false (mains only).", "type": "boolean" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_odds", "outputSchema": { "properties": { "available": { "type": "boolean" }, "bookmakers": { "description": "Per-book markets. Outcomes include is_main. In-play omits books that have not quoted since kickoff. Final events add result (won/lost/push/void) and close on the pre-kickoff point.", "items": { "type": "object" }, "type": "array" }, "event_id": { "type": "integer" }, "fallback_bookmaker": { "description": "The book actually returned when requested_bookmaker is present.", "type": "string" }, "last_updated": { "type": [ "string", "null" ] }, "requested_bookmaker": { "description": "Present only when the default (no bookmaker arg) request fell back to a different book because Pinnacle has no line yet — always 'pinnacle' when present.", "type": "string" } }, "type": "object" } }, { "description": "Get line-movement history for an event: a list of past odds snapshots (movements), each with its own timestamp, up to limit entries. bookmaker defaults to pinnacle. Use get_odds instead if you only need the current line.", "inputSchema": { "properties": { "bookmaker": { "description": "Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, bovada, all, or a comma-separated list.", "type": "string" }, "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" }, "limit": { "default": 50, "description": "Max line-movement entries to return. Default 50.", "type": "integer" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_odds_history", "outputSchema": { "properties": { "event_id": { "type": "integer" }, "movements": { "description": "Odds snapshots over time; each entry carries its own timestamp.", "items": { "type": "object" }, "type": "array" }, "total": { "type": "integer" } }, "type": "object" } }, { "description": "Get first-half / first-five / first-set lines and live progress for an NFL, NCAAF, NBA, NCAAB, MLB, soccer, or tennis event. Joins persisted first_half_spreads / first_half_totals mains to this-event period scores (1H = Q1+Q2, NCAAB or soccer native 1H; MLB F5 = innings 1–5; tennis S1 = first-set games) and grades the period, not the full game. GET /odds / get_odds stay on moneyline/spread/total. Returns available:false with no charge if no period mains have been ingested. Other sports return HTTP 400.", "inputSchema": { "properties": { "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_period_odds", "outputSchema": { "properties": { "available": { "description": "False when no first-half / first-five / first-set mains have been ingested; period_odds is empty and the call isn't billed.", "type": "boolean" }, "clock": { "description": "Game clock from the live score snapshot.", "type": [ "string", "null" ] }, "event_id": { "description": "Lumify event ID.", "type": "integer" }, "period": { "description": "Current period from the live score snapshot.", "type": [ "string", "null" ] }, "period_odds": { "description": "One row per (scope, market, line). Fields: scope (1H, F5, or S1), market (first_half_spreads / first_half_totals), line (home-perspective for spreads), home_score, away_score, current (totals only), current_margin (spreads only), pct_of_line, settleable, scope_complete, result (totals), home_result / away_result (spreads), books ({book_slug: {home, away} or {over, under}}).", "items": { "type": "object" }, "type": "array" }, "sport": { "description": "Sport slug: nfl, ncaaf, nba, ncaab, mlb, soccer, or tennis.", "type": [ "string", "null" ] }, "status": { "description": "Event status (scheduled, inprogress, delayed, final, …).", "type": [ "string", "null" ] } }, "type": "object" } }, { "description": "Get a single player identity profile: name, sport, country, position/handedness, physical stats, current team, rankings (tennis {singles, points}; null on every other sport), and image_url (Lumify media URL, null until the sport's headshot/enrichment job). Raises a not-found error if player_id doesn't exist. Resolve ids via search_players.", "inputSchema": { "properties": { "player_id": { "description": "Player id, from search_players.", "type": "integer" } }, "required": [ "player_id" ], "type": "object" }, "name": "get_player", "outputSchema": { "properties": { "birthdate": { "description": "YYYY-MM-DD date of birth.", "type": [ "string", "null" ] }, "country_code": { "description": "ISO 3166-1 alpha-3 country code.", "type": [ "string", "null" ] }, "current_team_id": { "description": "Lumify team ID when the player is on a club roster. Null for tennis.", "type": [ "integer", "null" ] }, "current_team_name": { "description": "Current team display name. Null for tennis.", "type": [ "string", "null" ] }, "first_name": { "type": [ "string", "null" ] }, "full_name": { "description": "Display name.", "type": "string" }, "handedness": { "description": "left | right | switch. Meaning is sport-specific (bats for MLB, shoots for NHL, playing hand for tennis). Null when unknown.", "type": [ "string", "null" ] }, "height_cm": { "description": "Height in centimetres. Null when not ingested.", "type": [ "integer", "null" ] }, "id": { "description": "Lumify player ID.", "type": "integer" }, "image_url": { "description": "Lumify media URL for the player headshot (https://lumify.ai/media/players/{sport}/{id}.{ext}). Null until the sport's headshot/enrichment job. Never a vendor CDN.", "type": [ "string", "null" ] }, "is_active": { "description": "False when deactivated or retired.", "type": "boolean" }, "last_name": { "type": [ "string", "null" ] }, "position": { "description": "Roster position abbreviation when the sport has one (e.g. C, P, SS for MLB; QB, WR for NFL). Null for tennis and when not yet ingested.", "type": [ "string", "null" ] }, "rankings": { "description": "Sport ranking block. Tennis: {singles, points} from ATP/WTA standings. Null for every other sport. Tennis /stats also exposes ranking / ranking_points on the tennis player block.", "properties": { "points": { "description": "ATP/WTA ranking points. Tennis only.", "type": [ "integer", "null" ] }, "singles": { "description": "ATP/WTA singles ranking. Tennis only.", "type": [ "integer", "null" ] } }, "type": [ "object", "null" ] }, "retired_at": { "description": "YYYY-MM-DD retirement date when known.", "type": [ "string", "null" ] }, "slug": { "description": "URL-safe unique slug.", "type": "string" }, "sport": { "description": "Sport slug, e.g. mlb, tennis, nfl.", "type": "string" }, "weight_kg": { "description": "Weight in kilograms. Null when not ingested.", "type": [ "number", "null" ] } }, "type": "object" } }, { "description": "List a player's events (schedule/results), paginated by id (after_id). Defaults to ±30 days around today when no date filter is given. Resolve player_id via search_players first.", "inputSchema": { "properties": { "after_id": { "description": "Cursor: last event id from the previous page's next_after_id.", "type": "integer" }, "from": { "description": "Start date YYYY-MM-DD.", "type": "string" }, "limit": { "default": 25, "description": "Max events to return per page.", "maximum": 100, "minimum": 1, "type": "integer" }, "player_id": { "description": "Player id, from search_players.", "type": "integer" }, "status": { "description": "Filter to events in this status.", "enum": [ "scheduled", "inprogress", "final", "postponed", "cancelled", "suspended", "delayed", "walkover" ], "type": "string" }, "to": { "description": "End date YYYY-MM-DD.", "type": "string" } }, "required": [ "player_id" ], "type": "object" }, "name": "get_player_events", "outputSchema": { "properties": { "data": { "description": "Events in the same shape as list_events' EventSummary.", "items": { "type": "object" }, "type": "array" }, "has_more": { "type": "boolean" }, "next_after_id": { "description": "Pass as after_id to fetch the next page; null on the last page.", "type": [ "integer", "null" ] }, "player_id": { "type": "integer" } }, "type": "object" } }, { "description": "Get player-prop lines and live progress for an NFL, NCAAF, NBA, NCAAB, NHL, MLB, or soccer event. Joins persisted player-prop mains to this-event player box counts and grades over/under/push (1:1 slugs, combo sums including rush+rec and pass+rush yards, weighted total bases, anytime TD, double-double/triple-double, hockey points). Sport × market catalog: https://lumify.ai/docs/player-props. GET /odds / get_odds stay on moneyline/spread/total. Returns available:false with no charge if no prop mains have been ingested. Other sports return HTTP 400.", "inputSchema": { "properties": { "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_player_props", "outputSchema": { "properties": { "available": { "description": "False when no player-prop mains have been ingested; player_props is empty and the call isn't billed.", "type": "boolean" }, "clock": { "description": "Game clock from the live score snapshot.", "type": [ "string", "null" ] }, "event_id": { "description": "Lumify event ID.", "type": "integer" }, "period": { "description": "Current period from the live score snapshot.", "type": [ "string", "null" ] }, "player_props": { "description": "One row per (player, market, line). Fields: player, player_id (null if unmatched), market (prop category), line, current (this-event box count), pct_of_line, settleable, result (in_progress / over / under / push / dnp — box landed and this player has zero rows / no_stat — played but this slug never landed, unmatched, or box not landed yet; null when not settleable), books ({book_slug: {over, under}} American prices).", "items": { "type": "object" }, "type": "array" }, "sport": { "description": "Sport slug: nfl, ncaaf, nba, ncaab, nhl, or mlb.", "type": [ "string", "null" ] }, "status": { "description": "Event status (scheduled, inprogress, delayed, final, …).", "type": [ "string", "null" ] } }, "type": "object" } }, { "description": "Get public betting splits (bets% and handle%) for an event: a consensus split plus a per-bookmaker breakdown (bookmakers[].bookmaker uses the same odds slugs as get_odds, e.g. draftkings — not upstream short keys like dk), with a captured_at timestamp. Available for MLB, NBA, NHL, NFL, NCAAF, and NCAAB. Not available for tennis or soccer (upstream 400). Returns available:false with no charge if splits haven't been captured for this event yet or the sport is unsupported.", "inputSchema": { "properties": { "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_splits", "outputSchema": { "properties": { "available": { "type": "boolean" }, "bookmakers": { "description": "Per-bookmaker splits. Each item has bookmaker (odds slug), name, moneyline, spread, total.", "items": { "type": "object" }, "type": "array" }, "captured_at": { "type": [ "string", "null" ] }, "consensus": { "description": "Aggregate bets%/handle% across bookmakers.", "type": [ "object", "null" ] }, "event_id": { "type": "integer" } }, "type": "object" } }, { "description": "Get raw, deterministic team/match statistics for a soccer, MLB, tennis, NFL, NCAAF, NBA, NCAAB, or NHL event — no odds (use get_odds) and no scoring (use get_intelligence). Payload is sport-specific: teams.home/away except tennis (players.player_1/player_2). Tennis doubles/qualifying return available:false. Form/record/H2H exclude walkovers and NFL/NCAAF/NBA/NCAAB preseason. Other sports return HTTP 400. Field catalog: https://lumify.ai/docs/reference#event-stats", "inputSchema": { "properties": { "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_stats", "outputSchema": { "properties": { "available": { "description": "False when participants haven't resolved, or tennis draw_type is not exactly 'singles' (doubles/qualifying out of scope); every other field is omitted and the call isn't billed.", "type": "boolean" }, "draw_type": { "description": "Tennis only. Always 'singles' when available is true. Values other than 'singles' (including 'doubles' and 'qualifying') return available:false.", "type": [ "string", "null" ] }, "event_id": { "description": "Lumify event ID.", "type": "integer" }, "head_to_head": { "description": "Past meetings: {window, meetings, total}. Soccer: {home_goals, away_goals}. MLB: {home_runs, away_runs}. NFL/NCAAF/NBA/NCAAB: {home_points, away_points}. NHL: {home_goals, away_goals}. Tennis: {event_id, starts_at, surface, winner_role, sets_won} relative to this fixture's player_1/player_2 (walkovers excluded).", "type": [ "object", "null" ] }, "league_context": { "description": "Soccer only. {avg_goals_per_team}: league-wide baseline goals/team/game, used by get_intelligence's attack/defense scoring. Null for fixed-baseline competitions.", "type": [ "object", "null" ] }, "league_slug": { "description": "League/tour slug, e.g. 'mls', 'mlb', 'nfl', 'atp', 'wta'.", "type": [ "string", "null" ] }, "match": { "description": "Tennis only. Match context: surface, competition_id/name, tier, round (ingested labels like 'Round of 16'/'Quarterfinal'/'Final', not 'R16'), court (not currently populated), status, result_type, scoreboard (sets_won + per-set games; tiebreak_score not currently populated).", "type": [ "object", "null" ] }, "neutral_site": { "description": "Soccer only. Whether this fixture is at a neutral venue. Informational here; factored into home-advantage scoring on get_intelligence.", "type": [ "boolean", "null" ] }, "players": { "description": "Tennis only (player_1/player_2). Each side: player_id, name, country_code, ranking, ranking_points, rest_days, recent_form, surface_form, record (tour_lookback wins/losses), career_rates (Stage-2 serve/return percentages; null until ingest), career_surface (Stage-2 match-surface W/L over windows.career_surface_years; null when empty). History windows exclude walkovers (unplayed) and include retirements.", "type": [ "object", "null" ] }, "profile": { "description": "Soccer only. 'world_cup' or 'club'.", "type": "string" }, "teams": { "description": "Soccer/MLB/NFL/NCAAF/NBA/NCAAB/NHL only (home/away). Each side includes image_url (Lumify media URL, null until ingest; never a vendor CDN). Soccer: recent_form, team_strength, venue, rest_days, sos, lineup, rates_l5, rates_season. MLB: record, recent_form, rest_days, rates_l5/rates_season (incl. OBP/SLG/OPS/RBI/TB), starting_pitcher (post-box only), lineup, player_box (this event's per-player batting/pitching counting stats; final, in-progress, and delayed when rows exist). NFL/NCAAF: record (points_for/against), recent_form (points_scored/allowed), rest_days, rates_l5/rates_season (total/passing/rushing yards, attempts, turnovers, third_down_pct), player_box (one players[] line per athlete with passing/rushing/receiving/defense/kicking counts; final, in-progress, and delayed when rows exist). NBA/NCAAB: record (points_for/against), recent_form (points_scored/allowed), rest_days, rates_l5/rates_season (rebounds/assists/steals/blocks/turnovers/fouls, fg_pct/three_point_pct/free_throw_pct as ratio-of-sums), player_box (points/rebounds/assists/…; final, in-progress, and delayed when rows exist). NHL: record (goals_for/against), recent_form (goals_scored/allowed), rest_days, rates_l5/rates_season (shots_on_goal/hits/penalty_minutes/power_play_goals/giveaways/takeaways/blocked_shots), player_box (skaters[] + goalies[]; assists/hits remapped from assists_nhl/hits_nhl; final, in-progress, and delayed when rows exist). Settleables stay on get_player_props. Absent on tennis responses — use players instead.", "type": [ "object", "null" ] }, "windows": { "description": "Explicit sample depths. Soccer: recent_form (5), rates_l5 (5), rates_season ('season'), head_to_head (10), sos (5). MLB/NFL/NCAAF/NBA/NCAAB/NHL: recent_form (5), rates_l5 (5), rates_season ('season'), head_to_head (10). Tennis: recent_form (10), surface_form (10), head_to_head (10), record_lookback_days (365), career_surface_years (3).", "type": [ "object", "null" ] } }, "type": "object" } }, { "description": "Get a single team profile with its home venue. Raises a not-found error if team_id doesn't exist. Resolve ids via list_teams.", "inputSchema": { "properties": { "team_id": { "description": "Team id, from list_teams.", "type": "integer" } }, "required": [ "team_id" ], "type": "object" }, "name": "get_team", "outputSchema": { "properties": { "abbreviation": { "type": [ "string", "null" ] }, "city": { "type": [ "string", "null" ] }, "conference": { "type": [ "string", "null" ] }, "division": { "type": [ "string", "null" ] }, "id": { "type": "integer" }, "image_url": { "description": "Lumify media URL for the team logo (https://lumify.ai/media/teams/{sport}/{id}.png). Null until ingest. Never a vendor CDN.", "type": [ "string", "null" ] }, "is_active": { "type": "boolean" }, "league": { "type": [ "string", "null" ] }, "name": { "type": "string" }, "slug": { "type": "string" }, "sport": { "type": "string" }, "venue": { "type": [ "object", "null" ] } }, "type": "object" } }, { "description": "Get team-total lines and live progress for an NFL, NCAAF, MLB, or soccer event. Joins persisted Pinnacle team-total mains (each team's full-game points/runs/goals Over/Under) to this-event participant scores and grades over/under/push. GET /odds / get_odds stay on moneyline/spread/total. Returns available:false with no charge if no team-total mains have been ingested. Other sports return HTTP 400.", "inputSchema": { "properties": { "event_id": { "description": "Event id, from list_events, query_events, or search results.", "type": "integer" } }, "required": [ "event_id" ], "type": "object" }, "name": "get_team_props", "outputSchema": { "properties": { "available": { "description": "False when no team-total mains have been ingested; team_props is empty and the call isn't billed.", "type": "boolean" }, "clock": { "description": "Game clock from the live score snapshot.", "type": [ "string", "null" ] }, "event_id": { "description": "Lumify event ID.", "type": "integer" }, "period": { "description": "Current period from the live score snapshot.", "type": [ "string", "null" ] }, "sport": { "description": "Sport slug: nfl, ncaaf, mlb, or soccer.", "type": [ "string", "null" ] }, "status": { "description": "Event status (scheduled, inprogress, delayed, final, …).", "type": [ "string", "null" ] }, "team_props": { "description": "One row per (team, line). Fields: team, team_id, side (home/away), market (team_total), line, current (this-event team score), pct_of_line, settleable, result (in_progress / over / under / push, or null), books ({book_slug: {over, under}} American prices).", "items": { "type": "object" }, "type": "array" } }, "type": "object" } }, { "description": "Grade settleable player-prop legs (over / under / push / in_progress / dnp / no_stat) for nfl, nba, ncaaf, ncaab, nhl, mlb, and soccer — the same sport coverage as get_player_props — plus structured game markets (h2h / spreads / totals) on any sport get_odds already settles. Prefer structured event_id + market_key + side; player_id and line are required on props, line is required on spreads/totals, and both player_id and line are omitted on h2h. team_total requires team_id + line + over/under and is only gradable on nfl/ncaaf/mlb/soccer. draw is only gradable on soccer h2h — off soccer it comes back unmapped. Free-text game phrases (Chiefs -3.5, Over 47.5 vs Bills, Yankees ML, Yankees to win, Yankees over 4.5 runs, Over 52.5 Syracuse vs Pittsburgh, Novak Djokovic ML) grade when the team or player and event resolve uniquely — Over 47.5 alone stays unmapped and is never the first slate game. A tennis moneyline leftover is a player, not a team; vs is the opponent player. Last-name-only tennis stays unmapped. A last-name-only player prop (Bergeron over 1.5 shots on goal last night) grades when a date is present and that surname is unique in scope — a named sport, team, or event narrows it (Johnson nhl last night); with no such clue, uniqueness is across every prop sport the key can see. No date, or a surname shared by more than one player in that scope, stays unmapped unless a date is present and exactly one of those candidates played in the window (optionally vs a named opponent). A colliding team nickname plus a date promotes only the unique in-window club; a football-sized line will not pick a baseball club. anytime goal / anytime assist (soccer_goals/soccer_assists over 0.5) and over a hit / over a homer (hits/home_runs over 1.0) need no explicit number. Free-text player props are graded only when player and event resolve uniquely — never guesses an ambiguous name. A roster-team mention (CIN, Niners) is resolved first; unique team_id scopes the player, and ambiguous/not_found stays on team_resolve. vs/at on a player prop is the opponent and narrows the event, not the player's team. Ambiguous events stay on event_resolve with candidates. Read legs[].result / current / market for the grade; use resolve.player_id to re-issue structured props. Call this tool with an API key to grade from an agent. Capped at 3 concurrent calls per key (shared with POST /v1/grade/slip). The public /grade sheet uses the same engine without a key (20 grades / IP / day). How-to: https://lumify.ai/docs/grade. Not live trading odds. Not wagering advice. Attribution is always Graded by Lumify.", "inputSchema": { "properties": { "clues": { "description": "Optional sport / league / event_id / team_id / team_text hints for free-text mode.", "properties": { "event_id": { "type": "integer" }, "league": { "type": "string" }, "sport": { "type": "string" }, "team_id": { "type": "integer" }, "team_text": { "type": "string" } }, "type": "object" }, "legs": { "items": { "properties": { "event_id": { "type": "integer" }, "line": { "description": "Required on props, spreads, totals, and team_total. Omit on h2h. Signed to the submitted side, not the favorite — side=home with a home -3.5 favorite is line=-3.5.", "type": "number" }, "market_key": { "description": "Player-prop slug (e.g. receiving_yards), game market h2h | spreads | totals, or team_total. Aliases accepted: player_reception_yds -> receiving_yards, moneyline/ml -> h2h, spread -> spreads, total/ou -> totals, team totals/tt -> team_total.", "type": "string" }, "player_id": { "description": "Required on player-prop markets. Forbidden on h2h, spreads, totals, and team_total.", "type": "integer" }, "side": { "description": "Props and totals: over | under (o | u also accepted). Spreads: home | away, matching the signed line above. Moneyline: home | away, or draw on soccer only.", "enum": [ "home", "away", "over", "under", "draw" ], "type": "string" }, "team_id": { "description": "Required on team_total. Forbidden on player-prop, h2h, spreads, and totals.", "type": "integer" } }, "required": [ "event_id", "market_key", "side" ], "type": "object" }, "maxItems": 8, "type": "array" }, "text": { "description": "Free-text slip (e.g. Chase over 74.5 receiving yards tonight, or Chiefs -3.5 / Over 47.5 vs Bills / Yankees ML / Yankees to win / Yankees over 4.5 runs / Over 52.5 Syracuse vs Pittsburgh / Novak Djokovic ML / Mbappe anytime goal / Judge over a hit / Bergeron over 1.5 shots on goal last night). Date words (today, tonight, yesterday, last night, last Wednesday, this Thursday, or an ISO date) narrow the event. A roster-team span is resolved first; unique team_id scopes a player or binds a game/team-total leg, and ambiguous/not_found stays on team_resolve. vs/at on a player prop is the opponent, not the player's team. A tennis moneyline leftover is a player; vs is the opponent player. \"anytime goal\"/\"anytime assist\" implies soccer_goals/soccer_assists over 0.5 with no explicit number; \"over a hit\"/\"over a homer\" implies hits/home_runs over 1.0. A last-name-only player prop grades when a date is present and the surname is unique in scope (a named sport, team, or event narrows it; otherwise every visible prop sport); no date, or a shared surname in that scope, still refuses. Graded only when team/player and event are unique. A bare Over 47.5 stays unmapped.", "type": "string" } }, "type": "object" }, "name": "grade_slip", "outputSchema": { "properties": { "branding": { "type": "object" }, "honesty": { "type": "object" }, "legs": { "items": { "type": "object" }, "type": "array" }, "slip_id": { "type": [ "string", "null" ] }, "status": { "description": "graded | partial | pending | unmapped", "type": "string" }, "summary": { "type": "object" } }, "type": "object" } }, { "description": "Beta. List pregame main-line +EV opportunities for a predictive-framework sport (soccer, mlb, tennis, nfl, ncaaf), sorted by ev_pct descending. market=h2h (default, moneyline), spreads, or totals. Tennis totals are not offered (Stage 1 is moneyline + spreads). Same gates as bets[].ev on get_intelligence: sharp-fair price gap, positive and ≤25%, suppressed MLB moneyline null books skipped in favor of the next eligible book. 1 credit. Field catalog: https://lumify.ai/docs/reference#intelligence-ev", "inputSchema": { "properties": { "book": { "description": "Restrict opportunities to one sportsbook slug (e.g. fanduel).", "type": "string" }, "league": { "description": "Optional league slug (mls, epl, atp, …). Soccer without a league scans every published soccer league (MLS + big-five).", "type": "string" }, "limit": { "description": "Max opportunities to return (1–200). Default 50.", "type": "integer" }, "market": { "description": "Main-line family: h2h (default, moneyline), spreads, or totals. Tennis + totals returns 400.", "enum": [ "h2h", "spreads", "totals" ], "type": "string" }, "min_ev": { "description": "Minimum EV% to include. Default 0. Clamped to 0–25.", "type": "number" }, "sport": { "description": "Sport slug: soccer, mlb, tennis, nfl, or ncaaf.", "type": "string" } }, "required": [ "sport" ], "type": "object" }, "name": "list_ev", "outputSchema": { "properties": { "beta": { "description": "Always true.", "type": "boolean" }, "book": { "description": "Book filter, or null.", "type": [ "string", "null" ] }, "league": { "description": "League filter, or null for the whole sport.", "type": [ "string", "null" ] }, "market": { "description": "h2h, spreads, or totals — the family scanned.", "type": "string" }, "max_ev": { "description": "Stale-line cap (25).", "type": "number" }, "min_ev": { "description": "Minimum EV% applied.", "type": "number" }, "opportunities": { "description": "Positive-EV main-line rows: {event_id, sport, league, commence_time, home_team, away_team, side, team, bet_type, line, fair_probability, ev}.", "items": { "type": "object" }, "type": "array" }, "sport": { "description": "Sport slug this scan was run for.", "type": "string" }, "total": { "description": "Count of opportunities on this page.", "type": "integer" } }, "type": "object" } }, { "description": "List events (schedules and live scores), paginated by id (after_id). Filter by sport, league, status, date range, season, or team_id (resolve teams via list_teams / get_team). Returns event id, name, sport/league, start time, status, and venue for each; pass include_scores to also inline participants + scores (intended for small result sets — use get_event for one event's full detail, or query_events for free-text/natural-language filters instead of structured params). include_scores shares the 20/min score-poll budget with get_live_score; prefer the SSE stream for live boards.", "inputSchema": { "properties": { "after_id": { "description": "Cursor: return events with id > after_id (from the previous page's next_after_id).", "type": "integer" }, "date": { "description": "UTC date YYYY-MM-DD (single day).", "type": "string" }, "from": { "description": "UTC start date YYYY-MM-DD.", "type": "string" }, "has_recommend": { "description": "When true, only events with at least one recommended bet.", "type": "boolean" }, "include_scores": { "default": false, "description": "Inline participants + scores in each event (intended for small result sets). Shares the 20/min score-poll budget with get_live_score.", "type": "boolean" }, "league": { "description": "League slug, e.g. nfl, atp, mls.", "type": "string" }, "limit": { "default": 25, "description": "Max events to return per page.", "maximum": 100, "minimum": 1, "type": "integer" }, "season_id": { "description": "Filter by season ID (from list_seasons).", "type": "integer" }, "sort": { "default": "time", "description": "Sort order. sort=status is incompatible with after_id.", "enum": [ "time", "status" ], "type": "string" }, "sport": { "description": "Sport slug, e.g. mlb, nfl, tennis, soccer.", "type": "string" }, "status": { "description": "Filter to events in this status.", "enum": [ "scheduled", "inprogress", "final", "postponed", "cancelled", "suspended", "delayed", "walkover" ], "type": "string" }, "team_id": { "description": "Filter to events where this team participates. Resolve ids via list_teams.", "type": "integer" }, "to": { "description": "UTC end date YYYY-MM-DD (inclusive).", "type": "string" } }, "type": "object" }, "name": "list_events", "outputSchema": { "$defs": { "EventSummary": { "properties": { "clock": { "type": [ "string", "null" ] }, "id": { "type": "integer" }, "inprogress_since": { "description": "ISO-8601 UTC when status first became inprogress (first live tick). Null until then; stays set after final.", "type": [ "string", "null" ] }, "league": { "type": "string" }, "name": { "type": "string" }, "period": { "type": [ "string", "null" ] }, "season_id": { "type": [ "integer", "null" ] }, "sport": { "type": "string" }, "starts_at": { "description": "ISO-8601 UTC start time.", "type": "string" }, "status": { "type": "string" }, "venue": { "type": [ "object", "null" ] } }, "type": "object" } }, "properties": { "events": { "items": { "$ref": "#/$defs/EventSummary" }, "type": "array" }, "next_after_id": { "description": "Pass as after_id to fetch the next page; null on the last page.", "type": [ "integer", "null" ] }, "total": { "type": "integer" } }, "type": "object" } }, { "description": "Daily board of forecasted wagers from Lumify's model — a prediction, not a beat-the-market claim (no OOS/independence gate; see list_ev for the gated main-line +EV claim). Player props (rate model) on MLB, NCAAF, NFL, NBA, NCAAB, NHL. 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. Tennis moneyline is ranking Bradley-Terry; tennis spreads/totals are a Normal-approx games model. Other sports use the published assessment probability. Each wager has p_hit, conviction, and posted books prices. Use list_ev to scan main lines by sharp-fair price gap; use this tool to scan high-probability forecasts. reliability is emerging on v0. 1 credit; empty slate is still 200. How + field catalog: https://lumify.ai/docs/forecasts Worked wager: https://lumify.ai/docs/understanding-odds#forecasts", "inputSchema": { "properties": { "date": { "description": "UTC slate date YYYY-MM-DD. Defaults to today UTC.", "type": "string" }, "limit": { "description": "Max wagers (1–100). Default 25.", "type": "integer" }, "market": { "description": "Main-line family filter (h2h, spreads, or totals). Main-line sports publish a high-confidence side of each family when the lean clears the coin-flip gate. Ignored on prop-only sports (nba, ncaab, nhl).", "enum": [ "h2h", "spreads", "totals" ], "type": "string" }, "sport": { "description": "Sport slug: mlb, ncaaf, nfl, nba, ncaab, nhl, tennis, or soccer.", "type": "string" } }, "required": [ "sport" ], "type": "object" }, "name": "list_forecasts", "outputSchema": { "properties": { "date": { "description": "UTC slate date (YYYY-MM-DD).", "type": "string" }, "model_version": { "description": "Scorer version (forecast-v0).", "type": "string" }, "reliability": { "description": "Default badge on this slate. v0 ships emerging; each wager repeats the same field.", "type": "string" }, "sport": { "description": "Sport slug this slate was scored for.", "type": "string" }, "total": { "description": "Count of wagers on this page.", "type": "integer" }, "wagers": { "description": "Selected forecasted wagers, highest conviction first. Read p_hit as P(the picked outcome — side on prop rows, bet_type on main-line rows — hits); conviction is the board rank. How + field catalog: https://lumify.ai/docs/forecasts", "items": { "properties": { "away_team": { "description": "Away team display name. Slate only.", "type": [ "string", "null" ] }, "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 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).", "type": [ "string", "null" ] }, "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.", "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 measured rate/rating behind the pick and effect as how far it lifts the chosen outcome versus a baseline.", "items": { "properties": { "direction": { "description": "up / down / neutral from the sign of effect.", "type": "string" }, "effect": { "description": "Signed shift in p_hit versus a baseline case on the same line. 0.0 on yardage markets.", "type": "number" }, "id": { "description": "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.", "type": "string" }, "input": { "description": "Measured rate/rating behind this driver, in native units.", "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 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.", "type": [ "number", "null" ] }, "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/rushing/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 (bet_type set): the main-line family — h2h, spreads, or totals.", "type": "string" }, "model_version": { "description": "Scorer version, e.g. forecast-v0.", "type": "string" }, "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.", "type": "number" }, "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).", "type": [ "string", "null" ] }, "player_id": { "description": "Lumify player ID. Bound by exact / Jr-stripped name match. Null on main-line rows with no player attribution.", "type": [ "integer", "null" ] }, "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).", "type": [ "string", "null" ] }, "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 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 — 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. 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": "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.", "type": [ "string", "null" ] }, "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" } }, "type": "object" } }, { "description": "List seasons per sport/league. By default returns only currently active seasons; pass current_only=false to include historical seasons. Optionally filter by sport. Returns each season's id, year, phase, start/end dates, and whether it is_current. Use list_sports for just each sport's current season.", "inputSchema": { "properties": { "current_only": { "default": true, "description": "Return only currently active seasons (default true). Pass false for historical seasons.", "type": "boolean" }, "sport": { "description": "Filter by sport slug, e.g. nhl, nba, soccer.", "type": "string" } }, "type": "object" }, "name": "list_seasons", "outputSchema": { "properties": { "seasons": { "items": { "properties": { "end_date": { "type": [ "string", "null" ] }, "id": { "type": "integer" }, "is_current": { "type": "boolean" }, "league": { "type": "object" }, "name": { "type": [ "string", "null" ] }, "phase": { "type": [ "string", "null" ] }, "sport": { "type": "object" }, "start_date": { "type": [ "string", "null" ] }, "year": { "type": [ "integer", "null" ] } }, "type": "object" }, "type": "array" }, "total": { "type": "integer" } }, "type": "object" } }, { "description": "List supported sports with their leagues and current season. Returns each sport's id, slug, name, team-sport flag, and its leagues (each with its current_season). Use list_seasons with current_only=false for historical seasons.", "inputSchema": { "properties": { "active_only": { "default": true, "description": "When true (default), omit sports with no active coverage.", "type": "boolean" } }, "type": "object" }, "name": "list_sports", "outputSchema": { "properties": { "sports": { "items": { "properties": { "id": { "type": "integer" }, "is_team_sport": { "type": "boolean" }, "leagues": { "items": { "properties": { "current_season": { "type": [ "object", "null" ] }, "id": { "type": "integer" }, "name": { "type": "string" }, "slug": { "type": "string" } }, "type": "object" }, "type": "array" }, "name": { "type": "string" }, "slug": { "type": "string" } }, "type": "object" }, "type": "array" }, "total": { "type": "integer" } }, "type": "object" } }, { "description": "List teams, paginated by id (after_id). Filter by sport, league, conference, division, country, active status, or name (q, partial match). Returns each team's id, slug, name, city, conference/division, venue, and image_url (Lumify media URL, null until ingest). Use get_team for full detail on one id once resolved here.", "inputSchema": { "properties": { "active": { "description": "Filter by active status.", "type": "boolean" }, "after_id": { "description": "Cursor: last team id from the previous page's next_after_id.", "type": "integer" }, "conference": { "description": "Conference name, e.g. AFC, Eastern.", "type": "string" }, "country": { "description": "ISO country code, e.g. USA.", "type": "string" }, "division": { "description": "Division name, e.g. AFC East.", "type": "string" }, "league": { "description": "League slug, e.g. nfl, mls.", "type": "string" }, "limit": { "default": 25, "description": "Max teams to return per page.", "maximum": 100, "minimum": 1, "type": "integer" }, "q": { "description": "Team name search (partial match).", "type": "string" }, "sport": { "description": "Sport slug, e.g. nfl, nba, soccer.", "type": "string" } }, "type": "object" }, "name": "list_teams", "outputSchema": { "$defs": { "Team": { "properties": { "abbreviation": { "type": [ "string", "null" ] }, "city": { "type": [ "string", "null" ] }, "conference": { "type": [ "string", "null" ] }, "country_code": { "type": [ "string", "null" ] }, "division": { "type": [ "string", "null" ] }, "id": { "type": "integer" }, "image_url": { "description": "Lumify media URL for the team logo (https://lumify.ai/media/teams/{sport}/{id}.png). Null until ingest. Never a vendor CDN.", "type": [ "string", "null" ] }, "is_active": { "type": "boolean" }, "league": { "type": [ "string", "null" ] }, "name": { "type": "string" }, "short_name": { "type": [ "string", "null" ] }, "slug": { "type": "string" }, "sport": { "type": "string" }, "state": { "type": [ "string", "null" ] }, "venue": { "type": [ "object", "null" ] } }, "type": "object" } }, "properties": { "data": { "items": { "$ref": "#/$defs/Team" }, "type": "array" }, "has_more": { "type": "boolean" }, "next_after_id": { "description": "Pass as after_id to fetch the next page; null on the last page.", "type": [ "integer", "null" ] } }, "type": "object" } }, { "description": "Search events with a natural-language query instead of structured filters — e.g. 'live nfl games today' or 'college basketball this week'. Rule-based (not an LLM): recognizes sport (nfl/nba/mlb/nhl/tennis/soccer/ncaaf/ncaab + aliases like hockey, american football, college basketball), status (live/final/upcoming/…), dates (today/tomorrow, this week, next N days, YYYY-MM-DD ranges). Bare 'football' is ambiguous and left unrecognized. Response includes interpreted filters, equivalent REST call, and unrecognized_terms. Prefer list_events when you already know the structured filters you want.", "inputSchema": { "properties": { "limit": { "description": "Overrides any limit parsed from the query text. Max 100.", "type": "integer" }, "query": { "description": "Free text, e.g. 'live nfl games today'.", "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "query_events", "outputSchema": { "properties": { "equivalent_request": { "description": "The literal GET /v1/events request this query was translated to.", "type": "string" }, "events": { "items": { "type": "object" }, "type": "array" }, "interpreted": { "description": "The list_events-equivalent filters parsed from the query text (sport, status, date, from, to, limit).", "type": "object" }, "next_after_id": { "type": [ "integer", "null" ] }, "query": { "description": "The original natural-language query text.", "type": "string" }, "total": { "type": "integer" }, "unrecognized_terms": { "description": "Query words that didn't map to a known filter.", "items": { "type": "string" }, "type": "array" } }, "type": "object" } }, { "description": "Resolve event identity from an event_id, or a player_id/team_id clue plus an optional date window, to a Lumify event_id. Falls back to a player's roster team schedule for team sports (only individual sports like tennis track per-player game participation directly). Combine team_id + opponent_team_id for a specific matchup. Returns ambiguous instead of guessing when the window has more than one candidate — never auto-pick candidates[0].", "inputSchema": { "properties": { "clues": { "description": "event_id (ground truth), or player_id/team_id plus a date window.", "properties": { "end_date": { "description": "UTC YYYY-MM-DD. Requires start_date.", "type": "string" }, "event_id": { "type": "integer" }, "opponent_team_id": { "description": "Requires team_id or player_id.", "type": "integer" }, "player_id": { "type": "integer" }, "start_date": { "description": "UTC YYYY-MM-DD. Requires end_date.", "type": "string" }, "team_id": { "type": "integer" } }, "type": "object" }, "options": { "properties": { "max_candidates": { "default": 5, "maximum": 25, "minimum": 1, "type": "integer" }, "min_confidence": { "default": 0.85, "maximum": 1, "minimum": 0, "type": "number" } }, "type": "object" } }, "type": "object" }, "name": "resolve_event", "outputSchema": { "properties": { "away_team": { "type": [ "string", "null" ] }, "candidates": { "items": { "type": "object" }, "type": "array" }, "clues_used": { "items": { "type": "string" }, "type": "array" }, "confidence": { "type": [ "number", "null" ] }, "event_id": { "type": [ "integer", "null" ] }, "event_status": { "type": [ "string", "null" ] }, "home_team": { "type": [ "string", "null" ] }, "league": { "type": [ "string", "null" ] }, "match_reasons": { "items": { "type": "string" }, "type": "array" }, "message": { "type": [ "string", "null" ] }, "method": { "type": [ "string", "null" ] }, "participant_conflict": { "type": "boolean" }, "sport": { "type": [ "string", "null" ] }, "starts_at": { "type": [ "string", "null" ] }, "status": { "description": "resolved | ambiguous | not_found | error", "type": "string" } }, "type": "object" } }, { "description": "Resolve messy sports player names to a Lumify player_id using sport, team, or event clues. Prefer this before grade_slip when the name is a fragment, initial, or nickname. Returns ambiguous instead of guessing — never auto-pick candidates[0]. A sport-scoped key binds the in-scope side of a collision and returns not_found when every hit is out of scope. Does not grade props.", "inputSchema": { "properties": { "clues": { "description": "Optional sport, team, event, or position clues.", "properties": { "event_id": { "type": "integer" }, "position": { "type": "string" }, "sport": { "description": "Sport slug, e.g. nfl.", "type": "string" }, "team_id": { "type": "integer" }, "team_text": { "description": "Team abbreviation, slug, or name.", "type": "string" }, "vendor": { "type": "string" }, "vendor_player_key": { "type": "string" } }, "type": "object" }, "options": { "properties": { "max_candidates": { "default": 5, "maximum": 25, "minimum": 1, "type": "integer" }, "min_confidence": { "default": 0.85, "maximum": 1, "minimum": 0, "type": "number" }, "mode": { "default": "strict", "enum": [ "strict", "permissive", "ingest" ], "type": "string" } }, "type": "object" }, "query": { "description": "Messy player name or fragment, e.g. J. Chase.", "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "resolve_player", "outputSchema": { "properties": { "candidates": { "items": { "type": "object" }, "type": "array" }, "clues_used": { "items": { "type": "string" }, "type": "array" }, "confidence": { "type": [ "number", "null" ] }, "display_name": { "type": [ "string", "null" ] }, "match_reasons": { "items": { "type": "string" }, "type": "array" }, "message": { "type": [ "string", "null" ] }, "player_id": { "type": [ "integer", "null" ] }, "sport": { "type": [ "string", "null" ] }, "status": { "description": "resolved | ambiguous | not_found | error", "type": "string" }, "team_id": { "type": [ "integer", "null" ] } }, "type": "object" } }, { "description": "Resolve messy team names, abbreviations, metros, or aliases to a Lumify team_id using sport, league, event, or player clues. Prefer this before list_teams when the string is a nickname or city token. Returns ambiguous instead of guessing — never auto-pick candidates[0]. City-only metros sit below the auto-resolve floor.", "inputSchema": { "properties": { "clues": { "description": "Optional sport, league, event, player, or team-id clues.", "properties": { "event_id": { "type": "integer" }, "league": { "description": "League slug, e.g. mls.", "type": "string" }, "player_id": { "type": "integer" }, "sport": { "description": "Sport slug, e.g. nfl.", "type": "string" }, "team_id": { "type": "integer" } }, "type": "object" }, "options": { "properties": { "max_candidates": { "default": 5, "maximum": 25, "minimum": 1, "type": "integer" }, "min_confidence": { "default": 0.85, "maximum": 1, "minimum": 0, "type": "number" } }, "type": "object" }, "query": { "description": "Team string, e.g. Niners, CIN, NY Giants.", "type": "string" } }, "type": "object" }, "name": "resolve_team", "outputSchema": { "properties": { "abbreviation": { "type": [ "string", "null" ] }, "candidates": { "items": { "type": "object" }, "type": "array" }, "clues_used": { "items": { "type": "string" }, "type": "array" }, "confidence": { "type": [ "number", "null" ] }, "display_name": { "type": [ "string", "null" ] }, "league": { "type": [ "string", "null" ] }, "match_reasons": { "items": { "type": "string" }, "type": "array" }, "message": { "type": [ "string", "null" ] }, "method": { "type": [ "string", "null" ] }, "sport": { "type": [ "string", "null" ] }, "sport_conflict": { "type": "boolean" }, "status": { "description": "resolved | ambiguous | not_found | error", "type": "string" }, "team_id": { "type": [ "integer", "null" ] } }, "type": "object" } }, { "description": "Search players by name, sport, country, ranking, or active status, paginated by id (after_id). Returns the same identity object on every sport (null means unknown, not wrong sport). Tennis standings nest under rankings.{singles, points}; rankings is null on every other sport. Use get_player for full detail on one id, or get_player_events for a player's schedule/results.", "inputSchema": { "properties": { "active": { "description": "Filter by active status.", "type": "boolean" }, "after_id": { "description": "Cursor: last player id from the previous page's next_after_id.", "type": "integer" }, "country": { "description": "ISO 3166-1 alpha-3 country code, e.g. USA.", "type": "string" }, "limit": { "default": 25, "description": "Max players to return per page.", "maximum": 100, "minimum": 1, "type": "integer" }, "q": { "description": "Name search (partial match).", "type": "string" }, "ranked": { "description": "If true, only tennis players with an ATP/WTA singles ranking (rankings.singles).", "type": "boolean" }, "sport": { "description": "Sport slug, e.g. tennis, nba.", "type": "string" } }, "type": "object" }, "name": "search_players", "outputSchema": { "$defs": { "Player": { "properties": { "birthdate": { "description": "YYYY-MM-DD date of birth.", "type": [ "string", "null" ] }, "country_code": { "description": "ISO 3166-1 alpha-3 country code.", "type": [ "string", "null" ] }, "current_team_id": { "description": "Lumify team ID when the player is on a club roster. Null for tennis.", "type": [ "integer", "null" ] }, "current_team_name": { "description": "Current team display name. Null for tennis.", "type": [ "string", "null" ] }, "first_name": { "type": [ "string", "null" ] }, "full_name": { "description": "Display name.", "type": "string" }, "handedness": { "description": "left | right | switch. Meaning is sport-specific (bats for MLB, shoots for NHL, playing hand for tennis). Null when unknown.", "type": [ "string", "null" ] }, "height_cm": { "description": "Height in centimetres. Null when not ingested.", "type": [ "integer", "null" ] }, "id": { "description": "Lumify player ID.", "type": "integer" }, "image_url": { "description": "Lumify media URL for the player headshot (https://lumify.ai/media/players/{sport}/{id}.{ext}). Null until the sport's headshot/enrichment job. Never a vendor CDN.", "type": [ "string", "null" ] }, "is_active": { "description": "False when deactivated or retired.", "type": "boolean" }, "last_name": { "type": [ "string", "null" ] }, "position": { "description": "Roster position abbreviation when the sport has one (e.g. C, P, SS for MLB; QB, WR for NFL). Null for tennis and when not yet ingested.", "type": [ "string", "null" ] }, "rankings": { "description": "Sport ranking block. Tennis: {singles, points} from ATP/WTA standings. Null for every other sport. Tennis /stats also exposes ranking / ranking_points on the tennis player block.", "properties": { "points": { "description": "ATP/WTA ranking points. Tennis only.", "type": [ "integer", "null" ] }, "singles": { "description": "ATP/WTA singles ranking. Tennis only.", "type": [ "integer", "null" ] } }, "type": [ "object", "null" ] }, "retired_at": { "description": "YYYY-MM-DD retirement date when known.", "type": [ "string", "null" ] }, "slug": { "description": "URL-safe unique slug.", "type": "string" }, "sport": { "description": "Sport slug, e.g. mlb, tennis, nfl.", "type": "string" }, "weight_kg": { "description": "Weight in kilograms. Null when not ingested.", "type": [ "number", "null" ] } }, "type": "object" } }, "properties": { "data": { "items": { "$ref": "#/$defs/Player" }, "type": "array" }, "has_more": { "type": "boolean" }, "next_after_id": { "description": "Pass as after_id to fetch the next page; null on the last page.", "type": [ "integer", "null" ] } }, "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:8f8055dbc599d094bc066deb572e4248a19b995c1d29c7889974f29145eec240 | sha256sum