Player-prop lines, market metadata, and line movement over REST/MCP. 14 sports, CoD projections.
The Flash Props API provides REST and MCP feeds for player-prop lines, market metadata, and line movement across 14 sports, including MLB, NFL, NBA, NHL, NCAA, soccer, tennis, and esports. It offers American odds with token authentication and tiered rate limits, designed for AI agents and applications requiring unified props data.
๐ ๏ธ Key Features
REST + MCP feed for unified access
Player-prop lines, market metadata, and line movement
OpenAPI spec and MCP server for direct AI consumption
Upstream data integration and sport-specific coverage
๐ Use Cases
AI agents consuming pre-game prop data
Betting analytics and prop analytics dashboards
Integrations requiring MCP-compatible feeds
Applications needing unified props across multiple sports
โก Developer Benefits
Structured MCP endpoint for agent-driven workflows
Public OpenAPI spec for integration planning
Clear authentication and billing model
Grounded in a real product approach (token auth, rate limits)
โ ๏ธ Limitations
Coverage varies by sport, season, and upstream availability
Esports props may have variable availability and delays
Allocation and pricing governed by upstream data and Stripe billing
Captured live from the server via tools/list.
list_sports
List every sport supported by Flash Props API with its live status and how deep the Flash model goes. Read-only. No side effects. Rate-limited per your tier. Returns { sports: Array<{ id, name, category, enabled, status, activeGames, activeProps, projectedProps, projectionCapability, effectiveProjection, contextCapability, marketFamilies, supportedMarkets, sources, lastFetchedAt, cacheAgeSeconds, shapeCanaryTripped, legalLine, notes }> }. id is what you pass as the sport parameter to other tools. status: "live" = props posted now, "idle" = in-season but none posted, "offseason" = out of season. projectionCapability tells you WHERE the depth is: "advanced_context" (CoD: projections + form + splits + map logs) and "flash_projection" (MLB: real season baselines + form + splits) vs "posted_lines_only" (everything else today). contextCapability "deep" means get_player_context returns data; "none" means it will be empty. enabled=false means the sport is outside your tier. When to use: to discover valid sport ids, or to check which sport actually has projections/context before asking for them. When not to use: if you already know the sport id and just want its props.
Parameters
No parameters.
Raw schema
{
"type": "object",
"properties": {}
}
get_market_metadata
Return the machine-readable stat vocabulary for a sport: for each live market, its label, family, scope (map1/maps13/full_game), unit, display order, and whether a Flash projection is supported (with a reason when not). Read-only. No side effects. Rate-limited per your tier. Returns { sport, count, markets: Array<{ statKey, label, family, scopeKind, scope, scopeLabel, unit, displayOrder, uiGroup, projection: { supported, reason }, contextSupported, lineOnly, alternateLine }> }. This is what turns a raw stat key like "kills_on_game_1" into "Map 1 Kills" (kills family, map scope, projectable) so you can label and group props without guessing. When to use: after scan_props / get_game_props, to explain or group the raw stat keys you got back. When not to use: if you only need one sport's existence/access, list_sports already carries marketFamilies.
Parameters1
sport
string
optional
Sport id (cod, nba, mlb, ...). Omit for the current in-season sport.
Raw schema
{
"type": "object",
"properties": {
"sport": {
"description": "Sport id (cod, nba, mlb, ...). Omit for the current in-season sport.",
"type": "string"
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}
list_games
Return today's games that have player props available for a sport. Read-only. No side effects. Requires an API key; rate-limited per your tier. Returns: { sport, count, games: Array<{ id, sport, homeTeam, awayTeam, startTime, live, source }> }. id is the eventId to pass to get_game_props (prefixed ud- for Underdog or bv- for Bovada); live is true when the game is in progress; source is "underdog" or "bovada". Live games sort first; scheduled games follow. Typical workflow: call list_games to discover eventIds, then pass an eventId to get_game_props. If sport is omitted the server selects the active in-season league automatically. Returns count=0 with an empty games array (not an error) when no props are posted yet for the day. When to use: to browse all games on the slate or to find an eventId before calling get_game_props. When not to use: if you already have the eventId, skip this and call get_game_props directly. Use find_game instead when you know the team names but want a single-game eventId without browsing the full slate.
Parameters1
sport
string
optional
Sport id: nba, mlb, nfl, nhl, ncaab, ncaaf, soccer, or cod. Omit to default to the current in-season sport.
Raw schema
{
"type": "object",
"properties": {
"sport": {
"description": "Sport id: nba, mlb, nfl, nhl, ncaab, ncaaf, soccer, or cod. Omit to default to the current in-season sport.",
"type": "string"
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_game_props
Fetch all player props for one game identified by eventId. Read-only. No side effects. Requires an API key; rate-limited per your tier. Returns: { eventId, sport, homeTeam, awayTeam, startTime, props: Array<{ player, stat, line, overOdds, underOdds, bookCount, gameState?, flashProjection? }>, sources: string[], fetchedAt, delayed }. flashProjection (present for modeled markets, CoD + MLB today, when available) is { value, sampleN, method, marketKey }, the Flash season-baseline projection, never fabricated. overOdds and underOdds are American-format integers (e.g. -110, +115); null when odds are not available. The stats parameter filters to specific markets (e.g. "points,rebounds" for NBA, "strikeouts,hits_allowed" for MLB). Typical workflow: (1) call list_games to get eventIds, (2) call get_game_props with the eventId. Alternatively, call find_game with team names to resolve the eventId when you know the matchup. Event ids are prefixed ud- (Underdog Fantasy source) or bv- (Bovada source). Returns an error when the event id is not found, the game has ended with no active props, or lines have not been posted yet. When to use: when you have an eventId and want all props for that specific game. When not to use: use scan_props instead when you want a cross-game market view (e.g. all strikeout props today). Use find_player_props when you know the player name but not which game they are in.
Parameters3
eventId
string
required
Event id from list_games or find_game. Prefixed ud- or bv-, e.g. "bv-26839935" or "ud-119284".
sport
string
optional
Sport id (nba, mlb, nfl, etc.). Must match the sport the event belongs to. Omit to use the current in-season sport.
stats
string
optional
Comma-separated list of stat keys to return, e.g. "points,rebounds,assists" for NBA or "strikeouts,hits_allowed" for MLB. Omit to return all available markets.
Raw schema
{
"type": "object",
"properties": {
"eventId": {
"type": "string",
"description": "Event id from list_games or find_game. Prefixed ud- or bv-, e.g. \"bv-26839935\" or \"ud-119284\"."
},
"sport": {
"description": "Sport id (nba, mlb, nfl, etc.). Must match the sport the event belongs to. Omit to use the current in-season sport.",
"type": "string"
},
"stats": {
"description": "Comma-separated list of stat keys to return, e.g. \"points,rebounds,assists\" for NBA or \"strikeouts,hits_allowed\" for MLB. Omit to return all available markets.",
"type": "string"
}
},
"required": [
"eventId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
scan_props
Flatten every active player prop across all of today's games for a sport into a single list. Read-only. No side effects. Requires an API key; rate-limited and row-capped per your tier (free: 25 rows, starter: 100, pro+: 500). Returns: { sport, stat, count, rows: Array<{ player, stat, line, overOdds, underOdds, bookCount, gameState?, flashProjection?, eventId, sport, homeTeam, awayTeam, startTime, source, fetchedAt }> }. Each row is a player prop merged with its event context โ there is no team or opponent field; use homeTeam/awayTeam instead. overOdds/underOdds are American-format integers; null when odds unavailable. Use scan_props when you need a broad cross-game market view โ e.g. every player with a strikeouts prop today, all passing-yards lines for the slate, or which players have the most active markets. Returns count=0 with an empty rows array (not an error) when no props are posted for the day yet. When to use: broad market discovery across all games for a sport. When not to use: use get_game_props instead when you already have an eventId and want one game only โ it is faster and not row-capped. Use find_player_props instead when you want all markets for one player by name.
Parameters3
sport
string
optional
Sport id (nba, mlb, nfl, etc.). Omit to use the current in-season sport.
stat
string
optional
Filter to exactly one stat market, e.g. "strikeouts", "points", "passing_yards". Omit to return all stat types.
limit
integer
optional
Maximum number of rows to return. Capped at your tier limit (free=25, starter=100, pro+=500). Omit to return up to your tier maximum.
Raw schema
{
"type": "object",
"properties": {
"sport": {
"description": "Sport id (nba, mlb, nfl, etc.). Omit to use the current in-season sport.",
"type": "string"
},
"stat": {
"description": "Filter to exactly one stat market, e.g. \"strikeouts\", \"points\", \"passing_yards\". Omit to return all stat types.",
"type": "string"
},
"limit": {
"description": "Maximum number of rows to return. Capped at your tier limit (free=25, starter=100, pro+=500). Omit to return up to your tier maximum.",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}
find_game
Translate a matchup (home team + away team) into the eventId needed by get_game_props. Read-only. No side effects. Requires an API key; rate-limited per your tier. Use this when you know the teams playing but don't have the eventId. On success returns: { eventId }. Pass that id straight to get_game_props. On failure returns an error explaining that the game was not found on today's board. If multiple games match the team names (rare), returns the first match sorted by start time. Matching is case-insensitive substring containment against the full team name (e.g. "Yankees" or "New York Yankees" resolve for MLB) โ short codes like "NYY" or "NY" do NOT match unless they are literally a substring of the team name. If no game is found, the matchup may not be scheduled for today or the sport may be off-season. When to use: when you know both team names and want the eventId without browsing the full slate. When not to use: use list_games instead when you want to browse all games on the slate. Use get_game_props directly if you already have the eventId.
Parameters3
home
string
required
Home team name or city, matched as a case-insensitive substring of the full team name. Examples: "Yankees", "Lakers", "Kansas City Chiefs", "Manchester City". Short codes like "LAL" will not match unless literally a substring of the full name.
away
string
required
Away team name or city, matched the same way. Examples: "Red Sox", "Warriors", "Buffalo Bills", "Arsenal".
sport
string
optional
Sport id (mlb, nba, nfl, nhl, soccer, etc.). Omit to default to the current in-season sport.
Raw schema
{
"type": "object",
"properties": {
"home": {
"type": "string",
"description": "Home team name or city, matched as a case-insensitive substring of the full team name. Examples: \"Yankees\", \"Lakers\", \"Kansas City Chiefs\", \"Manchester City\". Short codes like \"LAL\" will not match unless literally a substring of the full name."
},
"away": {
"type": "string",
"description": "Away team name or city, matched the same way. Examples: \"Red Sox\", \"Warriors\", \"Buffalo Bills\", \"Arsenal\"."
},
"sport": {
"description": "Sport id (mlb, nba, nfl, nhl, soccer, etc.). Omit to default to the current in-season sport.",
"type": "string"
}
},
"required": [
"home",
"away"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
find_player_props
Every active prop for one player across today's board for a sport โ same rows as scan_props, filtered by name (exact normalized match preferred, case-insensitive contains match as a fallback; see matchType in the response) instead of stat. Use this when you know the player but not which game/event they're in.
Parameters2
name
string
required
Player name or gamertag, e.g. "Judge" or "Shotzzy"
sport
string
optional
Sport id. Defaults to the in-season sport.
Raw schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Player name or gamertag, e.g. \"Judge\" or \"Shotzzy\""
},
"sport": {
"description": "Sport id. Defaults to the in-season sport.",
"type": "string"
}
},
"required": [
"name"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_player_context
Season context for a player from the sport's Flash pack: per-market baselines, recent form, and sport-native splits (CoD also carries per-mode stats + a map log). Sports with a registered pack (CoD and MLB today) return data; other sports and unmatched players return an honest empty context, never fabricated. Pro tier and above; free/starter keys get a structured tier_required deny.
Parameters2
name
string
required
Player gamertag, e.g. "Shotzzy". Exact match (case-insensitive) โ no fuzzy guessing.
sport
string
optional
Sport id (cod, mlb, ...). Sports with a Flash pack (cod, mlb today) return data; others an empty context. Defaults to cod.
Raw schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Player gamertag, e.g. \"Shotzzy\". Exact match (case-insensitive) โ no fuzzy guessing."
},
"sport": {
"description": "Sport id (cod, mlb, ...). Sports with a Flash pack (cod, mlb today) return data; others an empty context. Defaults to cod.",
"type": "string"
}
},
"required": [
"name"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_prop_evidence
Assemble the whole story of a single prop in one call. Read-only. No side effects. Rate-limited per your tier. Pro tier and above; free/starter keys get a structured tier_required deny. No picks, no advice -- a data feed. Returns { found, sport, player, market, event, book:{line,source,odds}, flash:{line,rawBaseline,method,sampleN,sampleStrength,mode}, gap, gapPct, form:{n,recentMean,median,stdev,min,max,hitRateVsBookLine,hitRateVsFlashLine,recent}, splits, modeSplit, opponentSplit, recentMaps, movement:{openedLine,currentLine,delta,series?}, freshness:{contextGeneratedAt,ageHours,stale,observedThrough,observedAgeHours,observedStale,note}, missingReasons, disclaimer }. freshness splits two clocks: ageHours/stale is the pack BUILD age; observedThrough/observedAgeHours/observedStale is the real age of the form data (can be far staler if ingest froze), with `note` a human "Form data through <date>" line. hitRateVsBookLine is how often recent maps went over the POSTED line (what a bettor asks); hitRateVsFlashLine is vs the Flash projection. The movement point series is Pro-only (free gets opened/current/delta). Available for sports with a registered Flash pack (CoD and MLB today); other sports return found:false with a reason, never fake data. Every absent section carries an explicit missingReason instead of being silently dropped. When to use: to explain or justify one prop end-to-end (why the Flash line sits where it does, how the player has trended, whether the line moved). When not to use: for a broad market view use scan_props; for a player overview use get_player_context.
Parameters4
player
string
required
Player gamertag, e.g. "Dashy" (exact normalized match preferred, contains-match fallback).
stat
string
required
Stat key, e.g. "kills_on_game_1". Call get_market_metadata for the vocabulary.
sport
string
optional
Sport id. Sports with a Flash pack (cod, mlb today) return full evidence; others found:false with a reason. Defaults to cod.
event
string
optional
Optional event id (ud-...) to disambiguate multi-game slates.
Raw schema
{
"type": "object",
"properties": {
"player": {
"type": "string",
"description": "Player gamertag, e.g. \"Dashy\" (exact normalized match preferred, contains-match fallback)."
},
"stat": {
"type": "string",
"description": "Stat key, e.g. \"kills_on_game_1\". Call get_market_metadata for the vocabulary."
},
"sport": {
"description": "Sport id. Sports with a Flash pack (cod, mlb today) return full evidence; others found:false with a reason. Defaults to cod.",
"type": "string"
},
"event": {
"description": "Optional event id (ud-...) to disambiguate multi-game slates.",
"type": "string"
}
},
"required": [
"player",
"stat"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_prop_history
Chronological line/odds history for a player prop, with opened/current/movement. Pro tier and above โ free/starter keys get a deny message pointing at the upgrade. History accrues from when archiving started, so early results may be short.
Props whose line moved most within a lookback window (default 24h, max 7d), sorted by absolute movement. Pro tier and above โ free/starter keys get a deny message pointing at the upgrade.
Parameters4
sport
string
optional
Sport id, e.g. nfl.
stat
string
optional
Stat key, e.g. passing_yards.
since
string
optional
Lookback window: e.g. 6h, 24h, 3d (1h min, 7d max). Defaults to 24h.
Ranked boards for a sport with a Flash pack. Read-only. No side effects. Pro tier and above (free/starter get a deny message). metric=gap ranks the widest Flash-vs-book edges on the live board (player, market, bookLine, flashLine, gap, gapPct); metric=form ranks players by recent mean vs their Flash Line (delta); metric=sample ranks by baseline size. Returns { sport, metric, stat, count, leaders[], note }. Works for any sport with a pack (CoD and MLB today). No picks -- a ranking of real numbers. When to use: "biggest CoD/MLB edges tonight", "who is trending over their projection". When not to use: for one prop use get_prop_evidence; for raw rows use scan_props.
Parameters4
metric
string
optional
gap (default), form, or sample.
sport
string
optional
Sport id with a Flash pack (cod, mlb). Defaults to cod.
stat
string
optional
Restrict the gap board to one market, e.g. "kills_on_game_1".
limit
integer
optional
Max rows (default 20).
Raw schema
{
"type": "object",
"properties": {
"metric": {
"description": "gap (default), form, or sample.",
"type": "string",
"enum": [
"gap",
"form",
"sample"
]
},
"sport": {
"description": "Sport id with a Flash pack (cod, mlb). Defaults to cod.",
"type": "string"
},
"stat": {
"description": "Restrict the gap board to one market, e.g. \"kills_on_game_1\".",
"type": "string"
},
"limit": {
"description": "Max rows (default 20).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_strategy_doc
Returns the Flash Odds Automation OS strategy document (2026-07-17). 14 sections covering: current architecture map, automation scorecard (26/70), event model, state machine, social operating strategy, live automation maturity ladder, competitive differentiation thesis, proprietary analytics catalog, product experience, prioritized roadmap, and a concrete build-now engineering spec for the CDL result-provider adapter. Use this to understand how Flash Odds is built, what is and is not automated, what to build next, and the core design invariants (frozen claims, no fabrication, approval-gated X posts, Chamber loopback-only). Read-only. No side effects. No API key required.
Live sports player-prop data for AI agents, over the Model Context Protocol. Player-prop lines (over/under), market metadata, Flash projections, evidence, and line movement across 14 sports including esports (CS2, Valorant, Dota 2, Call of Duty).
This repo is the connector for the hosted Flash Props MCP server. The server runs at https://api.flashodds.live/mcp and is operated by Flash AI Solutions. There is no server to install: point your MCP client at the remote endpoint and go.
Connect
Streamable HTTP endpoint:
code
https://api.flashodds.live/mcp
Send your API key as a bearer token:
code
Authorization: Bearer <your_api_key>
Anonymous access works for capability discovery (list_sports, get_market_metadata) so a client can see what's available on first run. Retrieving actual board data requires a key. Get a free one (250 requests/day, every active sport) at https://api.flashodds.live/.
Every sport with live status + projection/context capability
Anonymous
get_market_metadata
The stat vocabulary for a sport (labels, families, scope)
Anonymous
list_games
Today's games with props for a sport
Free+
get_game_props
All player props for one game
Free+
scan_props
Market-wide prop scan across the slate (row-capped by tier)
Free+
find_game
Resolve team names to an event id
Free+
find_player_props
Every active prop for one player
Free+
get_player_context
Season baselines, recent form, splits
Pro
get_prop_evidence
One prop's full story: book line, Flash line, gap, form, movement
Pro
get_prop_history
Chronological line/odds history for a prop
Pro
scan_movers
Biggest line movers in a window
Pro
get_leaders
Ranked boards: top gaps, form, sample strength
Pro
Data is informational only. Not affiliated with any league, team, or sportsbook. 21+.
Tiers
Free (250/day, 25-row scans), Starter, Pro (full evidence, movement, leaders, 500-row scans), and Enterprise. See pricing and full REST docs at https://api.flashodds.live/.