SofaScore API endpoint
Returns the rounds of a competition season and the current round. Round numbers are not unique in cups: the UEFA Champions League has both a qualifying and a league-phase round 1, and the same playoff round number with and without a `prefix`. To fetch a round's fixtures, pass its `round` to round-events together with its `slug` and, when present, its `prefix`; knockout and named rounds return 404 from round-events without the slug. Plain numbered rounds (a league's round 1 to 38) have no slug. Get `id` from category-tournaments or search and `season` from tournament-seasons. Returns 404 when SofaScore has no rounds for the season (for example a season that has not started).
/sofascore/tournament-roundsQuery parameters:
id: required. Numeric SofaScore unique-tournament (competition) id, for example 7 for the UEFA Champions League or 17 for the Premier League. Find one with category-tournaments or search.season: required. Numeric SofaScore season id from tournament-seasons, for example 76953.How to feed a round into round-events:
76953 the list holds {"round": 1, "slug": "qualification-round-1"} and a bare {"round": 1} (league phase), and round 636 appears both with prefix: "Qualification" and without. The two round-1 entries and the two round-636 entries return different fixtures.round and, when the entry has them, slug and prefix: for example round=636&slug=playoff-round&prefix=Qualification for the qualifying playoff and round=636&slug=playoff-round for the knockout playoff.round) is called with only round, as for a league's rounds 1 to 38.final, round-of-16, match-for-3rd-place) exist only with their slug: round-events returns 404 for the bare number.Notable response behavior:
rounds keeps SofaScore's order and every entry, duplicates of a round number included. name, slug, and prefix are omitted when SofaScore sends none.current_round is omitted when SofaScore does not report one. After a cup season ends it points at the last round (the final).Example response (trimmed):
{
"code": 200,
"msg": "OK",
"data": {
"tournament_id": 7,
"season_id": 76953,
"current_round": { "round": 29, "name": "Final", "slug": "final" },
"count": 17,
"source_url": "https://api.sofascore.com/api/v1/unique-tournament/7/season/76953/rounds",
"fetched_at": "2026-10-07T14:00:00Z",
"rounds": [
{ "round": 1, "name": "Qualification Round 1", "slug": "qualification-round-1" },
{ "round": 636, "name": "Playoff round", "slug": "playoff-round", "prefix": "Qualification" },
{ "round": 1 },
{ "round": 636, "name": "Playoff round", "slug": "playoff-round" },
{ "round": 5, "name": "Round of 16", "slug": "round-of-16" },
{ "round": 29, "name": "Final", "slug": "final" }
]
}
}
| Field | Filled in, of 17 checked | Values in the sample |
|---|---|---|
| round | 17 | 1 to 636, median 5 |
| name | 9 | “Qualification Round 1” and 7 other values |
| slug | 9 | |
| prefix | 1 | “Qualification” |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore unique-tournament (competition) id | 7 | |
| season | string | Yes | Numeric SofaScore season id from tournament-seasons | 76953 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/tournament-rounds?id=7&season=76953" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"tournament_id": 7,
"season_id": 76953,
"current_round": {
"round": 29,
"name": "Final",
"slug": "final"
},
"count": 17,
"source_url": "https://api.sofascore.com/api/v1/unique-tournament/7/season/76953/rounds",
"fetched_at": "2026-10-07T14:00:00Z",
"rounds": [
{
"round": 1,
"name": "Qualification Round 1",
"slug": "qualification-round-1"
},
{
"round": 636,
"name": "Playoff round",
"slug": "playoff-round",
"prefix": "Qualification"
},
{
"round": 1
},
{
"round": 636,
"name": "Playoff round",
"slug": "playoff-round"
},
{
"round": 5,
"name": "Round of 16",
"slug": "round-of-16"
},
{
"round": 29,
"name": "Final",
"slug": "final"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.tournamentRoundsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.TournamentRoundsResponse | No | ||||
| data.count | integer | No | ||||
| data.current_round | sofascore.RoundRef | No | ||||
| data.current_round.name | string | No | Round of 16 | |||
| data.current_round.prefix | string | No | Qualification | |||
| data.current_round.round | integer | No | 5 | |||
| data.current_round.slug | string | No | round-of-16 | |||
| data.fetched_at | string | No | ||||
| data.rounds | array | No | ||||
| data.rounds[].name | string | No | Round of 16 | |||
| data.rounds[].prefix | string | No | Qualification | |||
| data.rounds[].round | integer | No | 5 | |||
| data.rounds[].slug | string | No | round-of-16 | |||
| data.season_id | integer | No | ||||
| data.source_url | string | No | ||||
| 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-rounds?id=7&season=76953" \
-H "x-api-key: $CRAWLORA_API_KEY"