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

Response (live)json
{
  "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.

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.
game_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 game_id you use everywhere else, on the free tier. 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 game_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 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.

Get an API key now

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