SofaScore API endpoint
Returns one page of a football competition season's player statistics table, sortable by a statistic. `order` chooses the statistic to sort by, `direction` the sort direction (`desc` or `asc`), `accumulation` whether values are season totals, per-game averages or per-90-minute averages (`total`, `perGame`, `per90`), and `group` which statistic columns each row carries (`summary`, `attack`, `defence`, `passing`, `goalkeeper`). Page with `limit` (up to 100) and `offset`; `has_next_page` shows whether more rows follow. Optional filters narrow the table: `team` (team ids), `nationality` (SofaScore nationality codes), `position` (`G`, `D`, `M`, `F`), `min_appearances` and `min_minutes`; several filters combine (AND) and several values of one filter are alternatives (OR). The team ids and nationality codes of a season come from tournament-statistics-info. A filter that matches nobody returns an empty `players` list. Other sports return no rows (404). Get `id` from search and `season` from tournament-seasons.
/sofascore/tournament-player-statisticsQuery parameters:
id: required. Numeric SofaScore unique-tournament (competition) id of a football competition, e.g. 17 for the Premier League.season: required. Numeric SofaScore season id from sofascore/tournament-seasons, e.g. 96668.order: optional enum, the statistic to sort by. Allowed values: rating, goals, expectedGoals, assists, successfulDribbles, tackles, accuratePassesPercentage, bigChancesMissed, totalShots, goalConversionPercentage, interceptions, clearances, errorLeadToGoal, outfielderBlocks, bigChancesCreated, accuratePasses, keyPasses, saves, cleanSheet, penaltySave, savedShotsFromInsideTheBox, runsOut. Defaults to rating. Any statistic can be used with any group.direction: optional enum. Allowed values: desc (highest first), asc (lowest first). Defaults to desc.accumulation: optional enum. Allowed values: total (season totals), perGame (average per match), per90 (average per 90 minutes). Defaults to total.group: optional enum, which statistic columns each row carries. Allowed values: summary, attack, defence, passing, goalkeeper. Defaults to summary.limit: optional integer, 1 to 100. Rows per page. Defaults to 20.offset: optional integer, 0 or more. Rows to skip. Defaults to 0.team: optional. Comma-separated numeric team ids (up to 20); keeps only those teams' players, for example 42,17. The ids come from sofascore/tournament-statistics-info (or sofascore/tournament-teams).nationality: optional. Comma-separated two-letter SofaScore nationality codes (up to 20), for example EN,ES; keeps only players of those nationalities. The codes of a season come from sofascore/tournament-statistics-info; SofaScore uses EN for England, SX for Scotland, WA for Wales and NX for Northern Ireland.position: optional enum list, comma-separated. Allowed values: G (goalkeeper), D (defender), M (midfielder), F (forward), for example G,D.min_appearances: optional integer, 0 to 1000. Keeps only players with at least this many appearances in the season. 0 or omitted means no minimum.min_minutes: optional integer, 0 to 100000. Keeps only players with at least this many minutes played in the season. 0 or omitted means no minimum.Group columns:
summary: goals, expectedGoals, successfulDribbles, tackles, assists, accuratePassesPercentage, rating.attack: goals, expectedGoals, bigChancesMissed, successfulDribbles, totalShots, goalConversionPercentage, rating.defence: tackles, interceptions, clearances, errorLeadToGoal, outfielderBlocks, rating.passing: bigChancesCreated, assists, accuratePasses, accuratePassesPercentage, keyPasses, rating.goalkeeper: saves, cleanSheet, penaltySave, savedShotsFromInsideTheBox, runsOut, rating.Notable response behavior:
rank continues from offset (the first row of offset=40 is rank 41). page, total_pages and has_next_page describe the table at the requested limit.statistics is a map of the group's columns; a statistic SofaScore has no value for is null rather than 0 (for example expectedGoals for a player with no tracked shots). The table is not filtered by a minimum number of appearances, so a player with one match can top rating.position=G&team=42 is Arsenal's goalkeepers) and several values of one filter with OR (team=42,17 is Arsenal and Manchester City). The applied filters are echoed in filters (team_ids, nationalities, positions, min_appearances, min_minutes) and are omitted when none were given. A filter that matches nobody (an unknown nationality code, a team that is not in the season, a minimum nobody reaches) returns an empty players list with a 200 instead of the 404 below. Team ids, nationality codes and positions are checked for format before the request; SofaScore itself does not report unknown values.players list.order values were verified against the Premier League 2026/27 table; perGame and per90 ordering was verified with rating.position (G, D, M, F each returned only that position), team, nationality, and the minimums (ascending order started at exactly the minimum: 30 appearances, 31 for a strict greater-than, and 2503 minutes for min_minutes=2500). Filters are football only.Example response (shortened):
{
"code": 200,
"msg": "OK",
"data": {
"tournament_id": 17,
"season_id": 96668,
"order": "rating",
"direction": "desc",
"accumulation": "total",
"group": "attack",
"limit": 2,
"offset": 0,
"page": 1,
"total_pages": 211,
"has_next_page": true,
"count": 1,
"source_url": "https://api.sofascore.com/api/v1/unique-tournament/17/season/96668/statistics?accumulation=total&group=attack&limit=2&order=-rating",
"fetched_at": "2026-10-07T14:00:00Z",
"players": [
{
"rank": 1,
"player": { "id": 1142315, "name": "Jack Hinshelwood", "slug": "jack-hinshelwood" },
"team": { "id": 30, "name": "Brighton & Hove Albion", "slug": "brighton-and-hove-albion" },
"statistics": { "goals": 2, "expectedGoals": 1.41, "bigChancesMissed": 0, "successfulDribbles": 1, "totalShots": 3, "goalConversionPercentage": 66.67, "rating": 9 }
}
]
}
}
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| rank | 40 | 1 to 40, median 20 |
| player | 40 | |
| team | 40 | |
| statistics | 40 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore unique-tournament (competition) id of a football competition | 17 | |
| season | string | Yes | Numeric SofaScore season id | 96668 | |
| order | string | No | rating | Statistic to sort by. Defaults to rating Allowed values: rating, goals, expectedGoals, assists, successfulDribbles, tackles, accuratePassesPercentage, bigChancesMissed, totalShots, goalConversionPercentage, interceptions, clearances, errorLeadToGoal, outfielderBlocks, bigChancesCreated, accuratePasses, keyPasses, saves, cleanSheet, penaltySave, savedShotsFromInsideTheBox, runsOut. | goals |
| direction | string | No | desc | Sort direction. Defaults to desc Allowed values: desc, asc. | desc |
| accumulation | string | No | total | How statistics are accumulated. Defaults to total Allowed values: total, perGame, per90. | total |
| group | string | No | summary | Statistic columns returned. Defaults to summary Allowed values: summary, attack, defence, passing, goalkeeper. | summary |
| limit | integer | No | 20 | Rows per page, 1 to 100. Defaults to 20 Minimum: 1. Maximum: 100. | 20 |
| offset | integer | No | 0 | Rows to skip. Defaults to 0 Minimum: 0. | 0 |
| team | array<string> | No | Team ids to keep, comma separated, up to 20 (ids from tournament-statistics-info or tournament-teams) | 42 | |
| nationality | array<string> | No | Nationality codes to keep, comma separated, up to 20 (codes from tournament-statistics-info) | EN | |
| position | array<string> | No | Position codes to keep, comma separated Allowed values: G, D, M, F. | F | |
| min_appearances | integer | No | Keep players with at least this many appearances, 0 to 1000. Omit for no minimum Minimum: 0. Maximum: 1000. | 10 | |
| min_minutes | integer | No | Keep players with at least this many minutes played, 0 to 100000. Omit for no minimum Minimum: 0. Maximum: 100000. | 900 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/tournament-player-statistics?id=17&season=96668&order=rating&direction=desc&accumulation=total&group=summary&limit=10&position=G" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"tournament_id": 17,
"season_id": 96668,
"order": "rating",
"direction": "desc",
"accumulation": "total",
"group": "attack",
"limit": 2,
"offset": 0,
"page": 1,
"total_pages": 211,
"has_next_page": true,
"count": 1,
"source_url": "https://api.sofascore.com/api/v1/unique-tournament/17/season/96668/statistics?accumulation=total&group=attack&limit=2&order=-rating",
"fetched_at": "2026-10-07T14:00:00Z",
"players": [
{
"rank": 1,
"player": {
"id": 1142315,
"name": "Jack Hinshelwood",
"slug": "jack-hinshelwood"
},
"team": {
"id": 30,
"name": "Brighton & Hove Albion",
"slug": "brighton-and-hove-albion"
},
"statistics": {
"goals": 2,
"expectedGoals": 1.41,
"bigChancesMissed": 0,
"successfulDribbles": 1,
"totalShots": 3,
"goalConversionPercentage": 66.67,
"rating": 9
}
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.tournamentPlayerStatisticsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.TournamentPlayerStatisticsResponse | No | ||||
| data.accumulation | string | No | total | |||
| data.count | integer | No | ||||
| data.direction | string | No | desc | |||
| data.fetched_at | string | No | ||||
| data.filters | object | No | Filters echoes the filters applied and is omitted when none were given. | |||
| data.filters.min_appearances | integer | No | ||||
| data.filters.min_minutes | integer | No | ||||
| data.filters.nationalities | array | No | ||||
| data.filters.positions | array | No | ||||
| data.filters.team_ids | array | No | ||||
| data.group | string | No | summary | |||
| data.has_next_page | boolean | No | ||||
| data.limit | integer | No | 20 | |||
| data.offset | integer | No | ||||
| data.order | string | No | rating | |||
| data.page | integer | No | 1 | |||
| data.players | array | No | ||||
| data.players[].player | sofascore.PlayerRef | No | PlayerRef record, 6 fields: country, id, name, position, short_name, slug. Described under SofaScore player of the season API. | |||
| data.players[].rank | integer | No | 1 | |||
| data.players[].statistics | object | No | ||||
| data.players[].team | sofascore.TeamRef | No | TeamRef record, 6 fields: country, id, name, national, short_name, slug. Described under SofaScore venue API. | |||
| data.season_id | integer | No | ||||
| data.source_url | string | No | ||||
| data.total_pages | integer | No | 22 | |||
| data.tournament_id | integer | No | ||||
| 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/tournament-player-statistics?id=17&season=96668&order=rating&direction=desc&accumulation=total&group=summary&limit=10&position=G" \
-H "x-api-key: $CRAWLORA_API_KEY"