Documentation
Everything you need to connect and query 12 hockey data endpoints.
Getting Started
Authentication
Every request requires an API key. Pass it via header or query parameter:
x-api-key: YOUR_API_KEY
# or
Authorization: Bearer YOUR_API_KEY
# or (MCP only)
?key=YOUR_API_KEYVerify your email, then create an API key from the dashboard. Free accounts get 500 credits.
Base URL
https://mcp.puckapi.comREST API — POST /v1/{tool} with JSON body. Works with cURL, Python, any HTTP client.
MCP — POST /mcp via Streamable HTTP. Works with Claude Desktop, Claude Code, Cursor, and any MCP client.
Rate Limits
| Plan | Rate Limit |
|---|---|
| Free | 10 req/min |
| Starter / Pro / Scale | 60 req/min |
| Enterprise | Custom |
Error Handling
| Code | Meaning | What to do |
|---|---|---|
| 400 | Invalid parameters | Check required fields and value types |
| 401 | Invalid or missing API key | Check your x-api-key header |
| 402 | Insufficient credits | Top up your wallet or upgrade your plan |
| 429 | Rate limit exceeded | Wait and retry (see limits above) |
| 500 | Server error | Retry with idempotency key. Credits auto-refund on server errors. |
Pass x-idempotency-key or x-request-id headers to make retries duplicate-safe.
Data Coverage
| Data | Status | Coverage | Volume |
|---|---|---|---|
Games Game records and detail for supported regular season, playoff, and preseason matchups. Historical coverage depends on supported seasons and source availability. | Available | 2010-11 through current | 22,000+ |
Players Player search and player stat lookup across supported datasets. | Available | Bio, roster, position, supported stats | 3,000+ |
Goalies Goalie stat lookup including save percentage, GAA, GSAX, wins, and shutouts. | Available | Supported goalie stat seasons | 1,509 |
Teams Team metadata, abbreviations, divisions, conferences, and arenas. | Available | Active and historical franchises represented in PuckAPI | 34 |
Standings + rankings Standings, rankings, and supported advanced team metrics. Do not treat standings as real-time unless freshness is shown separately. | Available | Supported seasons and current-season snapshots | 494 |
Odds Odds for supported games, books, and markets where available. Coverage varies by sportsbook, game, market, and source availability. | Partial | 2019-20 through current | 107,000+ |
Line movement Line movement data where multiple odds snapshots exist for a supported game and market. Not every game, book, or market has line movement history. | Partial | Historical odds snapshots where available | Opening/current/closing snapshots |
Head-to-head Historical matchup context for supported teams and games. | Available | Supported teams and games | Matchup history |
Coverage describes the datasets PuckAPI supports. Freshness and operational health are tracked separately.
Odds Snapshot Definitions
opening — Game-day morning lines, captured at ~12:00 UTC (~7-8am ET). Represents the odds available on the morning of the game.
closing — Final pre-game lines, captured at ~23:00 UTC. For evening games, this is the last available line before or shortly after puck drop.
Odds coverage currently documents DraftKings, FanDuel, BetMGM, and ESPN BET. Sportsbook availability varies by game, market, and source. Do not assume every book is available for every game. Games before the 2019-20 season return no odds data.
Response Format
REST API
All successful REST responses wrap the result in a data key:
{ "data": { "teams": [...], "count": 32 } }Error responses return:
{ "error": "Insufficient credits", "message": "This tool costs 5 credits, you have 2" }MCP Protocol
MCP responses follow the standard MCP tool result format. The data is returned directly (no data wrapper). Both access methods return identical data, just different envelopes.
Conventions
Season IDs — 8-digit string combining start and end year, e.g. 20252026 for the 2025-26 season.
Game IDs — Assigned by the NHL. Use get_games or get_schedule to discover them.
Team abbreviations — Standard 3-letter NHL codes (BUF, TOR, NYR). Use list_teams for the full list.
Pagination — Endpoints use a limit parameter. No cursor or offset. Narrow your filters to get different slices of data.
Credits — Deducted before the request executes. Automatically refunded on server errors. Monthly credits are used first, then wallet balance.
Setup
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"puckapi": {
"url": "https://mcp.puckapi.com/mcp?key=YOUR_API_KEY"
}
}
}Claude Code
One command:
claude mcp add puckapi https://mcp.puckapi.com/mcp?key=YOUR_API_KEY --transport streamable-httpREST / cURL
POST to /v1/{tool_name} with your params as JSON body. No MCP client needed:
curl -X POST https://mcp.puckapi.com/v1/list_teams \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY"With parameters:
curl -X POST https://mcp.puckapi.com/v1/get_standings \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{"season": "20242025"}'Which Endpoint Should I Use?
Start from what you want to do, not the API path.
Endpoint Reference
12 endpoints grouped by credit cost. Each includes parameters, example requests in three formats, and documented response fields.
Static reference
1 credit/calllist_teams
1 creditAll 32 active NHL teams with divisions, conferences, and arenas.
When to use: You need a reference list of teams -- team abbreviations for other endpoints, arena names for travel planning, or division/conference groupings for analysis.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conference | string | optional | "Eastern" or "Western" |
| division | string | optional | Division name (e.g. "Atlantic") |
Example Request
{
"tool": "list_teams",
"arguments": {
"conference": "Eastern",
"division": "Atlantic"
}
}Example Response
{
"teams": [
{
"abbrev": "BUF",
"name": "Sabres",
"city": "Buffalo",
"conference": "Eastern",
"division": "Atlantic",
"arena": "KeyBank Center"
},
{
"abbrev": "TOR",
"name": "Maple Leafs",
"city": "Toronto",
"conference": "Eastern",
"division": "Atlantic",
"arena": "Scotiabank Arena"
},
{
"abbrev": "FLA",
"name": "Panthers",
"city": "Florida",
"conference": "Eastern",
"division": "Atlantic",
"arena": "Amerant Bank Arena"
}
]
}Response Fields
| Field | Type | Description |
|---|---|---|
| teams[].abbrev | string | 3-letter team code (e.g. "BUF") |
| teams[].name | string | Team name (e.g. "Sabres") |
| teams[].city | string | City name |
| teams[].conference | string | Eastern or Western |
| teams[].division | string | Division name |
| teams[].arena | string | Home arena name |
Basic lookup
2 credits/callget_schedule
2 creditsUpcoming games for the next N days. Defaults to 7 days.
When to use: You want to know what games are coming up this week -- for a specific team or across the league. Useful for building game-day alerts or planning which games to watch.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| team | string | optional | Team abbreviation (e.g. "BUF") |
| days | integer | optional | Days ahead (1-30, default 7) |
Example Request
{
"tool": "get_schedule",
"arguments": {
"team": "BUF",
"days": 7
}
}Example Response
{
"games": [
{
"id": "2025021143",
"gameDate": "2026-04-10",
"startTime": "19:00:00",
"homeTeam": "BUF",
"awayTeam": "TOR",
"homeTeamName": "Buffalo Sabres",
"awayTeamName": "Toronto Maple Leafs",
"venue": "KeyBank Center",
"gameType": "regular"
},
{
"id": "2025021187",
"gameDate": "2026-04-12",
"startTime": "19:30:00",
"homeTeam": "FLA",
"awayTeam": "BUF",
"homeTeamName": "Florida Panthers",
"awayTeamName": "Buffalo Sabres",
"venue": "Amerant Bank Arena",
"gameType": "regular"
}
]
}Response Fields
| Field | Type | Description |
|---|---|---|
| games[].id | string | Unique game ID |
| games[].gameDate | string | Date (YYYY-MM-DD) |
| games[].startTime | string | Start time (HH:MM:SS) |
| games[].homeTeam | string | Home team abbreviation |
| games[].awayTeam | string | Away team abbreviation |
| games[].homeTeamName | string | Home team full name |
| games[].awayTeamName | string | Away team full name |
| games[].venue | string | Arena name |
| games[].gameType | string | regular, playoff, or preseason |
search_players
2 creditsFind players by name, team, or position.
When to use: You need a player's ID to look up their stats, or you want to search a roster by position. For example, "find all active centers on the Sabres" or "look up Tage Thompson's player ID."
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| query | string | required | Search string (e.g. "Tage Thompson") |
| team | string | optional | Filter by team abbreviation |
| position | string | optional | G, D, C, LW, or RW |
| active | boolean | optional | Active players only (default true) |
| limit | integer | optional | Max results (1-50, default 10) |
Example Request
{
"tool": "search_players",
"arguments": {
"query": "Thompson",
"team": "BUF"
}
}Example Response
{
"players": [
{
"id": 8480208,
"name": "Tage Thompson",
"team": "BUF",
"teamName": "Buffalo Sabres",
"position": "C",
"jerseyNumber": 72,
"active": true
}
]
}Response Fields
| Field | Type | Description |
|---|---|---|
| players[].id | integer | Player ID (use in get_player_stats) |
| players[].name | string | Full name |
| players[].firstName | string | First name |
| players[].lastName | string | Last name |
| players[].team | string | Team abbreviation |
| players[].teamName | string | Full team name |
| players[].position | string | Position code |
| players[].positionType | string | Position type (F, D, or G) |
| players[].jerseyNumber | integer | Jersey number |
| players[].birthCountry | string | Birth country |
| players[].active | boolean | Currently active |
get_standings
2 creditsCurrent standings with advanced stats (Corsi%, Fenwick%, point pace).
When to use: You want to see how teams rank in the league right now -- points, win percentage, goal differential, and advanced possession stats like Corsi and Fenwick.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conference | string | optional | "Eastern" or "Western" |
| division | string | optional | Division name (e.g. "Atlantic") |
| season | string | optional | Season (e.g. "20252026", default current) |
Example Request
{
"tool": "get_standings",
"arguments": {
"conference": "Eastern",
"division": "Atlantic"
}
}Example Response
{
"standings": [
{
"rank": 1,
"teamAbbrev": "FLA",
"teamName": "Florida Panthers",
"points": 112,
"gamesPlayed": 80,
"wins": 52,
"losses": 20,
"otLosses": 8,
"pointPct": 0.683,
"goalDiff": 48,
"goalsForPerGame": 3.54,
"goalsAgainstPerGame": 2.94,
"corsiPct": 53.2,
"fenwickPct": 52.8,
"expectedGoalsFor": 271.3,
"expectedGoalsAgainst": 238.1
},
{
"rank": 2,
"teamAbbrev": "TOR",
"teamName": "Toronto Maple Leafs",
"points": 106,
"gamesPlayed": 80,
"wins": 49,
"losses": 23,
"otLosses": 8,
"pointPct": 0.65,
"goalDiff": 31,
"goalsForPerGame": 3.41,
"goalsAgainstPerGame": 3.02,
"corsiPct": 51.4,
"fenwickPct": 51.1,
"expectedGoalsFor": 258.4,
"expectedGoalsAgainst": 244.7
}
]
}Response Fields
| Field | Type | Description |
|---|---|---|
| standings[].rank | integer | League or division rank |
| standings[].teamAbbrev | string | Team abbreviation |
| standings[].teamName | string | Full team name |
| standings[].points | integer | Total points |
| standings[].gamesPlayed | integer | Games played |
| standings[].wins | integer | Wins |
| standings[].losses | integer | Losses |
| standings[].otLosses | integer | Overtime losses |
| standings[].pointPct | number | Points percentage |
| standings[].goalDiff | integer | Goal differential |
| standings[].goalsForPerGame | number | Goals for per game |
| standings[].goalsAgainstPerGame | number | Goals against per game |
| standings[].corsiPct | number | Corsi percentage (5v5 shot attempts) |
| standings[].fenwickPct | number | Fenwick percentage (unblocked shots) |
| standings[].expectedGoalsFor | number | Expected goals for |
| standings[].expectedGoalsAgainst | number | Expected goals against |
Stats + aggregation
5 credits/callget_games
5 creditsQuery games by date range, team, season, game state, or type.
When to use: You're building a dataset for analysis -- pull all games from a date range, all playoff games for a team, or all final scores from last season. This is the workhorse endpoint for model training data.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| date_from | string | optional | Start date (YYYY-MM-DD) |
| date_to | string | optional | End date (YYYY-MM-DD) |
| team | string | optional | Team abbreviation |
| season | string | optional | Season (e.g. "20252026") |
| game_state | string | optional | FUT, LIVE, FINAL, or OFF |
| game_type | string | optional | regular, playoff, or preseason |
| limit | integer | optional | Max results (1-500, default 100) |
Example Request
{
"tool": "get_games",
"arguments": {
"team": "TOR",
"date_from": "2026-03-01",
"date_to": "2026-03-07",
"game_state": "FINAL"
}
}Example Response
{
"games": [
{
"id": "2025020934",
"season": "20252026",
"gameDate": "2026-03-02",
"startTime": "19:00:00",
"homeTeam": "TOR",
"awayTeam": "BOS",
"homeScore": 4,
"awayScore": 2,
"gameState": "FINAL",
"gameType": "regular",
"venue": "Scotiabank Arena"
},
{
"id": "2025020958",
"season": "20252026",
"gameDate": "2026-03-05",
"startTime": "19:30:00",
"homeTeam": "MTL",
"awayTeam": "TOR",
"homeScore": 1,
"awayScore": 3,
"gameState": "FINAL",
"gameType": "regular",
"venue": "Bell Centre"
}
]
}Response Fields
| Field | Type | Description |
|---|---|---|
| games[].id | string | Unique game ID |
| games[].season | string | Season code (e.g. "20252026") |
| games[].gameDate | string | Date (YYYY-MM-DD) |
| games[].startTime | string | Start time |
| games[].homeTeam | string | Home team abbreviation |
| games[].awayTeam | string | Away team abbreviation |
| games[].homeTeamName | string | Home team full name |
| games[].awayTeamName | string | Away team full name |
| games[].homeScore | integer | Home team score (FINAL only) |
| games[].awayScore | integer | Away team score (FINAL only) |
| games[].gameState | string | FUT, LIVE, FINAL, or OFF |
| games[].gameType | string | regular, playoff, or preseason |
| games[].venue | string | Arena name |
get_team_stats
5 creditsDetailed stats for a specific team including advanced metrics and league rankings.
When to use: You want a complete statistical profile of a team -- league rank, point pace, goal differential, Corsi, Fenwick, and expected goals.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| team | string | required | Team abbreviation (e.g. "BUF") |
| season | string | optional | Season (e.g. "20252026") |
Example Request
{
"tool": "get_team_stats",
"arguments": {
"team": "BUF",
"season": "20252026"
}
}Example Response
{
"team": {
"abbrev": "BUF",
"name": "Sabres",
"fullName": "Buffalo Sabres",
"city": "Buffalo",
"conference": "Eastern",
"division": "Atlantic",
"arena": "KeyBank Center"
},
"current_stats": {
"rank": 14,
"gamesPlayed": 82,
"wins": 44,
"losses": 28,
"otLosses": 10,
"points": 98,
"pointPct": 0.598,
"goalDiff": 12,
"goalsForPerGame": 3.27,
"goalsAgainstPerGame": 3.12,
"corsiPct": 50.1,
"fenwickPct": 49.8,
"expectedGoalsFor": 261.3,
"expectedGoalsAgainst": 258.7
},
"season": "20252026"
}Response Fields
| Field | Type | Description |
|---|---|---|
| team.abbrev | string | Team abbreviation |
| team.fullName | string | Full team name |
| team.conference | string | Conference |
| team.division | string | Division |
| current_stats.rank | integer | League rank |
| current_stats.gamesPlayed | integer | Games played |
| current_stats.wins | integer | Wins |
| current_stats.losses | integer | Losses |
| current_stats.points | integer | Total points |
| current_stats.pointPct | number | Points percentage |
| current_stats.goalDiff | integer | Goal differential |
| current_stats.goalsForPerGame | number | Goals for per game |
| current_stats.goalsAgainstPerGame | number | Goals against per game |
| current_stats.corsiPct | number | Corsi percentage |
| current_stats.fenwickPct | number | Fenwick percentage |
| current_stats.expectedGoalsFor | number | Expected goals for |
| current_stats.expectedGoalsAgainst | number | Expected goals against |
get_player_stats
5 creditsPlayer bio and goalie stats (if goalie). For skaters, returns bio info and team context.
When to use: You have a player ID (from search_players) and want their full profile -- bio, team, position, and for goalies, their complete stat line including GSAX and advanced metrics.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| player_id | integer | required | Player ID (from search_players) |
Example Request
{
"tool": "get_player_stats",
"arguments": {
"player_id": 8480045
}
}Example Response
{
"player": {
"id": 8480045,
"name": "Ukko-Pekka Luukkonen",
"team": "BUF",
"teamName": "Buffalo Sabres",
"position": "G",
"jerseyNumber": 1,
"birthDate": "1999-03-09",
"birthCountry": "FIN",
"heightInches": 77,
"weightLbs": 220,
"shootsCatches": "L"
},
"goalie_stats": {
"gamesPlayed": 58,
"gamesStarted": 55,
"wins": 30,
"losses": 20,
"otLosses": 5,
"savePct": 0.912,
"gaa": 2.71,
"gsax": 12.1,
"shutouts": 3,
"highDangerSavePct": 0.842,
"rollingSavePct": 0.908,
"trend": "stable"
}
}Response Fields
| Field | Type | Description |
|---|---|---|
| player.id | integer | Player ID |
| player.name | string | Full name |
| player.team | string | Team abbreviation |
| player.teamName | string | Full team name |
| player.position | string | Position code |
| player.jerseyNumber | integer | Jersey number |
| player.birthDate | string | Birth date |
| player.birthCountry | string | Birth country |
| player.heightInches | integer | Height in inches |
| player.weightLbs | integer | Weight in pounds |
| player.shootsCatches | string | Shoots/catches (L or R) |
| goalie_stats | object|null | Goalie stats (null for skaters) |
| goalie_stats.savePct | number | Save percentage |
| goalie_stats.gaa | number | Goals against average |
| goalie_stats.gsax | number | Goals saved above expected |
get_goalie_stats
5 creditsGoalie leaderboard sorted by save%, GAA, GSAX, or wins.
When to use: You want to rank goalies across the league or within a team. GSAX (goals saved above expected) is the advanced metric that tells you who's actually good versus who plays behind a strong defense.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| team | string | optional | Filter by team abbreviation |
| season | string | optional | Season (e.g. "20252026") |
| min_games | integer | optional | Minimum games played (default 10) |
| sort_by | string | optional | save_pct, gaa, gsax, or wins |
| limit | integer | optional | Max results (1-50, default 20) |
Example Request
{
"tool": "get_goalie_stats",
"arguments": {
"sort_by": "gsax",
"limit": 3
}
}Example Response
{
"goalies": [
{
"playerId": 8479361,
"playerName": "Connor Hellebuyck",
"team": "WPG",
"gamesPlayed": 64,
"wins": 38,
"losses": 18,
"savePct": 0.924,
"gaa": 2.31,
"gsax": 24.7,
"shutouts": 5
},
{
"playerId": 8477424,
"playerName": "Sergei Bobrovsky",
"team": "FLA",
"gamesPlayed": 55,
"wins": 34,
"losses": 14,
"savePct": 0.918,
"gaa": 2.48,
"gsax": 18.3,
"shutouts": 4
},
{
"playerId": 8480045,
"playerName": "Ukko-Pekka Luukkonen",
"team": "BUF",
"gamesPlayed": 58,
"wins": 30,
"losses": 20,
"savePct": 0.912,
"gaa": 2.71,
"gsax": 12.1,
"shutouts": 3
}
]
}Response Fields
| Field | Type | Description |
|---|---|---|
| goalies[].playerId | integer | Player ID |
| goalies[].playerName | string | Goalie name |
| goalies[].team | string | Team abbreviation |
| goalies[].teamName | string | Full team name |
| goalies[].gamesPlayed | integer | Games played |
| goalies[].wins | integer | Wins |
| goalies[].losses | integer | Losses |
| goalies[].otLosses | integer | Overtime losses |
| goalies[].savePct | number | Save percentage |
| goalies[].gaa | number | Goals against average |
| goalies[].gsax | number | Goals saved above expected |
| goalies[].shutouts | integer | Shutouts |
| goalies[].highDangerSavePct | number | High-danger save percentage |
| goalies[].rollingSavePct | number | Rolling save percentage (recent trend) |
| goalies[].trend | string | Performance trend (hot, cold, stable) |
| goalies[].restDays | integer | Days since last start |
Multi-table
10 credits/callget_odds
10 creditsOdds for a specific game with optional bookmaker and snapshot type filters.
When to use: You have a game ID and want the betting lines -- moneyline, spread, and total from specific bookmakers. Filter by opening or closing lines to see how the market priced the game.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| game_id | string | required | Game ID (e.g. "2025020887") |
| bookmaker | string | optional | Filter by bookmaker (e.g. "draftkings") |
| snapshot_type | string | optional | "opening" (game-day morning) or "closing" (final pre-game). Default returns both. |
Example Request
{
"tool": "get_odds",
"arguments": {
"game_id": "2025020887",
"bookmaker": "draftkings"
}
}Example Response
{
"game_id": "2025020887",
"home_team": "BUF",
"away_team": "TOR",
"game_date": "2026-03-15",
"odds": [
{
"bookmaker": "draftkings",
"snapshotType": "opening",
"mlHome": -115,
"mlAway": -105,
"mlHomeProb": 0.535,
"mlAwayProb": 0.512,
"spreadHome": -1.5,
"spreadHomeOdds": 170,
"spreadAway": 1.5,
"spreadAwayOdds": -200,
"total": 6,
"totalOverOdds": -110,
"totalUnderOdds": -110,
"capturedAt": "2026-03-14T12:00:00Z"
},
{
"bookmaker": "draftkings",
"snapshotType": "closing",
"mlHome": -125,
"mlAway": 105,
"mlHomeProb": 0.556,
"mlAwayProb": 0.488,
"spreadHome": -1.5,
"spreadHomeOdds": 165,
"spreadAway": 1.5,
"spreadAwayOdds": -195,
"total": 6.5,
"totalOverOdds": -110,
"totalUnderOdds": -110,
"capturedAt": "2026-03-15T18:50:00Z"
}
],
"bookmaker_count": 1
}Response Fields
| Field | Type | Description |
|---|---|---|
| game_id | string | Game ID |
| home_team | string | Home team abbreviation |
| away_team | string | Away team abbreviation |
| odds[].bookmaker | string | Bookmaker name |
| odds[].snapshotType | string | opening or closing |
| odds[].mlHome | integer | Home moneyline |
| odds[].mlAway | integer | Away moneyline |
| odds[].mlHomeProb | number | Implied home win probability |
| odds[].mlAwayProb | number | Implied away win probability |
| odds[].spreadHome | number | Home puck line |
| odds[].spreadHomeOdds | integer | Home spread price |
| odds[].spreadAway | number | Away puck line |
| odds[].spreadAwayOdds | integer | Away spread price |
| odds[].total | number | Over/under total |
| odds[].totalOverOdds | integer | Over price |
| odds[].totalUnderOdds | integer | Under price |
| odds[].capturedAt | string | Timestamp of snapshot |
| bookmaker_count | integer | Number of bookmakers returned |
get_game_detail
10 creditsFull game detail including odds snapshots and confirmed goalie starts.
When to use: You want everything about a single game in one call -- scores, odds from multiple bookmakers, and confirmed goalie starts. Saves you from making separate get_odds and search_players calls.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| game_id | string | required | Game ID (e.g. "2025020887") |
Example Request
{
"tool": "get_game_detail",
"arguments": {
"game_id": "2025020887"
}
}Example Response
{
"game": {
"id": "2025020887",
"season": "20252026",
"gameDate": "2026-03-15",
"startTime": "19:00:00",
"homeTeam": "BUF",
"awayTeam": "TOR",
"homeScore": 5,
"awayScore": 3,
"gameState": "FINAL",
"gameType": "regular",
"venue": "KeyBank Center"
},
"home_team": {
"abbrev": "BUF",
"fullName": "Buffalo Sabres",
"conference": "Eastern",
"division": "Atlantic",
"arena": "KeyBank Center"
},
"away_team": {
"abbrev": "TOR",
"fullName": "Toronto Maple Leafs",
"conference": "Eastern",
"division": "Atlantic",
"arena": "Scotiabank Arena"
},
"odds": [
{
"bookmaker": "draftkings",
"snapshotType": "closing",
"mlHome": -125,
"mlAway": 105,
"mlHomeProb": 0.556,
"mlAwayProb": 0.488,
"spreadHome": -1.5,
"total": 6.5,
"totalOverOdds": -110,
"totalUnderOdds": -110
},
{
"bookmaker": "fanduel",
"snapshotType": "closing",
"mlHome": -130,
"mlAway": 110,
"mlHomeProb": 0.565,
"mlAwayProb": 0.476,
"spreadHome": -1.5,
"total": 6.5,
"totalOverOdds": -108,
"totalUnderOdds": -112
}
],
"goalie_starts": {
"homeGoalieId": 8480045,
"homeGoalieName": "Ukko-Pekka Luukkonen",
"awayGoalieId": 8479361,
"awayGoalieName": "Joseph Woll",
"confirmed": true
}
}Response Fields
| Field | Type | Description |
|---|---|---|
| game.id | string | Game ID |
| game.gameDate | string | Date |
| game.homeScore | integer | Home team score |
| game.awayScore | integer | Away team score |
| game.gameState | string | FUT, LIVE, FINAL, or OFF |
| home_team.abbrev | string | Home team abbreviation |
| home_team.fullName | string | Full team name |
| away_team.abbrev | string | Away team abbreviation |
| away_team.fullName | string | Full team name |
| odds[] | array | Odds snapshots from all bookmakers |
| goalie_starts | object|null | Confirmed goalie starts (null if unavailable) |
| goalie_starts.homeGoalieName | string | Home starting goalie |
| goalie_starts.awayGoalieName | string | Away starting goalie |
get_head_to_head
10 creditsMatchup history between two teams with win/loss records.
When to use: You're previewing a matchup and want to know the rivalry history -- who has the edge, recent results, and head-to-head record for a specific season or all-time.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| team1 | string | required | First team abbreviation |
| team2 | string | required | Second team abbreviation |
| season | string | optional | Filter to specific season |
| limit | integer | optional | Max games (1-100, default 20) |
Example Request
{
"tool": "get_head_to_head",
"arguments": {
"team1": "BUF",
"team2": "TOR",
"season": "20252026"
}
}Example Response
{
"team1": "BUF",
"team2": "TOR",
"record": {
"BUF": 2,
"TOR": 1
},
"total_games": 3,
"games": [
{
"id": "2025020412",
"season": "20252026",
"gameDate": "2025-12-14",
"homeTeam": "TOR",
"awayTeam": "BUF",
"homeScore": 3,
"awayScore": 4,
"gameState": "FINAL",
"venue": "Scotiabank Arena"
},
{
"id": "2025020623",
"season": "20252026",
"gameDate": "2026-01-28",
"homeTeam": "BUF",
"awayTeam": "TOR",
"homeScore": 2,
"awayScore": 5,
"gameState": "FINAL",
"venue": "KeyBank Center"
}
]
}Response Fields
| Field | Type | Description |
|---|---|---|
| team1 | string | First team abbreviation |
| team2 | string | Second team abbreviation |
| record | object | Win counts keyed by team abbreviation |
| record.[TEAM] | integer | Wins for that team |
| total_games | integer | Total games in range |
| games[].id | string | Game ID |
| games[].gameDate | string | Date |
| games[].homeTeam | string | Home team abbreviation |
| games[].awayTeam | string | Away team abbreviation |
| games[].homeScore | integer | Home team score |
| games[].awayScore | integer | Away team score |
Time-series
25 credits/callget_line_movement
25 creditsTime-series odds snapshots grouped by bookmaker. Shows how lines moved from open to close.
When to use: You're analyzing sharp money or building a betting model and need to see how odds changed over time. Opening vs. closing line differences reveal where the market moved, which is the strongest signal in sports betting.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| game_id | string | required | Game ID (e.g. "2025020887") |
| bookmaker | string | optional | Filter to one bookmaker |
Example Request
{
"tool": "get_line_movement",
"arguments": {
"game_id": "2025020887",
"bookmaker": "draftkings"
}
}Example Response
{
"game_id": "2025020887",
"home_team": "BUF",
"away_team": "TOR",
"movement": {
"draftkings": [
{
"bookmaker": "draftkings",
"snapshotType": "opening",
"mlHome": -115,
"mlAway": -105,
"spreadHome": -1.5,
"total": 6,
"capturedAt": "2026-03-15T12:00:00Z"
},
{
"bookmaker": "draftkings",
"snapshotType": "closing",
"mlHome": -125,
"mlAway": 105,
"spreadHome": -1.5,
"total": 6.5,
"capturedAt": "2026-03-15T23:00:00Z"
}
]
}
}Response Fields
| Field | Type | Description |
|---|---|---|
| game_id | string | Game ID |
| home_team | string | Home team abbreviation |
| away_team | string | Away team abbreviation |
| movement[book][] | array | Chronological snapshots per bookmaker |
| movement[book][].snapshotType | string | opening or closing |
| movement[book][].mlHome | integer | Home moneyline at this snapshot |
| movement[book][].mlAway | integer | Away moneyline at this snapshot |
| movement[book][].spreadHome | number | Home puck line |
| movement[book][].total | number | Over/under total |
| movement[book][].capturedAt | string | Timestamp |