Skip to main content
skill CX Codex

nba-data — Claude Code skill: what it does, how to install

Skill for querying NBA scores, team rosters, and shot coordinates via CLI without API keys. Useful for analyzing live game summaries, injuries, and historical league stats back to 1946.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add machina-sports/sports-skills --skill nba-data -a claude-code
Open on GitHub

What nba-data does

The skill supplies basketball data to the agent via the sports-skills CLI. It queries public ESPN endpoints, the NBA live CDN, and stats.nba.com directly. Available feeds cover live scoreboards, rosters, injury reports, odds futures, and play-by-play logs. Historical data stretches back to 1946, alongside team pace metrics and per-shot court coordinates.

The package requires Python 3.10 or newer, but needs zero API keys. To keep context clean, queries like get_nbastats_game_log and get_nbastats_team_stats accept sort_by, limit, and fields arguments to return only the requested columns.

ESPN and NBA Stats use separate ID systems for matches and athletes. You cannot join them by ID directly, so the tool relies on game dates and team abbreviations instead.

What it helps with

  • fetch live NBA scores and conference standings
  • retrieve per-shot court coordinates for players
  • look up historical game logs and player stats back to 1946
  • check league-wide injury reports and depth charts

Example prompts for the agent

  • Show today's live NBA scores and box score leaders
  • Get shot coordinates and stats for Nikola Jokic in 2024
  • Check current injury reports and team depth charts

How to install nba-data

1Skills CLI (Vercel)

npx skills add machina-sports/sports-skills --skill nba-data -a claude-code

2Manually: put the files in place

~/.claude/skills/nba-data/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/nba-data/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about nba-data

How to install nba-data in Claude Code?

Run the command npx skills add machina-sports/sports-skills --skill nba-data -a claude-code.

Are API keys required to use this skill?

No API keys or accounts are needed. The CLI pulls data directly from public ESPN endpoints, the NBA live CDN, and stats.nba.com.

What environment dependencies does nba-data have?

The underlying CLI requires Python 3.10 or newer. Install it using pip install sports-skills.

Source text

SKILL.md · MIT
---
name: nba-data
description: |
  NBA data via ESPN public endpoints, the NBA live CDN, and NBA Stats (stats.nba.com) — scores, standings, rosters, schedules, game summaries, play-by-play, injuries, futures, depth charts, leaders, and news, plus an analytics backend: advanced ratings, per-shot court coordinates, career splits, and history to 1946. Zero config, no API keys.

  Use when: user asks about NBA scores, standings, team rosters, schedules, game stats, box scores, play-by-play, injuries, transactions, betting futures, depth charts, team/player statistics, NBA news, shot charts, advanced ratings/pace, career stats, or historical NBA seasons.
  Don't use when: user asks about WNBA (use wnba-data), college basketball (use cbb-data), or other sports.
license: MIT
metadata:
  author: machina-sports
  version: "0.1.0"
---

# NBA Data

Before writing queries, consult `references/api-reference.md` for endpoints, ID conventions, and data shapes.

## Setup

Before first use, check if the CLI is available:
```bash
which sports-skills || pip install sports-skills
```
If `pip install` fails with a Python version error, the package requires Python 3.10+. Find a compatible Python:
```bash
python3 --version  # check version
# If < 3.10, try: python3.12 -m pip install sports-skills
# On macOS with Homebrew: /opt/homebrew/bin/python3.12 -m pip install sports-skills
```
No API keys required.

## Quick Start

Prefer the CLI — it avoids Python import path issues:
```bash
sports-skills nba get_scoreboard
sports-skills nba get_standings --season=2025
sports-skills nba get_teams
```

## CRITICAL: Before Any Query

CRITICAL: Before calling any data endpoint, verify:
- Season year is derived from the system prompt's `currentDate` — never hardcoded.
- If only a team name is provided, call `get_teams` to resolve the team ID before using team-specific commands.

## Choosing the Season

Derive the current year from the system prompt's date (e.g., `currentDate: 2026-02-18` → current year is 2026).

- **If the user specifies a season**, use it as-is.
- **If the user says "current", "this season", or doesn't specify**: The NBA season runs October–June. If the current month is October–December, the active season year matches the current year. If January–June, the active season started the previous calendar year (use that year as the season).

## Commands

| Command | Description |
|---|---|
| `get_scoreboard` | Live/recent NBA scores |
| `get_standings` | Standings by conference |
| `get_teams` | All 30 NBA teams |
| `get_team_roster` | Full roster for a team |
| `get_team_schedule` | Schedule for a specific team |
| `get_game_summary` | Detailed box score and scoring plays |
| `get_leaders` | NBA statistical leaders |
| `get_news` | NBA news articles |
| `get_play_by_play` | Full play-by-play for a game |
| `get_win_probability` | Win probability chart data |
| `get_schedule` | Games on a specific date (no season filter; see `get_team_schedule`) |
| `get_injuries` | Injury reports across all teams |
| `get_transactions` | Recent transactions |
| `get_futures` | Futures/odds markets |
| `get_depth_chart` | Depth chart for a team |
| `get_team_stats` | Team statistical profile |
| `get_player_stats` | Player statistical profile |
| `find_nba_player` | Search the NBA Stats player registry (all eras) |
| `get_nbastats_game_log` | League game log via NBA Stats — history to 1946, carries NBA game ids. `player_or_team="player"` or `player=<name or id>` for player game logs |
| `get_nbastats_player_career` | Career stats season by season via NBA Stats |
| `get_nbastats_team_stats` | League team stats via NBA Stats — advanced ratings, pace, four factors |
| `get_nbastats_shot_chart` | Per-shot court coordinates via NBA Stats |
| `get_nbastats_play_by_play` | Play-by-play with coordinates for past seasons via NBA Stats |
| `get_nbastats_advanced_boxscore` | Advanced box score (ratings, usage) via NBA Stats |
| `get_live_scoreboard` | Real-time scores. Primary cdn.nba.com, fallback ESPN |
| `get_live_boxscore` | Real-time box score. Primary cdn.nba.com, fallback ESPN |
| `get_live_playbyplay` | Real-time play-by-play, most recent plays first |
| `get_player_live_stats` | Real-time stats for one player in today's games |

See `references/api-reference.md` for full parameter lists and return shapes.

## Shaping Long NBA Stats Results

`get_nbastats_game_log`, `get_nbastats_team_stats` and `get_nbastats_shot_chart`
accept `sort_by`, `descending`, `limit` and `fields`, so you can ask for the rows
and columns you need instead of a full season:

```bash
# Miami's five highest-scoring games, four columns each
sports-skills nba get_nbastats_game_log --season=2025 --team=MIA \
  --sort_by=pts --limit=5 --fields=wl,pts
```

- `sort_by`: one column to sort by. Numbers (and numeric strings) sort numerically; missing values always go last.
- `descending`: `true` (default) or `false`; only used with `sort_by`.
- `limit`: positive integer, applied after sorting.
- `fields`: comma-separated keep-list. The identity columns below and the `sort_by` column are always kept.
- An unknown `sort_by`/`fields` column returns an error listing the valid columns.
- With any of these set, the response adds `total_rows` (matching rows before `limit`) and `returned_rows`. With none set, output is unchanged. They are applied after the fetch, so they never change the upstream request or its replay entry.

| Command | Always kept by `fields` |
|---------|-------------------------|
| `get_nbastats_game_log` | `game_id`, `game_date`, `team_abbreviation`, `matchup` |
| `get_nbastats_game_log` (player rows) | `game_id`, `game_date`, `player_id`, `team_abbreviation`, `matchup` |
| `get_nbastats_team_stats` | `team_id`, `team_name`, `team_abbreviation` |
| `get_nbastats_shot_chart` | `game_id`, `game_date`, `period` |

Column names are NBA.com's, lowercased (`pts`, `fg3m`, `plus_minus`, `shot_distance`).

## Using ESPN and NBA Stats Together

The `get_nbastats_*` commands read stats.nba.com — the analytics layer (advanced
ratings, shot coordinates, deep history) that ESPN's endpoints do not carry. The
two sources use unrelated id systems:

- **Game ids.** NBA Stats uses 10-digit ids (`"0022400061"`); ESPN uses event ids
  (`"401704627"`). There is no shared column — join on the game date plus the two
  team abbreviations.
- **Team abbreviations.** Six teams are spelled differently: ESPN `GS`/`NO`/`NY`/
  `SA`/`UTAH`/`WSH` vs NBA `GSW`/`NOP`/`NYK`/`SAS`/`UTA`/`WAS`. Every
  `get_nbastats_*` team filter accepts either spelling, and result rows carry both
  (`team_abbreviation` and `team_abbreviation_espn`).
- **Player ids.** NBA person ids (`"203999"`) and ESPN athlete ids are unrelated.
  Resolve names with `find_nba_player`; ASCII spellings match accented names
  ("jokic" finds "Nikola Jokić").
- **Seasons.** Pass the starting year (`season=2024` means 2024-25). The NBA form
  (`"2024-25"`) is also accepted.
- **Dates.** `game_date` is `YYYY-MM-DD` in game logs and shot charts alike.

stats.nba.com throttles by client and volume: heavy bursts (and many
datacenter/cloud IPs) get silently tarpitted rather than refused. The commands
fail fast with an explanatory error when that happens — wait before retrying;
do not hammer. Responses are cached, and the ESPN-backed and `get_live_*`
commands are unaffected.

## Examples

Example 1: Today's scores
User says: "What are today's NBA scores?"
Actions:
1. Call `get_scoreboard()`
Result: All live and recent NBA games with scores and status

Example 2: Conference standings
User says: "Show me the Western Conference standings"
Actions:
1. Derive season year from `currentDate`
2. Call `get_standings(season=<derived_year>)`
3. Filter results for Western Conference
Result: Western Conference standings table with W-L, PCT, GB per team

Example 3: Team roster
User says: "Who's on the Lakers roster?"
Actions:
1. Call `get_team_roster(team_id="13")`
Result: Full Lakers roster with name, position, jersey number, height, weight

Example 4: Game box score
User says: "Show me the full box score for last night's Celtics game"
Actions:
1. Call `get_scoreboard(date="<yesterday>")` to find the event_id
2. Call `get_game_summary(event_id=<id>)` for full box score
Result: Complete box score with per-player stats and scoring plays

Example 5: Injury report
User says: "Who's injured on the Lakers?"
Actions:
1. Call `get_injuries()`
2. Filter results for Los Angeles Lakers (team_id=13)
Result: Lakers injury list with player name, position, status, and injury type

Example 6: Player statistics
User says: "Show me LeBron's stats this season"
Actions:
1. Derive season year from `currentDate`
2. Call `get_player_stats(player_id="1966", season_year=<derived_year>)`
Result: Season stats by category with value, rank, and per-game averages

## Commands that DO NOT exist — never call these

- ~~`get_odds`~~ / ~~`get_betting_odds`~~ — not available. For prediction market odds, use the polymarket or kalshi skill.
- ~~`search_teams`~~ — does not exist. Use `get_teams` instead.
- ~~`get_box_score`~~ — does not exist. Use `get_game_summary` instead.
- ~~`get_player_ratings`~~ — does not exist. Use `get_player_stats` instead.

If a command is not listed in the Commands table above, it does not exist.

## Error Handling

When a command fails, **do not surface raw errors to the user**. Instead:
1. Catch silently and try alternatives
2. If team name given instead of ID, use `get_teams` to find the ID first
3. Only report failure with a clean message after exhausting alternatives

## Troubleshooting

Error: `sports-skills` command not found
Cause: Package not installed
Solution: Run `pip install sports-skills`

Error: Team not found by ID
Cause: Wrong or outdated ESPN team ID used
Solution: Call `get_teams` to get the current list of all 30 NBA teams with their IDs

Error: No data returned for a future game
Cause: ESPN only returns data for completed or in-progress games
Solution: Use `get_schedule` to see upcoming game details; `get_scoreboard` only covers active/recent games

Error: Offseason — scoreboard returns 0 events
Cause: No games scheduled during the offseason (July–September)
Solution: Use `get_standings` or `get_news` instead; use `get_schedule` to find when the season resumes

© machina-sports · MIT · machina-sports/sports-skills

Similar skills

All skills for Data and databases →

From the same set22

betting Converts odds, strips the vig, finds edge and sizes bets with the Kelly criterion. Useful when you have prices from two sources and want to know if there is value. CX Codex +1 1,600installs polymarket Pulls live Polymarket sports markets: prices, implied probabilities, order books and events. Useful when you need to know who the market favors. CX Codex +1 1,300installs sports-news Pulls fresh sports headlines from RSS feeds and Google News, searches by query and filters by date. Handy for transfer rumours or match reports. CX Codex +1 1,200installs kalshi This skill gives your agent Kalshi prediction market data: events, series, contracts, trades and candlesticks on sports outcomes. Useful when you want implied probabilities, not match results. CX Codex +1 1,000installs markets A skill that pairs ESPN schedules with Kalshi and Polymarket prediction markets: dashboards, odds comparison and bet evaluation. CX Codex +1 861installs nfl-data The skill gives your agent NFL schedules, rosters, stats and play-by-play through ESPN public endpoints and an nflverse backend. No API keys. CX Codex +1 752installs mlb-data Connects your coding agent to live and historical MLB data from ESPN and the official MLB API. Useful for pulling scores, rosters, injuries, and pitch analytics without API keys. CX Codex +1 737installs tennis-data A skill that lets your coding agent pull ATP and WTA tournament scores, rankings, the season calendar, player profiles and news from ESPN public endpoints. CX Codex +1 719installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor