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.

250 req/day on the free plan (500 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

Response (live)json
{
  "data": [
    {
      "date": "2026-06-08",
      "match_id": "eb20b8e4-a5d5-4f13-bbb4-bcbd551c0e1d",
      "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",
      "match_id": "eb20b8e4-a5d5-4f13-bbb4-bcbd551c0e1d",
      "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.

FieldStatusDescription
coordinate_xliveCourt x-coordinate of the shot. Origin is center-court at the rim; units are feet.
coordinate_yliveCourt y-coordinate of the shot (feet from the baseline along the court).
shot_typeliveDescriptive shot type, e.g. "Pullup Jump Shot", "Cutting Layup Shot", "Step Back Jump Shot".
madeliveBoolean, whether the shot went in (scoring play).
period / clockliveQuarter (or OT) and game clock at the moment of the shot.
match_idliveThe game the shot belongs to, joinable to the rest of the NBA surface.
distance_ftcomingShot distance in feet, derived from the coordinates. Pending the per-game endpoint.
zonecomingCourt-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 match_id you use everywhere else. Shot coordinates need a Pro key. Build the chart, not the scraper.

Per-game endpoint

In development

Both 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

Response shape (preview)json
{
  "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 match_id as the rest of the API
  • · Free throws excluded by default (include_ft=true to add them)
Node.js, @bigballsdata/sdktypescript
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 match_id you use across the rest of the NBA surface. Shot coordinates are part of our play-by-play product, so the endpoint requires a Pro key. 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?
The shot log is a Pro endpoint — shot coordinates are play-by-play data, and full play-by-play logs are Pro for basketball, hockey and football. Scores, box scores, lineups, standings and props are separate endpoints. There is a free tier; pricing lists what each plan covers. Free keys get 250 req/day (500 with GitHub).

Get an API key now

235k+ NBA shots with coordinates are live today. Sign up and your key is ready.