mirror of
https://github.com/nprasad2077/nbaStats.git
synced 2026-11-05 01:25:48 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0b1814369b | ||
|
|
39535055a5 | ||
|
|
3ced0d278b | ||
|
|
5eaa50f4e7 | ||
|
|
4b1d07353d | ||
|
|
0701ef19d2 | ||
|
|
3558b1c154 |
No files matched your search
@@ -1,373 +1,472 @@
|
|||||||
# NBA Stats API 2.0
|
# NBA Stats API 0.1 Beta
|
||||||
|
|
||||||
## [🔎 📜 View the Interactive API Documentation](https://api.server.nbaapi.com/)
|
|
||||||
|
|
||||||
[<img src="https://run.pstmn.io/button.svg" alt="Run In Postman" style="width: 128px; height: 32px;">](https://solar-meadow-682296.docs.buildwithfern.com)
|
|
||||||
|
|
||||||
|
|
||||||
# NEW DATA AVAILABLE SOON.
|
|
||||||
|
|
||||||
Hi Folks, stay tuned for new updated including much more advanced and refined player, game, and team statistics.
|
|
||||||
|
|
||||||
Here is a small preview:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
| API Responses |
|
|
||||||
| :---: |
|
|
||||||
| <img src="https://files.catbox.moe/sfi5z7.png" width="100%"> |
|
|
||||||
| <img src="https://files.catbox.moe/ua8jmc.png" width="100%"> |
|
|
||||||
| <img src="https://files.catbox.moe/no1mpw.png" width="100%"> |
|
|
||||||
| <img src="https://files.catbox.moe/ol7sjl.png" width="100%"> |
|
|
||||||
| <img src="https://files.catbox.moe/xi66gb.png" width="100%"> |
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
## 📺 Video Preview
|
|
||||||
|
|
||||||
<video src="https://github.com/user-attachments/assets/1e528ea9-7913-4e16-a33b-3251a0bb3c46" autoplay loop muted playsinline width="100%" type="video/mp4"></video>
|
|
||||||
|
|
||||||
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" height="4px" display="block">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
This documentation provides comprehensive information for using the NBA Stats API. The API offers access to NBA season and playoff statistics, including player totals, advanced metrics, and historical data. All statistics are cross-referenced with [basketball-reference.com](https://www.basketball-reference.com/) and [NBA.com](https://www.nba.com/stats).
|
This documentation provides the necessary information to use the NBA Stats API. These APIs provide access to NBA season and playoff totals, advanced statistics, shot chart data, and more.
|
||||||
|
|
||||||
# NBA Player Statistics API
|
|
||||||
|
|
||||||
This API provides endpoints to query NBA player statistics, including both "Totals" data, "Advanced" statistical data, and Player Shot Chart data. Each endpoint supports filtering, sorting, and pagination options to help you retrieve exactly the data you need.
|
|
||||||
|
|
||||||
## Base URL
|
|
||||||
|
|
||||||
All API endpoints are served from:
|
|
||||||
|
|
||||||
```
|
|
||||||
https://api.server.nbaapi.com/
|
|
||||||
```
|
|
||||||
|
|
||||||
## Authentication
|
|
||||||
|
|
||||||
No authentication is currently required for these endpoints.
|
|
||||||
|
|
||||||
## Available Endpoints
|
|
||||||
|
|
||||||
- **Player Advanced Stats** (`/api/playeradvancedstats`)
|
|
||||||
|
|
||||||
Provides advanced player metrics including Player Efficiency Rating (PER), True Shooting Percentage (TS%), Usage Percentage, Win Shares, VORP, and other advanced analytics.
|
|
||||||
|
|
||||||
- **Player Totals** (`/api/playertotals`)
|
|
||||||
|
|
||||||
Provides season-based totals such as points, assists, rebounds, games played, shooting percentages, and more traditional statistics.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Common Query Parameters
|
# [View API Documentation](https://documenter.getpostman.com/view/24232555/2s93shzpR3)
|
||||||
|
|
||||||
Both endpoints support the following query parameters:
|
|
||||||
|
|
||||||
### Filtering Parameters
|
|
||||||
- **season** *(integer, optional)*: Filter by a specific season (e.g., `2025`)
|
|
||||||
- **team** *(string, optional)*: Filter by team abbreviation (e.g., `MIL`, `LAL`)
|
|
||||||
- **playerId** *(string, optional)*: Filter by player's unique ID (e.g., `greenaj01`)
|
|
||||||
- **isPlayoff** *(boolean, optional)*: Filter for playoff statistics (`true`) or regular season (`false`)
|
|
||||||
|
|
||||||
### Pagination Parameters
|
|
||||||
- **page** *(integer, optional)*: Page number to retrieve (default: `1`)
|
|
||||||
- **pageSize** *(integer, optional)*: Number of records per page (default: `20`)
|
|
||||||
|
|
||||||
### Sorting Parameters
|
|
||||||
- **sortBy** *(string, optional)*: Field name to sort results by (see endpoint-specific options below)
|
|
||||||
- **ascending** *(boolean, optional)*: Sort order - `true` for ascending, `false` for descending (default: `false`)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Player Advanced Stats Endpoint
|
### Base URL
|
||||||
|
|
||||||
**GET** `/api/playeradvancedstats`
|
All URLs referenced in this documentation use the following base URL:
|
||||||
|
|
||||||
Retrieve advanced player statistics with comprehensive filtering and sorting options.
|
> <https://nba-stats-db.herokuapp.com/>
|
||||||
|
|
||||||
### Sorting Options for Advanced Stats
|
### Endpoints
|
||||||
|
|
||||||
The `sortBy` parameter accepts the following values:
|
Top 20 Scorers by Season
|
||||||
- `games` - Games played
|
Method: `Get`
|
||||||
- `minutes_played` - Total minutes played
|
|
||||||
- `ts_percent` - True Shooting Percentage
|
|
||||||
- `total_rb_percent` - Total Rebound Percentage
|
|
||||||
- `usage_percent` - Usage Percentage
|
|
||||||
- `offensive_ws` - Offensive Win Shares
|
|
||||||
- `defensive_ws` - Defensive Win Shares
|
|
||||||
- `win_shares` - Total Win Shares (default)
|
|
||||||
- `win_shares_per` - Win Shares per 48 minutes
|
|
||||||
- `offensive_box` - Offensive Box Plus/Minus
|
|
||||||
- `defensive_box` - Defensive Box Plus/Minus
|
|
||||||
- `box` - Total Box Plus/Minus
|
|
||||||
- `vorp` - Value Over Replacement Player
|
|
||||||
- `season` - Season year
|
|
||||||
|
|
||||||
### Example Request
|
> <https://nba-stats-db.herokuapp.com/api/playerdata/topscorers/total/season/2023/>
|
||||||
|
|
||||||
|
Success Response:
|
||||||
|
|
||||||
|
`Code: 200`
|
||||||
|
|
||||||
|
Content:
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X GET \
|
|
||||||
'https://api.server.nbaapi.com/api/playeradvancedstats?page=1&pageSize=20&sortBy=win_shares&ascending=false&season=2025&team=MIL' \
|
|
||||||
-H 'accept: application/json'
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Response Format
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
{
|
||||||
"data": [
|
"count": 20,
|
||||||
{
|
"next": null,
|
||||||
"id": 12345,
|
"previous": null,
|
||||||
"playerName": "Giannis Antetokounmpo",
|
"results": [
|
||||||
"position": "PF",
|
{
|
||||||
"age": 30,
|
"id": 40,
|
||||||
"games": 65,
|
"player_name": "Jayson Tatum",
|
||||||
"minutesPlayed": 2205,
|
"age": 24,
|
||||||
"per": 31.2,
|
"games": 74,
|
||||||
"tsPercent": 0.614,
|
"games_started": 74,
|
||||||
"threePAR": 0.156,
|
"minutes_played": 2732,
|
||||||
"ftr": 0.345,
|
"field_goals": 727,
|
||||||
"offensiveRBPercent": 11.2,
|
"field_attempts": 1559,
|
||||||
"defensiveRBPercent": 34.5,
|
"field_percent": "0.466",
|
||||||
"totalRBPercent": 22.8,
|
"three_fg": 240,
|
||||||
"assistPercent": 40.1,
|
"three_attempts": 686,
|
||||||
"stealPercent": 1.8,
|
"three_percent": "0.350",
|
||||||
"blockPercent": 3.2,
|
"two_fg": 487,
|
||||||
"turnoverPercent": 16.7,
|
"two_attempts": 873,
|
||||||
"usagePercent": 36.8,
|
"two_percent": "0.558",
|
||||||
"offensiveWS": 12.3,
|
"effect_fg_percent": "0.543",
|
||||||
"defensiveWS": 4.7,
|
"ft": 531,
|
||||||
"winShares": 17.0,
|
"fta": 622,
|
||||||
"winSharesPer": 0.370,
|
"ft_percent": "0.854",
|
||||||
"offensiveBox": 8.9,
|
"ORB": 78,
|
||||||
"defensiveBox": 2.1,
|
"DRB": 571,
|
||||||
"box": 11.0,
|
"TRB": 649,
|
||||||
"vorp": 9.2,
|
"AST": 342,
|
||||||
"team": "MIL",
|
"STL": 78,
|
||||||
"season": 2025,
|
"BLK": 51,
|
||||||
"playerId": "antetgi01",
|
"TOV": 213,
|
||||||
"isPlayoff": false
|
"PF": 160,
|
||||||
}
|
"PTS": 2225,
|
||||||
],
|
"team": "BOS",
|
||||||
"pagination": {
|
"season": 2023
|
||||||
"page": 1,
|
},
|
||||||
"pageSize": 20,
|
{
|
||||||
"total": 450,
|
"id": 20,
|
||||||
"pages": 23
|
"player_name": "Joel Embiid",
|
||||||
}
|
"age": 28,
|
||||||
|
"games": 66,
|
||||||
|
"games_started": 66,
|
||||||
|
"minutes_played": 2284,
|
||||||
|
"field_goals": 728,
|
||||||
|
"field_attempts": 1328,
|
||||||
|
"field_percent": "0.548",
|
||||||
|
"three_fg": 66,
|
||||||
|
"three_attempts": 200,
|
||||||
|
"three_percent": "0.330",
|
||||||
|
"two_fg": 662,
|
||||||
|
"two_attempts": 1128,
|
||||||
|
"two_percent": "0.587",
|
||||||
|
"effect_fg_percent": "0.573",
|
||||||
|
"ft": 661,
|
||||||
|
"fta": 771,
|
||||||
|
"ft_percent": "0.857",
|
||||||
|
"ORB": 113,
|
||||||
|
"DRB": 557,
|
||||||
|
"TRB": 670,
|
||||||
|
"AST": 274,
|
||||||
|
"STL": 66,
|
||||||
|
"BLK": 112,
|
||||||
|
"TOV": 226,
|
||||||
|
"PF": 205,
|
||||||
|
"PTS": 2183,
|
||||||
|
"team": "PHI",
|
||||||
|
"season": 2023
|
||||||
|
},
|
||||||
|
...
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
Top 20 Scorers in Playoffs
|
||||||
|
Method: `Get`
|
||||||
|
|
||||||
## Player Totals Endpoint
|
> <https://nba-stats-db.herokuapp.com/api/playerdata/topscorers/playoffs/2022/>
|
||||||
|
|
||||||
**GET** `/api/playertotals`
|
Success Response:
|
||||||
|
|
||||||
Retrieve traditional player statistics including points, assists, rebounds, and shooting data.
|
`Code: 200`
|
||||||
|
|
||||||
### Sorting Options for Player Totals
|
Content:
|
||||||
|
|
||||||
The `sortBy` parameter accepts the following values:
|
|
||||||
- `games` - Games played
|
|
||||||
- `minutes_pg` - Minutes per game
|
|
||||||
- `three_fg` - Three-point field goals made
|
|
||||||
- `three_attempts` - Three-point field goal attempts
|
|
||||||
- `two_fg` - Two-point field goals made
|
|
||||||
- `effect_fg_percent` - Effective Field Goal Percentage
|
|
||||||
- `ft` - Free throws made
|
|
||||||
- `total_rb` - Total rebounds
|
|
||||||
- `assists` - Assists
|
|
||||||
- `steals` - Steals
|
|
||||||
- `blocks` - Blocks
|
|
||||||
- `points` - Points scored
|
|
||||||
- `season` - Season year
|
|
||||||
|
|
||||||
### Example Request
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X GET \
|
|
||||||
'https://api.server.nbaapi.com/api/playertotals?page=1&pageSize=20&sortBy=points&ascending=false&season=2025' \
|
|
||||||
-H 'accept: application/json'
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Response Format
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
{
|
||||||
"data": [
|
"count": 20,
|
||||||
{
|
"next": null,
|
||||||
"id": 67890,
|
"previous": null,
|
||||||
"playerName": "Luka Doncic",
|
"results": [
|
||||||
"position": "PG",
|
{
|
||||||
"age": 26,
|
"id": 16,
|
||||||
"games": 70,
|
"player_name": "Jayson Tatum",
|
||||||
"gamesStarted": 70,
|
"age": 23,
|
||||||
"minutesPg": 36.2,
|
"games": 24,
|
||||||
"fieldGoals": 11.2,
|
"games_started": 24,
|
||||||
"fieldAttempts": 23.1,
|
"minutes_played": 983,
|
||||||
"fieldPercent": 0.485,
|
"field_goals": 201,
|
||||||
"threeFg": 4.1,
|
"field_attempts": 472,
|
||||||
"threeAttempts": 11.3,
|
"field_percent": "0.426",
|
||||||
"threePercent": 0.363,
|
"three_fg": 77,
|
||||||
"twoFg": 7.1,
|
"three_attempts": 196,
|
||||||
"twoAttempts": 11.8,
|
"three_percent": "0.393",
|
||||||
"twoPercent": 0.602,
|
"two_fg": 124,
|
||||||
"effectFgPercent": 0.574,
|
"two_attempts": 276,
|
||||||
"ft": 7.8,
|
"two_percent": "0.449",
|
||||||
"ftAttempts": 9.2,
|
"effect_fg_percent": "0.507",
|
||||||
"ftPercent": 0.848,
|
"ft": 136,
|
||||||
"offensiveRb": 1.8,
|
"fta": 170,
|
||||||
"defensiveRb": 7.4,
|
"ft_percent": "0.800",
|
||||||
"totalRb": 9.2,
|
"ORB": 24,
|
||||||
"assists": 8.9,
|
"DRB": 137,
|
||||||
"steals": 1.4,
|
"TRB": 161,
|
||||||
"blocks": 0.5,
|
"AST": 148,
|
||||||
"turnovers": 4.1,
|
"STL": 29,
|
||||||
"personalFouls": 2.8,
|
"BLK": 21,
|
||||||
"points": 34.3,
|
"TOV": 100,
|
||||||
"team": "DAL",
|
"PF": 72,
|
||||||
"season": 2025,
|
"PTS": 615,
|
||||||
"playerId": "doncilu01",
|
"team": "BOS",
|
||||||
"isPlayoff": false
|
"season": 2022
|
||||||
}
|
},
|
||||||
],
|
{
|
||||||
"pagination": {
|
"id": 178,
|
||||||
"page": 1,
|
"player_name": "Stephen Curry",
|
||||||
"pageSize": 20,
|
"age": 33,
|
||||||
"total": 500,
|
"games": 22,
|
||||||
"pages": 25
|
"games_started": 18,
|
||||||
}
|
"minutes_played": 764,
|
||||||
|
"field_goals": 202,
|
||||||
|
"field_attempts": 440,
|
||||||
|
"field_percent": "0.459",
|
||||||
|
"three_fg": 91,
|
||||||
|
"three_attempts": 229,
|
||||||
|
"three_percent": "0.397",
|
||||||
|
"two_fg": 111,
|
||||||
|
"two_attempts": 211,
|
||||||
|
"two_percent": "0.526",
|
||||||
|
"effect_fg_percent": "0.563",
|
||||||
|
"ft": 107,
|
||||||
|
"fta": 129,
|
||||||
|
"ft_percent": "0.829",
|
||||||
|
"ORB": 11,
|
||||||
|
"DRB": 104,
|
||||||
|
"TRB": 115,
|
||||||
|
"AST": 129,
|
||||||
|
"STL": 29,
|
||||||
|
"BLK": 8,
|
||||||
|
"TOV": 57,
|
||||||
|
"PF": 59,
|
||||||
|
"PTS": 602,
|
||||||
|
"team": "GSW",
|
||||||
|
"season": 2022
|
||||||
|
},
|
||||||
|
...
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
Top 20 Assists by Season
|
||||||
## Player Shot Chart Endpoint
|
Method: `Get`
|
||||||
|
|
||||||
**GET** `/api/playershotchart`
|
> <https://nba-stats-db.herokuapp.com/api/top_assists/totals/2023/>
|
||||||
|
|
||||||
Retrieve shot chart data for a specific player. This endpoint is ideal for visualizing player shooting performance and can be filtered by game, season, shot type, and outcome.
|
Success Response:
|
||||||
|
|
||||||
### Query Parameters for Shot Chart
|
`Code: 200`
|
||||||
|
|
||||||
- **playerId** *(string, optional)*: The player's unique ID (e.g., `hardeja01`).
|
Content:
|
||||||
- **season** *(integer, optional)*: Filter by a specific season (e.g., `2019`).
|
|
||||||
- **date** *(string, optional)*: Filter by a specific game date (e.g., `Dec 17, 2018`).
|
|
||||||
- **opponent** *(string, optional)*: Filter by the three-letter abbreviation for the opponent team (e.g., `UTA`).
|
|
||||||
- **qtr** *(string, optional)*: Filter by the quarter of the game (e.g., `1st Qtr`).
|
|
||||||
- **result** *(boolean, optional)*: Filter by shot outcome (`true` for made shots, `false` for missed).
|
|
||||||
- **shot\_type** *(string, optional)*: Filter by the type of shot (e.g., `2-pointer`, `3-pointer`).
|
|
||||||
- **page** *(integer, optional)*: Page number to retrieve (default: `1`). Note: The page size is fixed at 50 results.
|
|
||||||
|
|
||||||
### Example Request
|
```
|
||||||
|
{
|
||||||
|
"count": 20,
|
||||||
|
"next": null,
|
||||||
|
"previous": null,
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"id": 529,
|
||||||
|
"player_name": "Trae Young",
|
||||||
|
"age": 24,
|
||||||
|
"games": 73,
|
||||||
|
"games_started": 73,
|
||||||
|
"minutes_played": 2541,
|
||||||
|
"field_goals": 597,
|
||||||
|
"field_attempts": 1390,
|
||||||
|
"field_percent": "0.429",
|
||||||
|
"three_fg": 154,
|
||||||
|
"three_attempts": 460,
|
||||||
|
"three_percent": "0.335",
|
||||||
|
"two_fg": 443,
|
||||||
|
"two_attempts": 930,
|
||||||
|
"two_percent": "0.476",
|
||||||
|
"effect_fg_percent": "0.485",
|
||||||
|
"ft": 566,
|
||||||
|
"fta": 639,
|
||||||
|
"ft_percent": "0.886",
|
||||||
|
"ORB": 56,
|
||||||
|
"DRB": 161,
|
||||||
|
"TRB": 217,
|
||||||
|
"AST": 741,
|
||||||
|
"STL": 80,
|
||||||
|
"BLK": 9,
|
||||||
|
"TOV": 300,
|
||||||
|
"PF": 104,
|
||||||
|
"PTS": 1914,
|
||||||
|
"team": "ATL",
|
||||||
|
"season": 2023
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 203,
|
||||||
|
"player_name": "Nikola Jokić",
|
||||||
|
"age": 27,
|
||||||
|
"games": 69,
|
||||||
|
"games_started": 69,
|
||||||
|
"minutes_played": 2323,
|
||||||
|
"field_goals": 646,
|
||||||
|
"field_attempts": 1022,
|
||||||
|
"field_percent": "0.632",
|
||||||
|
"three_fg": 57,
|
||||||
|
"three_attempts": 149,
|
||||||
|
"three_percent": "0.383",
|
||||||
|
"two_fg": 589,
|
||||||
|
"two_attempts": 873,
|
||||||
|
"two_percent": "0.675",
|
||||||
|
"effect_fg_percent": "0.660",
|
||||||
|
"ft": 341,
|
||||||
|
"fta": 415,
|
||||||
|
"ft_percent": "0.822",
|
||||||
|
"ORB": 167,
|
||||||
|
"DRB": 650,
|
||||||
|
"TRB": 817,
|
||||||
|
"AST": 678,
|
||||||
|
"STL": 87,
|
||||||
|
"BLK": 47,
|
||||||
|
"TOV": 247,
|
||||||
|
"PF": 174,
|
||||||
|
"PTS": 1690,
|
||||||
|
"team": "DEN",
|
||||||
|
"season": 2023
|
||||||
|
},
|
||||||
|
...
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X GET \
|
|
||||||
'https://api.server.nbaapi.com/api/playershotchart?playerId=hardeja01&date=Dec%2017%2C2018' \
|
|
||||||
-H 'accept: application/json'
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Response Format
|
Top 20 Assists in Playoffs
|
||||||
|
Method: `Get`
|
||||||
|
|
||||||
The response is an array of shot objects.
|
> <https://nba-stats-db.herokuapp.com/api/top_assists/playoffs/2022/>
|
||||||
|
|
||||||
|
Success Response:
|
||||||
|
|
||||||
|
`Code: 200`
|
||||||
|
|
||||||
|
Content:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"count": 20,
|
||||||
|
"next": null,
|
||||||
|
"previous": null,
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"id": 16,
|
||||||
|
"player_name": "Jayson Tatum",
|
||||||
|
"age": 23,
|
||||||
|
"games": 24,
|
||||||
|
"games_started": 24,
|
||||||
|
"minutes_played": 983,
|
||||||
|
"field_goals": 201,
|
||||||
|
"field_attempts": 472,
|
||||||
|
"field_percent": "0.426",
|
||||||
|
"three_fg": 77,
|
||||||
|
"three_attempts": 196,
|
||||||
|
"three_percent": "0.393",
|
||||||
|
"two_fg": 124,
|
||||||
|
"two_attempts": 276,
|
||||||
|
"two_percent": "0.449",
|
||||||
|
"effect_fg_percent": "0.507",
|
||||||
|
"ft": 136,
|
||||||
|
"fta": 170,
|
||||||
|
"ft_percent": "0.800",
|
||||||
|
"ORB": 24,
|
||||||
|
"DRB": 137,
|
||||||
|
"TRB": 161,
|
||||||
|
"AST": 148,
|
||||||
|
"STL": 29,
|
||||||
|
"BLK": 21,
|
||||||
|
"TOV": 100,
|
||||||
|
"PF": 72,
|
||||||
|
"PTS": 615,
|
||||||
|
"team": "BOS",
|
||||||
|
"season": 2022
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 179,
|
||||||
|
"player_name": "Draymond Green",
|
||||||
|
"age": 31,
|
||||||
|
"games": 22,
|
||||||
|
"games_started": 22,
|
||||||
|
"minutes_played": 703,
|
||||||
|
"field_goals": 69,
|
||||||
|
"field_attempts": 144,
|
||||||
|
"field_percent": "0.479",
|
||||||
|
"three_fg": 8,
|
||||||
|
"three_attempts": 39,
|
||||||
|
"three_percent": "0.205",
|
||||||
|
"two_fg": 61,
|
||||||
|
"two_attempts": 105,
|
||||||
|
"two_percent": "0.581",
|
||||||
|
"effect_fg_percent": "0.507",
|
||||||
|
"ft": 30,
|
||||||
|
"fta": 47,
|
||||||
|
"ft_percent": "0.638",
|
||||||
|
"ORB": 26,
|
||||||
|
"DRB": 133,
|
||||||
|
"TRB": 159,
|
||||||
|
"AST": 138,
|
||||||
|
"STL": 25,
|
||||||
|
"BLK": 22,
|
||||||
|
"TOV": 59,
|
||||||
|
"PF": 87,
|
||||||
|
"PTS": 176,
|
||||||
|
"team": "GSW",
|
||||||
|
"season": 2022
|
||||||
|
},
|
||||||
|
...
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"id": 510,
|
|
||||||
"playerId": "hardeja01",
|
|
||||||
"season": 2019,
|
|
||||||
"date": "Dec 17,2018",
|
|
||||||
"qtr": "1st Qtr",
|
|
||||||
"timeRemaining": "11:09",
|
|
||||||
"top": 305,
|
|
||||||
"left": 161,
|
|
||||||
"playerName": "hardeja01",
|
|
||||||
"result": false,
|
|
||||||
"shotType": "3-pointer",
|
|
||||||
"distanceFt": 26,
|
|
||||||
"lead": true,
|
|
||||||
"teamScore": 3,
|
|
||||||
"opponentTeamScore": 0,
|
|
||||||
"opponent": "UTA",
|
|
||||||
"team": "HOU",
|
|
||||||
"ID": 0,
|
|
||||||
"CreatedAt": "2025-06-20T22:48:34.764255Z",
|
|
||||||
"UpdatedAt": "2025-06-20T22:48:34.764255Z",
|
|
||||||
"DeletedAt": null
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
```
|
||||||
|
|
||||||
-----
|
Top 20 Rebounders (Total Rebounds) by Season
|
||||||
|
Method: `Get`
|
||||||
|
|
||||||
## Response Codes
|
> <https://nba-stats-db.herokuapp.com/api/top_rebounds/totals/2023/>
|
||||||
|
|
||||||
- **200 OK**: Request successful; returns requested data
|
Success Response:
|
||||||
- **400 Bad Request**: Invalid query parameters
|
|
||||||
- **404 Not Found**: No matching records found
|
|
||||||
- **500 Internal Server Error**: Server encountered an error
|
|
||||||
|
|
||||||
---
|
`Code: 200`
|
||||||
|
|
||||||
## Usage Examples
|
Content:
|
||||||
|
|
||||||
### Get Top Win Shares Leaders (Advanced Stats)
|
```
|
||||||
|
{
|
||||||
|
"count": 20,
|
||||||
|
"next": null,
|
||||||
|
"previous": null,
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"id": 405,
|
||||||
|
"player_name": "Domantas Sabonis",
|
||||||
|
"age": 26,
|
||||||
|
"games": 79,
|
||||||
|
"games_started": 79,
|
||||||
|
"minutes_played": 2736,
|
||||||
|
"field_goals": 577,
|
||||||
|
"field_attempts": 938,
|
||||||
|
"field_percent": "0.615",
|
||||||
|
"three_fg": 31,
|
||||||
|
"three_attempts": 83,
|
||||||
|
"three_percent": "0.373",
|
||||||
|
"two_fg": 546,
|
||||||
|
"two_attempts": 855,
|
||||||
|
"two_percent": "0.639",
|
||||||
|
"effect_fg_percent": "0.632",
|
||||||
|
"ft": 325,
|
||||||
|
"fta": 438,
|
||||||
|
"ft_percent": "0.742",
|
||||||
|
"ORB": 251,
|
||||||
|
"DRB": 722,
|
||||||
|
"TRB": 973,
|
||||||
|
"AST": 573,
|
||||||
|
"STL": 65,
|
||||||
|
"BLK": 39,
|
||||||
|
"TOV": 230,
|
||||||
|
"PF": 279,
|
||||||
|
"PTS": 1510,
|
||||||
|
"team": "SAC",
|
||||||
|
"season": 2023
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 346,
|
||||||
|
"player_name": "Nikola Vučević",
|
||||||
|
"age": 32,
|
||||||
|
"games": 82,
|
||||||
|
"games_started": 82,
|
||||||
|
"minutes_played": 2746,
|
||||||
|
"field_goals": 597,
|
||||||
|
"field_attempts": 1148,
|
||||||
|
"field_percent": "0.520",
|
||||||
|
"three_fg": 121,
|
||||||
|
"three_attempts": 347,
|
||||||
|
"three_percent": "0.349",
|
||||||
|
"two_fg": 476,
|
||||||
|
"two_attempts": 801,
|
||||||
|
"two_percent": "0.594",
|
||||||
|
"effect_fg_percent": "0.573",
|
||||||
|
"ft": 132,
|
||||||
|
"fta": 158,
|
||||||
|
"ft_percent": "0.835",
|
||||||
|
"ORB": 159,
|
||||||
|
"DRB": 744,
|
||||||
|
"TRB": 903,
|
||||||
|
"AST": 265,
|
||||||
|
"STL": 60,
|
||||||
|
"BLK": 57,
|
||||||
|
"TOV": 139,
|
||||||
|
"PF": 179,
|
||||||
|
"PTS": 1447,
|
||||||
|
"team": "CHI",
|
||||||
|
"season": 2023
|
||||||
|
},
|
||||||
|
...
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -X GET \
|
|
||||||
'https://api.server.nbaapi.com/api/playeradvancedstats?page=1&pageSize=10&sortBy=win_shares&ascending=false&season=2025' \
|
|
||||||
-H 'accept: application/json'
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Get Leading Scorers (Player Totals)
|
## Plan
|
||||||
|
|
||||||
```bash
|
1. Data collection - Selenium - live data from dyanic websites. - Beautiful soap/scrapy - historical static data. - Live data - websocket connections or periodic updates.
|
||||||
curl -X GET \
|
|
||||||
'https://api.server.nbaapi.com/api/playertotals?page=1&pageSize=10&sortBy=points&ascending=false&season=2025' \
|
|
||||||
-H 'accept: application/json'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Get Boston Celtics Players Advanced Stats
|
2. Backend API - Django (Python): A more comprehensive framework that includes an ORM and admin panel out-of-the-box. - Django REST Framework
|
||||||
|
|
||||||
|
|
||||||
```bash
|
3. Backend DB
|
||||||
curl -X GET \
|
-Initially SQL lite, but it quickly met its limitations when trying to scrape data for 30 teams at once. It could not handle all the simulataneous connections.
|
||||||
'https://api.server.nbaapi.com/api/playeradvancedstats?team=BOS&season=2025&page=1&pageSize=20&sortBy=vorp&ascending=false' \
|
|
||||||
-H 'accept: application/json'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Get Playoff Statistics
|
- PostgreSQL is the new DB.
|
||||||
|
|
||||||
```bash
|
4. Frontend - React/Redux - D3.js - Chart.js - Highcharts - Websockets or Server-Sent Events
|
||||||
curl -X GET \
|
|
||||||
'https://api.server.nbaapi.com/api/playertotals?isPlayoff=true&season=2024&sortBy=points&ascending=false' \
|
|
||||||
-H 'accept: application/json'
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
5. Deployment
|
||||||
|
|
||||||
## Additional Resources
|
|
||||||
|
|
||||||
- **Interactive Documentation**: [https://api.server.nbaapi.com](https://api.server.nbaapi.com/swagger/index.html)
|
|
||||||
- **Postman Collection**: Use the "Run in Postman" button above
|
|
||||||
- **Data Sources**: Statistics cross-referenced with Basketball Reference and NBA.com
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Contact & Support
|
|
||||||
|
|
||||||
If you encounter any issues or have questions about the API, please open an issue in the repository or contact the development team. 🏀🚀
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Note**: This API is currently in public beta. Features and endpoints may be updated based on user feedback and requirements.
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
teams_data = ['HOU' ,'PHI', 'BOS', 'NYK', 'NJN', 'TOR', 'MEM', 'NOK', 'DAL', 'SAS', 'DEN', 'MIN', 'SEA', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
from nba_data.models import PlayerAdvancedData
|
||||||
|
from django.db import connection
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
# Provides a description for use with the custom django management command (python manage.py help).
|
||||||
|
help = 'Delete all player ADVANCED data with season specified and reset primary key sequence in DB'
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
# Delete player data with season
|
||||||
|
season = 2006
|
||||||
|
PlayerAdvancedData.objects.filter(season=season).delete()
|
||||||
|
|
||||||
|
# Reset the PK sequence
|
||||||
|
with connection.cursor() as cursor:
|
||||||
|
cursor.execute('ALTER SEQUENCE nba_data_playeradvanceddata_id_seq RESTART WITH 1;')
|
||||||
|
|
||||||
|
self.stdout.write(self.style.SUCCESS('Successfully deleted all players with season = {} in DB'.format(season)))
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.2 on 2023-09-20 07:36
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('nba_data', '0017_alter_playershotchartdata_result'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='playeradvanceddata',
|
||||||
|
name='ft_attempt_rate',
|
||||||
|
field=models.DecimalField(decimal_places=3, max_digits=8, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
+1
-1
@@ -79,7 +79,7 @@ class PlayerAdvancedData(models.Model):
|
|||||||
PER = models.DecimalField(max_digits=6, decimal_places=1, null=True)
|
PER = models.DecimalField(max_digits=6, decimal_places=1, null=True)
|
||||||
TS_percent = models.DecimalField(max_digits=5, decimal_places=3, null=True)
|
TS_percent = models.DecimalField(max_digits=5, decimal_places=3, null=True)
|
||||||
three_p_attempt_rate = models.DecimalField(max_digits=5, decimal_places=3, null=True)
|
three_p_attempt_rate = models.DecimalField(max_digits=5, decimal_places=3, null=True)
|
||||||
ft_attempt_rate = models.DecimalField(max_digits=5, decimal_places=3, null=True)
|
ft_attempt_rate = models.DecimalField(max_digits=8, decimal_places=3, null=True)
|
||||||
orb_percent = models.DecimalField(max_digits=5, decimal_places=2, null=True)
|
orb_percent = models.DecimalField(max_digits=5, decimal_places=2, null=True)
|
||||||
drb_percent = models.DecimalField(max_digits=5, decimal_places=2, null=True)
|
drb_percent = models.DecimalField(max_digits=5, decimal_places=2, null=True)
|
||||||
trb_percent = models.DecimalField(max_digits=5, decimal_places=2, null=True)
|
trb_percent = models.DecimalField(max_digits=5, decimal_places=2, null=True)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from bs4 import BeautifulSoup
|
|||||||
import csv
|
import csv
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
|
from data import teams_data
|
||||||
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
@@ -27,10 +28,11 @@ from nba_data.models import PlayerAdvancedData
|
|||||||
# Change MEM to VAN for 2001 and prior.
|
# Change MEM to VAN for 2001 and prior.
|
||||||
# Change LAC to SDC for 1984 and prior.
|
# Change LAC to SDC for 1984 and prior.
|
||||||
|
|
||||||
teams = ['HOU' ,'PHI', 'BOS', 'NYK', 'NJN', 'TOR', 'MEM', 'NOH', 'DAL', 'SAS', 'DEN', 'MIN', 'OKC', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
teams = ['HOU' ,'PHI', 'BOS', 'NYK', 'NJN', 'TOR', 'MEM', 'NOH', 'DAL', 'SAS', 'DEN', 'MIN', 'SEA', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
||||||
|
|
||||||
season = input('What season? ')
|
season = input('What season? ')
|
||||||
|
|
||||||
for team in teams:
|
for team in teams_data:
|
||||||
url_make = 'https://www.basketball-reference.com/teams/' + team + '/' + season + '.html'
|
url_make = 'https://www.basketball-reference.com/teams/' + team + '/' + season + '.html'
|
||||||
response = requests.get(url_make)
|
response = requests.get(url_make)
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from bs4 import BeautifulSoup
|
|||||||
import csv
|
import csv
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
|
from data import teams_data
|
||||||
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
@@ -29,13 +30,11 @@ from nba_data.models import PlayerPlayoffAdvancedData
|
|||||||
|
|
||||||
teams = ['HOU' ,'PHI', 'BOS', 'NYK', 'NJN', 'TOR', 'MEM', 'NOH', 'DAL', 'SAS', 'DEN', 'MIN', 'OKC', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
teams = ['HOU' ,'PHI', 'BOS', 'NYK', 'NJN', 'TOR', 'MEM', 'NOH', 'DAL', 'SAS', 'DEN', 'MIN', 'OKC', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
||||||
|
|
||||||
teams2 = ['HOU' ,'PHI', 'NYK', 'NJN', 'TOR', 'MEM', 'NOH', 'SAS', 'DEN', 'MIN', 'OKC', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
|
||||||
|
|
||||||
team_abbreviations = ['ATL', 'BOS', 'BRK', 'CHI', 'CHO', 'CLE', 'DAL', 'DEN', 'DET', 'GSW', 'HOU', 'IND', 'LAC', 'LAL', 'MEM', 'MIA', 'MIL', 'MIN', 'NOP', 'NYK', 'OKC', 'ORL', 'PHI', 'PHO', 'POR', 'SAC', 'SAS', 'TOR', 'UTA', 'WAS']
|
|
||||||
|
|
||||||
season = input('What season? ')
|
season = input('What season? ')
|
||||||
|
|
||||||
for team in teams:
|
teams2 = 'PHI'
|
||||||
|
|
||||||
|
for team in teams_data:
|
||||||
url_make = 'https://www.basketball-reference.com/teams/' + team + '/' + season + '.html'
|
url_make = 'https://www.basketball-reference.com/teams/' + team + '/' + season + '.html'
|
||||||
response = requests.get(url_make)
|
response = requests.get(url_make)
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from bs4 import BeautifulSoup
|
|||||||
import csv
|
import csv
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
|
from data import teams_data
|
||||||
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
@@ -27,14 +28,11 @@ from nba_data.models import PlayerPlayoffTotalsData
|
|||||||
# Change LAC to SDC for 1984 and prior.
|
# Change LAC to SDC for 1984 and prior.
|
||||||
|
|
||||||
|
|
||||||
teams = ['HOU' ,'PHI', 'BOS', 'NYK', 'NJN', 'TOR', 'MEM', 'NOH', 'DAL', 'SAS', 'DEN', 'MIN', 'OKC', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
teams = ['HOU' ,'PHI', 'BOS', 'NYK', 'NJN', 'TOR', 'MEM', 'NOH', 'DAL', 'SAS', 'DEN', 'MIN', 'SEA', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
||||||
|
|
||||||
|
|
||||||
team_abbreviations = ['ATL', 'BOS', 'BRK', 'CHI', 'CHO', 'CLE', 'DAL', 'DEN', 'DET', 'GSW', 'HOU', 'IND', 'LAC', 'LAL', 'MEM', 'MIA', 'MIL', 'MIN', 'NOP', 'NYK', 'OKC', 'ORL', 'PHI', 'PHO', 'POR', 'SAC', 'SAS', 'TOR', 'UTA', 'WAS']
|
|
||||||
|
|
||||||
season = input('What season? ')
|
season = input('What season? ')
|
||||||
|
|
||||||
for team in teams:
|
for team in teams_data:
|
||||||
url_make = 'https://www.basketball-reference.com/teams/' + team + '/' + season + '.html'
|
url_make = 'https://www.basketball-reference.com/teams/' + team + '/' + season + '.html'
|
||||||
response = requests.get(url_make)
|
response = requests.get(url_make)
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,11 @@ django.setup()
|
|||||||
|
|
||||||
from nba_data.models import PlayerShotChartData
|
from nba_data.models import PlayerShotChartData
|
||||||
|
|
||||||
player_name = 'James Harden'
|
player_name = 'Damian Lillard'
|
||||||
season = 2010
|
season = 2013
|
||||||
# team = 'LAL' # You might want to find a way to get this from the webpage
|
|
||||||
url = 'https://www.basketball-reference.com/players/h/hardeja01/shooting/' + \
|
# Player name and season will be inserted into DB. Modify before running script.
|
||||||
|
url = 'https://www.basketball-reference.com/players/l/lillada01/shooting/' + \
|
||||||
str(season)
|
str(season)
|
||||||
|
|
||||||
response = requests.get(url)
|
response = requests.get(url)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from bs4 import BeautifulSoup
|
|||||||
import csv
|
import csv
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
|
from data import teams_data
|
||||||
|
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
@@ -26,14 +27,14 @@ from nba_data.models import PlayerTotalsData
|
|||||||
# Change MEM to VAN for 2001 and prior.
|
# Change MEM to VAN for 2001 and prior.
|
||||||
# Change LAC to SDC for 1984 and prior.
|
# Change LAC to SDC for 1984 and prior.
|
||||||
|
|
||||||
teams = ['HOU' ,'PHI', 'BOS', 'NYK', 'NJN', 'TOR', 'MEM', 'NOH', 'DAL', 'SAS', 'DEN', 'MIN', 'OKC', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
teams = ['HOU' ,'PHI', 'BOS', 'NYK', 'NJN', 'TOR', 'MEM', 'NOH', 'DAL', 'SAS', 'DEN', 'MIN', 'SEA', 'UTA', 'POR', 'MIL', 'CLE', 'CHI', 'IND', 'DET', 'SAC', 'PHO', 'GSW', 'LAC', 'LAL', 'MIA', 'ATL', 'WAS', 'ORL', 'CHA']
|
||||||
|
|
||||||
|
|
||||||
# team = input('What team? ')
|
# team = input('What team? ')
|
||||||
# OMIT above. Will now only ask for season and iterate thru teams list.
|
# OMIT above. Will now only ask for season and iterate thru teams list.
|
||||||
season = input('What season? ')
|
season = input('What season? ')
|
||||||
|
|
||||||
for team in teams:
|
for team in teams_data:
|
||||||
url_make = 'https://www.basketball-reference.com/teams/' + team + '/' + season + '.html'
|
url_make = 'https://www.basketball-reference.com/teams/' + team + '/' + season + '.html'
|
||||||
response = requests.get(url_make)
|
response = requests.get(url_make)
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user