SofaScore API endpoint
Returns the seasons of one stage competition, newest first, for example Formula 1 2026 (id 214140) back to 1950. A season `id` is a stage id: pass it to stage-substages for the race calendar and to stage-standings for the championship table. The season still in progress has no `end_timestamp`. Get the competition `id` from stage-categories (for example 40 for Formula 1, 17 for MotoGP, 18 for the NASCAR Cup Series, 9 for Cycling Men). Competition ids and stage ids are different id spaces, so a competition id passed to stage returns an unrelated stage. Returns 404 for an unknown competition id.
/sofascore/stage-seasonsQuery parameters:
id: required. Numeric SofaScore competition id from sofascore/stage-categories, for example 40 (Formula 1), 17 (MotoGP), 18 (NASCAR Cup Series), 36 (WRC), 68 (Formula E) or 9 (Cycling Men).Notable response behavior:
id to sofascore/stage-substages for the race calendar and to sofascore/stage-standings for the championship table (type=competitor for drivers or riders, type=team for constructors).end_timestamp. year is a string and is 25/26 for seasons that span two calendar years.40 is a Superbike stage while competition 40 is Formula 1.stage-categories may also return 404; use the stage ids directly in that case.Example response (shortened):
{
"code": 200,
"msg": "OK",
"data": {
"competition": {
"id": 40,
"name": "Formula 1",
"slug": "formula-1",
"sport": "motorsport",
"category_id": 36,
"category_name": "Formula 1"
},
"count": 3,
"source_url": "https://api.sofascore.com/api/v1/unique-stage/40/seasons",
"fetched_at": "2026-10-07T14:00:00Z",
"seasons": [
{
"id": 214140,
"name": "Formula 1 2026",
"slug": "formula-1-2026",
"year": "2026",
"start_timestamp": 1767254187
},
{
"id": 209766,
"name": "Formula 1 2025",
"slug": "formula-1-2025",
"year": "2025",
"start_timestamp": 1741916100,
"end_timestamp": 1765119600
},
{
"id": 206455,
"name": "Formula 1 2024",
"slug": "formula-1-2024",
"year": "2024",
"start_timestamp": 1709206200,
"end_timestamp": 1733670000
}
]
}
}
| Field | Filled in, of 77 checked | Values in the sample |
|---|---|---|
| id | 77 | |
| name | 77 | “Formula 1 2026” and 76 other values |
| slug | 77 | |
| year | 77 | 1,950 to 2,026, median 1,988 |
| start_timestamp | 77 | -619,747,200 to 1,767,254,187, median 576,028,800 |
| end_timestamp | 76 | -609,984,000 to 1,765,119,600, median 563,932,800 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore competition id from stage-categories | 40 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/stage-seasons?id=40" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"competition": {
"id": 40,
"name": "Formula 1",
"slug": "formula-1",
"sport": "motorsport",
"category_id": 36,
"category_name": "Formula 1"
},
"count": 3,
"source_url": "https://api.sofascore.com/api/v1/unique-stage/40/seasons",
"fetched_at": "2026-10-07T14:00:00Z",
"seasons": [
{
"id": 214140,
"name": "Formula 1 2026",
"slug": "formula-1-2026",
"year": "2026",
"start_timestamp": 1767254187
},
{
"id": 209766,
"name": "Formula 1 2025",
"slug": "formula-1-2025",
"year": "2025",
"start_timestamp": 1741916100,
"end_timestamp": 1765119600
},
{
"id": 206455,
"name": "Formula 1 2024",
"slug": "formula-1-2024",
"year": "2024",
"start_timestamp": 1709206200,
"end_timestamp": 1733670000
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.stageSeasonsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.StageSeasonsResponse | No | ||||
| data.competition | sofascore.StageCompetition | No | ||||
| data.competition.category_id | integer | No | 36 | |||
| data.competition.category_name | string | No | Formula 1 | |||
| data.competition.id | integer | No | 40 | |||
| data.competition.name | string | No | Formula 1 | |||
| data.competition.slug | string | No | formula-1 | |||
| data.competition.sport | string | No | motorsport | |||
| data.count | integer | No | 77 | |||
| data.fetched_at | string | No | ||||
| data.seasons | array | No | ||||
| data.seasons[].end_timestamp | integer | No | 1765119600 | EndTimestamp is omitted for the season still in progress. | ||
| data.seasons[].id | integer | No | 214140 | |||
| data.seasons[].name | string | No | Formula 1 2026 | |||
| data.seasons[].slug | string | No | formula-1-2026 | |||
| data.seasons[].start_timestamp | integer | No | 1767254187 | |||
| data.seasons[].year | string | No | 2026 | |||
| data.source_url | string | 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/stage-seasons?id=40" \
-H "x-api-key: $CRAWLORA_API_KEY"