# GET /v2/leagues/{id}/standings

Group: Leagues

Standings for one season. By default the season’s primary table (the league table, or the first group of a group stage — meta.overall says whether it holds every team); with group=all every table (conferences, divisions, groups); with type=home or away the table of home games or away games only.

Note: Some seasons have several tables, in the source’s order — the NHL has two conferences, four divisions and the league; MLS two conferences and the overall table; a World Cup one per group. Exactly one table is primary (the default: the league table where there is one, otherwise the one with the most teams; the first group when all are equal); overall is true only on a table that holds every team of the season. position is always 1..n (re-ranked by us when the source’s is not). Columns that do not apply to the sport are null: points is null in the NBA (it ranks by winPercentage); draws is null wherever a table cannot draw (basketball, ice hockey, baseball, volleyball, …); overtimeLosses is set in ice hockey; scoresFor / scoresAgainst count scoreUnit (goals, points, runs, sets, …); streak (+3 = three wins in a row, −2 = two losses) is set where the source has it (NBA, EuroLeague, Liga ACB, …). form (since 2026-10-24) is the team’s last results in this competition season, up to five, oldest first (home / away tables: home / away results only); null where the source has none. Home / away tables exist for football and for basketball, handball, volleyball and ice-hockey leagues such as the EuroLeague, Liga ACB, the Handball-Bundesliga, the SuperLega and the KHL. The NBA and the NHL publish none, and the NFL’s stop updating: for basketball, ice hockey and American football we compute them (meta.source computed) from the season’s finished regular-season fixtures — home rows from home games, away rows from away games — with the columns of the total table that the same computation over every game reproduces exactly (NBA: wins, losses, winPercentage, gamesBehind per table, scores; NHL: wins, losses, overtimeLosses = overtime + shoot-out, points = 2 per win + 1 per overtime loss, scores; NFL: wins, losses, draws, winPercentage, scores). A published home / away table in those sports that is missing games is replaced by the computed one. winPercentage counts a tie as half a win. Ties are ranked by points or win share, then wins and score difference, not by head-to-head. Refreshed daily.

## Parameters

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `id` | path | yes | our numeric id (positive integer) |
| `season` | query | yes | a season id from /v2/leagues/{id}/seasons |
| `group` | query | no | all → every table of the season as StandingsGroup[] |
| `type` | query | no | overall (every game, default), home (home games only) or away (away games only); total is still accepted for one release and answered as overall |

## Response

- `data`: `StandingsRow[] (default) | StandingsGroup[] (group=all)`
- `meta`: season, type, source (upstream = the source’s table, computed = built by us from the fixtures), count (rows; tables with group=all); by default also group (the table’s name), groupCount (tables in the season), overall (whether this table holds every team), tieBreakRule, scoreUnit
- Objects: StandingsRow (https://sportsapi.app/markdown/en/reference.md#standingsrow), StandingsGroup (https://sportsapi.app/markdown/en/reference.md#standingsgroup)

## Errors

- 400 bad_request — missing or invalid season, group other than all, type other than overall|home|away
- 404 no_data — the source has no such table for that season (e.g. a home / away table it does not publish, outside basketball, ice hockey and American football); 404 not_found — an id we never issued
- 404 not_found — season is not one of this league’s seasons (the message names the parameter; list them with /v2/leagues/{id}/seasons)

Plus the common errors (https://sportsapi.app/markdown/en/docs.md#errors).

## Request

cURL:

```bash
curl -H "Authorization: Bearer sk_live_…" \
    "https://api.sportsapi.app/v2/leagues/{id}/standings?season=…"
```

TypeScript:

```ts
const { data, meta } = await client.leagues.standings(id, { season });
```

Python:

```python
res = client.leagues.standings(id, season=season)
```

Go:

```go
res, err := client.Leagues.Standings(ctx, id, &sportsapi.LeaguesStandingsParams{Season: season})
```

CLI:

```bash
$ sportsapi leagues standings <id> --season <season>
```

## Example response

```json
{ "data": [ { "position": 1, "team": { "id": 4438, "name": "Manchester City", … },
    "played": 7, "wins": 7, "draws": 0, "losses": 0, "overtimeWins": null, "overtimeLosses": null,
    "scoresFor": 19, "scoresAgainst": 7, "scoreDifference": 12, "points": 21,
    "winPercentage": null, "gamesBehind": null, "zone": "Champions League", "form": ["win", "win", "win", "win", "win"] }, … ],
  "meta": { "season": 200386, "type": "overall", "source": "upstream", "group": "Premier League 26/27", "groupCount": 1,
            "count": 20, "overall": true, "tieBreakRule": null, "scoreUnit": "goals" } }
```

---

Base URL: https://api.sportsapi.app. Send your API key as `Authorization: Bearer <key>` on every /v2 request; keys are created in the dashboard (https://sportsapi.app/dashboard).
HTML: https://sportsapi.app/docs/leagues/standings · All docs: https://sportsapi.app/markdown/en/docs.md
