SofaScore API endpoint
Returns one stage from SofaScore's stage hierarchy: a season (Formula 1 2026), an event (a Grand Prix weekend, a NASCAR race, a rally, a cycling race), a session (practice, qualifying, sprint, race) or a cycling stage. The response has its type (`Season`, `Event`, `Practice`, `Qualifying`, `Qualifying part`, `Race`, `Sprint race`, `Sprint qualifying`, `Practice part`, `Stage`), status (`finished`, `notstarted`, `canceled`), start time, country, competition, parent stage (the season of an event, the event of a session), the winner once decided, and circuit, weather and race facts where published (laps, race distance, lap record, safety car, NASCAR cautions, rally special stages, cycling route). `info` fields are omitted when not published, never zero. A season has no status. Stage ids and competition ids are different id spaces. Returns 404 for an unknown stage id.
/sofascore/stageQuery parameters:
id: required. Numeric SofaScore stage id: a season id from sofascore/stage-seasons, an event id from sofascore/stage-schedule, sofascore/stage-featured or sofascore/stage-substages, or a session or stage id from sofascore/stage-substages. Example: 214258 (Azerbaijan Grand Prix race, 2026).Notable response behavior:
type names the level. Values seen: Season (id 1), Event (2), Practice (3), Qualifying (4), Qualifying part (5), Race (6), Stage (8, cycling stages and rally special stages), Sprint race (10), Sprint qualifying (12) and Practice part (14). status.type is finished, notstarted or canceled; a season has no status.parent is the stage one level up: the season of an event, the event of a session. competition is the series (id is the competition id for sofascore/stage-seasons; it is not a stage id).info holds the facts SofaScore publishes and omits the rest, never zero-filling: circuit, circuit city and country, round (the round of an event, or the stage number within a cycling race), laps and laps completed, race_distance_m and circuit_length_m in metres, weather, track condition, air_temperature and track_temperature in degrees Celsius, humidity, lap_record and safety_car for Formula 1; special_stages for rallies (0 for a canceled rally) and stage_day (a weekday label such as FRI) for rally stages and some race-weekend sessions; discipline, race_type, departure_city and arrival_city for cycling; distance, actual_distance, average_speed, cautions, caution_laps, lead_changes, elapsed_time, race_segments and summary for NASCAR.winner is set once the stage has a winner, with the driver or rider and their team; for practice and qualifying sessions it is the fastest competitor. end_timestamp is omitted when SofaScore publishes none or one that precedes the start (seen on NASCAR races).Example response (shortened):
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.sofascore.com/api/v1/stage/214258",
"fetched_at": "2026-10-07T14:00:00Z",
"stage": {
"id": 214258,
"name": "Grand Prix",
"slug": "grand-prix",
"type": {
"id": 6,
"name": "Race"
},
"status": {
"type": "finished",
"description": "Finished"
},
"year": "2026",
"start_timestamp": 1790420400,
"start_time": "2026-09-26T11:00:00Z",
"season_name": "Formula 1 2026",
"country": "Azerbaijan",
"country_code": "AZ",
"competition": {
"id": 40,
"name": "Formula 1",
"slug": "formula-1",
"sport": "motorsport",
"category_id": 36,
"category_name": "Formula 1"
},
"parent": {
"id": 214253,
"name": "Azerbaijan GP",
"slug": "azerbaijan-gp",
"start_timestamp": 1790239908
},
"info": {
"circuit": "Baku City Circuit",
"circuit_country": "Azerbaijan",
"laps": 51,
"laps_completed": 51,
"race_distance_m": 306049,
"circuit_length_m": 6003,
"weather": "sunny",
"track_condition": "Dry",
"air_temperature": 26.5,
"track_temperature": 40.1,
"humidity": 50.4,
"lap_record": "1:44.916",
"safety_car": true
},
"winner": {
"id": 271315,
"name": "George Russell",
"short_name": "G. Russell",
"code": "RUS",
"slug": "russell-george",
"kind": "individual",
"country": "United Kingdom",
"country_code": "GB",
"team": {
"id": 214910,
"name": "Mercedes",
"short_name": "Mercedes",
"code": "MER",
"country": "Germany"
}
}
}
}
}
| Field | In the sample | Value in the sample |
|---|---|---|
| stage.id | Has a value | |
| stage.name | Has a value | “Grand Prix” |
| stage.slug | Has a value | |
| stage.type | Has a value | |
| stage.status | Has a value | |
| stage.year | Has a value | 2,026 |
| stage.start_timestamp | Has a value | 2026-09-26 |
| stage.start_time | Has a value | 2026-09-26 |
| stage.season_name | Has a value | “Formula 1 2026” |
| stage.country | Has a value | “Azerbaijan” |
| stage.country_code | Has a value | |
| stage.competition | Has a value | |
| stage.parent | Has a value | |
| stage.info | Has a value | |
| stage.winner | Has a value |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore stage id from stage-schedule, stage-seasons or stage-substages | 214258 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/stage?id=214258" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.sofascore.com/api/v1/stage/214258",
"fetched_at": "2026-10-07T14:00:00Z",
"stage": {
"id": 214258,
"name": "Grand Prix",
"slug": "grand-prix",
"type": {
"id": 6,
"name": "Race"
},
"status": {
"type": "finished",
"description": "Finished"
},
"year": "2026",
"start_timestamp": 1790420400,
"start_time": "2026-09-26T11:00:00Z",
"season_name": "Formula 1 2026",
"country": "Azerbaijan",
"country_code": "AZ",
"competition": {
"id": 40,
"name": "Formula 1",
"slug": "formula-1",
"sport": "motorsport",
"category_id": 36,
"category_name": "Formula 1"
},
"parent": {
"id": 214253,
"name": "Azerbaijan GP",
"slug": "azerbaijan-gp",
"start_timestamp": 1790239908
},
"info": {
"circuit": "Baku City Circuit",
"circuit_country": "Azerbaijan",
"laps": 51,
"laps_completed": 51,
"race_distance_m": 306049,
"circuit_length_m": 6003,
"weather": "sunny",
"track_condition": "Dry",
"air_temperature": 26.5,
"track_temperature": 40.1,
"humidity": 50.4,
"lap_record": "1:44.916",
"safety_car": true
},
"winner": {
"id": 271315,
"name": "George Russell",
"short_name": "G. Russell",
"code": "RUS",
"slug": "russell-george",
"kind": "individual",
"country": "United Kingdom",
"country_code": "GB",
"team": {
"id": 214910,
"name": "Mercedes",
"short_name": "Mercedes",
"code": "MER",
"country": "Germany"
}
}
}
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.stageDetailResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.StageDetailResponse | No | ||||
| data.fetched_at | string | No | ||||
| data.source_url | string | No | ||||
| data.stage | sofascore.Stage | No | ||||
| data.stage.competition | object | No | Competition is the series this stage belongs to. | |||
| data.stage.competition.category_id | integer | No | 36 | |||
| data.stage.competition.category_name | string | No | Formula 1 | |||
| data.stage.competition.id | integer | No | 40 | |||
| data.stage.competition.name | string | No | Formula 1 | |||
| data.stage.competition.slug | string | No | formula-1 | |||
| data.stage.competition.sport | string | No | motorsport | |||
| data.stage.country | string | No | Azerbaijan | |||
| data.stage.country_code | string | No | AZ | |||
| data.stage.end_timestamp | integer | No | EndTimestamp is omitted when SofaScore publishes none or one before the start. | |||
| data.stage.id | integer | No | 214258 | |||
| data.stage.info | sofascore.StageInfo | No | ||||
| data.stage.info.actual_distance | number | No | 400.5 | |||
| data.stage.info.air_temperature | number | No | 26.5 | AirTemperature and TrackTemperature are degrees Celsius; Humidity is a percentage. | ||
| data.stage.info.arrival_city | string | No | Kampar | |||
| data.stage.info.average_speed | number | No | 147.363 | |||
| data.stage.info.caution_laps | integer | No | 21 | |||
| data.stage.info.cautions | integer | No | 4 | |||
| data.stage.info.circuit | string | No | Baku City Circuit | |||
| data.stage.info.circuit_city | string | No | Baku | |||
| data.stage.info.circuit_country | string | No | Azerbaijan | |||
| data.stage.info.circuit_length_m | number | No | 6003 | |||
| data.stage.info.departure_city | string | No | Shah Alam | |||
| data.stage.info.discipline | string | No | Category Pro | Cycling facts. | ||
| data.stage.info.distance | number | No | 400 | NASCAR facts. Distances use the series' own unit (miles). | ||
| data.stage.info.elapsed_time | string | No | 2:43:04 | |||
| data.stage.info.humidity | number | No | 50.4 | |||
| data.stage.info.lap_record | string | No | 1:44.916 | |||
| data.stage.info.laps | integer | No | 51 | Laps is the scheduled lap count and LapsCompleted the laps actually run. | ||
| data.stage.info.laps_completed | integer | No | 51 | |||
| data.stage.info.lead_changes | integer | No | 12 | |||
| data.stage.info.race_distance_m | number | No | 306049 | RaceDistanceM and CircuitLengthM are in metres. | ||
| data.stage.info.race_segments | integer | No | 2 | RaceSegments is the number of scored segments in a NASCAR race. | ||
| data.stage.info.race_type | string | No | normal | |||
| data.stage.info.round | integer | No | 15 | Round is the championship round of an event, or the stage number within a cycling race or rally; practice, qualifying and race sessions carry none. | ||
| data.stage.info.safety_car | boolean | No | ||||
| data.stage.info.special_stages | integer | No | 17 | SpecialStages is the number of special stages of a rally (0 for a canceled rally). | ||
| data.stage.info.stage_day | string | No | FRI | StageDay is the weekday label (THU, FRI, SAT, SUN) of a rally stage or race-weekend session. | ||
| data.stage.info.summary | string | No | ||||
| data.stage.info.track_condition | string | No | Dry | |||
| data.stage.info.track_temperature | number | No | 40.1 | |||
| data.stage.info.weather | string | No | sunny | |||
| data.stage.name | string | No | Grand Prix | |||
| data.stage.on_date | boolean | No | OnDate is true when at least one session of the event starts inside the requested UTC day (stage-schedule only). | |||
| data.stage.parent | object | No | Parent is the season of an event, the event of a session, and so on. | |||
| data.stage.parent.id | integer | No | 214253 | |||
| data.stage.parent.name | string | No | Azerbaijan GP | |||
| data.stage.parent.slug | string | No | azerbaijan-gp | |||
| data.stage.parent.start_timestamp | integer | No | ||||
| data.stage.parts | array | No | Parts are the qualifying or practice parts of a session (substages only). | |||
| data.stage.parts[].id | integer | No | 214258 | |||
| data.stage.parts[].name | string | No | Grand Prix | |||
| data.stage.parts[].sequence | integer | No | 1 | |||
| data.stage.parts[].slug | string | No | grand-prix | |||
| data.stage.parts[].start_timestamp | integer | No | 1790420400 | |||
| data.stage.parts[].status | sofascore.StageStatus | No | ||||
| data.stage.parts[].status.description | string | No | Finished | |||
| data.stage.parts[].status.type | string | No | finished | |||
| data.stage.parts[].type | sofascore.StageType | No | ||||
| data.stage.parts[].type.id | integer | No | 6 | |||
| data.stage.parts[].type.name | string | No | Race | |||
| data.stage.season_name | string | No | Formula 1 2026 | |||
| data.stage.sequence | integer | No | 1 | Sequence orders practice sessions and cycling stages within their event. | ||
| data.stage.session | object | No | Session is the session SofaScore highlights for an event: the live, next or latest one (schedule routes only). | |||
| data.stage.session.id | integer | No | 214258 | |||
| data.stage.session.name | string | No | Grand Prix | |||
| data.stage.session.sequence | integer | No | 1 | |||
| data.stage.session.slug | string | No | grand-prix | |||
| data.stage.session.start_timestamp | integer | No | 1790420400 | |||
| data.stage.session.status | sofascore.StageStatus | No | ||||
| data.stage.session.status.description | string | No | Finished | |||
| data.stage.session.status.type | string | No | finished | |||
| data.stage.session.type | sofascore.StageType | No | ||||
| data.stage.session.type.id | integer | No | 6 | |||
| data.stage.session.type.name | string | No | Race | |||
| data.stage.session_start_timestamps | array | No | SessionStartTimestamps lists every session start of an event (schedule routes only). | |||
| data.stage.slug | string | No | grand-prix | |||
| data.stage.start_time | string | No | 2026-09-26T11:00:00Z | |||
| data.stage.start_timestamp | integer | No | 1790420400 | |||
| data.stage.status | sofascore.StageStatus | No | ||||
| data.stage.status.description | string | No | Finished | |||
| data.stage.status.type | string | No | finished | |||
| data.stage.type | sofascore.StageType | No | ||||
| data.stage.type.id | integer | No | 6 | |||
| data.stage.type.name | string | No | Race | |||
| data.stage.winner | object | No | Winner is set once the stage has a winner; for practice and qualifying it is the fastest competitor. | |||
| data.stage.winner.code | string | No | RUS | Code is the three-letter timing code (for example RUS), when published. | ||
| data.stage.winner.country | string | No | United Kingdom | |||
| data.stage.winner.country_code | string | No | GB | |||
| data.stage.winner.id | integer | No | 271315 | |||
| data.stage.winner.kind | string | No | individual | Kind is individual for a driver or rider and team for a team or constructor. | ||
| data.stage.winner.name | string | No | George Russell | |||
| data.stage.winner.short_name | string | No | G. Russell | |||
| data.stage.winner.slug | string | No | russell-george | |||
| data.stage.winner.team | object | No | Team is the team or constructor of an individual competitor. | |||
| data.stage.winner.team.chassis | string | No | W17 | Chassis and Engine are published for Formula 1 constructors only. | ||
| data.stage.winner.team.code | string | No | MER | |||
| data.stage.winner.team.country | string | No | Germany | |||
| data.stage.winner.team.engine | string | No | Mercedes-AMG F1 M17 | |||
| data.stage.winner.team.id | integer | No | 214910 | |||
| data.stage.winner.team.name | string | No | Mercedes | |||
| data.stage.winner.team.short_name | string | No | Mercedes | |||
| data.stage.year | string | No | 2026 | |||
| 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?id=214258" \
-H "x-api-key: $CRAWLORA_API_KEY"