SofaScore API endpoint
Returns a league table for a competition season. The `type` enum accepts `total`, `home`, and `away`. Get `id` from search and `season` from tournament-seasons.
/sofascore/standingsQuery parameters:
id: required. Numeric SofaScore unique-tournament (competition) id, e.g. 17 for the Premier League.season: required. Numeric SofaScore season id (from the tournament-seasons endpoint).type: required enum. Allowed values: total, home, away.Notable response behavior:
groups is a list because some competitions publish more than one table (e.g. separate group-stage tables); most leagues return a single group.| Field | Filled in, of 1 checked | Values in the sample |
|---|---|---|
| name | 1 | “Premier League 25/26” |
| rows | 1 | median 20 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore unique-tournament (competition) id | 17 | |
| season | string | Yes | Numeric SofaScore season id | 76986 | |
| type | string | Yes | Standings variant Allowed values: total, home, away. | total | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/standings?id=17&season=76986&type=total" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"tournament_id": 17,
"season_id": 76986,
"type": "total",
"source_url": "https://api.sofascore.com/api/v1/unique-tournament/17/season/76986/standings/total",
"fetched_at": "2026-07-08T16:45:00Z",
"groups": [
{
"name": "Premier League",
"rows": [
{
"position": 1,
"team": {
"id": 17,
"name": "Liverpool",
"short_name": "Liverpool",
"slug": "liverpool",
"country": "England"
},
"matches": 38,
"wins": 30,
"draws": 5,
"losses": 3,
"scores_for": 90,
"scores_against": 30,
"points": 95,
"promotion": "Champions League"
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.standingsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.StandingsResponse | No | ||||
| data.fetched_at | string | No | Time the data was fetched, in UTC (RFC 3339). | |||
| data.groups | array | No | One entry per table the competition publishes. | |||
| data.groups[].name | string | No | Table name, set when the competition publishes more than one table, such as group-stage groups. | |||
| data.groups[].rows | array | No | Table rows in position order. | |||
| data.groups[].rows[].draws | integer | No | Matches drawn. | |||
| data.groups[].rows[].losses | integer | No | Matches lost. | |||
| data.groups[].rows[].matches | integer | No | Matches played. | |||
| data.groups[].rows[].points | integer | No | Points in the table. | |||
| data.groups[].rows[].position | integer | No | Position in the table. | |||
| data.groups[].rows[].promotion | string | No | Champions League | What the position currently leads to, for example "Champions League". Omitted when the position carries nothing. | ||
| data.groups[].rows[].scores_against | integer | No | Goals or points conceded. | |||
| data.groups[].rows[].scores_for | integer | No | Goals or points scored. | |||
| data.groups[].rows[].team | object | No | The team. | |||
| data.groups[].rows[].team.country | string | No | Spain | Country the team belongs to. | ||
| data.groups[].rows[].team.id | integer | No | 2817 | SofaScore team id. Use it with the team endpoints. | ||
| data.groups[].rows[].team.name | string | No | FC Barcelona | Full team name. | ||
| data.groups[].rows[].team.national | boolean | No | True for a national team. | |||
| data.groups[].rows[].team.short_name | string | No | Barcelona | Shortened team name. | ||
| data.groups[].rows[].team.slug | string | No | barcelona | URL slug of the team on SofaScore. | ||
| data.groups[].rows[].wins | integer | No | Matches won. | |||
| data.season_id | integer | No | SofaScore season id. | |||
| data.source_url | string | No | SofaScore URL the data was read from. | |||
| data.tournament_id | integer | No | Id of the competition (the unique tournament id). | |||
| data.type | string | No | total | Which table was requested: `total`, `home` or `away`. | ||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/sofascore/standings?id=17&season=76986&type=total" \
-H "x-api-key: $CRAWLORA_API_KEY"