Tutorial · 10 min · endpoints verified 2026-09-22
How to build an NHL goalie dashboard
Resolve the goalie and team first, then render position-specific rates only when the underlying box-score sample supports them.
API coverage and endpoint overview: Explore the NHL API
Why this is hard
Goalie rates can look complete while their sample is empty
The shared player-stat shape includes both skater and goalie fields. A goalie dashboard must gate its metrics on position and sample metadata rather than treating every nullable field as zero.
- Save percentage and goals-against average are goalie-only fields.
- A zero-game sample must not become a 0.000 performance rate.
- Depth-chart order and season performance answer different questions.
- Goalie headshots and team logos remain nullable media.
Path 1 · recommended
Have your AI agent build it
Use MCP to find the goalie and read player stats; use REST for depth-chart and optional prop context.
1. Connect the MCP server
Add the server in your MCP client and sign in with your Big Balls account. Your client registers itself and handles the token exchange — there is no key to copy.
{
"mcpServers": {
"bigballs-sports-data": {
"url": "https://mcp.bigballsdata.com/mcp"
}
}
}2. Tools your agent gets
find_playersFind canonical player IDs by name for use with player-stat tools.
get_player_statsPer-player career or per-season totals and per-game rates.
get_coverageMachine-readable map of what we hold and what we do not.
3. Ask for what you want
Paste this at your agent. It is written to make the model check coverage before it designs anything, which is what stops it inventing a field we do not serve.
Build an NHL goalie dashboard. Resolve a canonical goalie id and verify
position G before rendering goalie metrics. Use get_player_stats for save_pct,
gaa and workload fields, and inspect matches_counted before calculating rates.
Use initials when headshot_url is null and never guess a team logo URL.What the agent cannot reach
MCP covers player identity and stats, but current depth-chart and saves-prop enrichment require REST calls.
Path 2 · hand-coded
Build it yourself
The dashboard begins with canonical identity and validates the goalie sample before displaying performance rates.
- 01
Resolve a canonical goalie
Search the player surface and require position G. Do not choose the first same-name result without team context.
Find the playerbashcurl -s "https://api.bigballsdata.com/v1/players?search=$NAME&sport=ice_hockey" \ -H "Authorization: Bearer $BBS_API_KEY" - 02
Fetch goalie aggregates and metadata
Read the shared player-stat response, then inspect position and matches_counted before showing goalie-only rates.
Fetch goalie statsbashcurl -s "https://api.bigballsdata.com/v1/players/$PLAYER_ID/stats?sport=ice_hockey" \ -H "Authorization: Bearer $BBS_API_KEY" - 03
Gate every rate on a real sample
Render unavailable when the player is not a goalie, when the sample count is zero, or when the specific metric is null.
Validate the goalie paneltypescriptconst canRender = stats.data?.position === 'G' && (stats.meta?.matches_counted ?? 0) > 0; const savePct = canRender ? stats.data?.save_pct ?? null : null; const gaa = canRender ? stats.data?.gaa ?? null : null;
Reference
Every endpoint this tutorial uses
All on the gateway at api.bigballsdata.com. Verified against production on 2026-09-22.
| Method | Path | Returns | Why you need it | Plan |
|---|---|---|---|---|
| GET | /v1/players/:id/stats?sport=ice_hockey | Position-aware player totals and per-game rates with sample metadata | The core goalie performance panel. Read the goalie-stat guide. | Free |
| GET | /v1/teams/:id/depth-chart | Current team depth-chart context where populated | Optional roster-role context; not a replacement for performance stats. | Free |
Pricing, honestly
The core goalie dashboard works on Free
Identity, player stats and current depth-chart context have Free entry points. Solo rolling form or projections are optional additions with separate availability rules.
Free goalie profile
GET /v1/players/:id/stats?sport=ice_hockey
GET /v1/teams/:id/depth-chartOptional Solo models
GET /v1/players/:id/rolling-stats
GET /v1/players/:id/season-projection- Free supplies the core goalie aggregates.
- A zero sample remains unavailable.
- Solo models do not repair missing historical rows.
- Saves props are a separate freshness-sensitive surface.
More tutorials
Other build guides
- How to build a fantasy hockey app
- How to build a fantasy basketball app
- How to build an NBA scoreboard
- How to build an NHL scoreboard
- How to build an NBA props tracker
- How to build an NBA shot chart
- How to build an NBA matchup page
- How to build an NHL props tracker
- How to build an NHL xG explorer
- How to build a soccer xG app
- How to build a cricket app
- NFL fantasy football API tutorial
- How to build an NFL scouting tool
- How to build an NFL conditions analytics tool
- NFL betting model API tutorial
- NFL live game center API tutorial
- How to build an NCAAF scoreboard and live game center
- How to build college football rankings and conference standings
- How to build an NCAAF fantasy football app
- How to build an MLB live scoreboard
- How to build a fantasy baseball app
- How to build an MLB pitching dashboard
- How to build an MLB betting model
- How to build an MLB standings dashboard
- How to build a soccer fantasy app
- How to build a soccer betting model
- How to build a soccer live match center
- How to build a soccer player production board
- How to build a soccer fixture alert app
- How to build a soccer scouting tool
- How to build an NCAAF betting model
- How to build an NCAAF conditions analytics tool
- How to build a WNBA live scoreboard
- How to build a WNBA quarter tracker
- How to build a WNBA odds board
- How to build a WNBA schedule browser
- How to build a WNBA team-form tool
- How to build an NCAAB scoreboard
- How to build a March Madness archive
- How to build an NCAAB game-detail view
- How to build an NCAAB team-form dashboard
- How to build an NCAAB head-to-head tool
Known gaps
What the first dashboard leaves out
Keep role, performance and market data separate.
- No inferred starter designation from one recent appearance.
- No zero-filled save percentage for an empty sample.
- No guessed headshot or crest when media is null.
Questions
- How do I know a row is a goalie?
- Require the served position to be G before rendering goalie-specific fields.
- What if matches_counted is zero?
- Render an unavailable sample state. Do not calculate or display zero rates.
- Is a depth chart the same as a performance ranking?
- No. It describes roster role or ordering, while the stat response describes recorded performance.
- Can I add saves props?
- Yes where the player-props response holds that market, but its line and freshness remain a separate panel.
Related APIs
Other APIs you can build with: