NBA SHOT CHARTPer-player endpoint live
NBA Shot Chart API
Every shot, with coordinate_x and coordinate_y on the court. 235,000+ shots from the 2025-26 season (regular season, playoffs, and Finals) with location, shot type, distance, and the shooter, in one clean API. No scraping hidden endpoints.
1,000 req/day on the free plan (2,000 with GitHub). No credit card.
235k+ shots · x/y coordinates · 2025-26 incl. Finals
A real shot, with coordinates
This is the live response from GET /v1/players/:id/shots. Plot coordinate_x and coordinate_y straight onto a court.
GET /v1/players/:id/shots?limit=200
{
"data": [
{
"date": "2026-06-08", "game_id": 18446895,
"period": 4, "clock": "5:22",
"shot_type": "Turnaround Fade Away Jump Shot",
"coordinate_x": 31.0, "coordinate_y": 12.0,
"made": true
},
{
"date": "2026-06-08", "game_id": 18446895,
"period": 4, "clock": "3:40",
"shot_type": "Running Layup Shot",
"coordinate_x": 25.0, "coordinate_y": 0.0,
"made": true
}
],
"meta": { "cached": false, "cache_age_ms": 0 }
}What you can build
Shot coordinates unlock the analytics the big sports sites show but never expose as an API.
Shot charts + heatmaps
Plot every made and missed shot on the court by x/y. Build a player or team heatmap without reverse-engineering another site.
Shot-quality models
Train expected-points-per-shot from location, shot type, and distance. 235k labeled shots is enough to cross-validate.
Zone efficiency dashboards
Bucket shots into court zones (rim, paint, mid-range, corner three, above-the-break) and compute FG% and frequency per zone.
Hot-zone betting research
Where is a player taking and making shots lately? Join the shot log to prop lines and find the matchup edge.
Broadcast + content graphics
Render live or post-game shot charts for a stream, recap, or newsletter, straight from a documented JSON response.
Per-game integration (coming)
The per-game endpoint shape below is the contract. Wire it now and it goes live the moment the route lands.
Fields covered
Live fields come back today from the per-player endpoint. Coming fields ship with the per-game endpoint.
| Field | Status | Description |
|---|---|---|
coordinate_x | live | Court x-coordinate of the shot. Origin is center-court at the rim; units are feet. |
coordinate_y | live | Court y-coordinate of the shot (feet from the baseline along the court). |
shot_type | live | Descriptive shot type, e.g. "Pullup Jump Shot", "Cutting Layup Shot", "Step Back Jump Shot". |
made | live | Boolean, whether the shot went in (scoring play). |
period / clock | live | Quarter (or OT) and game clock at the moment of the shot. |
game_id | live | The game the shot belongs to, joinable to the rest of the NBA surface. |
distance_ft | coming | Shot distance in feet, derived from the coordinates. Pending the per-game endpoint. |
zone | coming | Court-zone label (rim, paint, mid-range, corner 3, above-the-break 3). Pending the per-game endpoint. |
Built for ballers, not scrapers
The big sports sites render shot charts, but none of them publishes an API for it: you end up reverse-engineering undocumented internal endpoints that break without notice, with no terms that allow it. We serve the same x/y shot coordinates as a real, documented API, on the same player_id and game_id you use everywhere else, on the free tier. Build the chart, not the scraper.
Per-game endpoint
In developmentBoth teams' shots for a single game, with derived distance and court-zone labels. The shape is the contract, integrate now and it goes live the moment the route lands.
GET /v1/nba/games/:game_id/shots
{
"data": {
"game_id": "...",
"home_team": "OKC", "away_team": "IND",
"shots": [
{
"player_id": "...", "player_name": "Chet Holmgren",
"team": "OKC", "period": 1, "clock": "9:48",
"coordinate_x": 25.0, "coordinate_y": 2.0,
"shot_type": "Cutting Layup Shot",
"distance_ft": 1, "zone": "rim",
"made": true, "points": 2
}
]
},
"meta": { "cached": false, "cache_age_ms": 0 }
}SDK call, live today
The per-player shot log works now. Wire it up and render a court.
- · 235k+ shots with x/y coordinates, 2025-26 season
- · Same player_id and game_id as the rest of the API
- · Free throws excluded by default (include_ft=true to add them)
import { BigBallSportsClient } from '@bigballsdata/sdk';
const client = new BigBallSportsClient(process.env.BBS_API_KEY!);
// LIVE today: every shot a player took, with x/y court coordinates.
const shots = await client.nba.players.shots(playerId, { limit: 200 });
for (const s of shots.data) {
// Plot s.coordinate_x / s.coordinate_y straight onto a court.
console.log(s.coordinate_x, s.coordinate_y, s.shot_type, s.made ? 'make' : 'miss');
}Frequently asked
- Is there an NBA shot chart API?
- Yes. /v1/players/:id/shots is live and returns per-shot court coordinates (coordinate_x, coordinate_y) plus shot type, period, clock, and make/miss for the 2025-26 season, 235,000+ shots across 1,291 games (regular season, playoffs, and Finals). A per-game endpoint that returns shots from both teams for a single game is in development; the shape is documented below.
- How is this different from scraping NBA shot chart data off a sports site?
- The big sports sites render shot charts but publish no sanctioned API for them, so developers end up reverse-engineering undocumented internal endpoints that change without notice and carry no terms permitting reuse. This is a documented REST API with a stable schema, the same player_id and game_id you use across the rest of the NBA surface, on the free tier. Build the chart, not the scraper.
- What coordinate system do the shots use?
- Coordinates are in feet on a half-court grid. coordinate_x runs across the court (center-court at the rim is roughly x = 25) and coordinate_y is distance from the baseline. A 1-foot layup sits near (25, 0-2); a corner three sits near the sideline at low y. Derived distance and court-zone labels ship with the per-game endpoint.
- How many shots and which seasons are covered?
- 235,000+ shots with x/y coordinates across 1,291 games of the 2025-26 season, including the playoffs and Finals. Free throws are excluded by default (pass include_ft=true to include them). Coverage grows each game day.
- Is the shot chart API free?
- Yes, on the same free tier as the rest of the API: 1,000 req/day (2,000 with GitHub connected), no credit card. Paid tiers (Solo / Trio / Edge / Pro) carry forward for higher caps.
Also on this sport
Stats reference
Get an API key now
235k+ NBA shots with coordinates are live today. Sign up and your key is ready.