Developer Reference

API Documentation

Complete reference for accessing NBA, MLB, NFL, NHL, FIFA World Cup 2026, and NCAAB analytics data programmatically. Build custom integrations, mobile apps, and automated workflows with SportsFBI's powerful multi-sport REST API.

Getting Started

Prerequisites

To use the SportsFBI API, you need:

  • ELITE subscription (or Admin) - direct API access is limited to ELITE and Admin accounts; PRO accounts can use Pro-tier features inside the SportsFBI app but cannot generate an API key
  • API Key - Generate from your API Keys page
  • HTTPS support - All API requests must use HTTPS

Base URL

https://app.sportsfbi.com/api

Quick Start

Make your first API request in under 60 seconds:

# Get today's NBA games curl -X GET "https://app.sportsfbi.com/api/nba/games/today" \ -H "Authorization: Bearer YOUR_API_KEY"

Authentication

Public endpoints can be called without a key. Authenticated endpoints require a Bearer API key; administrator routes also require administrator privileges. Include your key in the Authorization header:

Authorization: Bearer sfbi_abc123...

Getting Your API Key

  1. Sign in to your SportsFBI account
  2. Navigate to API Keys
  3. Click "Generate New API Key"
  4. Copy and securely store your key (shown only once)

⚠️ Security Best Practices

  • Never commit API keys to version control
  • Use environment variables to store keys
  • Rotate keys regularly (at least every 90 days)
  • Revoke compromised keys immediately
  • Use different keys for development and production

Rate Limits

API access requires an ELITE subscription. Elite API keys are limited to 600 requests per minute and enforce fair usage across all users.

Rate Limit Headers

Every API response includes rate limit information in headers:

RateLimit-Limit: 600 RateLimit-Remaining: 587 RateLimit-Reset: 1672531200

Handling Rate Limits

When you exceed your rate limit, the API returns a 429 Too Many Requests status. Implement exponential backoff:

// Example: Exponential backoff in JavaScript async function fetchWithRetry(url, retries = 3) { for (let i = 0; i < retries; i++) { const response = await fetch(url); if (response.status !== 429) return response; const delay = Math.pow(2, i) * 1000; // 1s, 2s, 4s await new Promise(resolve => setTimeout(resolve, delay)); } throw new Error('Max retries exceeded'); }

API Endpoints

All endpoints are served from: https://app.sportsfbi.com

Every endpoint below is callable with no authentication unless marked ELITE or ADMIN ONLY β€” those require a valid API key. Since keys are only issued to ELITE and Admin accounts, this covers every endpoint that needs any form of sign-in or subscription tier, not just ones restricted to ELITE inside the app. ADMIN ONLY requires administrator privileges in addition to authentication.

Games

GET /api/nba/games/today

Today's (or a given date's) NBA games with quality ratings, betting odds, team standings, and injuries.

Query Parameters

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD (defaults to today)
tzOffsetMinintegerOptionalTimezone offset in minutes, βˆ’720 to 720 (e.g. βˆ’300 for EST)
vendorstringOptionaldraftkings or fanduel (default: fanduel)
GET /api/nba/games/upcoming

Games for the next date that has non-final games after today, reusing the today endpoint's shape.

GET /api/nba/games/{nbaGameId}/lineups

Confirmed or predicted starting lineups, bench, injuries, and team standings for a specific game.

GET /api/nba/plays/{nbaGameId}

Play-by-play data grouped by quarter, plus live score, period, and clock.

GET /api/nba/betting-odds

Spreads, moneylines, and totals for up to 20 games at once.

Query Parameters

ParameterTypeRequiredDescription
gameIdsstringRequiredComma-separated NBA game IDs, max 20
vendorstringRequiredOne of fanduel, draftkings, betmgm, betrivers, caesars, fanatics, prizepicks
GET /api/nba/games/{nbaGameId}/key-suspects

Key Suspects analysis β€” players likely to exceed prop projections based on matchup, role, and usage trends.

Query Parameters

ParameterTypeRequiredDescription
modestringOptionaldfs or props (default: dfs)
vendorstringOptionalSportsbook vendor (default: fanduel)
GET /api/nba/games/{nbaGameId}/streaks

Notable consecutive-game stat streaks (30+ pts, double-double, triple-double, etc.) for starters, plus each team's win/loss streak.

GET /api/nba/games/{nbaGameId}/team-trends

Team points-for/points-against trend over the last 10 games vs. season averages, for both teams.

GET /api/nba/games/{nbaGameId}/ou-history

Historical Over/Under hit-rate splits (home/road) for both teams against a given odds vendor.

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionalOdds vendor (default: draftkings)
GET /api/nba/games/{nbaGameId}/four-factors

Team Four Factors comparison (eFG%, TOV%, OREB%, FTA rate β€” offensive and defensive) plus league averages.

GET /api/nba/games/{nbaGameId}/player/{playerId}/box-score

A single player's box score for a specific game.

GET /api/nba/games/{nbaGameId}/box-score

Every player's box score for a game in one request, keyed by player ID.

Slate & DFS

GET /api/nba/slate/dfs-ranking

Precomputed DFS score ranking for today's slate, refreshed every 5 minutes.

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionaldraftkings (default) or fanduel
GET /api/nba/slate/streak-board ELITE

Players on today's slate on an active consecutive-over prop streak (minimum streak of 2), sorted by streak length.

Query Parameters

ParameterTypeRequiredDescription
propTypestringOptionalpoints_rebounds_assists (default) or another combo stat
GET /api/nba/slate/summary

Full slate analysis β€” game environment, spreads/totals, rest days, injuries, and blowout-risk classification. Elite accounts additionally receive playerTags and slateEdge fields in the same response.

GET /api/nba/slate/value-plays ELITE

Slate players whose recent average for a stat meets or exceeds today's prop line (ratio β‰₯ 1.0).

Query Parameters

ParameterTypeRequiredDescription
propTypestringOptionalCombo stat, default points_rebounds_assists
vendorstringOptionalSportsbook vendor (default: draftkings)
GET /api/nba/slate/first-team-scorers ELITE

Slate players who scored within the first 3 minutes of Q1 in at least one recent game.

Query Parameters

ParameterTypeRequiredDescription
windowintegerOptionalGames to look back: 0 (season), 5, 10, 15, or 20 (default: 5)
GET /api/nba/slate/quarter-scorers ELITE

Slate players who scored 3+ points in every quarter in at least one recent game.

Query Parameters

ParameterTypeRequiredDescription
windowintegerOptionalGames to look back: 0 (season), 5, 10, 15, or 20 (default: 5)
GET /api/nba/slate/hit-rate ELITE

Historical Key Suspects hit/miss results for a given (or most recent completed) slate date.

Query Parameters

ParameterTypeRequiredDescription
modestringOptionaldfs or props
datestringOptionalYYYY-MM-DD, defaults to most recent completed date

Signals

GET /api/nba/slate/signals ELITE

Projected stat leaders for the next slate date, with a 5-game sparkline, opponent matchup rating, trend %, and a signal badge (elite_spot, rising, risky, consistent, value, blowout_risk).

Query Parameters

ParameterTypeRequiredDescription
statstringOptionalOne of pts, ast, reb, blk, stl, fg3m, min (default: pts)

Players β€” Free Tier

GET /api/nba/players/{playerId}

Player profile (name, position, height, weight, team).

GET /api/nba/players/{playerId}/seasons

List of seasons the player has box-score data for.

GET /api/nba/players/{playerId}/vs-opponent

The player's last 20 games (min β‰₯5 minutes) against a specific team, with a per-game log and averages.

Query Parameters

ParameterTypeRequiredDescription
teamAbbrstringRequiredTeam abbreviation (e.g. LAL)
GET /api/nba/players/{playerId}/game-log

Game-by-game statistics for a season.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year (e.g. 2025)
GET /api/nba/players/{playerId}/advanced-stats

Game-by-game advanced metrics: PIE, pace, usage%, ORtg, DRtg, TS%, and more.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
GET /api/nba/players/{playerId}/stats

Season averages (pts, reb, ast, etc.) and games-played count.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
GET /api/nba/players/{playerId}/injuries

Current injury status and history for a player.

GET /api/nba/players/{playerId}/contracts

Player contract details by season (cap hit, total cash, base salary, rank).

GET /api/nba/players/{playerId}/role-breakdown

Detailed 18-role archetype breakdown with scores and probabilities for the player's current classification.

GET /api/nba/players/{playerId}/role-analysis

Condensed role analysis: primary role and top-3 role distribution, with generated insight text.

GET /api/nba/players/{playerId}/matchup-analysis/{opponentTeamAbbr}

Comprehensive matchup analysis: player archetype, opponent defensive profile, usage trends, zone data, and a projected score delta.

GET /api/nba/players/{playerId}/shot-chart

Shot chart data β€” FGA/FGM/FG% across 7 distance zones plus rim/midrange/three frequencies and pull-up vs. catch-and-shoot splits.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
GET /api/nba/players/{playerId}/shot-profile

Shot-selection shift detector comparing last-10-games shot selection to season norms, flagging shifts of 12+ percentage points.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
GET /api/nba/players/{playerId}/defender-matchup

How opponents have performed when guarded by this player, plus a computed 0–100 defense score.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
opponentTeamIdintegerOptionalFilter to a single opponent team
GET /api/nba/players/{playerId}/clutch-stats

Clutch performance (final margin ≀5) vs. overall season averages, plus a computed 0–100 clutch score.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
GET /api/nba/players/{playerId}/hustle-stats

Hustle Index β€” a 0–100 composite of deflections, contested shots, charges, screen assists, loose balls, and box-outs vs. league average.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
GET /api/nba/players/{playerId}/quarter-stats

Quarter-by-quarter (Q1–Q4) performance breakdown with a "closer" or "fast starter" trend tag.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
GET /api/nba/players/{playerId}/scoring-sources

Season averages for scoring source breakdown (paint, fast break, second chance, off turnovers) and shot-location scoring %.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
GET /api/nba/players/{playerId}/ball-movement

Touches, passes, secondary/FT assists, speed, and distance, plus a computed touch-based opportunity score.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequiredSeason start year
GET /api/nba/players/{playerId}/schedule-difficulty

Upcoming schedule with a per-game opponent difficulty score based on defensive rating and opponent shooting.

Query Parameters

ParameterTypeRequiredDescription
daysintegerOptional1–14 days ahead (default: 7)
GET /api/player-injuries

All current player injuries across the league.

Query Parameters

ParameterTypeRequiredDescription
teamIdintegerOptionalFilter by team ID
statusstringOptionalout, doubtful, questionable, dtd, probable, out for season

Players β€” Elite

GET /api/nba/players/{playerId}/matchup-stats ELITE

Last-5-games averaged advanced stats with archetype/role detection and generated insights.

GET /api/nba/players/{playerId}/props ELITE

Player prop betting lines (line, over/under odds, per vendor and prop type) for a specific game.

Query Parameters

ParameterTypeRequiredDescription
game_idstringRequiredNBA game ID
GET /api/nba/players/{playerId}/props/hit-rate ELITE

Historical over/under hit rates by prop type.

Query Parameters

ParameterTypeRequiredDescription
limitintegerOptionalRecent games to analyze, 1–50 (default: 25)
prop_typestringOptionalFilter to one prop category
vendorstringOptionalFilter to one vendor
GET /api/nba/players/{playerId}/props/line-movement ELITE

Intraday prop line-movement history for a game. Elite/Admin accounts additionally see cross-vendor consensus-shift detection.

Query Parameters

ParameterTypeRequiredDescription
game_idstringRequiredNBA game ID
GET /api/nba/players/{playerId}/matchup-verdict/{opponentTeamAbbr} ELITE

Lightweight verdict-only endpoint (favorable/neutral/unfavorable) for icon color-coding in lineup cards, skipping the full projection engine.

POST /api/nba/matchup-verdicts/batch ELITE

Batch version of matchup-verdict for up to 30 player/opponent pairs in one request.

Body Parameters

FieldTypeRequiredDescription
requestsarrayRequired1–30 items, each { playerId, opponentTeamAbbr }

Leaderboards

GET /api/nba/leaderboard/{category}

Statistical leaderboards for live, daily, or full-season stats.

Query Parameters

ParameterTypeRequiredDescription
modestringOptionaltoday (live), daily (completed games), or season β€” default: today
limitintegerOptionalMax results (default: 10)
seasonYearintegerOptionalSeason year for season mode
datestringOptionalYYYY-MM-DD for daily mode
tzOffsetMinintegerOptionalTimezone offset in minutes
onlyTodayPlayersbooleanOptionalSeason mode β€” restrict to players in today's games
GET /api/nba/rules

DFS scoring rules reference (DraftKings and FanDuel point values).

GET /api/nba/league-averages

Current cached league averages (pace, defensive rating, etc.) used by the matchup engine. Force-recalculation via refresh=true is admin-only.

Teams

GET /api/nba/teams/{teamAbbr}/defensive-stats ELITE

Detailed defensive statistics: season averages, rim protection, paint defense, pace, and positional matchup breakdowns.

GET /api/nba/team/{teamId}/predicted-lineup

Predicted starting lineup based on the last 15 games of player usage.

GET /api/nba/team/{teamId}/schedule

Team schedule with results and upcoming games.

GET /api/nba/team/{teamId}/roster

Full team roster with positions, jersey numbers, and contract status.

GET /api/nba/team/{teamId}/season-stats

Team season averages β€” PPG, PAPG, pace, offensive and defensive ratings.

DFS Lineup Projections

POST /api/nba/lineup/projections ELITE

DFS lineup projection engine β€” per-player projections, lineup synergy scoring, opponent defensive profile, and role compatibility for a 2–5 player lineup.

Body Parameters

FieldTypeRequiredDescription
playerIdsarrayRequiredArray of 2–5 internal player IDs
opponentTeamAbbrstringRequiredOpponent team abbreviation (e.g. GSW)

Games

GET /api/mlb/games/today

Today's MLB schedule with betting odds and heavy matchup context β€” rest days, injuries, probable-pitcher ERA/WHIP/FIP, team OPS/wOBA, bullpen quality, and recent run differential.

Query Parameters

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD (defaults to today)
vendorstringOptionalOdds vendor (default: draftkings)
GET /api/mlb/games/{gameId}

Single game detail β€” full box score, odds from every vendor, pre-game lineup, and the last 50 plays.

GET /api/mlb/betting-odds

Spreads, moneylines, and totals for one or more games.

Query Parameters

ParameterTypeRequiredDescription
gameIdsstringOptionalComma-separated MLB game IDs (one of gameIds or date required)
datestringOptionalYYYY-MM-DD β€” fetches odds for every game that day
vendorstringOptionalFilter to one vendor
GET /api/mlb/games/{mlbGameId}/analysis

Game-level matchup analysis β€” run-environment/stack recommendation and pitcher-vs-lineup breakdown for both sides.

Query Parameters

ParameterTypeRequiredDescription
langstringOptionalen or es (default: en)
GET /api/mlb/games/{gameId}/player/{playerId}/box-score

A single player's batting or pitching box score line for a specific game.

GET /api/mlb/games/{gameId}/lineups

Batting lineup and probable pitchers for both teams, with standings, injuries, and predicted lineups for games without a confirmed one yet.

GET /api/mlb/plays/{mlbGameId}

Full play-by-play, grouped by inning (top/bottom), including pitch type, velocity, and trajectory where available.

GET /api/mlb/games/{gameId}/recap

AI-generated prose recap of a completed game, cached permanently once generated. Returns 400 if the game isn't final yet, 202 if a recap is already being generated.

GET /api/mlb/games/{gameId}/preview

AI-generated pregame preview with narrative, outlook, and quick facts. Generated as soon as both teams' official starting lineups post, or an hour before first pitch at the latest; falls back to an algorithmic narrative until then.

GET /api/mlb/games/{gameId}/weather

Weather and wind intelligence for the ballpark at first pitch β€” wind speed/direction, temperature, home-run boost rating, and run-environment impact.

GET /api/mlb/games/{gameId}/odds-history

Current line from every vendor plus a historical line-movement timeline for one vendor.

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionalSportsbook vendor (default: fanduel)
GET /api/mlb/games/{mlbGameId}/head-to-head

Win-count record between the two teams over their last 10 meetings.

GET /api/mlb/games/{gameId}/odds-markets

Team/game-level betting markets β€” run line, first-5-innings, correct score, team totals, and more (excludes player props; see the player-level odds-markets endpoint under Players).

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionalSportsbook vendor (default: fanduel)

Slate & DFS

GET /api/mlb/slate/summary

Today's slate overview β€” spread/total/win probability per game, run-environment classification, key injuries, probable pitchers, and per-game player tags (core/value/fade batters).

Query Parameters

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD (defaults to today)
GET /api/mlb/slate/hit-rate ELITE

Historical hit/miss results for the Key Suspects engine on a completed slate date (backtesting view).

Query Parameters

ParameterTypeRequiredDescription
modestringOptionaldfs or props (default: dfs)
vendorstringOptionalSportsbook vendor (default: fanduel)
datestringOptionalYYYY-MM-DD, defaults to most recent completed date
GET /api/mlb/slate/value-plays ELITE

Batters and pitchers whose recent average for a stat meets or exceeds today's live prop line.

Query Parameters

ParameterTypeRequiredDescription
propTypestringOptionalhits, total_bases, home_runs, rbis, strikeouts, runs_scored, pitcher_strikeouts (default: hits)
vendorstringOptionalSportsbook vendor (default: draftkings)
lookbackstringOptional5, 10, 20, or season (default: 5)
GET /api/mlb/slate/batting-signals ELITE

Today's projected batting-stat leaders with a sparkline, trend %, opposing-pitcher matchup rating, pitcher fatigue, and a signal badge (elite_spot, rising, risky, and more).

Query Parameters

ParameterTypeRequiredDescription
statstringOptionalhits, hr, rbi, runs, sb, tb, walks, strikeouts (default: hits)
GET /api/mlb/slate/pitching-signals ELITE

Today's projected strikeout leaders among probable starters, with recent form, opponent-lineup matchup context, and signal badges.

Query Parameters

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD (defaults to today)
GET /api/mlb/slate/stacks

Today's games ranked by DFS/props stack attractiveness β€” run environment, favored stack side, pitcher-vs-lineup matchup, and top recommended batters to stack.

GET /api/mlb/slate/case-builder ELITE

Auto-built parlay "cases" assembled from the Key Suspects engine across the slate, scored by suspicion score, hit rate, and odds value.

Query Parameters

ParameterTypeRequiredDescription
legsintegerOptional2–10 legs per case (default: 4)
minOddsintegerOptionalAmerican-odds floor (default: -150)
gamesstringOptionalComma-separated game IDs or all
vendorstringOptionalSportsbook vendor (default: fanduel)
GET /api/mlb/slate/ev ELITE

EV Finder β€” every vendor's game odds, plus player props with at least a +3% edge against the offered odds based on recent hit rate.

GET /api/mlb/dfs ELITE

DFS slate data β€” slates, games in the slate, roster-slot definitions, and draftable players with salary, position, and eligibility.

Query Parameters

ParameterTypeRequiredDescription
datestringRequiredYYYY-MM-DD
slateIdstringOptionalFilter to one slate
gameIdstringOptionalFilter to one game

Key Suspects

GET /api/mlb/games/{mlbGameId}/key-suspects

Ranked list of a game's most notable player-prop/DFS suspects. Free/Pro/Elite see 1/3/7 of the same curated list.

Query Parameters

ParameterTypeRequiredDescription
modestringOptionaldfs or props (default: dfs)
vendorstringOptionalSportsbook vendor (default: fanduel)
POST /api/mlb/matchup-verdicts/batch ELITE

Batch-computes a cached matchup verdict (favorable/unfavorable) for up to 30 players at once.

Body Parameters

FieldTypeRequiredDescription
gameIdstringRequiredMLB game ID
requestsarrayRequiredUp to 30 items, each { playerId }
GET /api/mlb/games/{mlbGameId}/suspects/votes ELITE

Aggregate upvote/downvote counts per suspect for a game, plus the caller's own current vote.

POST /api/mlb/games/{mlbGameId}/suspects/{playerId}/vote ELITE

Casts or toggles a vote on a suspect. Voting the same direction twice cancels it back to neutral. Returns the suspect's updated aggregate counts.

Body Parameters

FieldTypeRequiredDescription
propTypestringRequiredWhich prop the suspect refers to
voteintegerRequired1 (up) or -1 (down)

Players

GET /api/mlb/players

Player search by name β€” returns id, full name, position, and team for matches.

Query Parameters

ParameterTypeRequiredDescription
qstringRequiredName search, minimum 2 characters
GET /api/mlb/players/{playerId}

Player profile β€” name, position, jersey, bats/throws, physicals, birthplace, debut year, draft info, and current team.

GET /api/mlb/players/{playerId}/stats

Season totals and rate stats (batting and/or pitching) for one player-season.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
season_typestringOptionalregular or postseason (default: regular)
GET /api/mlb/players/{playerId}/splits

Split-stat breakdown by arena, pitcher hand, day/night, month, opponent, situation, batting order, count, and position.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
categorystringOptionalbatting or pitching (default: both)
GET /api/mlb/players/{playerId}/handedness-splits

AVG/OBP/SLG/OPS split vs. left- and right-handed opponents (pitchers for a batter, batters for a pitcher), with a league percentile rank.

GET /api/mlb/players/{playerId}/game-log

Per-game batting and pitching stat lines for the current season, most recent first.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
limitintegerOptionalMax games (default: 30, max: 162)
GET /api/mlb/players/{playerId}/props

Player prop lines across all prop types and vendors for a specific game.

Query Parameters

ParameterTypeRequiredDescription
game_idstringRequiredMLB game ID (mlb_game_id or internal ID)
vendorstringOptionalFilter to one vendor
GET /api/mlb/players/{playerId}/odds-markets

This player's betting markets and outcomes for one game, across all vendors.

Query Parameters

ParameterTypeRequiredDescription
game_idstringRequiredMLB game ID (mlb_game_id or internal ID)
vendorstringOptionalFilter to one vendor
GET /api/mlb/players/{playerId}/props/hit-rate ELITE

Historical hit-rate tracker β€” how often the player's actual result beat the line, all-time and over the last 10 games.

Query Parameters

ParameterTypeRequiredDescription
limitintegerOptionalGames considered per prop type (default: 25, max: 50)
GET /api/mlb/players/{playerId}/props/line-movement ELITE

Intraday line movement per prop type and vendor. Elite/Admin accounts also see cross-book consensus-shift detection.

Query Parameters

ParameterTypeRequiredDescription
game_idstringRequiredMLB game ID
GET /api/mlb/players/{playerId}/pitch-type/arsenal

A pitcher's per-pitch-type arsenal β€” usage%, zone%, chase%, whiff%, contact%, and results allowed by pitch type.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
GET /api/mlb/players/{playerId}/pitch-type/movement

Statcast-derived pitch movement β€” average velocity, spin rate, induced vertical break, horizontal break, and release extension per pitch type.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
GET /api/mlb/players/{playerId}/pitch-type/splits

A hitter's performance against each pitch type β€” whiff/chase/contact/zone %, BA/SLG/wOBA, and outcome counts.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
GET /api/mlb/players/{playerId}/injuries

Current injury status, return date, and description for a player.

GET /api/mlb/players/{playerId}/batter-matchup

Pre-game matchup packet β€” the batter's season stats and splits against the opposing probable pitcher's profile, plus career stats vs. that opponent.

Query Parameters

ParameterTypeRequiredDescription
game_idstringRequiredMLB game ID

Leaderboards

GET /api/mlb/leaderboard/{category}

Ranked season leaderboard for one batting or pitching stat category, with a 5-game sparkline.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
season_typestringOptionalregular or postseason (default: regular)
limitintegerOptionalMax results (default: 25, max: 100)
onlyTodayPlayersbooleanOptionalRestrict to players in today's lineups
datestringOptionalYYYY-MM-DD, used only with onlyTodayPlayers

Teams

GET /api/mlb/teams

All MLB teams β€” ID, abbreviation, names, league, and division.

GET /api/mlb/team/{teamId}/schedule

Full season schedule for a team with scores, status, and opponent info.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
GET /api/mlb/team/{teamId}/roster

Current active roster with each player's current-season batting/pitching stat line attached.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
GET /api/mlb/team/{teamId}/standings

A team's standings row (wins, losses, streak) for a season.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
GET /api/mlb/team/{teamId}/injuries

Team's current injury report β€” player, status, return date, and description.

GET /api/mlb/team/{teamId}/season-stats

Team batting, pitching, and fielding season totals (regular season only).

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
GET /api/mlb/team/{teamId}/batting-vs-hand

Team-level batting AVG/OPS vs. left- and right-handed pitching for the current season, with league rank.

Prediction Accuracy

GET /api/mlb/stats/predictions

All-time SportsFBI prediction-accuracy stats β€” predictions made/graded/hit, hit rate, key suspects surfaced, and props currently tracked.

GET /api/mlb/stats/latest-slate

Same grading methodology scoped to the single most recent fully-graded slate date.

GET /api/mlb/stats/slate-recap

Full result ledger for one date's slate β€” every game's prediction vs. actual outcome graded hit/miss/pending, plus navigable previous/next dates.

Query Parameters

ParameterTypeRequiredDescription
datestringRequiredYYYY-MM-DD
GET /api/mlb/stats/slate-recap-dates

List of the last 90 days' fully-completed slate-recap dates.

NFL reference: 39 endpoints. Public routes require no API key; protected routes require authentication. Direct API-key access requires an Elite API key; app access follows the endpoint's plan entitlement. Admin routes require administrator privileges.

Team and player IDs are internal IDs. Game-detail, play-by-play, Key Suspects, and voting routes use provider NFL game IDs; odds-history also accepts an internal game ID. For date-window queries, tzOffsetMin is minutes east of UTC, opposite to JavaScript getTimezoneOffset(), and defaults to 0.

Games

GET /api/nfl/games/today

Games on a given local calendar day, with odds, a derived win/loss record, and the SportsFBI edge projection per game. NFL's slate clusters on Thu/Sun/Mon, so fallback=last walks forward to the next date with real games instead of backward.

Query Parameters

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD (defaults to today)
vendorstringOptionalOdds vendor (default: draftkings)
tzOffsetMinintegerOptionalClient timezone offset in minutes
fallbackstringOptionallast β€” walk forward to the next date with games if none on date
GET /api/nfl/games/{gameId}

Single game detail β€” quarter-by-quarter score, all-vendor odds comparison, frozen opening moneyline, full box score, derived team records, and the SportsFBI edge engine output.

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionalOdds vendor (default: draftkings)
GET /api/nfl/betting-odds

Spreads, moneylines, and totals for one or more games.

Query Parameters

ParameterTypeRequiredDescription
gameIdsstringOptionalComma-separated NFL game IDs (one of gameIds or date required)
datestringOptionalYYYY-MM-DD β€” fetches odds for every game that day
vendorstringOptionalFilter to one vendor
tzOffsetMinintegerOptionalClient timezone offset in minutes
GET /api/nfl/games/{gameId}/preview

AI-generated pregame preview, gated to within an hour of kickoff.

GET /api/nfl/games/{gameId}/recap

AI-generated prose recap of a completed game, cached permanently once generated. Returns 400 if the game isn't final yet, 202 if a recap is already being generated.

GET /api/nfl/games/{gameId}/odds-history

Consensus: authenticated callers can use marketScope=consensus for cross-book history and current consensus; otherwise the selected vendor is used.

Authoritative opening line, intraday movement snapshots, and the latest quote per vendor.

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionalOne of betmgm, betrivers, caesars, draftkings, fanatics, fanduel, kalshi, polymarket (default: draftkings)
GET /api/nfl/plays/{gameId}

Full play-by-play grouped by quarter/OT, with team stats, top player-stat leaders, and a computed live-game-center overlay (win-probability deltas, event markers).

Key Suspects & Slate

GET /api/nfl/games/{gameId}/key-suspects

Consensus: marketScope=consensus requests the canonical cross-book pool. availableAt optionally limits it to picks offered by a supported sportsbook. If consensus is unavailable, the vendor pool is returned with consensusFallback=true and fallbackVendor. Consensus access and the number/bands of visible suspects depend on authentication and plan.

Ranked list of a game's most notable player-prop suspects with suspicion scores and evidence factors.

Query Parameters

ParameterTypeRequiredDescription
modestringOptionalprops (default; dfs is accepted but not yet supported for NFL)
vendorstringOptionalOne of draftkings, fanduel, betmgm, betrivers, caesars, fanatics, prizepicks
GET /api/nfl/slate/hit-rate ELITE

Access: authenticated with the premiumData entitlement. marketScope=consensus grades frozen consensus snapshots, falling back per game to the selected vendor. Responses identify fallback games. Live fallback candidates remain ungraded; they are not historical recommendations.

Historical hit/miss results for the Key Suspects engine on a completed slate date (backtesting view).

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionalSportsbook vendor (default: draftkings)
datestringOptionalYYYY-MM-DD, defaults to most recent completed date
GET /api/nfl/slate/ev ELITE

EV Finder β€” every vendor's game odds, plus player props (Pro/Elite/Admin in the app; Elite API key required for direct access) with an edge against the offered odds based on a no-vig consensus across other books.

Query Parameters

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD (defaults to the next scheduled game date within 21 days)
GET /api/nfl/slate/case-builder ELITE

Access: authenticated; case count and leg limits depend on plan. Uses consensus by default, with vendor fallback per game when no consensus suspects exist. Each consensus leg uses the best available sportsbook quote at its canonical line, rather than fair consensus odds. Responses include consensus and fallback metadata. refresh=true bypasses the cache. Free accounts allow 2-4 legs and use a -200 odds floor; paid accounts allow 2-10 legs and default to -150.

Auto-built parlay "case" cards assembled from that day's scheduled games' Key Suspects picks, with combined American odds.

Query Parameters

ParameterTypeRequiredDescription
legsintegerOptional2–10 legs per case (default: 4)
minOddsintegerOptionalAmerican-odds floor (default: -150)
gamesstringOptionalComma-separated game IDs or all
vendorstringOptionalOne of draftkings, fanduel, betmgm, betrivers, caesars, fanatics, prizepicks
datestringOptionalYYYY-MM-DD (default: today)

Players

GET /api/nfl/players

Player search by name β€” returns id, full name, position, and team for matches.

Query Parameters

ParameterTypeRequiredDescription
qstringRequiredName search, minimum 2 characters
GET /api/nfl/players/{playerId}

Player profile β€” identity, position, physicals, team, plus most recent injury status.

GET /api/nfl/players/{playerId}/seasons

Distinct list of seasons for which this player has any game or season stats.

GET /api/nfl/players/{playerId}/stats

Season totals for one player-season.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
postseasonbooleanOptionaltrue for postseason stats (default: regular season)
GET /api/nfl/players/{playerId}/game-log

Per-game box-score log, newest first, joined to opponent/date/result context.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
limitintegerOptionalMax games (default: 10, max: 50)
GET /api/nfl/players/{playerId}/props

Player prop lines (line, over/under/milestone odds, market type) for a specific game.

Query Parameters

ParameterTypeRequiredDescription
game_idstringRequiredNFL game ID (nfl_game_id or internal ID)
vendorstringOptionalFilter to one vendor
GET /api/nfl/players/{playerId}/props/hit-rate ELITE

Historical hit-rate tracker β€” how often the player's actual result beat the line.

Query Parameters

ParameterTypeRequiredDescription
limitintegerOptionalGames considered (default: 25, max: 50)
GET /api/nfl/players/{playerId}/props/line-movement ELITE

Per-prop-type/vendor line-movement timeline for a player in one game, opening line through subsequent moves.

Query Parameters

ParameterTypeRequiredDescription
game_idstringRequiredNFL game ID (nfl_game_id or internal ID)

Teams

GET /api/nfl/teams

All NFL teams β€” ID, abbreviation, name, conference, and division.

GET /api/nfl/team/{teamId}/roster

Full roster with depth-chart position, injury status, and nested per-player season stats where available.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
GET /api/nfl/team/{teamId}/injuries

Team's current injury report β€” player, status, comment, and injury date.

GET /api/nfl/team/{teamId}/standings

Derived win/loss/tie record, points for/against, point differential, and win streak, computed from completed games.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
seasonTypeintegerOptional1=preseason, 2=regular, 3=postseason (default: 2)
GET /api/nfl/team/{teamId}/schedule

Every game the team plays that season across all season types (preseason included), with score/status/home-away.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
GET /api/nfl/team/{teamId}/season-stats

Team offense/defense/special-teams season totals, including opponent-mirror fields.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current year
seasonTypeintegerOptional1=preseason, 2=regular, 3=postseason (default: 2)

Prediction Accuracy

GET /api/nfl/stats/week-recap

Weekly result ledger β€” every game in that week graded hit/miss/pending against its frozen pregame prediction, plus previous/next graded-week navigation.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerRequirede.g. 2026
weekintegerRequired1–22
seasonTypeintegerOptional1=preseason, 2=regular, 3=postseason (default: 2)
GET /api/nfl/stats/week-recap-periods

Completed, prediction-bearing NFL weeks eligible for public recap discovery and sitemap inclusion. Includes the prediction-history start date and each week's last game date.

Discovery, Signals & Leads

GET /api/nfl/slate/summary

Daily NFL Summary with matchups, spread, total, win confidence, rest, injuries, and projection factors. Dates follow the Eastern kickoff calendar.

Access: Authenticated

Parameters

date: optional valid YYYY-MM-DD; defaults to today in Eastern time. Current projections before kickoff; stored pregame confidence and factors after kickoff. Missing historical predictions stay unavailable. Historical lines are closing pregame DraftKings quotes. NFL uses Breakdown and Injuries, without Stack or an overtime estimate.

Response overview

{ date, games, slateOverview, slateEdge }

GET /api/nfl/slate/signals

Player form, projections, and matchup signals for the current or next available slate.

Access: Authenticated; playerSignals entitlement

Parameters

stat: passing_yards (default), passing_tds, passing_completions, rushing_yards, rushing_attempts, receiving_yards, or receptions. The slate date is selected automatically.

Response overview

{ date, stat, games, players }

GET /api/nfl/slate/value-plays

Leads: players whose recent average meets or exceeds the consensus prop line. Always uses consensus, with no sportsbook fallback.

Access: Authenticated; results limited by plan

Parameters

propType: passing_yards (default), passing_tds, passing_completions, rushing_yards, rushing_attempts, receiving_yards, receptions, rushing_receiving_yards, or anytime_td. lookback: 5 (default), 10, 20, or season. date: YYYY-MM-DD, default today. tzOffsetMin: minutes east of UTC, -720 to 840, default 0. fallback: next to find the next available prop date. vendor does not select a book; marketScope is always consensus.

Response overview

{ players, updatedAt, marketScope: "consensus", ...date and plan metadata }

GET /api/nfl/players/hub

Player directory with season summaries and a recent-form list.

Access: Public

Parameters

season: optional 2000-2100; defaults to the current NFL season.

Response overview

{ sport: "nfl", season, totalPlayers, players, hot }

GET /api/nfl/players/{playerId}/public-profile

Combined player identity, injury, regular-season stats, recent game log, and roster. Optional sections may be unavailable while the profile still succeeds.

Access: Public

Parameters

playerId: internal player ID. season: optional; defaults to the current calendar year.

Response overview

{ player, injury, stats, gameLog, roster }

GET /api/nfl/teams/hub

Team directory with records and season summaries.

Access: Public

Parameters

season: optional 2000-2100; defaults to the current NFL season. seasonType: 1 preseason, 2 regular season (default), or 3 postseason.

Response overview

Team hub with season, seasonType, and team summaries.

GET /api/nfl/team-rankings

League-wide team rankings by statistical category.

Access: Public

Parameters

season: optional; defaults to the current NFL season. seasonType: 1 preseason, 2 regular season (default), or 3 postseason.

Response overview

{ totalTeams, categories, teams, ...ranking metadata }

GET /api/nfl/team/{teamId}/profile

Combined team record, home/away splits, streak, scoring, spread and total results, division standings, rankings, and schedule.

Access: Public

Parameters

teamId: internal team ID. season: optional; defaults to the current NFL season. seasonType: 1 preseason, 2 regular season (default), or 3 postseason. The schedule includes all season types; result summaries use the requested type.

Response overview

{ team, season, seasonType, gamesPlayed, record, home, away, streak, ats, overUnder, division, rankings, schedule, ...scoring fields }

GET /api/nfl/games/{nflGameId}/suspects/votes

Aggregate suspect votes and the current user's vote, keyed by playerId_propType. An unknown game returns an empty votes object.

Access: Authenticated

Parameters

nflGameId: provider NFL game ID, not the internal game ID.

Response overview

{ gameId, votes: { "123_passing_yards": { upvotes: 1, downvotes: 0, userVote: 1 } } }

Voting & Administration

POST /api/nfl/games/{nflGameId}/suspects/{playerId}/vote

Cast a suspect vote. Repeating the same vote cancels it; voting in the opposite direction switches it. Unknown game returns 404.

Access: Authenticated

Parameters

nflGameId: provider NFL game ID. playerId: internal player ID. JSON body: propType (required string), vote (required numeric 1 or -1).

Request body

{
  "propType": "passing_yards",
  "vote": 1
}

Response overview

{ playerId, propType, upvotes, downvotes, userVote }

PUT /api/nfl/team/{teamId}/core-players/{playerId}

Override whether a rostered player belongs to the team's core lineup. Refreshes the roster cache. A player outside this roster returns 404.

Access: Admin only

Parameters

teamId and playerId: internal IDs. JSON body: isCore, optional boolean, default true; other types return 400.

Request body

{
  "isCore": true
}

Response overview

{ teamId, playerId, isCore, source: "override" }

DELETE /api/nfl/team/{teamId}/core-players/{playerId}

Remove a core-player override and restore automatic selection. Refreshes the roster cache.

Access: Admin only

Parameters

teamId and playerId: internal IDs. No request body.

Response overview

{ teamId, playerId, source: "usage" }

NHL API Reference

Reviewed October 12, 2026. All 51 dedicated NHL routes are listed below: 47 public or authenticated routes and four administrator-only routes.

Access: Public routes need no key. ELITE means direct API calls require Authorization: Bearer YOUR_API_KEY; keys are issued to ELITE and Admin accounts. App sessions follow the feature allowances described on each route. ADMIN ONLY requires administrator privileges; an ordinary ELITE key does not grant administrative access.

IDs: :gameId, game_id, and gameIds use provider nhl_game_id. :teamId and :playerId use SportsFBI internal IDs from the team/player lists. Do not substitute nhl_team_id or nhl_player_id in these paths. All path IDs must be positive integers.

Dates: Daily game/odds readers use Eastern scheduled dates unless tzOffsetMin is supplied. The offset is minutes east of UTC (for example -240), opposite to JavaScript's getTimezoneOffset(). Required seasons have no universal current-season default. postseason accepts the literal strings true and false; omission behavior varies by route, as listed below.

Markets: Tool books are draftkings, fanduel, betmgm, betrivers, caesars, and fanatics. Readers can expose other stored vendors/markets. Settlement-supported skater props are goals, assists, points, shots_on_goal, and anytime_goal. Power-play points are not supported for grading. Over/under and milestones remain distinct: milestones reach their threshold, while integer over/under lines can push. Overtime counts for supported player props; shootout goals do not. A player with no recorded ice time is voided once a final box score is available; missing box data remains unresolved.

Consensus: Provisional version 1 requires at least two books at the unique canonical line, at least half of eligible books supporting it, and quotes no older than 180 minutes. Over/under probability is the median two-sided no-vig over probability; UNDER uses its complement. Milestones use raw one-sided probabilities including bookmaker margin. Synthetic consensus odds are reference prices, not executable offers. Capture gaps are never filled retrospectively from live prices.

Examples: IDs, dates, and results are illustrative. Response snippets show selected fields, not exhaustive schemas or live results. Empty arrays and nulls illustrate possible missing-data states. Replace IDs with values from list endpoints. Timestamps may be null when unavailable.

Games & Live Center

GET /api/nhl/games/today

Daily games with records, scores, status, venue, and matchup projections.

Parameter / locationRequirements, defaults & behavior
dateoptional YYYY-MM-DD; default today in Eastern time unless stated otherwise.
tzOffsetMinoptional minutes east of UTC, -720 to 840; absent uses Eastern scheduled dates.
seasonoptional provider season start year.
postseasonoptional true/false; omitted includes both regular-season and postseason games.
fallbackoptional next; legacy last also finds the next scheduled slate when the requested day is empty.

Behavior: No pagination. engine is live before puck drop, frozen after start, or null when unavailable.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/today?date=2026-10-12&fallback=next"

Response example (selected fields):

{
  "date": "2026-10-12",
  "requestedDate": "2026-10-12",
  "fallbackDate": null,
  "timezone": "America/New_York",
  "tzOffsetMin": null,
  "games": []
}
GET /api/nhl/games/results

Completed games, newest first, with the matching total count.

Parameter / locationRequirements, defaults & behavior
seasonrequired provider season start year (four digits, at least 1900; for example 2026).
postseasonoptional true/false; omitted includes both regular-season and postseason games.
limitoptional 1-100, default 50. offset: optional 0-100000, default 0.
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/results?season=2026&postseason=false"

Response example (selected fields):

{
  "season": 2026,
  "postseason": false,
  "games": [],
  "total": 0,
  "limit": 50,
  "offset": 0
}
GET /api/nhl/games/:gameId

One game, returned directly rather than inside a games array.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.

Behavior: Includes scores, records, venue, and the current/frozen engine. Missing game returns 404.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11"

Response example (selected fields):

{
  "id": 1,
  "nhl_game_id": 11,
  "season": 2026,
  "status_state": "scheduled",
  "engine": null
}
GET /api/nhl/games/:gameId/stats

Skater and goalie box-score rows for one game.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.

Behavior: participation is recorded, no_recorded_ice_time, or unknown. Empty rows do not imply zero statistics.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/stats"

Response example (selected fields):

{
  "game": {
    "nhl_game_id": 11
  },
  "players": [],
  "source": "provider_box_scores",
  "feed_observation": null,
  "retained_after_empty": false
}
GET /api/nhl/plays/:gameId

Play-by-play and a full-feed live-center summary.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.
periodoptional positive integer; filters plays only, not summary.

Behavior: Summary includes period scoring, overtime/shootout context, penalties, team totals, and leaders. Participant IDs in play details are provider player IDs.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/plays/11?period=1"

Response example (selected fields):

{
  "game": {
    "nhl_game_id": 11
  },
  "plays": [],
  "periods": [],
  "feed_coverage": {},
  "source": "provider_play_by_play",
  "summary": {
    "scoring": {},
    "scoring_plays": [],
    "penalties": [],
    "team_stats": {},
    "leaders": {},
    "unavailable": [
      "win_probability",
      "expected_goals",
      "shift_time",
      "power_play_labels"
    ]
  }
}

Teams, Rosters & Starting Goalies

GET /api/nhl/teams

All stored team identities, including historical teams.

No query parameters or body.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/teams"

Response example (selected fields):

{
  "teams": []
}
GET /api/nhl/teams/hub

Season teams, regular-season standings, recent form, and per-stat rankings.

Parameter / locationRequirements, defaults & behavior
seasonrequired provider season start year (four digits, at least 1900; for example 2026).
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/teams/hub?season=2026"

Response example (selected fields):

{
  "sport": "nhl",
  "season": 2026,
  "postseason": false,
  "totalTeams": 0,
  "teams": []
}
GET /api/nhl/team-rankings

Team rankings from standings and official season aggregates.

Parameter / locationRequirements, defaults & behavior
seasonrequired provider season start year (four digits, at least 1900; for example 2026).
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/team-rankings?season=2026"

Response example (selected fields):

{
  "season": 2026,
  "postseason": false,
  "totalTeams": 0,
  "method": "per_metric_competition_rank",
  "categories": [],
  "teams": []
}
GET /api/nhl/team/:teamId/profile

Identity, standings, division, rankings, and full season schedule.

Parameter / locationRequirements, defaults & behavior
teamIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).

Behavior: Standings and ranks use regular-season data. Schedule also includes postseason games. ATS and total records remain unavailable.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/team/1/profile?season=2026"

Response example (selected fields):

{
  "team": {
    "id": 1
  },
  "season": 2026,
  "standing": null,
  "recordText": null,
  "division": {
    "rows": []
  },
  "rankings": {},
  "ats": null,
  "overUnder": null,
  "betting_results_unavailable_reason": "settlement_scope_unresolved",
  "schedule": []
}
GET /api/nhl/team/:teamId/schedule

Season games in date order, with opponent and home/away identity.

Parameter / locationRequirements, defaults & behavior
teamIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).
postseasonoptional true/false; omitted includes both regular-season and postseason games.
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/team/1/schedule?season=2026&postseason=false"

Response example (selected fields):

{
  "team": {
    "id": 1
  },
  "season": 2026,
  "games": []
}
GET /api/nhl/team/:teamId/roster

Season-associated roster, current injuries, core overrides, and official regular-season player stats.

Parameter / locationRequirements, defaults & behavior
teamIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).

Behavior: Season membership does not confirm game participation or line combinations.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/team/1/roster?season=2026"

Response example (selected fields):

{
  "team": {
    "id": 1
  },
  "season": 2026,
  "players": [],
  "stats_source": "provider_season_stats",
  "injury_source": "current_report",
  "membership_type": "season_association",
  "lineup_confirmed": false
}
GET /api/nhl/team/:teamId/standings

Stored provider standings for a team and season.

Parameter / locationRequirements, defaults & behavior
teamIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).

Behavior: standing is null when no row is stored.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/team/1/standings?season=2026"

Response example (selected fields):

{
  "team": {
    "id": 1
  },
  "season": 2026,
  "standing": null
}
GET /api/nhl/team/:teamId/injuries

Current injuries attributed through the injury feed's season associations.

Parameter / locationRequirements, defaults & behavior
teamIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).

Behavior: Current report, not a historical report reconstructed for a past game.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/team/1/injuries?season=2026"

Response example (selected fields):

{
  "team": {
    "id": 1
  },
  "season": 2026,
  "injuries": [],
  "report_type": "current",
  "team_attribution": "injury_feed_season_association"
}
GET /api/nhl/team/:teamId/goalie-starts

Observed starters from finals, grouped by goalie with individual starts.

Parameter / locationRequirements, defaults & behavior
teamIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).

Behavior: Includes regular-season and postseason finals. This is postgame evidence, not pregame confirmation.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/team/1/goalie-starts?season=2026"

Response example (selected fields):

{
  "team": {
    "id": 1
  },
  "season": 2026,
  "observation": "postgame_box_score_starter",
  "pregame_confirmation": false,
  "coverage": {
    "final_games": 0,
    "games_with_observed_starter": 0
  },
  "goalies": [],
  "starts": []
}
GET /api/nhl/games/:gameId/goalies

Expected or observed confirmed goalie for each side, with official season stats.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.

Behavior: status is expected, confirmed, or unavailable. Expected uses prior starts/rest; confirmed uses a box-score starter flag, not an external pregame confirmation feed.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/goalies"

Response example (selected fields):

{
  "nhl_game_id": 11,
  "home": {
    "status": "unavailable",
    "goalie": null,
    "basis": "no_prior_starts",
    "detail": null
  },
  "away": {
    "status": "unavailable",
    "goalie": null,
    "basis": "no_prior_starts",
    "detail": null
  },
  "pregame_confirmation": false
}

Players & Official Statistics

GET /api/nhl/players

Search stored players by name and optional season association.

Parameter / locationRequirements, defaults & behavior
qoptional substring, maximum 128 characters; default empty (all players).
seasonoptional provider season start year.
limitoptional 1-100, default 50. offset: optional 0-100000, default 0.
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players?q=Skater&season=2026"

Response example (selected fields):

{
  "players": [],
  "limit": 50,
  "offset": 0
}
GET /api/nhl/players/hub

Associated players, teams, regular-season stats, and current injuries.

Parameter / locationRequirements, defaults & behavior
seasonrequired provider season start year (four digits, at least 1900; for example 2026).

Behavior: Traded players can have multiple team associations.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players/hub?season=2026"

Response example (selected fields):

{
  "sport": "nhl",
  "season": 2026,
  "postseason": false,
  "players": []
}
GET /api/nhl/players/:playerId

Player identity and all stored season team memberships.

Parameter / locationRequirements, defaults & behavior
playerIdrequired positive integer in the path; SportsFBI internal ID.
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players/7"

Response example (selected fields):

{
  "player": {
    "id": 7,
    "nhl_player_id": 70
  },
  "memberships": [],
  "membership_type": "season_association"
}
GET /api/nhl/players/:playerId/public-profile

Player identity, memberships, injury, season stats, and the latest ten game logs.

Parameter / locationRequirements, defaults & behavior
playerIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).

Behavior: Stats are regular-season aggregates. Logs can include postseason games in that season. role is skater, goalie, or null.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players/7/public-profile?season=2026"

Response example (selected fields):

{
  "player": {
    "id": 7
  },
  "season": 2026,
  "role": "skater",
  "memberships": [],
  "injury": null,
  "stats": {
    "postseason": false,
    "values": {},
    "source": "provider_season_stats"
  },
  "gameLog": {
    "rows": [],
    "source": "provider_box_scores"
  }
}
GET /api/nhl/players/:playerId/game-log

Paginated player box scores, newest first, with opponent at each game.

Parameter / locationRequirements, defaults & behavior
playerIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).
postseasonoptional true/false; omitted includes both regular-season and postseason games.
limitoptional 1-100, default 50. offset: optional 0-100000, default 0.
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players/7/game-log?season=2026&postseason=false"

Response example (selected fields):

{
  "player": {
    "id": 7
  },
  "season": 2026,
  "rows": [],
  "limit": 50,
  "offset": 0,
  "source": "provider_box_scores"
}
GET /api/nhl/players/:playerId/stats

Official season stats, or box-score rows for one game.

Parameter / locationRequirements, defaults & behavior
playerIdrequired positive integer in the path; SportsFBI internal ID.
gameIdoptional provider NHL game ID; cannot be combined with season/postseason.
seasonrequired if gameId is absent; provider season start year.
postseasonoptional true/false; default false.

Behavior: With gameId, response is player_id, nhl_game_id, rows, and source: provider_box_scores. This query uses gameId; player prop readers use game_id.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players/7/stats?season=2026&postseason=false"

Response example (selected fields):

{
  "entity": {
    "id": 7,
    "provider_id": 70
  },
  "season": 2026,
  "postseason": false,
  "stats": [],
  "values": {},
  "source": "provider_season_stats",
  "feed_observation": null,
  "retained_after_empty": false
}

Single-game mode (selected fields):

GET /api/nhl/players/7/stats?gameId=11

{
  "player_id": 7,
  "nhl_game_id": 11,
  "rows": [],
  "source": "provider_box_scores"
}
GET /api/nhl/players/:playerId/seasons

Scopes with stored official statistics.

Parameter / locationRequirements, defaults & behavior
playerIdrequired positive integer in the path; SportsFBI internal ID.
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players/7/seasons"

Response example (selected fields):

{
  "player_id": 7,
  "seasons": [
    {
      "season": 2026,
      "postseason": false
    }
  ],
  "source": "stored_official_season_stats"
}
GET /api/nhl/team/:teamId/season-stats

Official team aggregates and source observations.

Parameter / locationRequirements, defaults & behavior
teamIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).
postseasonoptional true/false; default false.
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/team/1/season-stats?season=2026&postseason=false"

Response example (selected fields):

{
  "entity": {
    "id": 1,
    "provider_id": 10
  },
  "season": 2026,
  "postseason": false,
  "stats": [],
  "values": {},
  "source": "provider_season_stats",
  "feed_observation": null,
  "retained_after_empty": false
}
GET /api/nhl/player_stats/leaders

Official player leaderboard, preserving provider order.

Parameter / locationRequirements, defaults & behavior
seasonrequired provider season start year (four digits, at least 1900; for example 2026).
postseasonoptional true/false; default false.
typerequired allowed player stat; see complete type lists below.
limitoptional 1-100, default 100. offset: optional 0-100000, default 0.

Behavior: Rows expose internal id and provider_id. source_rows_for_entity identifies repeated provider entries; they are not combined into invented totals.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/player_stats/leaders?season=2026&type=points"

Response example (selected fields):

{
  "season": 2026,
  "postseason": false,
  "type": "points",
  "rows": [],
  "limit": 100,
  "offset": 0,
  "ordering": "provider_order",
  "source": "provider_stat_leaders"
}
GET /api/nhl/team_stats/leaders

Official team leaderboard, preserving provider order.

Parameter / locationRequirements, defaults & behavior
seasonrequired provider season start year (four digits, at least 1900; for example 2026).
postseasonoptional true/false; default false.
typerequired allowed team stat; see complete type lists below.
limitoptional 1-100, default 100. offset: optional 0-100000, default 0.

Behavior: Rows expose internal id and provider_id. source_rows_for_entity identifies repeated provider entries; they are not combined into invented totals.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/team_stats/leaders?season=2026&type=points"

Response example (selected fields):

{
  "season": 2026,
  "postseason": false,
  "type": "points",
  "rows": [],
  "limit": 100,
  "offset": 0,
  "ordering": "provider_order",
  "source": "provider_stat_leaders"
}

Sportsbook Odds & Player Props

GET /api/nhl/betting-odds

Active game lines for selected games or one slate.

Parameter / locationRequirements, defaults & behavior
gameIdsoptional comma-separated provider NHL game IDs, 1-100; overrides date/timezone filtering.
dateoptional YYYY-MM-DD; default today in Eastern time unless stated otherwise.
tzOffsetMinoptional minutes east of UTC, -720 to 840; only used without gameIds.
vendoroptional sportsbook name; omitted reads all books.
Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/betting-odds?gameIds=11&vendor=fanduel"

Response example (selected fields):

{
  "odds": [],
  "market_scope": "provider_game"
}
GET /api/nhl/games/:gameId/markets

Current, official opening, and observed pregame closing game lines.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.
vendoroptional sportsbook name; omitted reads all books.

Behavior: pregame_closing is null before start and an array afterwards. closing_basis is not_started, observed_pregame_history, or unavailable. Current lines can be live in-game prices after puck drop.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/markets?vendor=fanduel"

Response example (selected fields):

{
  "game": {
    "nhl_game_id": 11
  },
  "current": [],
  "opening": [],
  "pregame_closing": null,
  "market_scope": "provider_game",
  "closing_basis": "not_started"
}
GET /api/nhl/games/:gameId/odds-history

Locally observed material line changes, oldest first, plus current/opening/closing views.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.
vendoroptional sportsbook name; omitted reads all books.
limitoptional 1-2000, default 200. offset: optional 0-100000, default 0.

Behavior: Local collection history is not a complete historical sportsbook feed. Withdrawal rows are preserved.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/odds-history?vendor=fanduel&limit=200"

Response example (selected fields):

{
  "game": {
    "nhl_game_id": 11
  },
  "history": [],
  "limit": 200,
  "offset": 0,
  "source": "local_observed_material_changes",
  "current": [],
  "opening": [],
  "pregame_closing": null
}
GET /api/nhl/games/:gameId/player-props ELITE

All active offers for a game, across books and alternate ladders.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.

Behavior: No vendor filter or pagination. Current offers after start can be live in-game prices.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/player-props" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "game": {
    "nhl_game_id": 11
  },
  "props": [],
  "source": "provider_current_quotes"
}
GET /api/nhl/games/:gameId/player-props/closing ELITE

Last locally observed active pregame quote for each distinct offer.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.
vendoroptional sportsbook name; omitted reads all books.

Behavior: Before start props is null/not_started; missing start returns null/unavailable. Both source update and observation must predate start; withdrawn offers are excluded.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/player-props/closing?vendor=fanduel" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "game": {
    "nhl_game_id": 11
  },
  "props": [],
  "closing_basis": "unavailable",
  "alternative_lines_are_distinct": true,
  "settlement_rules": null
}
GET /api/nhl/players/:playerId/props

Current and immutable opening quotes for a player in a game.

Parameter / locationRequirements, defaults & behavior
playerIdrequired positive integer in the path; SportsFBI internal ID.
game_idrequired provider NHL game ID.
vendoroptional sportsbook name; omitted reads all books.

Behavior: Prop rows include quote_key, vendor, prop_type, market_type, line_value, over_odds, under_odds, milestone_odds, active, source_updated_at, observed_at. Game-wide offers can have a null internal player mapping.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players/7/props?game_id=11&vendor=fanduel"

Response example (selected fields):

{
  "player": {
    "id": 7,
    "nhl_player_id": 70
  },
  "game": {
    "nhl_game_id": 11
  },
  "props": [],
  "opening": []
}
GET /api/nhl/players/:playerId/props/line-movement ELITE

Observed offer history, optionally restricted to one exact quote.

Parameter / locationRequirements, defaults & behavior
playerIdrequired positive integer in the path; SportsFBI internal ID.
game_idrequired provider NHL game ID.
vendor, prop_type, market_typeoptional exact offer filters.
quote_keyoptional 64 lowercase hexadecimal characters.
limitoptional 1-2000, default 200. offset: optional 0-100000, default 0.

Behavior: Requires premiumData (Pro/Elite app tiers). Ascending observed order. Different lines remain distinct; history includes withdrawals.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players/7/props/line-movement?game_id=11&prop_type=shots_on_goal" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "player": {
    "id": 7
  },
  "game": {
    "nhl_game_id": 11
  },
  "history": [],
  "limit": 200,
  "offset": 0,
  "source": "local_observed_offer_history",
  "alternative_lines_are_distinct": true
}
GET /api/nhl/players/:playerId/props/hit-rate ELITE

Frozen player pick performance and a separate all-offer baseline.

Parameter / locationRequirements, defaults & behavior
playerIdrequired positive integer in the path; SportsFBI internal ID.
seasonrequired provider season start year (four digits, at least 1900; for example 2026).
postseasonrequired explicit true/false.
marketScopeoptional vendor (default) or consensus.
vendor, prop_type, market_typeoptional exact offer filters.
limitoptional 1-2000, default 200. offset: optional 0-100000, default 0.

Behavior: Requires premiumData. Strict scope filtering, no fallback. History retains individual frozen offer records; decided denominator is HIT + MISS. Newest games first.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/players/7/props/hit-rate?season=2026&postseason=false&marketScope=consensus" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "marketScope": "consensus",
  "player": {
    "id": 7
  },
  "season": 2026,
  "postseason": false,
  "selected_picks": {
    "hits": 0,
    "misses": 0,
    "pushes": 0,
    "voids": 0,
    "unresolved": 0,
    "decided": 0,
    "hit_rate": null
  },
  "all_offers": {
    "captured": 0,
    "graded": 0
  },
  "history": [],
  "limit": 200,
  "offset": 0
}

Game Analysis, Previews & Key Suspects

GET /api/nhl/games/:gameId/analysis

Current pregame analysis, or frozen prediction with actual outcome.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.

Behavior: No recomputation after start; missing capture is explicit. The 3+ goal model is uncalibrated.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/analysis"

Response example (selected fields):

{
  "frozen": false,
  "model_version": "nhl-game-v2",
  "capture_missing": true,
  "derivation": null,
  "derivation_unavailable_reason": "no_pregame_capture",
  "outcome": null
}
GET /api/nhl/games/:gameId/preview

Stored/generated AI preview, or factual early/fallback analysis.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.

Behavior: AI responses include preview_text; early/fallback responses use fallback_narrative. Cached text can be served after start; otherwise alreadyStarted: true. Concurrent generation returns 202 with inProgress: true. Requests may generate content.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/preview"

Response example (selected fields):

{
  "tooEarly": true,
  "fallback_narrative": [],
  "fallback_quick_facts": []
}

Generation already running (HTTP 202):

{
  "inProgress": true
}

Started game without a stored preview (HTTP 200):

{
  "alreadyStarted": true
}
GET /api/nhl/games/:gameId/recap

Recap of a final game, using AI text or a factual fallback.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.

Behavior: 400 before final; 202/inProgress during concurrent generation. AI recaps require a tracked pregame prediction; backfilled history uses factual fallback. Requests may generate content.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/recap"

Response example (selected fields):

{
  "fallback": true,
  "recap_text": "Illustrative factual recap."
}
GET /api/nhl/games/:gameId/key-suspects

Highest-scoring supported prop per player with historical and matchup evidence.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.
marketScopeoptional vendor (default) or consensus.
availableAtoptional supported book name; filters accepted consensus after strongest-prop selection.

Behavior: Current offers/prior finals before start, frozen snapshots afterwards. No selected consensus picks means all_books fallback with consensusFallback: true; availability filtering never triggers fallback and does not filter book fallback. Missing capture is flagged. Scores are not hit probabilities.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/key-suspects?marketScope=consensus"

Response example (selected fields):

{
  "marketScope": "consensus",
  "consensusVersion": 1,
  "consensusFallback": false,
  "frozen": false,
  "totalAvailable": 0,
  "suspects": [],
  "evidence_score_is_probability": false
}

Frozen capture with consensus fallback (selected fields):

{
  "marketScope": "consensus",
  "consensusVersion": 1,
  "consensusFallback": true,
  "fallbackVendor": "all_books",
  "frozen": true,
  "source": "pregame_capture",
  "captured_at": null,
  "captured_offers": 0,
  "capture_missing": true,
  "totalAvailable": 0,
  "suspects": []
}

Slate Research Tools & Results

GET /api/nhl/slate/signals ELITE

Form estimates and opponent-matchup context on the current/next slate.

Parameter / locationRequirements, defaults & behavior
statoptional points (default), goals, assists, shots_on_goal, hits, blocked_shots, or saves.

Behavior: Requires playerSignals (all signed-in app tiers). No date query. Estimates use prior finals and are not calibrated hit probabilities.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/slate/signals?stat=shots_on_goal" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "date": "2026-10-12",
  "stat": "points",
  "players": [],
  "games": []
}
GET /api/nhl/slate/value-plays ELITE

Consensus Leads comparing prior performance with accepted canonical pregame prop lines.

Parameter / locationRequirements, defaults & behavior
propTypeoptional points (default), goals, assists, shots_on_goal, or anytime_goal.
lookbackoptional 5 (default), 10, 20, or season.
dateoptional YYYY-MM-DD; default today in Eastern time unless stated otherwise.
fallbackoptional next searches later slates when no qualifying picks exist.
marketScopealways consensus; vendor is accepted for compatibility but does not select a book.

Behavior: Consensus only, no book fallback. Each row includes contributing books and probability; overOdds is an available quote at the canonical line, identified by executionVendor. Canonical opening/line movement are unavailable. Free app accounts see WATCH/RISK; paid accounts see all tiers. Started games excluded.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/slate/value-plays?propType=shots_on_goal&marketScope=consensus&lookback=20" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "players": [],
  "updatedAt": null,
  "marketScope": "consensus",
  "vendor": "consensus",
  "date": "2026-10-12"
}
GET /api/nhl/slate/ev ELITE

Market-derived EV at an identical line, before puck drop.

Parameter / locationRequirements, defaults & behavior
dateoptional YYYY-MM-DD; omitted finds next upcoming slate within 21 days, otherwise today.

Behavior: Game lines for signed-in accounts; player props require evPlayerProps (Pro/Elite). At least two other reference books and supported two-sided props only. EV is conditional on no push. NHL game-line Radar settlement is unavailable.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/slate/ev?date=2026-10-12" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "date": "2026-10-12",
  "games": [],
  "propsEnabled": true,
  "gameLinesRadar": false,
  "maxQuoteAgeMinutes": 90,
  "opportunities": [],
  "coverage": {}
}
GET /api/nhl/slate/case-builder ELITE

Consensus Cases priced at real sportsbook quotes at the canonical line, with distinct players.

Parameter / locationRequirements, defaults & behavior
dateoptional YYYY-MM-DD; default today in Eastern time unless stated otherwise.
vendoroptional fallback sportsbook, default fanduel; consensus legs choose their best available book.
legsoptional default 4; clamped to 2-4 for Free app accounts, 2-10 for paid.
minOddsoptional American odds; paid default -150; Free fixed -200.
gamesoptional all (default), or comma-separated provider game IDs.
refreshoptional true bypasses cache and reshuffles near ties.

Behavior: Consensus by default. If a game has no selected consensus picks, uses the requested fallback sportsbook for that game and reports fallback metadata. Fair consensus reference odds are not executable prices. Case count follows account allowance. No calibrated parlay probability supplied.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/slate/case-builder?vendor=fanduel&legs=4" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "gamesAvailable": [],
  "marketScope": "consensus",
  "vendor": "fanduel",
  "executionPolicy": "best_canonical_price_per_leg",
  "modelBasis": "ranked_evidence_no_probability",
  "cases": [],
  "consensusFallback": false,
  "consensusFallbackGames": 0,
  "consensusGamesTotal": 0,
  "fallbackVendor": null
}
GET /api/nhl/slate/summary

Daily matchup overview: puck lines, goal-margin bands, rest, injuries, expected goals.

Parameter / locationRequirements, defaults & behavior
dateoptional YYYY-MM-DD; default today in Eastern time unless stated otherwise.

Behavior: Frozen analysis and pregame closing lines after start. Goal bands mean 3+ goals including overtime, not calibrated confidence.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/slate/summary?date=2026-10-12"

Response example (selected fields):

{
  "date": "2026-10-12",
  "model_version": "nhl-game-v2",
  "calibrated": false,
  "slateOverview": {
    "totalGames": 0
  },
  "slateEdge": null,
  "games": []
}
GET /api/nhl/slate/hit-rate ELITE

Daily Hitlist, or season history/totals when season is supplied.

Parameter / locationRequirements, defaults & behavior
dateoptional daily mode only; default latest completed Eastern slate before today.
seasonoptional; switches to season mode; explicit provider start year.
postseasonseason mode only; optional true/false; omitted includes regular-season and postseason.
prop_typeoptional season-mode filter, 1-64 lowercase letters/digits/underscores.
marketScopeoptional vendor (default) or consensus.
limitseason mode only, 1-100, default 25. offset: season mode only, 0-100000, default 0.

Behavior: Requires premiumData. Daily consensus fallback is per game. Started games without captures are counted, never reconstructed. Season mode returns season, history, selected, by_prop, all_offers, limit, offset; strict scope without fallback. date ignored in season mode.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/slate/hit-rate?date=2026-10-12&marketScope=consensus" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "date": "2026-10-12",
  "marketScope": "consensus",
  "suspects": [],
  "total": 0,
  "gamesFound": 0,
  "frozenGames": 0,
  "liveGames": 0,
  "captureMissingGames": 0,
  "consensusFallback": false,
  "consensusFallbackGames": 0,
  "consensusGamesTotal": 0,
  "summary": {
    "hits": 0,
    "misses": 0,
    "pushes": 0,
    "voids": 0,
    "ungraded": 0,
    "decided": 0,
    "hit_rate": null
  }
}

Season-history mode (selected fields):

GET /api/nhl/slate/hit-rate?season=2026&postseason=false&marketScope=consensus&limit=25&offset=0

{
  "season": 2026,
  "postseason": false,
  "marketScope": "consensus",
  "history": [],
  "selected": {
    "HIT": 0,
    "MISS": 0,
    "PUSH": 0,
    "VOID": 0,
    "ungraded": 0,
    "hit_rate": null,
    "hit_rate_denominator": "HIT + MISS (PUSH and VOID excluded)"
  },
  "by_prop": [],
  "all_offers": [],
  "limit": 25,
  "offset": 0
}
GET /api/nhl/stats/slate-recap-dates

Completed slate dates with frozen predictions for recap discovery.

No query parameters or body.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/stats/slate-recap-dates"

Response example (selected fields):

{
  "dates": []
}
GET /api/nhl/stats/slate-recap

Daily results against frozen game predictions and selected prop tallies.

Parameter / locationRequirements, defaults & behavior
daterequired YYYY-MM-DD.
marketScopeoptional vendor (default) or consensus.

Behavior: Strict prop scope, no fallback; unique picks count once within scope. Results include upset flags, overtime/shootout labels, and previous/next completed slate dates.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/stats/slate-recap?date=2026-10-12&marketScope=consensus"

Response example (selected fields):

{
  "date": "2026-10-12",
  "marketScope": "vendor",
  "totalGames": 0,
  "predictionsGraded": 0,
  "hits": 0,
  "misses": 0,
  "accuracyPct": null,
  "suspects": null,
  "results": []
}

Key Suspect Voting

GET /api/nhl/games/:gameId/suspects/votes ELITE

Aggregated votes and the requesting account's own vote, keyed by player/prop.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.

Behavior: Missing game returns an empty votes object rather than 404.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/games/11/suspects/votes" -H "Authorization: Bearer YOUR_API_KEY"

Response example (selected fields):

{
  "gameId": 11,
  "votes": {
    "7_shots_on_goal": {
      "upvotes": 1,
      "downvotes": 0,
      "userVote": 1
    }
  }
}
POST /api/nhl/games/:gameId/suspects/:playerId/vote ELITE

Cast or toggle a vote before puck drop.

Parameter / locationRequirements, defaults & behavior
gameIdrequired positive integer in the path; provider nhl_game_id.
playerIdrequired positive integer in the path; SportsFBI internal ID.
Body propTyperequired supported NHL prop name.
Body voterequired integer 1 (upvote) or -1 (downvote).

Behavior: Repeating the same vote cancels it (0); opposite vote replaces it. 409 at puck drop; 400 for unsupported inputs.

Example request & response
curl -X POST "https://app.sportsfbi.com/api/nhl/games/11/suspects/7/vote" -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" -d '{"propType":"shots_on_goal","vote":1}'

Response example (selected fields):

{
  "playerId": 7,
  "propType": "shots_on_goal",
  "upvotes": 1,
  "downvotes": 0,
  "userVote": 1
}

Administration

PUT /api/nhl/team/:teamId/core-players/:playerId ADMIN ONLY

Set a roster core-player override.

Parameter / locationRequirements, defaults & behavior
teamIdrequired positive integer in the path; SportsFBI internal ID.
playerIdrequired positive integer in the path; SportsFBI internal ID.
Body isCoreoptional boolean, defaults true; strings/numbers rejected.

Behavior: Administrator only. Player must have a season association with the team; missing association returns 404.

Example request & response
curl -X PUT "https://app.sportsfbi.com/api/nhl/team/1/core-players/7" -H "Authorization: Bearer YOUR_ADMIN_API_KEY" -H "Content-Type: application/json" -d '{"isCore":true}'

Response example (selected fields):

{
  "teamId": 1,
  "playerId": 7,
  "isCore": true,
  "source": "override"
}
DELETE /api/nhl/team/:teamId/core-players/:playerId ADMIN ONLY

Remove a core-player override.

Parameter / locationRequirements, defaults & behavior
teamIdrequired positive integer in the path; SportsFBI internal ID.
playerIdrequired positive integer in the path; SportsFBI internal ID.
Example request & response
curl -X DELETE "https://app.sportsfbi.com/api/nhl/team/1/core-players/7" -H "Authorization: Bearer YOUR_ADMIN_API_KEY"

Response example (selected fields):

{
  "teamId": 1,
  "playerId": 7,
  "isCore": null,
  "source": "none"
}
GET /api/nhl/system/refresh-status ADMIN ONLY

Refresh job status, attempts, successes, staleness, and errors.

No query parameters or body.

Behavior: Read-only; does not trigger refresh jobs.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/system/refresh-status" -H "Authorization: Bearer YOUR_ADMIN_API_KEY"

Response example (selected fields):

{
  "jobs": [],
  "expected_jobs": [],
  "conditional_jobs": []
}
GET /api/nhl/system/health ADMIN ONLY

Worker, source freshness, capture coverage, unresolved grades, and live-game health.

No query parameters or body.

Example request & response
curl -X GET "https://app.sportsfbi.com/api/nhl/system/health" -H "Authorization: Bearer YOUR_ADMIN_API_KEY"

Response example (selected fields):

{
  "worker": {
    "jobs": 0,
    "failed": 0,
    "stale": 0,
    "heartbeat_age_seconds": null
  },
  "source_age_seconds": {},
  "capture_coverage": {
    "window_days": 7,
    "started_games": 0,
    "with_game_prediction": 0,
    "with_prop_capture": 0
  },
  "unresolved_grades": {
    "count": 0,
    "oldest_game_date": null,
    "after_hours": 6
  },
  "live_games": 0
}

Allowed Leaderboard Types

Player leaderboard types

goals, power_play_points, game_winning_goals, plus_minus, even_strength_points, shots_against, goals_against_average, games_played, goals_against, shots, games_started, short_handed_goals, short_handed_points, faceoff_win_pct, assists, save_pct, power_play_goals, time_on_ice_per_game, wins, ot_losses, overtime_goals, penalty_minutes, saves, points, even_strength_goals, shutouts, shooting_pct, time_on_ice, points_per_game, losses

Team leaderboard types

faceoff_win_percentage, shots_for_per_game, penalty_kill_percentage, goals_against_per_game, games_played, goals_for_per_game, goals_against, points_pct, points, power_play_percentage, shots_against_per_game, goals_for, wins, goal_differential, ot_losses, losses

HTTP Statuses & Missing Data

  • 200: JSON data, including empty arrays and unavailable fields when nothing is stored.
  • 202: Preview/recap generation already in progress; retry the same request later.
  • 400: Invalid parameter, incompatible scope, unsupported vote, or recap before final.
  • 401 / 403: Authentication, account access, feature allowance, or administrator requirement is not satisfied.
  • 404: Missing game, team, player, or required roster association. Vote aggregates intentionally return an empty object for a missing game.
  • 409: Voting closed at puck drop. 500: Server/data request failure.

Shared Radar, account, and chat routes have their own contracts, rather than additional /api/nhl aliases. Administrator routes above do not expose the separate internal editorial/publishing interfaces.

Matches

GET /api/fifa/matches

List of matches for a given date, each with team info, stadium, and primary-vendor odds attached.

Query Parameters

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD (defaults to today)
seasonintegerOptionalDefaults to 2026
vendorstringOptionalSportsbook vendor (default: fanduel)
GET /api/fifa/matches/{matchId}

Full match detail β€” events, lineups, team stats, best players, odds from every vendor, shot map (xG/xGOT), per-minute momentum, and head-to-head history.

Odds

GET /api/fifa/odds/futures

Tournament and group winner futures odds, grouped by market.

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionalSportsbook vendor
market_typestringOptionale.g. tournament_winner
GET /api/fifa/odds/match/{matchId}

Full match odds β€” 3-way moneyline, spread, and total per vendor, plus exotic markets and their outcomes.

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionalFilter to one vendor
GET /api/fifa/odds/match/{matchId}/props

Player prop odds (milestone/over/under) for a single match.

Query Parameters

ParameterTypeRequiredDescription
vendorstringOptionalFilter to one vendor

Teams

GET /api/fifa/teams

All teams with their current group-stage standing for the season.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026
GET /api/fifa/teams/{teamId}

Team detail β€” group standing, full roster with aggregated tournament stats, all matches, average team stats, and current manager.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026

Players

GET /api/fifa/players

Search or list players by name, team, or position.

Query Parameters

ParameterTypeRequiredDescription
qstringOptionalName substring search, min 2 characters
team_idintegerOptionalFilter by team
positionstringOptionalExact match, e.g. Forward
seasonintegerOptionalDefaults to 2026
GET /api/fifa/players/{playerId}

Player detail (bio, team) plus every match's stat line for the player this season.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026

Standings

GET /api/fifa/standings

Group-stage standings grouped by group letter.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026
groupstringOptionalSingle letter, e.g. A, filters to one group

Bracket

GET /api/fifa/bracket ELITE

Knockout-stage bracket, grouped by round (Round of 32 through Final) in bracket order.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026

Leaderboards

GET /api/fifa/leaderboards ELITE

Tournament-wide statistical leaderboard for a chosen stat, top 100.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026
statstringOptionalgoals, assists, xg, rating, shots, or saves (default: goals)

Signals

GET /api/fifa/signals ELITE

Six pre-match betting-edge signals per upcoming match β€” xG Edge, Possession, Set Piece, Press Intensity, Form, and Late Momentum β€” each with a winner, tag, and implication.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026
datestringOptionalYYYY-MM-DD (defaults to today)

Key Suspects

GET /api/fifa/matches/{matchId}/suspects

Weighted 0–100 Suspicion Score per player prop for a match, with an evidence breakdown, trend, and sparkline.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026
vendorstringOptionalFilter to one vendor

Value Plays

GET /api/fifa/value-plays ELITE

Player prop value plays for upcoming matches β€” players whose season hit rate/average beats the prop line, sorted by ratio.

Query Parameters

ParameterTypeRequiredDescription
propTypestringRequiredanytime_goal, first_goal, shots_on_target, assists, goal_or_assist, saves, or tackles
seasonintegerOptionalDefaults to 2026
vendorstringOptionalFilter to one vendor

Streak Board

GET /api/fifa/streak-board ELITE

Players currently on active consecutive-match statistical streaks (minimum length 2).

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026
streakTypestringOptionalgoal, shot, rating, or clean_sheet (omit for all four)

Expected Lineup

GET /api/fifa/matches/{matchId}/expected-lineup

Projected starting XI and bench for both teams based on this season's formation and starter frequency, with tournament-average stats per player.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026

Hit Rate

GET /api/fifa/slate/hit-rate ELITE

For all completed matches on a target date, compares each player prop line to the actual result and returns HIT/MISS per player.

Query Parameters

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD, defaults to most recent completed date
vendorstringOptionalSportsbook vendor (default: fanduel)
seasonintegerOptionalDefaults to 2026

Case Preview

GET /api/fifa/matches/{matchId}/case-preview

Pre-match context for both teams β€” last-5-match form, season momentum profile, top-3 key players per side, and head-to-head history.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to 2026

Games

GET /api/ncaab/games/today

Today's NCAAB games with team info, scores, status, and game quality ratings.

Query Parameters

ParameterTypeRequiredDescription
datestringOptionalYYYY-MM-DD (defaults to today)
tzOffsetMinintegerOptionalTimezone offset in minutes, βˆ’720 to 720
GET /api/ncaab/betting-odds

Spreads, moneylines, and totals for NCAAB games.

Query Parameters

ParameterTypeRequiredDescription
gameIdsstringRequiredComma-separated NCAAB game IDs, max 100
vendorstringRequiredSportsbook vendor name
GET /api/ncaab/games/{ncaabGameId}/lineups

Starting lineups, bench players, injuries, and team standings for a specific game.

GET /api/ncaab/games/{ncaabGameId}/player/{playerId}/box-score

A single player's box score for a specific game.

GET /api/ncaab/plays/{ncaabGameId}

Play-by-play data organized by half.

GET /api/ncaab/games/{ncaabGameId}/key-suspects

Key Suspects analysis for NCAAB β€” college players likely to exceed projections based on matchup and usage context.

Players

GET /api/ncaab/players/{playerId}

Player profile (name, position, height, weight, team, jersey number).

GET /api/ncaab/players/{playerId}/seasons

List of seasons the player has box-score data for.

GET /api/ncaab/players/{playerId}/game-log

Game-by-game statistics for a NCAAB season.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current calendar year
GET /api/ncaab/players/{playerId}/stats

Season averages for a NCAAB player.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current calendar year
GET /api/ncaab/players/{playerId}/matchup-analysis/{opponentTeamAbbr}

A player's last-10-game averages compared against an opponent's defensive profile, with generated insight strings and an overall verdict.

Teams

GET /api/ncaab/team/{teamId}/schedule

NCAAB team schedule with results and upcoming games.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to current calendar year
GET /api/ncaab/team/{teamId}/roster

Full team roster with player positions, jersey numbers, and current-season per-game averages.

GET /api/ncaab/team/{teamId}/stats

Team's individual per-game box scores for a season, newest first.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to the current NCAAB season-start year
GET /api/ncaab/team/{teamId}/season-stats

Team statistics including PPG, PAPG, pace, and offensive/defensive breakdowns.

Query Parameters

ParameterTypeRequiredDescription
seasonintegerOptionalDefaults to the current NCAAB season-start year

Leaderboards

GET /api/ncaab/leaderboard/{category}

Statistical leaderboards for NCAAB β€” live, daily, or season modes.

Query Parameters

ParameterTypeRequiredDescription
modestringOptionaltoday, daily, or season (default: today)
limitintegerOptionalMax results, 5–50 (default: 20)
seasonYearintegerOptionalSeason year for season mode
datestringOptionalYYYY-MM-DD for daily mode
onlyTodayPlayersbooleanOptionalSeason mode β€” restrict to players whose team plays on date

System & Utilities

GET /api/health Free

System health check. Reports database connectivity, Redis status, and feature store pipeline freshness (gameFeatures and playerFeatures staleness flags).

GET /rate-limit-status Free

Your current rate-limit usage and remaining quota for the active window.

GET /auth/status Free

Current authentication status β€” tier, subscription state, and API key validity.

Error Handling

The API uses standard HTTP status codes and returns errors in JSON format:

HTTP Status Codes

Status Code Meaning Description
200 OK Request successful
400 Bad Request Invalid request parameters
401 Unauthorized Missing or invalid API key
403 Forbidden Insufficient subscription tier
404 Not Found Resource doesn't exist
429 Too Many Requests Rate limit exceeded
500 Internal Server Error Server error

Error Response Format

{ "error": "Invalid API key", "statusCode": 401, "timestamp": "2026-02-09T12:34:56.789Z" }

Code Examples

JavaScript (Node.js)

const fetch = require('node-fetch'); const API_KEY = process.env.SPORTSFBI_API_KEY; const BASE_URL = 'https://app.sportsfbi.com/api'; async function getTodayGames() { const response = await fetch(`${BASE_URL}/nba/games/today`, { headers: { 'Authorization': `Bearer ${API_KEY}` } }); if (!response.ok) { throw new Error(`API error: ${response.status}`); } return await response.json(); } getTodayGames() .then(games => console.log(games)) .catch(err => console.error(err));

Python

import requests import os API_KEY = os.environ['SPORTSFBI_API_KEY'] BASE_URL = 'https://app.sportsfbi.com/api' def get_today_games(): headers = { 'Authorization': f'Bearer {API_KEY}' } response = requests.get( f'{BASE_URL}/nba/games/today', headers=headers ) response.raise_for_status() return response.json() try: games = get_today_games() print(games) except requests.exceptions.RequestException as e: print(f'Error: {e}')

cURL

# Get today's games curl -X GET "https://app.sportsfbi.com/api/nba/games/today" \ -H "Authorization: Bearer YOUR_API_KEY" # Get player profile curl -X GET "https://app.sportsfbi.com/api/nba/players/123" \ -H "Authorization: Bearer YOUR_API_KEY" # Get leaderboard curl -X GET "https://app.sportsfbi.com/api/nba/leaderboard/pts?mode=today&limit=10" \ -H "Authorization: Bearer YOUR_API_KEY" # Get matchup analysis curl -X GET "https://app.sportsfbi.com/api/nba/players/123/matchup-analysis/LAL" \ -H "Authorization: Bearer YOUR_API_KEY"

Response Example

{ "success": true, "data": [ { "id": 1234, "nbaGameId": "0022600789", "status": "live", "homeTeam": { "id": 5, "name": "Lakers", "abbreviation": "LAL", "score": 98 }, "awayTeam": { "id": 10, "name": "Warriors", "abbreviation": "GSW", "score": 95 }, "period": 3, "gameClock": "5:23", "startTime": "2026-02-09T19:30:00Z" } ] }

Support & Resources

Need help with the API? We're here to assist:

πŸ“§ Contact Support

For API-specific questions or issues, please contact our support team with your API key ID (not the full key) and a description of your issue.