NBA box score API

Team totals and every player's stat line for an NBA game, live or final, in one call per game.

Data is aggregated from public sources and is typically 20-30 seconds behind live play (about 1 second after our source). There is no SLA.

AvailableReturned NBA data when checked.

Endpoint

  • GET/api/v1/sports/basketball/leagues/nba/events/{eventId}/boxscore

Live NBA example

Request

curl -H "Authorization: Bearer $RSA_API_KEY" \
  "https://www.realtimesportsapi.com/api/v1/sports/basketball/leagues/nba/events/401909287/boxscore"

Response captured from live data at 2026-11-07 13:53 UTC (refreshed every few minutes). Long arrays are trimmed; meta.rateLimit values are illustrative for a Free key. Box score for Washington Wizards at Atlanta Hawks; player lists trimmed to 2 of 12 (home) and 12 (away).

Response

{
  "success": true,
  "data": {
    "homeTeam": {
      "id": "1",
      "name": "Atlanta Hawks",
      "abbreviation": "ATL",
      "score": 139
    },
    "awayTeam": {
      "id": "27",
      "name": "Washington Wizards",
      "abbreviation": "WSH",
      "score": 132
    },
    "homePlayers": [
      {
        "id": "4431680",
        "name": "Onyeka Okongwu",
        "jersey": "17",
        "position": "F",
        "starter": true,
        "didNotPlay": false,
        "points": "22",
        "rebounds": "10",
        "assists": "1",
        "minutes": "33",
        "fieldGoalsMade-fieldGoalsAttempted": "8-12",
        "threePointFieldGoalsMade-threePointFieldGoalsAttempted": "2-3",
        "freeThrowsMade-freeThrowsAttempted": "4-4",
        "turnovers": "1",
        "steals": "4",
        "blocks": "0",
        "offensiveRebounds": "1",
        "defensiveRebounds": "9",
        "fouls": "2",
        "plusMinus": "+7"
      },
      {
        "id": "4278039",
        "name": "Nickeil Alexander-Walker",
        "jersey": "7",
        "position": "G",
        "starter": true,
        "didNotPlay": false,
        "points": "28",
        "rebounds": "2",
        "assists": "2",
        "minutes": "33",
        "fieldGoalsMade-fieldGoalsAttempted": "7-20",
        "threePointFieldGoalsMade-threePointFieldGoalsAttempted": "4-12",
        "freeThrowsMade-freeThrowsAttempted": "10-10",
        "turnovers": "3",
        "steals": "2",
        "blocks": "0",
        "offensiveRebounds": "1",
        "defensiveRebounds": "1",
        "fouls": "0",
        "plusMinus": "+2"
      }
    ],
    "awayPlayers": [
      {
        "id": "5142718",
        "name": "AJ Dybantsa",
        "jersey": "4",
        "position": "F",
        "starter": true,
        "didNotPlay": false,
        "points": "11",
        "rebounds": "9",
        "assists": "3",
        "minutes": "36",
        "fieldGoalsMade-fieldGoalsAttempted": "3-13",
        "threePointFieldGoalsMade-threePointFieldGoalsAttempted": "1-1",
        "freeThrowsMade-freeThrowsAttempted": "4-4",
        "turnovers": "2",
        "steals": "4",
        "blocks": "0",
        "offensiveRebounds": "2",
        "defensiveRebounds": "7",
        "fouls": "0",
        "plusMinus": "-5"
      },
      {
        "id": "5174563",
        "name": "Kyshawn George",
        "jersey": "18",
        "position": "F",
        "starter": true,
        "didNotPlay": false,
        "points": "33",
        "rebounds": "4",
        "assists": "7",
        "minutes": "39",
        "fieldGoalsMade-fieldGoalsAttempted": "10-19",
        "threePointFieldGoalsMade-threePointFieldGoalsAttempted": "5-7",
        "freeThrowsMade-freeThrowsAttempted": "8-10",
        "turnovers": "2",
        "steals": "1",
        "blocks": "2",
        "offensiveRebounds": "1",
        "defensiveRebounds": "3",
        "fouls": "3",
        "plusMinus": "-3"
      }
    ],
    "periodScores": {
      "home": [
        28,
        38,
        39,
        "... 1 more"
      ],
      "away": [
        32,
        27,
        35,
        "... 1 more"
      ]
    }
  },
  "meta": {
    "rateLimit": {
      "limit": 125,
      "remaining": 124,
      "reset": 1796083200000
    }
  }
}

Code samples

curl

curl -H "Authorization: Bearer $RSA_API_KEY" \
  "https://www.realtimesportsapi.com/api/v1/sports/basketball/leagues/nba/events/401909287/boxscore"

JavaScript (fetch)

const res = await fetch("https://www.realtimesportsapi.com/api/v1/sports/basketball/leagues/nba/events/401909287/boxscore", {
  headers: { Authorization: `Bearer ${process.env.RSA_API_KEY}` }
});
const { success, data, meta } = await res.json();
console.log(data, meta.rateLimit);

Python (requests)

import os, requests

res = requests.get(
    "https://www.realtimesportsapi.com/api/v1/sports/basketball/leagues/nba/events/401909287/boxscore",
    headers={"Authorization": f"Bearer {os.environ['RSA_API_KEY']}"},
    timeout=10,
)
body = res.json()
print(body["data"])

MCP prompt (Claude, Cursor, ChatGPT)

Using the Realtime Sports MCP server (https://www.realtimesportsapi.com/api/mcp), call get_box_score with sport "basketball" and league "nba" and pick a finished game from get_events and list the top performers for NBA.

Connect the hosted MCP server first: setup guide. Each tool call counts as one API call.

Each request above is 1 call. Free covers 125 calls a month after a 1,000-call first month, at 1 request/second. Starter is $29/month for 10,000 calls (about 333 a day) plus webhooks and WebSocket, so you stop polling for changes; 7-day free trial. Compare plans

Fields

FieldTypeNotes
homeTeamobject
awayTeamobject
homePlayersobject[]
awayPlayersobject[]
periodScoresobject

Rate limits and pricing

PlanPriceCallsRateWebSocketWebhooks
Free$0125/mo (1,000 first 30 days)1/s500 msgs/moNo
Starter$29/mo ($290/yr)10,000/mo5/sShares monthly poolShares monthly pool
Growth$49/mo ($490/yr)25,000/mo10/sShares monthly poolShares monthly pool
Pro$99/mo ($990/yr)50,000/mo20/s100,000 msgs/mo25,000/mo
Business$179/mo ($1,790/yr)150,000/mo40/s300,000 msgs/mo75,000/mo
Scale$299/mo ($2,990/yr)500,000/mo100/s500,000 msgs/mo100,000/mo

Every successful REST call counts as one call. Over the limit you get HTTP 429 with a Retry-After header. No SLA. Full pricing.

FAQ

Is there a free NBA box score API?
Yes. A free key (no card) includes every endpoint and league: 1,000 calls in the first 30 days, then 125 a month at 1 request per second. Paid plans start at $29/month for 10,000 calls and add webhooks and WebSocket.
Are NBA box scores live?
They update while the game is in progress and are final afterwards. Data typically runs 20-30 seconds behind live play, so it suits apps, alerts, dashboards and bots, not in-play betting.

Related