{"openapi":"3.1.0","info":{"title":"Flash Props API","version":"0.1.0","description":"Sports betting player-prop lines across free books (Underdog, Bovada), unified into one clean feed. Pre-game and live in-game props for NBA, MLB, NFL, NHL, NCAA and soccer. Built by Flash AI Solutions."},"servers":[{"url":"https://api.flashodds.live","description":"production"}],"security":[{"BearerAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Your Flash Props API key. Send it as `Authorization: Bearer flash_live_...`."}},"schemas":{"SportsResponse":{"type":"object","properties":{"sports":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"nba"},"name":{"type":"string","example":"NBA Basketball"},"enabled":{"type":"boolean","description":"Allowed on your current tier."}},"required":["id","name","enabled"]}}},"required":["sports"]},"Error":{"type":"object","properties":{"error":{"type":"string","example":"invalid_api_key"},"message":{"type":"string","example":"API key is invalid, revoked, or inactive."}},"required":["error","message"]},"GamesResponse":{"type":"object","properties":{"sport":{"type":"string"},"count":{"type":"integer"},"games":{"type":"array","items":{"$ref":"#/components/schemas/Game"}}},"required":["sport","count","games"]},"Game":{"type":"object","properties":{"id":{"type":"string","example":"bv-26839935","description":"Event id. Prefix ud- (Underdog) or bv- (Bovada)."},"sport":{"type":"string","example":"mlb"},"homeTeam":{"type":"string","example":"Detroit Tigers"},"awayTeam":{"type":"string","example":"Philadelphia Phillies"},"startTime":{"type":"string","example":"2026-07-11T23:10:00.000Z","description":"ISO 8601 start time."},"live":{"type":"boolean","description":"Game is currently in progress."},"source":{"type":"string","enum":["underdog","bovada"]}},"required":["id","sport","homeTeam","awayTeam","startTime","live","source"]},"PropsResult":{"type":"object","properties":{"eventId":{"type":"string","example":"bv-26839935"},"sport":{"type":"string","example":"mlb"},"homeTeam":{"type":"string"},"awayTeam":{"type":"string"},"startTime":{"type":"string"},"props":{"type":"array","items":{"$ref":"#/components/schemas/PlayerProp"}},"sources":{"type":"array","items":{"type":"string"},"example":["bovada"]},"fetchedAt":{"type":"number","description":"Epoch ms when the upstream snapshot was taken."},"delayed":{"type":"boolean","description":"True when served on a delay (free tier)."}},"required":["eventId","sport","homeTeam","awayTeam","startTime","props","sources","fetchedAt","delayed"]},"PlayerProp":{"type":"object","properties":{"player":{"type":"string","example":"Aaron Judge"},"stat":{"type":"string","example":"points","description":"Stat key. NBA: points | rebounds | assists | threes | pra. Other sports use descriptive keys (strikeouts, total_bases, passing_yards, goals, ...)."},"line":{"type":"number","example":24.5,"description":"The posted over/under line."},"overOdds":{"type":"number","example":-115,"description":"American odds for the over / higher."},"underOdds":{"type":"number","example":-105,"description":"American odds for the under / lower."},"bookCount":{"type":"integer","example":1,"description":"How many books contributed (consensus confidence)."},"photoUrl":{"type":"string","example":"https://cdn.underdogfantasy.com/....png"},"playerId":{"type":"string"},"liveValue":{"type":"number","description":"Current in-game stat count (live games only)."},"gameClock":{"type":"string","example":"Q2 7:23"},"gameState":{"type":"string","enum":["pre","live","final"]}},"required":["player","stat","line","bookCount"]},"ScanResponse":{"type":"object","properties":{"sport":{"type":"string"},"stat":{"type":["string","null"]},"count":{"type":"integer"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/ScanRow"}}},"required":["sport","stat","count","rows"]},"ScanRow":{"type":"object","properties":{"player":{"type":"string","example":"Aaron Judge"},"stat":{"type":"string","example":"points","description":"Stat key. NBA: points | rebounds | assists | threes | pra. Other sports use descriptive keys (strikeouts, total_bases, passing_yards, goals, ...)."},"line":{"type":"number","example":24.5,"description":"The posted over/under line."},"overOdds":{"type":"number","example":-115,"description":"American odds for the over / higher."},"underOdds":{"type":"number","example":-105,"description":"American odds for the under / lower."},"bookCount":{"type":"integer","example":1,"description":"How many books contributed (consensus confidence)."},"photoUrl":{"type":"string","example":"https://cdn.underdogfantasy.com/....png"},"playerId":{"type":"string"},"liveValue":{"type":"number","description":"Current in-game stat count (live games only)."},"gameClock":{"type":"string","example":"Q2 7:23"},"gameState":{"type":"string","enum":["pre","live","final"]},"eventId":{"type":"string"},"sport":{"type":"string"},"homeTeam":{"type":"string"},"awayTeam":{"type":"string"},"startTime":{"type":"string"},"source":{"type":"string"}},"required":["player","stat","line","bookCount","eventId","sport","homeTeam","awayTeam","startTime","source"]},"KeyInfo":{"type":"object","properties":{"keyPrefix":{"type":"string","example":"flash_live_ab12"},"tier":{"type":"string","example":"pro"},"label":{"type":"string","example":"production"},"limits":{"type":"object","properties":{"requestsPerMinute":{"type":"integer"},"requestsPerDay":{"type":"integer"},"realtime":{"type":"boolean"},"sports":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string","enum":["all"]}]},"scanLimit":{"type":"integer"}},"required":["requestsPerMinute","requestsPerDay","realtime","sports","scanLimit"]},"usage":{"type":"object","properties":{"today":{"type":"integer","description":"Requests used today (UTC)."},"dailyRemaining":{"type":"integer"}},"required":["today","dailyRemaining"]}},"required":["keyPrefix","tier","label","limits","usage"]}},"parameters":{}},"paths":{"/api/v1/sports":{"get":{"tags":["Meta"],"summary":"List supported sports","description":"Returns the sport catalog and whether each is enabled on your tier.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Sport catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportsResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not permitted on your tier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or daily quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/games":{"get":{"tags":["Props"],"summary":"List today's games","description":"Games with player props posted for the given sport, merged across free books. Live games first.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","default":"nba","example":"mlb","description":"Sport id. See GET /sports."},"required":false,"description":"Sport id. See GET /sports.","name":"sport","in":"query"}],"responses":{"200":{"description":"Games list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GamesResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not permitted on your tier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or daily quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/games/{eventId}/props":{"get":{"tags":["Props"],"summary":"Player props for one game","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","example":"bv-26839935","description":"Event id from GET /games."},"required":true,"description":"Event id from GET /games.","name":"eventId","in":"path"},{"schema":{"type":"string","example":"points,rebounds","description":"Comma-separated stat filter."},"required":false,"description":"Comma-separated stat filter.","name":"stats","in":"query"},{"schema":{"type":"string","default":"nba","example":"mlb"},"required":false,"name":"sport","in":"query"}],"responses":{"200":{"description":"Props for the game","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropsResult"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not permitted on your tier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No props for this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or daily quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/props":{"get":{"tags":["Props"],"summary":"Market-wide props scan","description":"Every player prop across today's games for a sport, flattened into rows — the \"flow\" feed. Live props first. Row count is capped by your tier.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","default":"nba","example":"mlb"},"required":false,"name":"sport","in":"query"},{"schema":{"type":"string","example":"strikeouts","description":"Filter to a single stat."},"required":false,"description":"Filter to a single stat.","name":"stat","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":5000,"example":50,"description":"Max rows (capped by your tier)."},"required":false,"description":"Max rows (capped by your tier).","name":"limit","in":"query"}],"responses":{"200":{"description":"Flattened prop rows","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResponse"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not permitted on your tier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or daily quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me":{"get":{"tags":["Meta"],"summary":"Your key, tier, and usage","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Key info","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyInfo"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or daily quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{}}