Lumify Sports Intelligence
Server Details
Schedules, scores, odds, splits & explainable AI bet confidence — 8+ sports, free instant key.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- lumifyai/lumify
- GitHub Stars
- 3
- Server Listing
- Lumify Sports Intelligence
Available Tools
25 toolsbatch_get_eventsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| bookmaker | No | 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, all. | |
| event_ids | Yes | Event ids to fetch (max 25); duplicates are billed once. | |
| include_odds | No | Inline current odds scoped by bookmaker (default: pinnacle). Does not add credits — each found event stays 1 credit. | |
| include_intelligence | No | Inline bet intelligence on each event. Does not add credits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| events | No | Full event detail (same shape as get_event) for every found id. |
| not_found | No | Requested event_ids that don't exist. Never billed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only, idempotent, and non-destructive. The description adds valuable behavioral detail beyond that: a 25-id max, full detail for existing ids plus a not_found list, and that missing ids are never billed. This extra operational context helps an agent predict side effects and cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences carry the primary purpose, constraints, billing behavior, output shape, and sibling routing. Every sentence earns its place, and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch-read tool with a rich output schema and annotations, the description covers everything needed to invoke it correctly: when to use it, max batch size, return behavior, and which sibling to use instead. No critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents event_ids, bookmaker, include_odds, and include_intelligence. The description adds the high-level batching/billing behavior but no per-parameter details beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description leads with a specific verb-resource pair ('Get multiple events by id in one call') and clearly distinguishes the batch operation from its single-id sibling get_event. It names the intended use case (agents that already have ids and want full detail) without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: when the agent already has a list of ids and wants full detail without per-event calls. It also names alternatives and the routing condition: use get_event for a single id, or list_events / query_events to discover ids first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_costARead-onlyIdempotentInspect
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}}.
| Name | Required | Description | Default |
|---|---|---|---|
| calls | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| estimates | No | |
| total_max_credits | No | |
| total_min_credits | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds valuable behavioral detail: no credits are spent, results are a [min_credits, max_credits] range, costs are data-dependent, and specific free-call cases are given. This goes well beyond the structured safety hints and enriches the agent's mental model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences accomplish all goals: purpose, behavior, and usage example. Nothing is redundant; every sentence carries essential information. The structure is front-loaded with the core function and then elaborates with context and a concrete example.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (array input, max 50 items) and the presence of an output schema, the description fully covers what an agent needs to invoke it correctly: the input format, the output format (range), and special cost edge cases. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by explaining the required 'calls' array structure, the 'tool' and 'arguments' fields, and providing a concrete JSON example. The agent knows exactly what to pass without needing to infer from a bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Estimate') and resource ('credit cost of planned tool calls'), making it unmistakable. It explicitly states 'before making them' and 'no credits are spent,' distinguishing it from all sibling tools that actually fetch data. This is a model of clear purpose differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly conveys when to use the tool (before executing calls, to estimate cost) and provides a usage example. However, it does not explicitly state when not to use it or name alternatives. The context makes the use case obvious, but explicit exclusion guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. | |
| bookmaker | No | 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, all. | |
| include_odds | No | Inline current odds scoped by bookmaker (default: pinnacle). Does not add credits — the event call stays 1 credit. | |
| include_intelligence | No | Inline bet intelligence. Does not add credits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| sport | No | |
| venue | No | |
| league | No | |
| status | No | |
| starts_at | No | |
| updated_at | No | |
| participants | No | |
| inprogress_since | No | ISO-8601 UTC when status first became inprogress (first live tick). Null until then; stays set after final. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by disclosing the not-found error behavior for invalid event_id and the credit/pricing behavior (1 credit, inlining adds no credits).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose and covering scope, error behavior, and routing in a tight order. Minor redundancy: the 'does not add credits' information is repeated in both the description and the parameter schema, and the phrase 'same 1 credit as the event call' is slightly awkward since this tool is itself the event call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, full param coverage, and safety annotations, the description covers the main operational details: high-level return contents, error behavior, id discovery, and batch alternative. A small gap is that it doesn't disambiguate when to inline odds/intelligence here versus calling sibling tools get_odds or get_intelligence directly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: event_id provenance, bookmaker defaults/valid values, and include_odds/include_intelligence credit behavior are all in the schema. The description mostly restates the credit aspect already present in the parameter descriptions, adding little new param meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource statement ('Get a single event with participants and venue') and marks this as the single-item variant, which distinguishes it from sibling batch_get_events. The optional inlining of odds and intelligence is also stated clearly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: use list_events / query_events to discover event ids first, and use batch_get_events for fetching several ids in one call. This names the alternatives and the conditions that select them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_injuriesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. | |
| exclude_status | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| event_id | No | |
| injuries | No | 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. |
| available | No | |
| confirmed_at | No | |
| next_check_at | No | |
| last_checked_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with annotations already marking readOnly/openWorld/idempotent, the description adds substantial behavioral detail: beta status, league coverage windows, the 'no charge' behavior before a first structured report, polling triggers, the absence of an in-game feed, and the non-effect of exclude_status on availability or credit. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes operational knowledge an agent needs. It is front-loaded with the primary purpose and then efficiently covers coverage, timing, webhooks, and parameter behavior without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is exceptionally complete for a complex data tool: it covers availability semantics, timing, charge behavior, update triggers, webhook subscription, limitations, and parameter nuances. The presence of an output schema means return-value documentation is handled elsewhere, so no essential calling context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds extra semantic value for exclude_status, explaining its purpose as dropping noisy long-standing designations and clarifying that it does not affect availability or credit, which is not evident from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get late-breaking player injury and availability status for an event,' naming a specific verb, resource, and scope. It also enumerates the specific statuses and fields returned, and it is clearly distinct from sibling tools like get_event or get_player because it targets injury intelligence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong contextual guidance: Beta coverage is limited to NFL and MLB, with specific monitoring windows and cadence. It also explains when the tool may return 'available:false' and directs users to webhooks for material/critical changes, though it does not explicitly contrast with alternative tools since no direct sibling exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_intelligenceARead-onlyIdempotentInspect
Get predictive bet intelligence for an event: vig-stripped probability, fair_price, Price overlay, main-line ev (Beta), and forecasts[] — forecasted wagers from the model (same objects as list_forecasts): player props plus tennis moneyline/spreads/totals. bets[] is live for MLB, tennis, soccer (MLS + big-five), NFL, and NCAAF. forecasts[] covers MLB, NFL, NCAAF, NBA, NCAAB, NHL, and tennis and can populate when available is false. Fair-price + line-shopping on bets[] today (edge/tier null; has_recommend false). bookmaker is ignored. Match-level tokens (OVER, UNDER, ML_DRAW) have null player/team attribution. Free only when available is false and forecasts is empty. Field catalog: https://lumify.ai/docs/reference#event-intelligence
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. | |
| bookmaker | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bets | No | |
| sport | No | Sport slug for this event. |
| league | No | League slug for this event, if any. |
| matchup | No | Not returned. Use get_stats for pitcher/lineup Data. |
| players | No | Home/away (or p1/p2) participant identification, keyed by role: {role: {name, player_id, team_id}}. |
| event_id | No | Lumify event ID this intelligence describes. |
| available | No | 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. |
| forecasts | No | Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows on team sports; tennis main-line via bet_type ML_P1/ML_P2 (moneyline), SPREAD_P1/SPREAD_P2 (game handicap), OVER/UNDER (total games). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts |
| rationale | No | 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. |
| odds_source | No | 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. |
| has_recommend | No | 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. |
| match_overview | No | 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. |
| intelligence_updated_at | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the readOnlyHint/idempotentHint annotations: bookmaker is ignored, match-level tokens have null player/team attribution, edge/tier are null, has_recommend is false, and forecasts[] can populate when available is false. These are the exact caveats an agent needs to interpret results correctly, and nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but information-dense: every clause covers a meaningful scope, caveat, or field behavior. It is not as cleanly structured as a bulleted field list, and it repeats bookmaker being ignored from the schema, but the complexity of the tool warrants most of the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core purpose, live sports coverage, forecast coverage, attribution null cases, pricing caveats, and even points to a field catalog link. Given the tool's complexity, an agent has enough context to invoke it correctly and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters at 100% coverage; event_id includes its source and bookmaker already states it is ignored with the valid values listed. The description adds little beyond the schema, so the schema-heavy baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get predictive bet intelligence for an event,' and then enumerates the concrete fields returned, such as vig-stripped probability, fair_price, and forecasts[]. It clearly distinguishes this tool from siblings like list_forecasts and get_event by describing its unique composite payload and by stating that bookmaker is ignored.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong contextual guidance about when the tool is relevant: it supports specific sports for bets[] and forecasts[] and even states a condition for free access ('Free only when available is false and forecasts is empty'). It does not explicitly say 'use list_forecasts instead of this tool when...', so it stops just short of fully spelled-out when-not alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_live_scoreARead-onlyIdempotentInspect
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. Raises a not-found error if event_id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| clock | No | |
| period | No | |
| scores | No | |
| status | No | |
| event_id | No | |
| finished | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description adds valuable context: 'Cheaper and faster' performance expectations and the 'not-found error' behavior. It also clarifies the lightweight nature and what fields are included, exceeding the structured metadata's coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main purpose, followed by usage and error info. Every sentence adds distinct value with no redundancy, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with output schema and strong annotations, the description covers purpose, usage, alternatives, and error behavior. It is complete and self-contained for an agent to correctly invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage for the single parameter event_id with a clear origin ('from list_events, query_events, or search results'). The description adds no new parameter-level semantics beyond what the schema already states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get a lightweight live score snapshot') with a clear resource ('an event') and enumerates exact contents (status, period, clock, scores, last-updated). It also distinguishes from sibling get_event by highlighting the scope difference, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool instead of get_event ('when you only need the score, not participants or venue') and notes the error condition for a non-existent event_id. This provides clear decision guidance relative to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_oddsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. | |
| bookmaker | No | Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, all, or a comma-separated list. | |
| include_alts | No | Include alternate spread/total rungs. Default false (mains only). |
Output Schema
| Name | Required | Description |
|---|---|---|
| event_id | No | |
| available | No | |
| bookmakers | No | 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. |
| last_updated | No | |
| fallback_bookmaker | No | The book actually returned when requested_bookmaker is present. |
| requested_bookmaker | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, open-world, idempotent, and non-destructive. The description adds substantial behavioral context beyond that: books with no recent quote are omitted, unavailable events return available:false with no charge, fallback bookmaker behavior is explained, and the result grading from pre-kickoff close is disclosed. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description carries operational information an agent needs: defaults, fallbacks, charge behavior, availability semantics, and sibling routing. Though the paragraph is dense, it is appropriately sized for the tool's complexity and front-loads the core purpose before edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema, the description covers all critical contextual gaps: live-event behavior, missing-odds handling, fallback selection rules, alternate markets, result grading, and fair_price availability. An agent selecting or invoking this tool has enough information to predict behavior across edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is already strong. The description goes much further by explaining default values ('bookmaker defaults to pinnacle'), the special 'all' and comma-separated syntax, the 1-credit guarantee across multiple books, and the interaction between include_alts and main lines. This adds meaning well beyond the raw parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get current betting odds for an event,' followed by the key outputs (per-bookmaker lines, last-updated time). It clearly differentiates from the sibling get_odds_history by explicitly routing line-movement queries there.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance, including behaviors for live events, post-event grading, unavailable odds, and fallback selection. It names get_odds_history as the alternative for line movement over time, making the choice between siblings unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_odds_historyARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max line-movement entries to return. Default 50. | |
| event_id | Yes | Event id, from list_events, query_events, or search results. | |
| bookmaker | No | Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, all, or a comma-separated list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| event_id | No | |
| movements | No | Odds snapshots over time; each entry carries its own timestamp. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a safe, read-only, idempotent operation. The description adds behavioral context by specifying that it returns a list of past snapshots, each with a timestamp, capped by the limit parameter, and noting the default bookmaker. This is useful context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the core purpose first, then important defaults, then the alternative tool. Every sentence earns its place and there is no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, explicit annotations, and an output schema, the description provides enough context for correct invocation. It covers the operation, the result shape, the limit behavior, the default bookmaker, and when to use a sibling tool instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents event_id, limit, and bookmaker. The description reinforces the meaning of limit ('up to limit entries') and mentions the bookmaker default, but it does not add substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: retrieving line-movement history for an event, i.e. past odds snapshots with timestamps. It explicitly distinguishes itself from get_odds, which returns only the current line, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names the alternative get_odds and gives the condition for choosing it instead: 'Use get_odds instead if you only need the current line.' This gives the agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_period_oddsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| clock | No | Game clock from the live score snapshot. |
| sport | No | Sport slug: nfl, ncaaf, nba, ncaab, mlb, soccer, or tennis. |
| period | No | Current period from the live score snapshot. |
| status | No | Event status (scheduled, inprogress, delayed, final, …). |
| event_id | No | Lumify event ID. |
| available | No | False when no first-half / first-five / first-set mains have been ingested; period_odds is empty and the call isn't billed. |
| period_odds | No | 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}}). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only/idempotent/non-destructive, and the description adds meaningful behavior beyond that: it joins persisted period mains to live scores, grades the period rather than the full game, explains the no-charge available:false state, and documents the HTTP 400 restriction. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place and the main purpose is front-loaded. The description is somewhat dense and the phrase 'GET /odds / get_odds' is slightly awkward, but overall it is efficiently structured for the amount of domain nuance it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of period definitions and sport-specific rules, the description is remarkably complete. It covers supported sports, how period scores are computed, the difference from full-game grades, the no-charge empty state, and the error case. With an output schema present, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage for the single required parameter, event_id, and already explains where it comes from. The description does not add parameter-specific detail, but the schema carries the full burden, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a specific resource ('first-half / first-five / first-set lines and live progress'), and the sports covered. It explicitly distinguishes itself from get_odds, which stays on moneyline/spread/total, so an agent can immediately tell what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says when to use this tool: when period-specific lines/progress are needed, not full-game odds. It names the alternative (GET /odds / get_odds) and gives exclusion signals such as 'Other sports return HTTP 400' and 'available:false with no charge if no period mains have been ingested.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playerARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| player_id | Yes | Player id, from search_players. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Lumify player ID. |
| slug | No | URL-safe unique slug. |
| sport | No | Sport slug, e.g. mlb, tennis, nfl. |
| position | No | 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. |
| rankings | No | 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. |
| birthdate | No | YYYY-MM-DD date of birth. |
| full_name | No | Display name. |
| height_cm | No | Height in centimetres. Null when not ingested. |
| image_url | No | 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. |
| is_active | No | False when deactivated or retired. |
| last_name | No | |
| weight_kg | No | Weight in kilograms. Null when not ingested. |
| first_name | No | |
| handedness | No | left | right | switch. Meaning is sport-specific (bats for MLB, shoots for NHL, playing hand for tennis). Null when unknown. |
| retired_at | No | YYYY-MM-DD retirement date when known. |
| country_code | No | ISO 3166-1 alpha-3 country code. |
| current_team_id | No | Lumify team ID when the player is on a club roster. Null for tennis. |
| current_team_name | No | Current team display name. Null for tennis. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses important runtime behavior: it raises a not-found error for invalid player_id, and it explains null semantics for rankings on non-tennis sports and image_url before enrichment. This gives the agent accurate expectations for edge cases and return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but well-structured and front-loaded. Every sentence earns its place: the first defines the tool and its output fields, the second states error behavior, and the third gives id resolution guidance. There is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single required parameter, a high-coverage schema, an output schema, and strong annotations, the description is complete. It covers the return payload's special cases, the error case, and how to obtain a valid player_id. An agent has everything needed to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents player_id with 100% coverage, including 'from search_players.' The description reinforces this by saying 'Resolve ids via search_players,' but it does not add meaningful new parameter semantics beyond what the schema provides. The error behavior is useful context but is more behavioral than parameter-specific.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get a single player identity profile', then enumerates the fields returned (name, sport, country, position/handedness, physical stats, current team, rankings, image_url). It clearly distinguishes from siblings like get_team, get_player_events, and get_player_props by scoping the tool to identity/profile data rather than events, odds, or props.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: to retrieve a single player's identity profile, and it explicitly routes id resolution via search_players. It does not explicitly state when not to use it or name alternatives for events/props, but the profile-scoped wording and the mention of search_players provide adequate guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_player_eventsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date YYYY-MM-DD. | |
| from | No | Start date YYYY-MM-DD. | |
| limit | No | Max events to return per page. | |
| status | No | Filter to events in this status. | |
| after_id | No | Cursor: last event id from the previous page's next_after_id. | |
| player_id | Yes | Player id, from search_players. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Events in the same shape as list_events' EventSummary. |
| has_more | No | |
| player_id | No | |
| next_after_id | No | Pass as after_id to fetch the next page; null on the last page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent. The description adds useful behavioral details: pagination by after_id and the default ±30-day date window when no filter is provided. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the core action. Every clause adds value: scope, pagination, default window, and prerequisite. Zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema and rich annotations, the description doesn't need to detail return format or safety. It covers core behavior, pagination, defaults, and the player_id prerequisite, making it complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters, including player_id origin and after_id cursor semantics. The description reiterates these but doesn't add substantially new parameter-level information beyond connecting the pagination flow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists a player's events, with 'player's' distinguishing it from broader event tools. The parenthetical (schedule/results) and pagination mention add specificity. This is a specific verb+resource+scope, meeting the top criteria.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: it's for retrieving a specific player's events, and instructs to resolve player_id via search_players first. However, it does not explicitly contrast with alternative event-listing tools like list_events or query_events, so it lacks explicit exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_player_propsARead-onlyIdempotentInspect
Get player-prop lines and live progress for an NFL, NCAAF, NBA, NCAAB, NHL, or MLB event. Joins persisted player-prop mains to this-event player box counts and grades over/under/push (1:1 slugs, combo sums, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| clock | No | Game clock from the live score snapshot. |
| sport | No | Sport slug: nfl, ncaaf, nba, ncaab, nhl, or mlb. |
| period | No | Current period from the live score snapshot. |
| status | No | Event status (scheduled, inprogress, delayed, final, …). |
| event_id | No | Lumify event ID. |
| available | No | False when no player-prop mains have been ingested; player_props is empty and the call isn't billed. |
| player_props | No | 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, or null), books ({book_slug: {over, under}} American prices). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only and idempotent behavior, but the description adds substantial non-obvious context: joining persisted prop mains to box counts, grading various prop types, returning available:false without charge when no prop mains exist, and rejecting unsupported sports. Nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place: sports scope, output contents, prop types covered, sibling distinction, no-charge behavior, and error handling are all stated with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An agent has enough information to call the tool correctly: which sports/events are valid, what categories of props are graded, when not to expect results, and which sibling tools to use instead. The presence of an output schema covers return structure, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents event_id, including its source from list_events, query_events, or search results. The description adds useful sport-level context but does not materially extend the meaning of the single parameter beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: retrieving player-prop lines and live progress, and enumerates the supported sports. It also differentiates itself from get_odds by explicitly saying that odds tools stay on moneyline/spread/total.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative tool category (GET /odds / get_odds) and clarifies that those tools cover moneyline/spread/total, making the selection boundary clear. It also explains the no-charge available:false case and the HTTP 400 behavior for unsupported sports.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prediction_marketsARead-onlyIdempotentInspect
Get prediction-market game-line probabilities for an NFL, NCAAF, NBA, NHL, MLB, soccer, or tennis event. Persist-then-read from Fanatics Markets, Kalshi, and Polymarket. Prices are implied probabilities in (0, 1] — never American odds and never the same surface as get_odds / GET /odds. Game-line contracts only (h2h / spreads / totals; soccer 1X2 as three outcomes). Returns available:false with no charge if no rows have been ingested. Other sports return HTTP 400. This is a price-input read, not a prediction-market trading product and not Edge.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sport | No | Sport slug: nfl, ncaaf, nba, nhl, mlb, soccer, or tennis. |
| venues | No | One block per venue (fanaticsmarkets, kalshi, polymarket). Each has venue, display_name, and markets[] of {key, point?, outcomes:[{label, probability, contract_id}]}. probability is in (0, 1]. |
| event_id | No | Lumify event ID. |
| available | No | False when no prediction-market rows have been ingested; venues is empty and the call isn't billed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation readOnly, idempotent, and non-destructive, and the description adds meaningful behavior beyond that: persist-then-read semantics, data sources, the no-charge available:false return on missing rows, HTTP 400 for other sports, and its nature as a price-input read rather than a trading product. This is rich, honest behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then delivers dense, non-redundant guidance: source providers, price format, contract scope, empty-result behavior, error behavior, and product positioning. Every sentence earns its place without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema and strong annotations, the description is fully sufficient. It covers sports coverage, data sources, price semantics, contract restrictions, no-data behavior, and error conditions, leaving no caller-relevant ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, event_id, is already fully documented in the schema with its source (list_events, query_events, or search results), and schema coverage is 100%. The description adds no additional parameter-level semantics because none are needed, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Get prediction-market game-line probabilities') and enumerates the supported sports, making the tool's purpose immediately identifiable. It also actively distinguishes itself from get_odds / GET /odds by stating it returns implied probabilities, not American odds, which separates it clearly from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool applies: prediction-market game-line contracts for specific sports, with explicit exclusions for non-game-line contracts and unsupported sports. It references get_odds as a different surface, but it does not explicitly say 'use X instead' for the alternatives, which keeps it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_splitsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| event_id | No | |
| available | No | |
| consensus | No | Aggregate bets%/handle% across bookmakers. |
| bookmakers | No | Per-bookmaker splits. Each item has bookmaker (odds slug), name, moneyline, spread, total. |
| captured_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, openWorld, idempotent, and non-destructive behavior. The description adds valuable detail beyond that: no charge when splits are unavailable, upstream 400 errors for unsupported sports, and the bookmaker slug mapping convention relative to get_odds.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core purpose, followed by availability and fallback behavior. The first sentence is long with parentheticals, but every part earns its place; it could be slightly restructured for readability without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with an output schema, the description is complete: it states what is returned, which sports are supported, when no data is available, and the billing behavior. No critical calling context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully covers the only required parameter, event_id, with guidance to source it from list_events, query_events, or search results. The description does not add extra parameter-level meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Get public betting splits (bets% and handle%) for an event'. It clearly distinguishes the tool from siblings like get_odds by describing the exact data returned: consensus split, per-bookmaker breakdown, and captured_at timestamp.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context by listing supported sports (MLB, NBA, NHL, NFL, NCAAF, NCAAB) and explicitly stating tennis and soccer are not available. It also explains when the tool returns available:false, but it does not name an alternative tool or explicitly say when to prefer get_splits over get_odds.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statsARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| match | No | 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). |
| teams | No | 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). 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 only). 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 only). 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 only). Settleables stay on get_player_props. Absent on tennis responses — use players instead. |
| players | No | 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. |
| profile | No | Soccer only. 'world_cup' or 'club'. |
| windows | No | 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). |
| event_id | No | Lumify event ID. |
| available | No | 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. |
| draw_type | No | Tennis only. Always 'singles' when available is true. Values other than 'singles' (including 'doubles' and 'qualifying') return available:false. |
| league_slug | No | League/tour slug, e.g. 'mls', 'mlb', 'nfl', 'atp', 'wta'. |
| head_to_head | No | 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). |
| neutral_site | No | Soccer only. Whether this fixture is at a neutral venue. Informational here; factored into home-advantage scoring on get_intelligence. |
| league_context | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare safety (readOnly, openWorld, idempotent) but the description adds rich behavioral detail beyond them: sport-specific payload shape, tennis doubles/qualifying returning available:false, exclusions from form/record/H2H, and HTTP 400 behavior. This materially improves an agent's understanding of what to expect when calling the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description packs critical usage information into three tightly written sentences, front-loading the core purpose and differentiating siblings first. Every sentence earns its place; there is zero fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the description covers supported sports, payload structure, edge-case availability, statistical exclusions, and error handling. Combined with annotations and output schema, an agent has everything needed to invoke this tool correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, event_id, is fully described in the schema (coverage 100%) with a clear source and type. The description adds no extra parameter-level meaning, but the baseline of 3 applies because the schema already carries the necessary semantic weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a clear resource ('raw, deterministic team/match statistics'), and enumerates supported sports, explicitly distinguishing it from siblings by excluding odds and scoring. This makes the tool's purpose unmistakable and differentiates it from get_odds and get_intelligence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool (raw statistics) and when not to, naming alternatives: 'no odds (use get_odds) and no scoring (use get_intelligence)'. It also provides error conditions (HTTP 400 for unsupported sports), leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_teamARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| team_id | Yes | Team id, from list_teams. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| city | No | |
| name | No | |
| slug | No | |
| sport | No | |
| venue | No | |
| league | No | |
| division | No | |
| image_url | No | Lumify media URL for the team logo (https://lumify.ai/media/teams/{sport}/{id}.png). Null until ingest. Never a vendor CDN. |
| is_active | No | |
| conference | No | |
| abbreviation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, idempotent, non-destructive behavior. The description adds value by disclosing the not-found error behavior for invalid team_id, which the annotations do not cover, and notes the return includes home venue.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each carrying distinct information: purpose, error behavior, and id resolution. No filler or repetition of annotation fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, a full output schema, and strong annotations, the description covers the essential call pattern and failure mode. Nothing needed to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents team_id as an id from list_teams, so the baseline is 3. The description adds meaning by warning that a nonexistent team_id triggers an error and reinforces the resolution path, going slightly beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Get' with the resource 'single team profile' and adds 'with its home venue' to define scope. It contrasts with list_teams by indicating a single team, and the explicit mention of list_teams helps disambiguate from that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear prerequisite sequence: resolve ids via list_teams before calling get_team. It implies use when a single team profile or home venue is needed, though it does not enumerate exclusions like team props or stats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_team_propsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event id, from list_events, query_events, or search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| clock | No | Game clock from the live score snapshot. |
| sport | No | Sport slug: nfl, ncaaf, mlb, or soccer. |
| period | No | Current period from the live score snapshot. |
| status | No | Event status (scheduled, inprogress, delayed, final, …). |
| event_id | No | Lumify event ID. |
| available | No | False when no team-total mains have been ingested; team_props is empty and the call isn't billed. |
| team_props | No | 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds meaningful operational context: joining persisted Pinnacle team-total mains to live scores, grading over/under/push, and no-charge behavior when data is unavailable. This goes well beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four tightly packed sentences with no filler. The main action is front-loaded, and every clause adds new information: supported sports, data join logic, sibling differentiation, and edge-case behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and only one well-documented parameter, the description covers all essential selection and invocation context. It includes sport restrictions, no-data behavior, and the relationship to get_odds, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, event_id, is already fully described in the schema with sourcing guidance ('from list_events, query_events, or search results'). The description's supported-sport scope is useful but does not add parameter-level mechanics, so the high schema coverage baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('team-total lines and live progress') and scopes it to NFL, NCAAF, MLB, and soccer events. It explicitly contrasts with get_odds's moneyline/spread/total scope, so an agent can distinguish it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use this tool for team-total props and indicates that GET /odds and get_odds cover moneyline/spread/total instead. It also gives practical fallback/edge behavior: available:false with no charge when no team-total mains exist, and HTTP 400 for unsupported sports.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_evARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| book | No | Restrict opportunities to one sportsbook slug (e.g. fanduel). | |
| limit | No | Max opportunities to return (1–200). Default 50. | |
| sport | Yes | Sport slug: soccer, mlb, tennis, nfl, or ncaaf. | |
| league | No | Optional league slug (mls, epl, atp, …). Soccer without a league scans every published soccer league (MLS + big-five). | |
| market | No | Main-line family: h2h (default, moneyline), spreads, or totals. Tennis + totals returns 400. | |
| min_ev | No | Minimum EV% to include. Default 0. Clamped to 0–25. |
Output Schema
| Name | Required | Description |
|---|---|---|
| beta | No | Always true. |
| book | No | Book filter, or null. |
| sport | No | Sport slug this scan was run for. |
| total | No | Count of opportunities on this page. |
| league | No | League filter, or null for the whole sport. |
| market | No | h2h, spreads, or totals — the family scanned. |
| max_ev | No | Stale-line cap (25). |
| min_ev | No | Minimum EV% applied. |
| opportunities | No | Positive-EV main-line rows: {event_id, sport, league, commence_time, home_team, away_team, side, team, bet_type, line, fair_probability, ev}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, and non-destructive behavior. The description adds substantial context beyond that: the tool costs 1 credit, is in Beta, sorts by ev_pct, suppresses MLB moneyline null books, skips to the next eligible book, applies sharp-fair price gates, and returns 400 for tennis totals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized, front-loading the core purpose and then adding constraints, gates, cost, and a reference link. Every sentence earns its place; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values. It covers supported sports, market families, default behavior, edge cases, EV gates, cost, and links to the full field catalog, making it fully actionable for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the market default, the tennis totals 400 error, the MLB null-book behavior, and the soccer league scanning behavior, adding useful semantics for parameter selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists pregame main-line +EV opportunities, names the supported sports, and specifies sorting by ev_pct descending. It also differentiates the tool from siblings by mentioning market families and the tennis totals exclusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: it is for pregame +EV opportunities, not live events, and it specifies market defaults and unsupported combinations. It references get_intelligence for the shared EV gates, which helps an agent relate the tool to a sibling, though it does not explicitly say 'use this instead of X'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | UTC end date YYYY-MM-DD (inclusive). | |
| date | No | UTC date YYYY-MM-DD (single day). | |
| from | No | UTC start date YYYY-MM-DD. | |
| sort | No | Sort order. sort=status is incompatible with after_id. | time |
| limit | No | Max events to return per page. | |
| sport | No | Sport slug, e.g. mlb, nfl, tennis, soccer. | |
| league | No | League slug, e.g. nfl, atp, mls. | |
| status | No | Filter to events in this status. | |
| team_id | No | Filter to events where this team participates. Resolve ids via list_teams. | |
| after_id | No | Cursor: return events with id > after_id (from the previous page's next_after_id). | |
| season_id | No | Filter by season ID (from list_seasons). | |
| has_recommend | No | When true, only events with at least one recommended bet. | |
| include_scores | No | Inline participants + scores in each event (intended for small result sets). |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| events | No | |
| next_after_id | No | Pass as after_id to fetch the next page; null on the last page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds valuable behavioral context beyond those: pagination via after_id, include_scores inlining scores only for small result sets, and the specific event fields returned. This is richer than a minimal read-only list description, though it does not discuss rate limits or authorization.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph with no filler. It front-loads the core purpose and pagination model, then efficiently conveys filters, return fields, the include_scores caveat, and alternatives. Every sentence contributes actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter list tool, the description covers pagination, filters, return representation, the small-result-set caveat, and alternative tools. The output schema exists, so returning full field details is not required, but the description still summarizes key fields. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra meaning by grouping parameters (sport, league, status, date range, season, team_id), explaining that team_id is resolved via list_teams / get_team, and clarifying the include_scores behavior for small result sets. This goes beyond the schema's individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List events (schedules and live scores), paginated by id (after_id).' It clearly identifies the tool as a paginated list operation and differentiates it from siblings by naming get_event and query_events as alternatives with distinct purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use alternatives: 'use get_event for one event's full detail, or query_events for free-text/natural-language filters instead of structured params.' It also gives guidance on resolving teams via list_teams / get_team and warns that include_scores is 'intended for small result sets,' providing clear when/when-not context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_forecastsARead-onlyIdempotentInspect
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. Tennis main-line: moneyline (ranking Bradley-Terry) as bet_type ML_P1/ML_P2, game handicap as SPREAD_P1/SPREAD_P2, and total games as OVER/UNDER (a Normal-approx games model; soft-book game-unit lines only, never Pinnacle's set-unit total). Each wager has p_hit, conviction (|p_hit−0.5|×2×sufficiency×research), 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
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | UTC slate date YYYY-MM-DD. Defaults to today UTC. | |
| limit | No | Max wagers (1–100). Default 25. | |
| sport | Yes | Sport slug: mlb, ncaaf, nfl, nba, ncaab, nhl, or tennis. | |
| market | No | Main-line family filter (h2h, spreads, or totals). Tennis publishes all three (moneyline, game-handicap, total-games). Ignored on prop-only sports. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | UTC slate date (YYYY-MM-DD). |
| sport | No | Sport slug this slate was scored for. |
| total | No | Count of wagers on this page. |
| wagers | No | 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 |
| reliability | No | Default badge on this slate. v0 ships emerging; each wager repeats the same field. |
| model_version | No | Scorer version (forecast-v0). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent, but the description adds meaningful behavioral context: this is a prediction model not a beat-the-market claim, reliability is emerging, credit cost is disclosed, and the 'empty slate is still 200' quirk is noted. All this goes beyond the annotation hints and clarifies expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but each sentence earns its place: the core differentiation is front-loaded, sport-specific caveats are grouped, and supporting links are at the end. Slightly long, but no wasted words given the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Considering the tool's complexity (multi-sport, multiple models, market nuances), the description covers the essential context: what the forecast represents, field semantics (p_hit, conviction), limitations (no OOS gate, soft-book lines), and pointers for further details. An output schema exists, so return values don't need elaboration here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% description coverage for all four parameters, including enums and defaults. The description adds supplemental context for sport and market (e.g., tennis's three market families), but it does not redefine parameter semantics beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: 'Daily board of forecasted wagers from Lumify's model' and explicitly contrasts with list_ev ('use this tool to scan high-probability forecasts'). It clearly identifies the resource and what makes it distinct from the sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Direct guidance is given: 'Use list_ev to scan main lines by sharp-fair price gap; use this tool to scan high-probability forecasts.' It also clarifies scope across sports and market types, including caveats like tennis-specific behavior, leaving no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_seasonsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | No | Filter by sport slug, e.g. nhl, nba, soccer. | |
| current_only | No | Return only currently active seasons (default true). Pass false for historical seasons. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| seasons | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (read-only, idempotent, non-destructive), and the description adds meaningful behavior: default active-only filtering, optional historical inclusion, and return field details. It does not contradict annotations and provides useful context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core purpose, then defaults, return fields, and an alternative. Every sentence earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with an output schema and full annotations, the description fully covers defaults, filtering, and alternatives. There are no meaningful gaps for selection or invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description mirrors the schema's current_only and sport semantics without adding new parameter-level details, but it does reinforce them in natural language.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' with a clear resource 'seasons' and scope 'per sport/league'. It explicitly distinguishes itself from the sibling list_sports by directing users there for just current-season info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the default behavior (only active seasons), how to opt into historical seasons (current_only=false), optional sport filtering, and explicitly names list_sports as an alternative when simpler data suffices. This provides clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sportsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| active_only | No | When true (default), omit sports with no active coverage. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| sports | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and non-destructive behavior. The description adds useful context about the returned data structure (sport id, slug, name, team-sport flag, leagues with current_season) that is not redundant with the output schema, and it clarifies the tool's scope beyond the hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first leads with the action and key outcome, the second details return fields and the alternative for historical data. Every sentence earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single optional parameter, rich annotations, and presence of an output schema, the description fully covers the tool's purpose, return shape, and related tool guidance. No important gaps remain for a simple list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides a full description for active_only (100% coverage), so the schema does the heavy lifting. The description does not add additional parameter meaning beyond what is in the schema, meeting the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists supported sports with their leagues and current season, naming the exact fields returned. It distinguishes from sibling tools by explicitly pointing to list_seasons for historical seasons, and the scope (sports vs teams/events) is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance to use list_seasons with current_only=false for historical seasons, which is a clear alternative. Does not enumerate all when-not-to-use scenarios, but the primary use case is evident and the alternative is well-targeted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_teamsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Team name search (partial match). | |
| limit | No | Max teams to return per page. | |
| sport | No | Sport slug, e.g. nfl, nba, soccer. | |
| active | No | Filter by active status. | |
| league | No | League slug, e.g. nfl, mls. | |
| country | No | ISO country code, e.g. USA. | |
| after_id | No | Cursor: last team id from the previous page's next_after_id. | |
| division | No | Division name, e.g. AFC East. | |
| conference | No | Conference name, e.g. AFC, Eastern. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| has_more | No | |
| next_after_id | No | Pass as after_id to fetch the next page; null on the last page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description only needs to add extra context. It adds useful behavioral details: pagination is driven by after_id, results are a summary set, and image_url is null until ingest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler; the main action and pagination are front-loaded, followed by filters, return fields, and the sibling-tool handoff. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list endpoint with an output schema and annotations covering safety and idempotency, the description covers how to paginate, what filters exist, what fields come back, and how to get full detail afterwards. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine optional parameters. The description mostly restates the filter categories and cursor semantics rather than adding new parameter-level meaning, which is adequate but not additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (List teams), names the pagination mechanism, enumerates filters, and specifies the returned fields. It also distinguishes itself from get_team, so an agent can tell the two apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to use this tool: resolve a team id here, then call get_team for full detail. This explicit routing to a sibling tool eliminates ambiguity about the boundary between list and detail operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_eventsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Overrides any limit parsed from the query text. Max 100. | |
| query | Yes | Free text, e.g. 'live nfl games today'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | No | The original natural-language query text. |
| total | No | |
| events | No | |
| interpreted | No | The list_events-equivalent filters parsed from the query text (sport, status, date, from, to, limit). |
| next_after_id | No | |
| equivalent_request | No | The literal GET /v1/events request this query was translated to. |
| unrecognized_terms | No | Query words that didn't map to a known filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (read-only, idempotent, non-destructive), the description adds critical behavioral details: it is rule-based not an LLM, specific language features are recognized, bare 'football' is ambiguous and left unrecognized, and the response includes interpreted filters, equivalent REST call, and unrecognized_terms.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes useful information. It opens with the primary purpose, provides illustrative examples, explains internal behavior, and closes with usage guidance—all without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's natural-language processing complexity, the description thoroughly covers usage scope, behavioral limitations, and response contents. The output schema handles return values, so no additional detail is needed there. The description is comprehensive for an AI agent to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema documents both parameters, the description enriches the 'query' parameter by detailing supported sports, statuses, date formats, and the ambiguity behavior. It also clarifies the 'limit' parameter's override semantics, adding value beyond the schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: search events using natural-language queries instead of structured filters. It provides concrete examples and explicitly distinguishes it from sibling tools like list_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit guidance on when to use this tool versus the alternative, stating 'Prefer list_events when you already know the structured filters you want.' This directly addresses tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_playersARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Name search (partial match). | |
| limit | No | Max players to return per page. | |
| sport | No | Sport slug, e.g. tennis, nba. | |
| active | No | Filter by active status. | |
| ranked | No | If true, only tennis players with an ATP/WTA singles ranking (rankings.singles). | |
| country | No | ISO 3166-1 alpha-3 country code, e.g. USA. | |
| after_id | No | Cursor: last player id from the previous page's next_after_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| has_more | No | |
| next_after_id | No | Pass as after_id to fetch the next page; null on the last page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnly, openWorld, idempotent, and non-destructive, so the bar is lower. The description adds valuable behavioral context: the identity object is the same across sports with null meaning unknown, not wrong sport, and that rankings only nests under tennis while being null elsewhere. This goes beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The main action and filters are front-loaded in the first sentence, behavior notes in the second, and routing to alternatives in the third. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover the safety profile, the description covers the remaining important context: null/unknown semantics, sport-specific rankings shape, and the relationship to sibling tools. Nothing critical is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reinforces the role of parameters like sport, country, ranking, and after_id, and clarifies pagination via id, but it does not significantly deepen the semantics beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search players by name, sport, country, ranking, or active status, paginated by id (after_id).' It clearly identifies the action, the target, and the available filters, and distinguishes itself from get_player and get_player_events by naming them as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use alternatives: 'Use get_player for full detail on one id, or get_player_events for a player's schedule/results.' It also provides pagination context with after_id and next_after_id, making the usage conditions clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
- Changed
get_injuries1 field changed- changed
Output schema / properties / injuries / descriptionPrevious value: -"Per-player rows: player, player_id, team, team_id, status, previous_status, body_part, note, source_url, severity, last_changed_at."New value: +"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."
1 tool update
- Changed
get_injuries1 field changed- added
Input schema / properties / exclude_statusAdded value: +{ + "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" +}
1 tool update
- Added
get_injuries
6 tool updates
- Changed
batch_get_events1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"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, all."New value: +"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, all."
- Changed
get_event1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"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, all."New value: +"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, all."
- Changed
get_intelligence1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers."New value: +"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig."
- Changed
get_odds1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, all, or a comma-separated list."New value: +"Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, all, or a comma-separated list."
- Changed
get_odds_history1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, all, or a comma-separated list."New value: +"Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig, all, or a comma-separated list."
- Added
get_prediction_markets
5 tool updates
- Changed
get_event1 field changed- added
Output schema / properties / inprogress_sinceAdded value: +{ + "description": "ISO-8601 UTC when status first became inprogress (first live tick). Null until then; stays set after final.", + "type": [ + "string", + "null" + ] +}
- Changed
get_intelligence1 field changed- changed
Output schema / properties / forecasts / items / properties / market / descriptionPrevious value: -"Player-prop rows: Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (bet_type set): the main-line family — h2h, spreads, or totals."New value: +"Player-prop rows: prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (bet_type set): the main-line family — h2h, spreads, or totals."
- Changed
get_stats1 field changed- changed
Output schema / properties / players / descriptionPrevious value: -"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 from RapidAPI Tennis API; 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."New value: +"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."
- Changed
list_events1 field changed- added
Output schema / $defs / EventSummary / properties / inprogress_sinceAdded value: +{ + "description": "ISO-8601 UTC when status first became inprogress (first live tick). Null until then; stays set after final.", + "type": [ + "string", + "null" + ] +}
- Changed
list_forecasts1 field changed- changed
Output schema / properties / wagers / items / properties / market / descriptionPrevious value: -"Player-prop rows: Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (bet_type set): the main-line family — h2h, spreads, or totals."New value: +"Player-prop rows: prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (bet_type set): the main-line family — h2h, spreads, or totals."
5 tool updates
- Changed
batch_get_events1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"Bookmaker for inlined odds and intelligence market prices. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all."New value: +"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, all."
- Changed
get_event1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"Bookmaker for inlined odds and intelligence market prices. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all."New value: +"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, all."
- Changed
get_intelligence1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline."New value: +"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers."
- Changed
get_odds1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all, or a comma-separated list."New value: +"Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, all, or a comma-separated list."
- Changed
get_odds_history1 field changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline, all, or a comma-separated list."New value: +"Bookmaker slug. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, all, or a comma-separated list."
1 tool update
- Changed
get_intelligence2 fields changed- changed
Output schema / properties / match_overview / descriptionPrevious value: -"Natural-language matchup preview — form, context, what to watch. Search-backed context overlay on every event sport (MLB, NFL, NCAAF, NBA, NCAAB, NHL, soccer, tennis); sport-shaped queries. Null when no narrative has been generated."New value: +"Natural-language pre-game matchup preview — form, context, what to watch. Written before kickoff by a Search-backed overlay on every event sport (MLB, NFL, NCAAF, NBA, NCAAB, NHL, soccer, tennis); sport-shaped queries. The request path only reads the stored row. Null when the pre-kickoff job has not run or the fixture was not eligible." - changed
Output schema / properties / rationale / descriptionPrevious value: -"Event-level factual matchup chips (injuries, recent form, lineup/availability news — sport-shaped). Search-backed context overlay; may populate on first get_intelligence, later calls reuse the stored row."New value: +"Event-level factual pre-game matchup chips (injuries, recent form, lineup/availability news — sport-shaped). Written before kickoff; the request path only reads the stored row."
2 tool updates
- Changed
get_intelligence2 fields changed- changed
Output schema / properties / forecasts / descriptionPrevious value: -"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows on team sports; tennis moneyline via bet_type ML_P1/ML_P2. selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts"New value: +"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows on team sports; tennis main-line via bet_type ML_P1/ML_P2 (moneyline), SPREAD_P1/SPREAD_P2 (game handicap), OVER/UNDER (total games). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts" - changed
Output schema / properties / forecasts / items / properties / bet_type / descriptionPrevious value: -"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis moneyline rows set ML_P1 / ML_P2."New value: +"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis sets ML_P1/ML_P2 (moneyline), SPREAD_P1/SPREAD_P2 (game handicap), and OVER/UNDER (total games)."
- Changed
list_forecasts2 fields changed- changed
Input schema / properties / market / descriptionPrevious value: -"Main-line family filter (h2h, spreads, or totals). Tennis publishes h2h only. Ignored on prop-only sports."New value: +"Main-line family filter (h2h, spreads, or totals). Tennis publishes all three (moneyline, game-handicap, total-games). Ignored on prop-only sports." - changed
Output schema / properties / wagers / items / properties / bet_type / descriptionPrevious value: -"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis moneyline rows set ML_P1 / ML_P2."New value: +"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis sets ML_P1/ML_P2 (moneyline), SPREAD_P1/SPREAD_P2 (game handicap), and OVER/UNDER (total games)."
2 tool updates
- Changed
get_intelligence2 fields changed- changed
Output schema / properties / forecasts / descriptionPrevious value: -"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows today; schema also carries main-line rows via bet_type (none shipped yet). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts"New value: +"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows on team sports; tennis moneyline via bet_type ML_P1/ML_P2. selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts" - changed
Output schema / properties / forecasts / items / properties / bet_type / descriptionPrevious value: -"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. No sport ships a non-null bet_type here yet."New value: +"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis moneyline rows set ML_P1 / ML_P2."
- Changed
list_forecasts3 fields changed- changed
Input schema / properties / market / descriptionPrevious value: -"Main-line family filter (h2h, spreads, or totals) for a sport's main-line forecast rows, once one exists. No sport publishes main-line forecasts today, so this has no effect yet. Ignored on prop-only sports."New value: +"Main-line family filter (h2h, spreads, or totals). Tennis publishes h2h only. Ignored on prop-only sports." - changed
Input schema / properties / sport / descriptionPrevious value: -"Sport slug: mlb, ncaaf, nfl, nba, ncaab, or nhl."New value: +"Sport slug: mlb, ncaaf, nfl, nba, ncaab, nhl, or tennis." - changed
Output schema / properties / wagers / items / properties / bet_type / descriptionPrevious value: -"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. No sport ships a non-null bet_type here yet."New value: +"Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. Tennis moneyline rows set ML_P1 / ML_P2."
3 tool updates
- Changed
get_intelligence19 fields changed- changed
Output schema / properties / forecasts / descriptionPrevious value: -"Forecasted Over/Under player-prop wagers for this event (same object as list_forecasts). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(side hits the posted line) from the player's shrunken rate. How + field catalog: https://lumify.ai/docs/forecasts"New value: +"Forecasted wagers for this event (same object as list_forecasts) — a model prediction, not a beat-the-market claim. Player-prop rows today; schema also carries main-line rows via bet_type (none shipped yet). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(the picked outcome hits). How + field catalog: https://lumify.ai/docs/forecasts" - added
Output schema / properties / forecasts / items / properties / bet_typeAdded value: +{ + "description": "Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. No sport ships a non-null bet_type here yet.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / forecasts / items / properties / books / descriptionPrevious value: -"American price for the chosen side, keyed by bookmaker slug (e.g. {draftkings: -453}). Posted market price for the side the model picked."New value: +"American price for the picked outcome, keyed by bookmaker slug (e.g. {draftkings: -453}). Posted market price for the side/bet_type the model picked." - changed
Output schema / properties / forecasts / items / properties / drivers / descriptionPrevious value: -"Signed contributions that moved p_hit. Read input as the player's measured rate and effect as how far that rate lifts the chosen side versus a league-mean player."New value: +"Signed contributions that moved p_hit. Read input as the measured rate/rating behind the pick and effect as how far it lifts the chosen outcome versus a baseline." - changed
Output schema / properties / forecasts / items / properties / drivers / items / properties / effect / descriptionPrevious value: -"Signed shift in p_hit versus a league-mean player on the same line. 0.0 on yardage markets."New value: +"Signed shift in p_hit versus a baseline case on the same line. 0.0 on yardage markets." - changed
Output schema / properties / forecasts / items / properties / drivers / items / properties / id / descriptionPrevious value: -"e.g. player.l10_rate — the recent-form rate that fed Poisson."New value: +"Prop rows: typically player.l10_rate — the recent-form rate that fed Poisson. Main-line rows would use a different namespace once a main-line forecast model ships." - changed
Output schema / properties / forecasts / items / properties / drivers / items / properties / input / descriptionPrevious value: -"Measured rate in counting-stat units per game after shrinkage."New value: +"Measured rate/rating behind this driver, in native units." - changed
Output schema / properties / forecasts / items / properties / line / descriptionPrevious value: -"Posted Over/Under main line the model was scored against."New value: +"Posted line the model was scored against. Prop and totals main-line rows: Over/Under number. Spreads main-line rows: the spread number. Null on h2h/moneyline rows." - changed
Output schema / properties / forecasts / items / properties / line / typePrevious value: -"number"New value: +[ + "number", + "null" +] - changed
Output schema / properties / forecasts / items / properties / market / descriptionPrevious value: -"Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal."New value: +"Player-prop rows: Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (bet_type set): the main-line family — h2h, spreads, or totals." - changed
Output schema / properties / forecasts / items / properties / p_hit / descriptionPrevious value: -"Model probability (0–1) that side hits line, from the player's shrunken counting-stat rate (Poisson vs the posted Over/Under). Optional research may nudge this by at most ±0.03; the side stays."New value: +"Model probability (0–1) that the picked outcome (side on prop rows, bet_type on main-line rows) hits. Prop rows: built from the player's shrunken counting-stat rate (Poisson vs the posted Over/Under). Optional research may nudge a prop's p_hit by at most ±0.03; the chosen side stays the same." - changed
Output schema / properties / forecasts / items / properties / player / descriptionPrevious value: -"Player display name from the priced line."New value: +"Player display name from the priced line. Null on main-line rows with no player attribution (bet_type is a match-level token like OVER/UNDER/ML_DRAW)." - changed
Output schema / properties / forecasts / items / properties / player / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / forecasts / items / properties / player_id / descriptionPrevious value: -"Lumify player ID. Bound by exact / Jr-stripped name match."New value: +"Lumify player ID. Bound by exact / Jr-stripped name match. Null on main-line rows with no player attribution." - changed
Output schema / properties / forecasts / items / properties / player_id / typePrevious value: -"integer"New value: +[ + "integer", + "null" +] - added
Output schema / properties / forecasts / items / properties / player_roleAdded value: +{ + "description": "'home'/'away' for team sports or 'p1'/'p2' for head-to-head sports, set only alongside a non-null bet_type. Null for player-prop rows and for match-level main-line tokens (OVER, UNDER, ML_DRAW).", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / forecasts / items / properties / research / descriptionPrevious value: -"Optional Deep Research overlay: {stance, conviction, note}. stance is validate / neutral / invalidate. Validate nudges p_hit up by at most 0.03 and lifts conviction; invalidate does the reverse. The chosen side stays. Null means read p_hit from the rate model alone."New value: +"Optional Deep Research overlay on high-probability wagers (p_hit ≥ 0.80): {stance, conviction, note}. stance is validate / neutral / invalidate. note is the wager-level why. Validate / invalidate rows always carry a note. Validate nudges p_hit up by at most 0.03 and lifts conviction; invalidate does the reverse. The chosen side stays. Null means read p_hit from the rate model alone." - changed
Output schema / properties / forecasts / items / properties / side / descriptionPrevious value: -"'over' or 'under' — the more likely side given the player's shrunken rate versus line."New value: +"Prop rows: 'over' or 'under' — the more likely side given the player's shrunken rate versus line. Null on main-line rows — read the picked outcome from bet_type instead." - changed
Output schema / properties / forecasts / items / properties / side / typePrevious value: -"string"New value: +[ + "string", + "null" +]
- Changed
list_ev1 field changed- added
Input schema / properties / market / enumAdded value: +[ + "h2h", + "spreads", + "totals" +]
- Changed
list_forecasts20 fields changed- added
Input schema / properties / marketAdded value: +{ + "description": "Main-line family filter (h2h, spreads, or totals) for a sport's main-line forecast rows, once one exists. No sport publishes main-line forecasts today, so this has no effect yet. Ignored on prop-only sports.", + "enum": [ + "h2h", + "spreads", + "totals" + ], + "type": "string" +} - changed
Output schema / properties / wagers / descriptionPrevious value: -"Selected forecasted wagers, highest conviction first. Read p_hit as P(side hits the posted line); conviction is the board rank. How + field catalog: https://lumify.ai/docs/forecasts"New value: +"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" - added
Output schema / properties / wagers / items / properties / bet_typeAdded value: +{ + "description": "Main-line token when this row is a main-line forecast — ML_P1/ML_P2/ML_HOME/ML_AWAY/ML_DRAW, SPREAD_P1/SPREAD_P2/SPREAD_HOME/SPREAD_AWAY, or OVER/UNDER (same vocabulary as get_intelligence bets[].bet_type and list_ev). Null on player-prop rows — that's the discriminator between the two row shapes. No sport ships a non-null bet_type here yet.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / wagers / items / properties / books / descriptionPrevious value: -"American price for the chosen side, keyed by bookmaker slug (e.g. {draftkings: -453}). Posted market price for the side the model picked."New value: +"American price for the picked outcome, keyed by bookmaker slug (e.g. {draftkings: -453}). Posted market price for the side/bet_type the model picked." - changed
Output schema / properties / wagers / items / properties / drivers / descriptionPrevious value: -"Signed contributions that moved p_hit. Read input as the player's measured rate and effect as how far that rate lifts the chosen side versus a league-mean player."New value: +"Signed contributions that moved p_hit. Read input as the measured rate/rating behind the pick and effect as how far it lifts the chosen outcome versus a baseline." - changed
Output schema / properties / wagers / items / properties / drivers / items / properties / effect / descriptionPrevious value: -"Signed shift in p_hit versus a league-mean player on the same line. 0.0 on yardage markets."New value: +"Signed shift in p_hit versus a baseline case on the same line. 0.0 on yardage markets." - changed
Output schema / properties / wagers / items / properties / drivers / items / properties / id / descriptionPrevious value: -"e.g. player.l10_rate — the recent-form rate that fed Poisson."New value: +"Prop rows: typically player.l10_rate — the recent-form rate that fed Poisson. Main-line rows would use a different namespace once a main-line forecast model ships." - changed
Output schema / properties / wagers / items / properties / drivers / items / properties / input / descriptionPrevious value: -"Measured rate in counting-stat units per game after shrinkage."New value: +"Measured rate/rating behind this driver, in native units." - changed
Output schema / properties / wagers / items / properties / line / descriptionPrevious value: -"Posted Over/Under main line the model was scored against."New value: +"Posted line the model was scored against. Prop and totals main-line rows: Over/Under number. Spreads main-line rows: the spread number. Null on h2h/moneyline rows." - changed
Output schema / properties / wagers / items / properties / line / typePrevious value: -"number"New value: +[ + "number", + "null" +] - changed
Output schema / properties / wagers / items / properties / market / descriptionPrevious value: -"Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal."New value: +"Player-prop rows: Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal. Main-line rows (bet_type set): the main-line family — h2h, spreads, or totals." - changed
Output schema / properties / wagers / items / properties / p_hit / descriptionPrevious value: -"Model probability (0–1) that side hits line, from the player's shrunken counting-stat rate (Poisson vs the posted Over/Under). Optional research may nudge this by at most ±0.03; the side stays."New value: +"Model probability (0–1) that the picked outcome (side on prop rows, bet_type on main-line rows) hits. Prop rows: built from the player's shrunken counting-stat rate (Poisson vs the posted Over/Under). Optional research may nudge a prop's p_hit by at most ±0.03; the chosen side stays the same." - changed
Output schema / properties / wagers / items / properties / player / descriptionPrevious value: -"Player display name from the priced line."New value: +"Player display name from the priced line. Null on main-line rows with no player attribution (bet_type is a match-level token like OVER/UNDER/ML_DRAW)." - changed
Output schema / properties / wagers / items / properties / player / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / wagers / items / properties / player_id / descriptionPrevious value: -"Lumify player ID. Bound by exact / Jr-stripped name match."New value: +"Lumify player ID. Bound by exact / Jr-stripped name match. Null on main-line rows with no player attribution." - changed
Output schema / properties / wagers / items / properties / player_id / typePrevious value: -"integer"New value: +[ + "integer", + "null" +] - added
Output schema / properties / wagers / items / properties / player_roleAdded value: +{ + "description": "'home'/'away' for team sports or 'p1'/'p2' for head-to-head sports, set only alongside a non-null bet_type. Null for player-prop rows and for match-level main-line tokens (OVER, UNDER, ML_DRAW).", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / wagers / items / properties / research / descriptionPrevious value: -"Optional Deep Research overlay: {stance, conviction, note}. stance is validate / neutral / invalidate. Validate nudges p_hit up by at most 0.03 and lifts conviction; invalidate does the reverse. The chosen side stays. Null means read p_hit from the rate model alone."New value: +"Optional Deep Research overlay on high-probability wagers (p_hit ≥ 0.80): {stance, conviction, note}. stance is validate / neutral / invalidate. note is the wager-level why. Validate / invalidate rows always carry a note. Validate nudges p_hit up by at most 0.03 and lifts conviction; invalidate does the reverse. The chosen side stays. Null means read p_hit from the rate model alone." - changed
Output schema / properties / wagers / items / properties / side / descriptionPrevious value: -"'over' or 'under' — the more likely side given the player's shrunken rate versus line."New value: +"Prop rows: 'over' or 'under' — the more likely side given the player's shrunken rate versus line. Null on main-line rows — read the picked outcome from bet_type instead." - changed
Output schema / properties / wagers / items / properties / side / typePrevious value: -"string"New value: +[ + "string", + "null" +]
2 tool updates
- Changed
get_intelligence2 fields changed- changed
Output schema / properties / match_overview / descriptionPrevious value: -"Natural-language matchup preview — form, context, what to watch. On predictive MLB may be a Search-backed context overlay. Null when no narrative has been generated."New value: +"Natural-language matchup preview — form, context, what to watch. Search-backed context overlay on every event sport (MLB, NFL, NCAAF, NBA, NCAAB, NHL, soccer, tennis); sport-shaped queries. Null when no narrative has been generated." - changed
Output schema / properties / rationale / descriptionPrevious value: -"Event-level factual matchup chips (starting pitchers, injuries, form). Event-level context overlay. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."New value: +"Event-level factual matchup chips (injuries, recent form, lineup/availability news — sport-shaped). Search-backed context overlay; may populate on first get_intelligence, later calls reuse the stored row."
- Changed
list_ev3 fields changed- added
Input schema / properties / marketAdded value: +{ + "description": "Main-line family: h2h (default, moneyline), spreads, or totals. Tennis + totals returns 400.", + "type": "string" +} - changed
Output schema / properties / market / descriptionPrevious value: -"Always h2h (moneyline) in v1."New value: +"h2h, spreads, or totals — the family scanned." - changed
Output schema / properties / opportunities / descriptionPrevious value: -"Positive-EV moneyline rows: {event_id, sport, league, commence_time, home_team, away_team, side, team, bet_type, fair_probability, ev}."New value: +"Positive-EV main-line rows: {event_id, sport, league, commence_time, home_team, away_team, side, team, bet_type, line, fair_probability, ev}."
2 tool updates
- Changed
get_period_odds3 fields changed- changed
Output schema / properties / available / descriptionPrevious value: -"False when no first-half / first-five mains have been ingested; period_odds is empty and the call isn't billed."New value: +"False when no first-half / first-five / first-set mains have been ingested; period_odds is empty and the call isn't billed." - changed
Output schema / properties / period_odds / descriptionPrevious value: -"One row per (scope, market, line). Fields: scope (1H or F5), 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}})."New value: +"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}})." - changed
Output schema / properties / sport / descriptionPrevious value: -"Sport slug: nfl, ncaaf, nba, ncaab, or mlb."New value: +"Sport slug: nfl, ncaaf, nba, ncaab, mlb, soccer, or tennis."
- Changed
get_team_props1 field changed- changed
Output schema / properties / sport / descriptionPrevious value: -"Sport slug: nfl."New value: +"Sport slug: nfl, ncaaf, mlb, or soccer."
1 tool update
- Changed
get_intelligence5 fields changed- changed
Output schema / properties / bets / items / properties / best / descriptionPrevious value: -"Highest price-gap pick across edges_by_book: {book, price, edge, quote_age_seconds}. Price gap ≠ EV; Tier C informational line-shopping."New value: +"Highest price-gap book across edges_by_book: {book, price, edge, quote_age_seconds}. Tier C informational line-shopping." - changed
Output schema / properties / bets / items / properties / edges_by_book / descriptionPrevious value: -"Price gap versus fair.probability per soft book (fair.probability × decimal_odds − 1). Line-shopping only, NOT EV / NOT a recommend."New value: +"Price gap versus fair.probability per soft book (fair.probability × decimal_odds − 1). Line-shopping metric: rank soft books by gap." - changed
Output schema / properties / bets / items / properties / fair / descriptionPrevious value: -"Sharp-consensus fair: {probability, books, n_books, is_consensus}. MLB/NFL: Pinnacle+Circa; MLS/tennis: Pinnacle. Price-gap reference for edges_by_book/best — not EV."New value: +"Sharp-consensus fair: {probability, books, n_books, is_consensus}. MLB/NFL: Pinnacle+Circa; MLS/tennis: Pinnacle. Price-gap reference for edges_by_book/best." - changed
Output schema / properties / match_overview / descriptionPrevious value: -"Natural-language matchup preview — form, context, what to watch. On predictive MLB may be a Search-backed context overlay (not a recommendation). Null when no narrative has been generated."New value: +"Natural-language matchup preview — form, context, what to watch. On predictive MLB may be a Search-backed context overlay. Null when no narrative has been generated." - changed
Output schema / properties / rationale / descriptionPrevious value: -"Event-level factual matchup chips (starting pitchers, injuries, form). Context overlay only — not a pick. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."New value: +"Event-level factual matchup chips (starting pitchers, injuries, form). Event-level context overlay. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."
4 tool updates
- Changed
get_intelligence2 fields changed- changed
Output schema / properties / available / descriptionPrevious value: -"False when no intelligence has been computed for this event yet — every other field is then null/empty and the request is not charged."New value: +"False when no predictive bets[] have been computed for this event yet. forecasts[] can still populate on MLB/NFL/NCAAF/NBA/NCAAB/NHL. Free only when available is false and forecasts is empty." - added
Output schema / properties / forecastsAdded value: +{ + "description": "Forecasted Over/Under player-prop wagers for this event (same object as list_forecasts). selected marks the top-conviction rows on the daily slate; the rest of the event catalog is included with selected:false. Read p_hit as P(side hits the posted line) from the player's shrunken rate. How + field catalog: https://lumify.ai/docs/forecasts", + "items": { + "properties": { + "away_team": { + "description": "Away team display name. Slate only.", + "type": [ + "string", + "null" + ] + }, + "books": { + "description": "American price for the chosen side, keyed by bookmaker slug (e.g. {draftkings: -453}). Posted market price for the side the model picked.", + "type": "object" + }, + "commence_time": { + "description": "ISO-8601 UTC scheduled start. Slate only.", + "type": [ + "string", + "null" + ] + }, + "conviction": { + "description": "Board rank key on 0–1: |p_hit−0.5|×2×sufficiency×research. A high p_hit on a thin sample ranks below a moderate p_hit on a long one. Highest conviction first on the daily slate.", + "type": "number" + }, + "drivers": { + "description": "Signed contributions that moved p_hit. Read input as the player's measured rate and effect as how far that rate lifts the chosen side versus a league-mean player.", + "items": { + "properties": { + "direction": { + "description": "up / down / neutral from the sign of effect.", + "type": "string" + }, + "effect": { + "description": "Signed shift in p_hit versus a league-mean player on the same line. 0.0 on yardage markets.", + "type": "number" + }, + "id": { + "description": "e.g. player.l10_rate — the recent-form rate that fed Poisson.", + "type": "string" + }, + "input": { + "description": "Measured rate in counting-stat units per game after shrinkage.", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "event_id": { + "description": "Lumify event ID. Present on list_forecasts; omitted on get_intelligence.forecasts (the event is the argument).", + "type": [ + "integer", + "null" + ] + }, + "home_team": { + "description": "Home team display name. Slate only.", + "type": [ + "string", + "null" + ] + }, + "interval": { + "description": "[lo, hi] stated band around p_hit. Wider when sufficiency is low. A stated evidence band, not a statistical confidence interval.", + "items": { + "type": "number" + }, + "type": "array" + }, + "league": { + "description": "League slug, if any. Slate only.", + "type": [ + "string", + "null" + ] + }, + "line": { + "description": "Posted Over/Under main line the model was scored against.", + "type": "number" + }, + "market": { + "description": "Owls prop category (1:1 counting stats). MLB: strikeouts_pitcher, hits, rbis, runs, strikeouts_batter, hits_allowed, earned_runs, outs_recorded. NFL/NCAAF: passing/rushing/receiving_yards, receptions. NBA/NCAAB: points, rebounds, assists, steals, blocks, threes_made. NHL: goals, hockey_assists, shots_on_goal.", + "type": "string" + }, + "model_version": { + "description": "Scorer version, e.g. forecast-v0.", + "type": "string" + }, + "p_hit": { + "description": "Model probability (0–1) that side hits line, from the player's shrunken counting-stat rate (Poisson vs the posted Over/Under). Optional research may nudge this by at most ±0.03; the side stays.", + "type": "number" + }, + "player": { + "description": "Player display name from the priced line.", + "type": "string" + }, + "player_id": { + "description": "Lumify player ID. Bound by exact / Jr-stripped name match.", + "type": "integer" + }, + "reliability": { + "description": "Badge on this sport×market cell: emerging, moderate, high, or informational. v0 ships emerging for every wager.", + "type": "string" + }, + "research": { + "description": "Optional Deep Research overlay: {stance, conviction, note}. stance is validate / neutral / invalidate. Validate nudges p_hit up by at most 0.03 and lifts conviction; invalidate does the reverse. The chosen side stays. Null means read p_hit from the rate model alone.", + "type": [ + "object", + "null" + ] + }, + "selected": { + "description": "True when this wager is on the daily board (top conviction). On get_intelligence the array includes selected and the rest of the event catalog.", + "type": "boolean" + }, + "side": { + "description": "'over' or 'under' — the more likely side given the player's shrunken rate versus line.", + "type": "string" + }, + "sport": { + "description": "Sport slug. Slate only.", + "type": [ + "string", + "null" + ] + }, + "sufficiency": { + "description": "Evidence weight on 0–1: n/(n+12), where n is the recent-form game count (typically L10). A player with 10 games has sufficiency ≈ 0.45. The wager still ships; this field tells you how much of p_hit is earned from this player's own boxes.", + "type": "number" + } + }, + "type": "object" + }, + "type": "array" +}
- Changed
get_player19 fields changed- added
Output schema / properties / birthdate / descriptionAdded value: +"YYYY-MM-DD date of birth." - added
Output schema / properties / country_code / descriptionAdded value: +"ISO 3166-1 alpha-3 country code." - added
Output schema / properties / current_team_id / descriptionAdded value: +"Lumify team ID when the player is on a club roster. Null for tennis." - added
Output schema / properties / current_team_name / descriptionAdded value: +"Current team display name. Null for tennis." - added
Output schema / properties / first_nameAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / full_name / descriptionAdded value: +"Display name." - added
Output schema / properties / handedness / descriptionAdded value: +"left | right | switch. Meaning is sport-specific (bats for MLB, shoots for NHL, playing hand for tennis). Null when unknown." - added
Output schema / properties / height_cm / descriptionAdded value: +"Height in centimetres. Null when not ingested." - added
Output schema / properties / id / descriptionAdded value: +"Lumify player ID." - added
Output schema / properties / image_urlAdded value: +{ + "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" + ] +} - added
Output schema / properties / is_active / descriptionAdded value: +"False when deactivated or retired." - added
Output schema / properties / last_nameAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / position / descriptionAdded value: +"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." - added
Output schema / properties / rankingsAdded value: +{ + "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" + ] +} - added
Output schema / properties / retired_atAdded value: +{ + "description": "YYYY-MM-DD retirement date when known.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / slug / descriptionAdded value: +"URL-safe unique slug." - added
Output schema / properties / sport / descriptionAdded value: +"Sport slug, e.g. mlb, tennis, nfl." - removed
Output schema / properties / tennis_rankingRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - added
Output schema / properties / weight_kg / descriptionAdded value: +"Weight in kilograms. Null when not ingested."
- Added
list_forecasts - Changed
search_players20 fields changed- changed
Input schema / properties / ranked / descriptionPrevious value: -"If true, only players with a tennis ranking."New value: +"If true, only tennis players with an ATP/WTA singles ranking (rankings.singles)." - changed
Output schema / $defs / Player / properties / birthdate / descriptionPrevious value: -"YYYY-MM-DD."New value: +"YYYY-MM-DD date of birth." - added
Output schema / $defs / Player / properties / country_code / descriptionAdded value: +"ISO 3166-1 alpha-3 country code." - added
Output schema / $defs / Player / properties / current_team_id / descriptionAdded value: +"Lumify team ID when the player is on a club roster. Null for tennis." - added
Output schema / $defs / Player / properties / current_team_name / descriptionAdded value: +"Current team display name. Null for tennis." - added
Output schema / $defs / Player / properties / first_nameAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / $defs / Player / properties / full_name / descriptionAdded value: +"Display name." - added
Output schema / $defs / Player / properties / handednessAdded value: +{ + "description": "left | right | switch. Meaning is sport-specific (bats for MLB, shoots for NHL, playing hand for tennis). Null when unknown.", + "type": [ + "string", + "null" + ] +} - added
Output schema / $defs / Player / properties / height_cmAdded value: +{ + "description": "Height in centimetres. Null when not ingested.", + "type": [ + "integer", + "null" + ] +} - added
Output schema / $defs / Player / properties / id / descriptionAdded value: +"Lumify player ID." - added
Output schema / $defs / Player / properties / image_urlAdded value: +{ + "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" + ] +} - added
Output schema / $defs / Player / properties / is_active / descriptionAdded value: +"False when deactivated or retired." - added
Output schema / $defs / Player / properties / last_nameAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / $defs / Player / properties / position / descriptionAdded value: +"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." - added
Output schema / $defs / Player / properties / rankingsAdded value: +{ + "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" + ] +} - added
Output schema / $defs / Player / properties / retired_atAdded value: +{ + "description": "YYYY-MM-DD retirement date when known.", + "type": [ + "string", + "null" + ] +} - added
Output schema / $defs / Player / properties / slug / descriptionAdded value: +"URL-safe unique slug." - added
Output schema / $defs / Player / properties / sport / descriptionAdded value: +"Sport slug, e.g. mlb, tennis, nfl." - removed
Output schema / $defs / Player / properties / tennis_rankingRemoved value: -{ - "type": [ - "integer", - "null" - ] -} - added
Output schema / $defs / Player / properties / weight_kgAdded value: +{ + "description": "Weight in kilograms. Null when not ingested.", + "type": [ + "number", + "null" + ] +}
3 tool updates
- Changed
get_stats1 field changed- changed
Output schema / properties / teams / descriptionPrevious value: -"Soccer/MLB/NFL/NCAAF/NBA/NCAAB/NHL only (home/away). 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). 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 only). 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 only). 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 only). Settleables stay on get_player_props. Absent on tennis responses — use players instead."New value: +"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). 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 only). 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 only). 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 only). Settleables stay on get_player_props. Absent on tennis responses — use players instead."
- Changed
get_team1 field changed- added
Output schema / properties / image_urlAdded value: +{ + "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" + ] +}
- Changed
list_teams1 field changed- added
Output schema / $defs / Team / properties / image_urlAdded value: +{ + "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" + ] +}
1 tool update
- Changed
get_stats1 field changed- changed
Output schema / properties / players / descriptionPrevious value: -"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."New value: +"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 from RapidAPI Tennis API; 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."
2 tool updates
- Changed
get_intelligence10 fields changed- changed
Input schema / properties / bookmaker / descriptionPrevious value: -"Bookmaker slug for market prices on recommended bets. Defaults to pinnacle. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. No effect for probability-model sports (MLS soccer and MLB), which report the book their assessment was priced against."New value: +"Ignored. Intelligence always reports the book the assessment was priced against. Valid: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline." - changed
Output schema / properties / bets / items / properties / attribution / descriptionPrevious value: -"Attribution keys backing rationale, same order. Points-model sports only."New value: +"Not published." - changed
Output schema / properties / bets / items / properties / confidence_score / descriptionPrevious value: -"Points-engine score, 0-1, not a calibrated probability. Points-model sports only."New value: +"Not published. Use probability." - changed
Output schema / properties / bets / items / properties / coverage / descriptionPrevious value: -"Signal-coverage fraction, 0-1. Points-model sports only."New value: +"Not published." - changed
Output schema / properties / bets / items / properties / narrative / descriptionPrevious value: -"Per-bet narrative sentence. Points-model sports only."New value: +"Not published." - changed
Output schema / properties / bets / items / properties / rationale / descriptionPrevious value: -"Per-bet signal-strength bullets. Points-model sports only. Distinct from top-level rationale (event-level context chips)."New value: +"Not published. Top-level rationale is the event-level context overlay." - changed
Output schema / properties / bets / items / properties / signals / descriptionPrevious value: -"Per-signal point breakdown. Points-model sports only."New value: +"Not published." - changed
Output schema / properties / bets / items / properties / validator / descriptionPrevious value: -"Qualitative-validator verdict: {stance, confidence, delta, validated_at}. Points-model sports only."New value: +"Not published." - changed
Output schema / properties / matchup / descriptionPrevious value: -"Legacy points-engine probable-starter context. Not returned on the MLB predictive customer surface — use get_stats for pitcher/lineup Data."New value: +"Not returned. Use get_stats for pitcher/lineup Data." - changed
Output schema / properties / rationale / descriptionPrevious value: -"Event-level factual matchup chips (starting pitchers, injuries, form). Context overlay only — not a pick. Distinct from bets[].rationale on points-model sports. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."New value: +"Event-level factual matchup chips (starting pitchers, injuries, form). Context overlay only — not a pick. Predictive MLB may populate on first get_intelligence; later calls reuse the stored row."
- Changed
list_ev1 field changed- changed
Input schema / properties / league / descriptionPrevious value: -"Optional league slug (mls, epl, atp, …). Soccer without a league scans every migrated league."New value: +"Optional league slug (mls, epl, atp, …). Soccer without a league scans every published soccer league (MLS + big-five)."
2 tool updates
- Changed
get_intelligence1 field changed- added
Output schema / properties / bets / items / properties / evAdded value: +{ + "description": "Beta. Customer-facing EV estimate: {beta: true, book, price, ev_pct, kelly_fraction, quote_age_seconds, n_books}. Re-packages the same fair price gap for direct display. Moneyline only. n=1 Pinnacle is a valid fair (soccer/tennis). Null when the gap is ≤0, above 25% (stale-line), or only suppressed books remain (MLB ML × DK/FD proven null; BetMGM/Bet365/BetOnline unscreened).", + "type": [ + "object", + "null" + ] +}
- Added
list_ev
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Sports odds, player props and source coverage for AI assistants. Connect with your own API key.
Sports data across 8 sports under one canonical schema — scores, stats, standings, Elo, odds
NFL/NBA/MLB/NHL/PGA + DFS and prediction-market data. Browse free; query with a free API key.
Live odds, cross-book +EV and graded player-prop results across 27 books. Hosted endpoint included.
Related MCP Servers
- AlicenseAqualityCmaintenanceProvides AI assistants with sports model win probabilities and fair odds across nine sports without requiring an API key.360MIT
- FlicenseNot gradedqualityCmaintenanceProvides comprehensive sports intelligence including live scores, standings, schedules, betting odds, news, highlights, and more via SSE transport.-

PropLineofficial
AlicenseAqualityAmaintenanceLive sports betting odds, cross-book +EV, and graded player-prop resolution across 13 books.111,0151MIT- AlicenseBqualityCmaintenanceProvides AI agents with live, grounded sports data including model probabilities, track records, and European soccer and tennis arbitrage opportunities, so they answer from real numbers instead of stale guesses.135121MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Each tool maps to a distinct data resource or operation: events, live scores, odds, odds history, splits, stats, intelligence, player props, players, teams, sports, and seasons. Pairs like list_events vs query_events and get_event vs get_live_score are clearly differentiated by structured vs natural-language filtering and lightweight vs full detail.
Tool names consistently follow a verb_noun snake_case pattern: get_*, list_*, search_*, query_*, batch_get_*, and estimate_cost. The naming conventions make the resource family immediately obvious, and deviations like batch_get_events are still predictable variants.
19 tools is on the higher side, but each tool covers a specific sports-intelligence data product or workflow with little redundancy. The count feels intentional for the breadth of the domain rather than bloated.
The surface covers event discovery and retrieval, live scores, odds and line movement, splits, statistics, player props, intelligence, player/team/sport/season lookups, batch fetching, and cost estimation. Minor gaps like team standings or full rosters are not exposed, but core agent workflows are well supported.