Football V1
Competition Standings
Get league table and standings for a competition
GET
/
standings
League Standings
curl --request GET \
--url https://api.sportsapipro.com/v1/basketball/standings \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sportsapipro.com/v1/basketball/standings"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sportsapipro.com/v1/basketball/standings', 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.sportsapipro.com/v1/basketball/standings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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.sportsapipro.com/v1/basketball/standings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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.sportsapipro.com/v1/basketball/standings")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportsapipro.com/v1/basketball/standings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"standings": [
{
"competitor": {
"id": 123,
"name": "<string>",
"score": 123,
"imageUrl": "<string>"
},
"position": 123,
"wins": 123,
"losses": 123,
"winPercentage": 123,
"gamesBack": 123,
"streak": "<string>",
"conference": "<string>",
"division": "<string>"
}
]
}Endpoint
GET https://api.sportsapipro.com/v1/football/standings
Description
Returns the current standings/league table for a competition including team positions, statistics, recent form, next matches, and qualification zones. TTL: 300 seconds (5 minutes)Common Use Case: The standings endpoint is the recommended way to get all team IDs (competitor IDs) for a competition. Use these IDs with
/games/fixtures and /games/results to fetch team-specific match data.Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
competitions | number | Yes* | Competition identifier (e.g., 7 for English Premier League) |
competitor | number | Yes* | Competitor/team identifier (alternative to competitions) |
live | boolean | No | Filter for live standings updates |
isPreview | boolean | No | Include preview data |
stageNum | number | No | Stage number to retrieve standings for |
seasonNum | number | No | Season number to retrieve standings for |
type | number | No | Filter type: 1=Overall, 2=Home, 3=Away |
withSeasonsFilter | boolean | No | Include seasons filter data |
lastUpdateId | number | No | For incremental updates (-1 for latest) |
timezoneName | string | No | Timezone for date/time values (auto-resolved, or specify e.g., America/New_York) |
All
startTime fields in match data use ISO 8601 format with a dynamic timezone offset based on the resolved or specified timezone.competitions or competitor is required.
Common Competition IDs
| Competition | ID |
|---|---|
| English Premier League | 7 |
| La Liga | 13 |
| Bundesliga | 8 |
| Serie A | 12 |
| Ligue 1 | 35 |
| UEFA Champions League | 572 |
| UEFA Europa League | 573 |
| UEFA Conference League | 7685 |
Request Examples
Get EPL Standings (Premier League)
curl -X GET "https://api.sportsapipro.com/v1/football/standings?competitions=7" \
-H "x-api-key: YOUR_API_KEY"
const response = await fetch(
"https://api.sportsapipro.com/v1/football/standings?competitions=7",
{
headers: { "x-api-key": "YOUR_API_KEY" }
}
);
const data = await response.json();
// Extract all EPL team IDs
const teams = data.standings[0].rows.map(row => ({
id: row.competitor.id,
name: row.competitor.name,
position: row.position
}));
console.log(teams);
import requests
response = requests.get(
"https://api.sportsapipro.com/v1/football/standings",
params={"competitions": 7},
headers={"x-api-key": "YOUR_API_KEY"}
)
data = response.json()
# Extract all EPL team IDs
teams = [
{
"id": row["competitor"]["id"],
"name": row["competitor"]["name"],
"position": row["position"]
}
for row in data["standings"][0]["rows"]
]
print(teams)
Get Standings with Season/Stage Filter
curl -X GET "https://api.sportsapipro.com/v1/football/standings?competitions=7685&stageNum=5&seasonNum=6" \
-H "x-api-key: YOUR_API_KEY"
const response = await fetch(
"https://api.sportsapipro.com/v1/football/standings?competitions=7685&stageNum=5&seasonNum=6",
{
headers: { "x-api-key": "YOUR_API_KEY" }
}
);
const data = await response.json();
response = requests.get(
"https://api.sportsapipro.com/v1/football/standings",
params={
"competitions": 7685,
"stageNum": 5,
"seasonNum": 6
},
headers={"x-api-key": "YOUR_API_KEY"}
)
data = response.json()
Response
{
"lastUpdateId": 5494811901,
"requestedUpdateId": -1,
"ttl": 300,
"standings": [
{
"competitionId": 7685,
"seasonNum": 6,
"stageNum": 5,
"isCurrentStage": true,
"displayName": "UEFA Conference League",
"currentGroupCategory": 0,
"headers": [
{
"key": "gamePlayed",
"name": "P",
"isMajor": true
},
{
"key": "goals",
"name": "F:A",
"isMajor": true
},
{
"key": "ratio",
"name": "+/-",
"isMajor": true
},
{
"key": "points",
"name": "PTS",
"isMajor": true
},
{
"key": "gamesWon",
"name": "W",
"isMajor": false
},
{
"key": "gamesEven",
"name": "D",
"isMajor": false
},
{
"key": "gamesLost",
"name": "L",
"isMajor": false
},
{
"key": "recentForm",
"name": "Form",
"isMajor": false
},
{
"key": "nextMatch",
"name": "Next",
"isMajor": false
}
],
"rows": [
{
"competitor": {
"id": 479,
"countryId": 5,
"sportId": 1,
"name": "Strasbourg",
"symbolicName": "STR",
"nameForURL": "strasbourg",
"type": 1,
"popularityRank": 1572,
"imageVersion": 1,
"color": "#0034A5",
"awayColor": "#FFFFFF",
"mainCompetitionId": 35,
"hasSquad": true,
"hasTransfers": false
},
"gamePlayed": 5,
"gamesWon": 4,
"gamesLost": 0,
"gamesEven": 1,
"for": 8,
"against": 4,
"ratio": 4.0,
"points": 13.0,
"strike": 3,
"gamesOT": 0,
"gamesWonOnOT": 0,
"gamesWonOnPen": 0,
"gamesLossOnOT": 0,
"gamesLossOnPen": 0,
"pct": ".800",
"position": 1,
"trend": 0,
"recentForm": [1, 1, 1, 2, 1],
"detailedRecentForm": [
{
"id": 4538934,
"sportId": 1,
"competitionId": 7685,
"startTime": "2025-12-11T20:00:00+00:00",
"statusGroup": 4,
"statusText": "Ended",
"homeCompetitor": {
"id": 761,
"name": "Aberdeen",
"score": 0.0,
"isWinner": false
},
"awayCompetitor": {
"id": 479,
"name": "Strasbourg",
"score": 1.0,
"isWinner": true
},
"outcome": 1,
"winner": 2,
"scores": [0.0, 1.0]
}
],
"nextMatch": {
"id": 4538911,
"sportId": 1,
"competitionId": 7685,
"startTime": "2025-12-18T20:00:00+00:00",
"statusGroup": 2,
"statusText": "Scheduled",
"homeCompetitor": {
"id": 479,
"name": "Strasbourg",
"symbolicName": "STR"
},
"awayCompetitor": {
"id": 2089,
"name": "Breidablik"
},
"showCountdown": true
},
"destinationNum": 1,
"destinationGuaranteed": true,
"hasPointsDeduction": false,
"ppg": 0.0,
"oppg": 0.0
}
],
"destinations": [
{
"num": 1,
"name": "Round of 16",
"guaranteedText": "Round of 16",
"color": "#2BE0D4",
"type": 0
},
{
"num": 2,
"name": "Playoffs",
"guaranteedText": "Playoffs",
"color": "#AB2CF5",
"type": 7
}
],
"filterTypes": [
{
"type": 1,
"name": "Overall"
},
{
"type": 2,
"name": "Home"
},
{
"type": 3,
"name": "Away"
}
]
}
],
"sports": [
{
"id": 1,
"name": "Football",
"nameForURL": "football",
"drawSupport": true,
"imageVersion": 1
}
],
"countries": [
{
"id": 19,
"name": "Europe",
"nameForURL": "europe",
"sportTypes": [1, 2, 4, 5, 6, 7, 8, 9],
"imageVersion": 1,
"isInternational": true
}
],
"competitions": [
{
"id": 7685,
"countryId": 19,
"sportId": 1,
"name": "UEFA Conference League",
"shortName": "Conference League",
"hasStandings": true,
"hasBrackets": true,
"nameForURL": "uefa-conference-league",
"popularityRank": 7655344,
"imageVersion": 6,
"currentStageType": 1,
"color": "#1D1D1D",
"currentPhaseNum": 2,
"currentPhaseName": "Main",
"seasons": [
{
"num": 6,
"name": "2025/2026",
"hasStandings": true,
"stages": [
{
"num": 5,
"name": "League Phase",
"hasStandings": true,
"stageType": 1
}
],
"phases": [
{
"num": 2,
"name": "Main",
"isCurrentPhase": true
}
]
}
],
"currentSeasonNum": 6,
"currentStageNum": 5,
"isInternational": true
}
],
"bookmakers": [
{
"id": 14,
"name": "Bet365",
"link": "https://extra.bet365.com/features/en/sports-live-streaming?affiliate=365_275195",
"nameForURL": "bet365",
"color": "#007B5B",
"imageVersion": 3
}
]
}
Standing Row Fields
| Field | Type | Description |
|---|---|---|
competitor | object | Team information with id, name, colors, etc. |
position | number | Current league position |
gamePlayed | number | Total matches played |
gamesWon | number | Matches won |
gamesEven | number | Matches drawn |
gamesLost | number | Matches lost |
for | number | Goals scored |
against | number | Goals conceded |
ratio | number | Goal difference |
points | number | Total points |
strike | number | Current winning/losing streak |
pct | string | Win percentage |
trend | number | Position trend (0=same, positive=up, negative=down) |
recentForm | array | Last 5 results (1=win, 2=draw, 0=loss) |
detailedRecentForm | array | Detailed recent match objects |
nextMatch | object | Next scheduled match details |
destinationNum | number | Qualification zone number |
destinationGuaranteed | boolean | Whether qualification is guaranteed |
hasPointsDeduction | boolean | Whether team has points deduction |
ppg | number | Points per game |
oppg | number | Opponent points per game |
Headers Object
| Field | Type | Description |
|---|---|---|
key | string | Column identifier (gamePlayed, goals, ratio, points, etc.) |
name | string | Display name (P, F:A, +/-, PTS, W, D, L, Form, Next) |
isMajor | boolean | Whether column is a major/primary column |
Destinations (Qualification Zones)
| Field | Type | Description |
|---|---|---|
num | number | Zone identifier |
name | string | Zone name (e.g., “Round of 16”, “Playoffs”) |
guaranteedText | string | Text shown when qualification is guaranteed |
color | string | Zone color for visual display |
type | number | Zone type identifier |
Filter Types
ThefilterTypes array indicates available standings views:
| Type | Name | Description |
|---|---|---|
| 1 | Overall | Combined home and away standings |
| 2 | Home | Home matches only |
| 3 | Away | Away matches only |
Competition Seasons & Stages
Thecompetitions array includes detailed season and stage information:
| Field | Type | Description |
|---|---|---|
seasons | array | Available seasons with stages and phases |
seasons[].num | number | Season number |
seasons[].name | string | Season display name (e.g., “2025/2026”) |
seasons[].stages | array | Competition stages within season |
seasons[].phases | array | Competition phases (Qualifications, Main, etc.) |
currentSeasonNum | number | Current active season |
currentStageNum | number | Current active stage |
Recent Form Match Object
| Field | Type | Description |
|---|---|---|
id | number | Match identifier |
startTime | string | Match start time (ISO 8601) |
statusGroup | number | Status category (4=ended) |
statusText | string | Status display text |
homeCompetitor | object | Home team with score and winner status |
awayCompetitor | object | Away team with score and winner status |
outcome | number | Match outcome for the team |
winner | number | Winner (1=home, 2=away, 0=draw) |
scores | array | Final scores [home, away] |
Notes
- The
typeparameter filters standings by home/away performance - Use
stageNumandseasonNumto get historical standings - The
competitorparameter can be used instead ofcompetitionsto get standings for a specific team - Destinations indicate qualification zones with color coding for visual display
- The
detailedRecentFormincludes full match details for recent games
Use Case: Get EPL Team IDs for Fixtures & Results
The standings endpoint is the recommended starting point for getting all team IDs in a competition. These IDs can then be used with/games/fixtures and /games/results to fetch team-specific match data.
Complete Workflow Example
const BASE_URL = "https://api.sportsapipro.com/v1/football";
const API_KEY = "YOUR_API_KEY";
const EPL_COMPETITION_ID = 7;
// Step 1: Get all EPL teams from standings
async function getEPLTeams() {
const response = await fetch(
`${BASE_URL}/standings?competitions=${EPL_COMPETITION_ID}`,
{ headers: { "x-api-key": API_KEY } }
);
const data = await response.json();
return data.standings[0].rows.map(row => ({
id: row.competitor.id,
name: row.competitor.name,
nameForURL: row.competitor.nameForURL,
position: row.position,
points: row.points,
played: row.gamePlayed
}));
}
// Step 2: Get fixtures for a specific team
async function getTeamFixtures(competitorId) {
const response = await fetch(
`${BASE_URL}/games/fixtures?competitors=${competitorId}&showOdds=true`,
{ headers: { "x-api-key": API_KEY } }
);
return response.json();
}
// Step 3: Get results for a specific team
async function getTeamResults(competitorId) {
const response = await fetch(
`${BASE_URL}/games/results?competitors=${competitorId}&showOdds=true`,
{ headers: { "x-api-key": API_KEY } }
);
return response.json();
}
// Example: Get all EPL teams and then fetch fixtures for the top team
async function main() {
const teams = await getEPLTeams();
console.log("EPL Teams:", teams);
// Get fixtures for the team in 1st place
const topTeam = teams.find(t => t.position === 1);
console.log(`\nFetching fixtures for ${topTeam.name}...`);
const fixtures = await getTeamFixtures(topTeam.id);
console.log(`Found ${fixtures.games?.length || 0} upcoming fixtures`);
// Get results for the same team
const results = await getTeamResults(topTeam.id);
console.log(`Found ${results.games?.length || 0} past results`);
}
main();
import requests
BASE_URL = "https://api.sportsapipro.com/v1/football"
API_KEY = "YOUR_API_KEY"
EPL_COMPETITION_ID = 7
def get_epl_teams():
"""Step 1: Get all EPL teams from standings"""
response = requests.get(
f"{BASE_URL}/standings",
params={"competitions": EPL_COMPETITION_ID},
headers={"x-api-key": API_KEY}
)
data = response.json()
return [
{
"id": row["competitor"]["id"],
"name": row["competitor"]["name"],
"nameForURL": row["competitor"]["nameForURL"],
"position": row["position"],
"points": row["points"],
"played": row["gamePlayed"]
}
for row in data["standings"][0]["rows"]
]
def get_team_fixtures(competitor_id: int):
"""Step 2: Get fixtures for a specific team"""
response = requests.get(
f"{BASE_URL}/games/fixtures",
params={"competitors": competitor_id, "showOdds": "true"},
headers={"x-api-key": API_KEY}
)
return response.json()
def get_team_results(competitor_id: int):
"""Step 3: Get results for a specific team"""
response = requests.get(
f"{BASE_URL}/games/results",
params={"competitors": competitor_id, "showOdds": "true"},
headers={"x-api-key": API_KEY}
)
return response.json()
# Example: Get all EPL teams and fetch data for the top team
def main():
teams = get_epl_teams()
print(f"Found {len(teams)} EPL teams:")
for team in teams[:5]: # Print top 5
print(f" {team['position']}. {team['name']} (ID: {team['id']}) - {team['points']} pts")
# Get fixtures for the team in 1st place
top_team = next(t for t in teams if t["position"] == 1)
print(f"\nFetching fixtures for {top_team['name']}...")
fixtures = get_team_fixtures(top_team["id"])
games = fixtures.get("games", [])
print(f"Found {len(games)} upcoming fixtures")
# Get results for the same team
results = get_team_results(top_team["id"])
past_games = results.get("games", [])
print(f"Found {len(past_games)} past results")
if __name__ == "__main__":
main()
Sample EPL Team IDs (2025/2026 Season)
Team IDs are stable identifiers. The example below shows common EPL teams - use the standings endpoint for the authoritative current list.
| Team | ID | nameForURL |
|---|---|---|
| Arsenal | 48 | arsenal |
| Chelsea | 104 | chelsea |
| Liverpool | 25 | liverpool |
| Manchester City | 27 | manchester-city |
| Manchester United | 26 | manchester-united |
| Tottenham | 14 | tottenham |
Building Match URLs
Use thenameForURL field from competitor objects to construct SEO-friendly URLs:
// Build a match page URL
function buildMatchURL(game) {
const home = game.homeCompetitor.nameForURL;
const away = game.awayCompetitor.nameForURL;
const gameId = game.id;
return `/football/match/${home}-vs-${away}/${gameId}`;
}
// Example output: /football/match/arsenal-vs-chelsea/4538934
Related Endpoints
- /games/fixtures - Get upcoming matches for a team
- /games/results - Get past match results for a team
- /games/best-practices - Endpoint selection guide and backfill patterns
Authorizations
Your SportsAPI Pro API key
Query Parameters
Competition ID (e.g., 132 for NBA)
Example:
132
Season identifier (defaults to current)
Response
200 - application/json
Standings retrieved successfully
Show child attributes
Show child attributes
Last modified on June 29, 2026
Was this page helpful?
⌘I
League Standings
curl --request GET \
--url https://api.sportsapipro.com/v1/basketball/standings \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sportsapipro.com/v1/basketball/standings"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sportsapipro.com/v1/basketball/standings', 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.sportsapipro.com/v1/basketball/standings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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.sportsapipro.com/v1/basketball/standings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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.sportsapipro.com/v1/basketball/standings")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportsapipro.com/v1/basketball/standings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"standings": [
{
"competitor": {
"id": 123,
"name": "<string>",
"score": 123,
"imageUrl": "<string>"
},
"position": 123,
"wins": 123,
"losses": 123,
"winPercentage": 123,
"gamesBack": 123,
"streak": "<string>",
"conference": "<string>",
"division": "<string>"
}
]
}