curl --request GET \
--url https://api.sportquanta.com/v1/nba/players/{id}/tracking \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/nba/players/{id}/tracking"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.sportquanta.com/v1/nba/players/{id}/tracking', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sportquanta.com/v1/nba/players/{id}/tracking",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.sportquanta.com/v1/nba/players/{id}/tracking"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sportquanta.com/v1/nba/players/{id}/tracking")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/nba/players/{id}/tracking")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"season": 123,
"games_played": 123,
"minutes_per_game": 123,
"drives": {
"drives": 123,
"field_goals_made": 123,
"field_goals_attempted": 123,
"field_goal_pct": 123,
"free_throws_made": 123,
"free_throws_attempted": 123,
"free_throw_pct": 123,
"points": 123,
"passes": 123,
"assists": 123,
"turnovers": 123,
"fouls": 123
},
"touches": {
"touches": 123,
"front_court_touches": 123,
"time_of_possession": 123,
"avg_seconds_per_touch": 123,
"avg_dribbles_per_touch": 123,
"points_per_touch": 123,
"elbow_touches": 123,
"post_touches": 123,
"paint_touches": 123,
"points_per_elbow_touch": 123,
"points_per_post_touch": 123,
"points_per_paint_touch": 123
},
"pull_up": {
"field_goals_made": 123,
"field_goals_attempted": 123,
"field_goal_pct": 123,
"three_pointers_made": 123,
"three_pointers_attempted": 123,
"three_point_pct": 123,
"points": 123,
"effective_field_goal_pct": 123
},
"catch_shoot": {
"field_goals_made": 123,
"field_goals_attempted": 123,
"field_goal_pct": 123,
"three_pointers_made": 123,
"three_pointers_attempted": 123,
"three_point_pct": 123,
"points": 123,
"effective_field_goal_pct": 123
},
"id": "<string>",
"canonical_id": "<string>",
"external_ids": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"player_id": "<string>",
"team_id": "<string>"
},
"_meta": {
"request_id": "<string>",
"served_from": "live",
"cache_ttl_seconds": 123,
"provenance": {},
"availability": {}
}
}Player tracking
NBA-only route. Returns the single (player, season) document
from the derived player_tracking_stats collection — the
leaguedashptstats per-game aggregate combining four slices:
drives, touches (possessions), pull_up, and
catch_shoot, plus games played and minutes per game. A
slice the player had no rows in comes back null (e.g. a
center who never takes pull-up jumpers). Players with no
tracking doc for the season return 404
data_not_yet_available.
Requires the stats entitlement (a paid plan). See Responses & Errors for the success envelope and availability rules.
curl --request GET \
--url https://api.sportquanta.com/v1/nba/players/{id}/tracking \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/nba/players/{id}/tracking"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.sportquanta.com/v1/nba/players/{id}/tracking', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sportquanta.com/v1/nba/players/{id}/tracking",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.sportquanta.com/v1/nba/players/{id}/tracking"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sportquanta.com/v1/nba/players/{id}/tracking")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/nba/players/{id}/tracking")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"season": 123,
"games_played": 123,
"minutes_per_game": 123,
"drives": {
"drives": 123,
"field_goals_made": 123,
"field_goals_attempted": 123,
"field_goal_pct": 123,
"free_throws_made": 123,
"free_throws_attempted": 123,
"free_throw_pct": 123,
"points": 123,
"passes": 123,
"assists": 123,
"turnovers": 123,
"fouls": 123
},
"touches": {
"touches": 123,
"front_court_touches": 123,
"time_of_possession": 123,
"avg_seconds_per_touch": 123,
"avg_dribbles_per_touch": 123,
"points_per_touch": 123,
"elbow_touches": 123,
"post_touches": 123,
"paint_touches": 123,
"points_per_elbow_touch": 123,
"points_per_post_touch": 123,
"points_per_paint_touch": 123
},
"pull_up": {
"field_goals_made": 123,
"field_goals_attempted": 123,
"field_goal_pct": 123,
"three_pointers_made": 123,
"three_pointers_attempted": 123,
"three_point_pct": 123,
"points": 123,
"effective_field_goal_pct": 123
},
"catch_shoot": {
"field_goals_made": 123,
"field_goals_attempted": 123,
"field_goal_pct": 123,
"three_pointers_made": 123,
"three_pointers_attempted": 123,
"three_point_pct": 123,
"points": 123,
"effective_field_goal_pct": 123
},
"id": "<string>",
"canonical_id": "<string>",
"external_ids": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"player_id": "<string>",
"team_id": "<string>"
},
"_meta": {
"request_id": "<string>",
"served_from": "live",
"cache_ttl_seconds": 123,
"provenance": {},
"availability": {}
}
}Authorizations
Send a workspace API token in the Authorization: Bearer <token> header.
Path Parameters
Query Parameters
Season start year (2025 for the 2025-26 season).
1946 <= x <= 2100Response
Player tracking payload.
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
live, cache Response cache TTL; independent of source freshness. Omitted when zero.
Endpoint-specific availability context, including soccer roster coverage.