Turkish Basketball Super League API
Access Turkish Basketball Super League teams, players, games, lineups, scoring, statistics and standings. Get an API key at app.balldontlie.io. Browse our other APIs.
OpenAPI Specification
Download the OpenAPI specification.
Authentication
Send your API key in the Authorization header with every request. The base URL is https://api.balldontlie.io/bsl/v1.
Account Tiers
| Endpoint | Free | ALL-STAR | GOAT |
|---|---|---|---|
| Teams | Yes | Yes | Yes |
| Players | Yes | Yes | Yes |
| Standings | Yes | Yes | Yes |
| Games | No | Yes | Yes |
| Lineups | No | Yes | Yes |
| Scoring | No | Yes | Yes |
| Player Stats | No | No | Yes |
| Team Stats | No | No | Yes |
FREE: $0, 5 requests/minute. ALL-STAR: $9.99/month, 60 requests/minute. GOAT: $39.99/month, 600 requests/minute.
Manage subscriptions in the account dashboard. ALL-ACCESS includes all leagues.
Data Availability
Seasons use the starting year: 2026 means the 2026–27 season. Game dates and times are in UTC. Coverage varies by game and statistic. Unavailable statistics are null; an empty collection means no matching records are currently available. Final statistics may be corrected after the game. Playing-time precision can vary. Lineups appear when confirmed starters are available. Scoring is a score progression, not full play-by-play.
Pagination
List endpoints return data and meta. The default page size is 25, with a maximum of 100. Pass meta.next_cursor as cursor to get the next page; stop when it is absent. A full final page may be followed by an empty page. meta.prev_cursor, when present, echoes the cursor used for the current request. Array filters use repeated bracketed query parameters, such as team_ids[]=1&team_ids[]=2.
Errors
| Status | Meaning |
|---|---|
| 400 | Invalid parameters; JSON {"errors":[{"param":"per_page","error":"Invalid value"}]} |
| 401 | Missing/invalid API key or insufficient subscription; Unauthorized |
| 404 | Record not found; JSON {"error":"Not found"} |
| 429 | Rate limit exceeded |
| 500 | Server error |
Teams
Get teams
Requires FREE or higher. Availability varies by game.
GET /bsl/v1/teams
curl --get "https://api.balldontlie.io/bsl/v1/teams?per_page=1" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/teams?per_page=1", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/teams?per_page=1",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": [
{
"id": 1855,
"name": "Besiktas",
"abbreviation": "BES"
}
],
"meta": {
"per_page": 1
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| per_page | No | Results per page (default 25, maximum 100). |
| cursor | No | Use meta.next_cursor from the previous response. |
| season | No | Season start year. |
Get a team
Requires FREE or higher. Availability varies by game.
GET /bsl/v1/teams/{id}
curl --get "https://api.balldontlie.io/bsl/v1/teams/1855" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/teams/1855", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/teams/1855",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": {
"id": 1855,
"name": "Besiktas",
"abbreviation": "BES"
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| id | Yes | Team ID. |
Response fields
| Field | Type | Description |
|---|---|---|
| id | integer | Team ID. |
| name | string | Team name. |
| abbreviation | string or null | Team abbreviation. |
Players
Get players
Requires FREE or higher. Availability varies by game.
GET /bsl/v1/players
curl --get "https://api.balldontlie.io/bsl/v1/players?per_page=1" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/players?per_page=1", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/players?per_page=1",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": [
{
"id": 79171,
"name": "Ugurlu B.",
"country": "Turkey"
}
],
"meta": {
"next_cursor": 79171,
"per_page": 1
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| per_page | No | Results per page (default 25, maximum 100). |
| cursor | No | Use meta.next_cursor from the previous response. |
| season | No | Filter by participation in this season. |
| search | No | Case-insensitive player name search. |
| team_ids[] | No | Filter by team participation in lineups or stats; combine with season for a season-specific roster. |
Get a player
Requires FREE or higher. Availability varies by game.
GET /bsl/v1/players/{id}
curl --get "https://api.balldontlie.io/bsl/v1/players/79171" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/players/79171", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/players/79171",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": {
"id": 79171,
"name": "Ugurlu B.",
"country": "Turkey"
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| id | Yes | Player ID. |
Response fields
| Field | Type | Description |
|---|---|---|
| id | integer | Player ID. |
| name | string | Player name. |
| country | string or null | Country, when available. |
Games
Get games
Requires ALL-STAR or GOAT. Availability varies by game.
GET /bsl/v1/games
curl --get "https://api.balldontlie.io/bsl/v1/games?per_page=1" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/games?per_page=1", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/games?per_page=1",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": [
{
"id": 2602,
"season": 2026,
"datetime": "2026-10-05T16:00:00.000Z",
"status": "final",
"home_team": {
"id": 1855,
"name": "Besiktas",
"abbreviation": "BES"
},
"visitor_team": {
"id": 1856,
"name": "Trabzonspor",
"abbreviation": "TRA"
},
"home_team_score": 90,
"visitor_team_score": 81
}
],
"meta": {
"next_cursor": 2602,
"per_page": 1
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| per_page | No | Results per page (default 25, maximum 100). |
| cursor | No | Use meta.next_cursor from the previous response. |
| team_ids[] | No | Filter by team IDs from the teams endpoint. Maximum 100 values. |
| seasons[] | No | Filter by season start years. Maximum 100 values. |
| dates[] | No | Filter by UTC game dates. |
| start_date | No | Inclusive UTC start date. |
| end_date | No | Inclusive UTC end date. |
| status | No | Filter by game status. |
Get a game
Requires ALL-STAR or GOAT. Availability varies by game.
GET /bsl/v1/games/{id}
curl --get "https://api.balldontlie.io/bsl/v1/games/2602" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/games/2602", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/games/2602",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": {
"id": 2602,
"season": 2026,
"datetime": "2026-10-05T16:00:00.000Z",
"status": "final",
"home_team": {
"id": 1855,
"name": "Besiktas",
"abbreviation": "BES"
},
"visitor_team": {
"id": 1856,
"name": "Trabzonspor",
"abbreviation": "TRA"
},
"home_team_score": 90,
"visitor_team_score": 81
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| id | Yes | Game ID. |
Response fields
| Field | Type | Description |
|---|---|---|
| id | integer | Game ID. |
| season | integer | Season start year; 2026 identifies the 2026–27 season. |
| datetime | string | Scheduled start time in UTC. |
| status | string | scheduled, live, final, postponed, cancelled |
| home_team | Team | |
| visitor_team | Team | |
| home_team_score | integer or null | Home score. Null before scoring is available. |
| visitor_team_score | integer or null | Visitor score. Null before scoring is available. |
Player Stats
Get player stats
Requires GOAT. Availability varies by game.
GET /bsl/v1/stats
curl --get "https://api.balldontlie.io/bsl/v1/stats?per_page=1&game_ids%5B%5D=2602" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/stats?per_page=1&game_ids%5B%5D=2602", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/stats?per_page=1&game_ids%5B%5D=2602",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": [],
"meta": {
"per_page": 1
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| per_page | No | Results per page (default 25, maximum 100). |
| cursor | No | Use meta.next_cursor from the previous response. |
| team_ids[] | No | Filter by team IDs from the teams endpoint. Maximum 100 values. |
| seasons[] | No | Filter by season start years. Maximum 100 values. |
| game_ids[] | No | Filter by game IDs from the games endpoint. Maximum 100 values. |
| player_ids[] | No | Filter by player IDs from the players endpoint. Maximum 100 values. |
Response fields
| Field | Type | Description |
|---|---|---|
| id | integer | Stat record ID. |
| game_id | integer | Game ID from the games endpoint. |
| team | Team | |
| player | Player | |
| pts | number or null | Points. Null when unavailable. |
| reb | number or null | Total rebounds. Null when unavailable. |
| oreb | number or null | Offensive rebounds. Null when unavailable. |
| dreb | number or null | Defensive rebounds. Null when unavailable. |
| ast | number or null | Assists. Null when unavailable. |
| stl | number or null | Steals. Null when unavailable. |
| blk | number or null | Blocked shots. Null when unavailable. |
| turnover | number or null | Turnovers. Null when unavailable. |
| pf | number or null | Personal fouls. Null when unavailable. |
| fgm | number or null | Field goals made. Null when unavailable. |
| fga | number or null | Field goals attempted. Null when unavailable. |
| fg2m | number or null | Two-point field goals made. Null when unavailable. |
| fg2a | number or null | Two-point field goals attempted. Null when unavailable. |
| fg3m | number or null | Three-point field goals made. Null when unavailable. |
| fg3a | number or null | Three-point field goals attempted. Null when unavailable. |
| ftm | number or null | Free throws made. Null when unavailable. |
| fta | number or null | Free throws attempted. Null when unavailable. |
| min | string or null | Playing time, as minutes or minutes:seconds according to available precision. |
| plus_minus | number or null | Plus/minus. |
Team Stats
Get team stats
Requires GOAT. Availability varies by game.
GET /bsl/v1/team_stats
curl --get "https://api.balldontlie.io/bsl/v1/team_stats?per_page=1&game_ids%5B%5D=2602" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/team_stats?per_page=1&game_ids%5B%5D=2602", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/team_stats?per_page=1&game_ids%5B%5D=2602",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": [],
"meta": {
"per_page": 1
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| per_page | No | Results per page (default 25, maximum 100). |
| cursor | No | Use meta.next_cursor from the previous response. |
| team_ids[] | No | Filter by team IDs from the teams endpoint. Maximum 100 values. |
| seasons[] | No | Filter by season start years. Maximum 100 values. |
| game_ids[] | No | Filter by game IDs from the games endpoint. Maximum 100 values. |
| period | No | 0 for the entire game; 1–4 for quarters; 5+ for overtime. |
Response fields
| Field | Type | Description |
|---|---|---|
| id | integer | Stat record ID. |
| game_id | integer | Game ID from the games endpoint. |
| team | Team | |
| period | integer | 0 = entire game; 1–4 = quarters; 5 and above = overtime periods. |
| pts | number or null | Points. Null when unavailable. |
| reb | number or null | Total rebounds. Null when unavailable. |
| oreb | number or null | Offensive rebounds. Null when unavailable. |
| dreb | number or null | Defensive rebounds. Null when unavailable. |
| ast | number or null | Assists. Null when unavailable. |
| stl | number or null | Steals. Null when unavailable. |
| blk | number or null | Blocked shots. Null when unavailable. |
| turnover | number or null | Turnovers. Null when unavailable. |
| pf | number or null | Personal fouls. Null when unavailable. |
| fgm | number or null | Field goals made. Null when unavailable. |
| fga | number or null | Field goals attempted. Null when unavailable. |
| fg2m | number or null | Two-point field goals made. Null when unavailable. |
| fg2a | number or null | Two-point field goals attempted. Null when unavailable. |
| fg3m | number or null | Three-point field goals made. Null when unavailable. |
| fg3a | number or null | Three-point field goals attempted. Null when unavailable. |
| ftm | number or null | Free throws made. Null when unavailable. |
| fta | number or null | Free throws attempted. Null when unavailable. |
Lineups
Get lineups
Requires ALL-STAR or GOAT. Availability varies by game.
GET /bsl/v1/lineups
curl --get "https://api.balldontlie.io/bsl/v1/lineups?per_page=1&game_ids%5B%5D=2602" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/lineups?per_page=1&game_ids%5B%5D=2602", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/lineups?per_page=1&game_ids%5B%5D=2602",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": [],
"meta": {
"per_page": 1
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| per_page | No | Results per page (default 25, maximum 100). |
| cursor | No | Use meta.next_cursor from the previous response. |
| team_ids[] | No | Filter by team IDs from the teams endpoint. Maximum 100 values. |
| seasons[] | No | Filter by season start years. Maximum 100 values. |
| game_ids[] | Yes | Filter by game IDs from the games endpoint. Maximum 100 values. |
| player_ids[] | No | Filter by player IDs from the players endpoint. Maximum 100 values. |
Response fields
| Field | Type | Description |
|---|---|---|
| id | integer | Lineup record ID. |
| game_id | integer | Game ID from the games endpoint. |
| team | Team | |
| player | Player | |
| jersey_number | string or null | Jersey number. |
| starter | boolean | Whether the player is a confirmed starter. |
Scoring
Get scoring
Requires ALL-STAR or GOAT. Returns scoring progression, not a full play-by-play feed. Availability varies by game.
GET /bsl/v1/scoring
curl --get "https://api.balldontlie.io/bsl/v1/scoring?per_page=1&game_id=2602" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/scoring?per_page=1&game_id=2602", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/scoring?per_page=1&game_id=2602",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": [],
"meta": {
"per_page": 1
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| per_page | No | Results per page (default 25, maximum 100). |
| cursor | No | Use meta.next_cursor from the previous response. |
| game_id | Yes | Game ID from the games endpoint. |
Response fields
| Field | Type | Description |
|---|---|---|
| id | integer | Scoring record ID. |
| game_id | integer | Game ID from the games endpoint. |
| sequence | integer | Scoring sequence, returned in ascending order. |
| period | integer | 1–4 = quarters; 5 and above = overtime periods. |
| home_team_score | integer | Cumulative home score. |
| visitor_team_score | integer | Cumulative visitor score. |
Standings
Get standings
Requires FREE or higher. Availability varies by game.
GET /bsl/v1/standings
curl --get "https://api.balldontlie.io/bsl/v1/standings?per_page=1&season=2026" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/standings?per_page=1&season=2026", {
headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/bsl/v1/standings?per_page=1&season=2026",
headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()
Example response
{
"data": [
{
"id": 200,
"season": 2026,
"group": null,
"rank": 2,
"team": {
"id": 1862,
"name": "Bahcesehir Kol.",
"abbreviation": "BAH"
},
"games_played": 3,
"wins": 3,
"losses": 0,
"points_for": 274,
"points_against": 241
}
],
"meta": {
"next_cursor": 200,
"per_page": 1
}
}
Parameters
| Parameter | Required | Description |
|---|---|---|
| per_page | No | Results per page (default 25, maximum 100). |
| cursor | No | Use meta.next_cursor from the previous response. |
| season | Yes | Season start year. |
Response fields
| Field | Type | Description |
|---|---|---|
| id | integer | Standing record ID. |
| season | integer | Season start year. |
| group | string or null | Standings group; null for an ungrouped league. |
| rank | integer | Rank within the group. |
| team | Team | |
| games_played | integer | Games played. |
| wins | integer | Wins. |
| losses | integer | Losses. |
| points_for | integer | Points scored. |
| points_against | integer | Points conceded. |