SofaScore API endpoint
Returns one classification of a stage. For a race or sprint it is the result (position, grid, race time, gap, interval, laps, laps led, pit stops, tyre stints, fastest lap, points, retirement status); for practice and qualifying the timing order (`time` is the best lap); for a cycling stage the stage result with time gaps; for an event the event aggregate; for a season the championship table (points, victories, races started, pole positions, podiums, fastest laps; NASCAR adds top 5, top 10 and races not finished). `competitor` returns drivers and riders, `team` returns constructors and teams, which only some seasons and events publish (verified for the Formula 1 and MotoGP seasons and the Formula 1 event; races, NASCAR, WRC and cycling return 404 for `team`). Rows are in upstream order. `position` is omitted for competitors who did not finish or set no time, and `gap` is `DNF` for a retirement. The parent session of a split qualifying has no standings; use the ids of its parts from stage-substages. Fields a classification does not publish are omitted. Returns 404 for an unknown id, a stage that has no results yet, or a kind of stage without that classification. The `type` enum accepts `competitor` and `team`.
/sofascore/stage-standingsQuery parameters:
id: required. Numeric SofaScore stage id of a season, event, session or cycling stage, for example 214258 (a race) or 214140 (the Formula 1 2026 season).type: required enum. Allowed values: competitor (drivers and riders), team (constructors and teams).Notable response behavior:
position, grid_position, time, gap, interval, laps, laps_led, pit_stops, fastest_laps, fastest_lap_time, tyre_type, tyre_stints and points. A practice or qualifying row has position, time (the best lap) and gap. A cycling stage row has position, time and gap; the general classification of a race adds total_time and jersey (general for the leader). A season row has points, victories, races_started, races_with_points, pole_positions, podiums and fastest_laps, and NASCAR adds rank, top5, top10 and did_not_finish (races not finished).position is omitted for a competitor who did not finish or set no time, and gap is DNF for a retirement (with status Out, sub_status Retired and did_not_finish 1 in a race row) and DNS for a competitor who did not start (status Out or Did not start). status values seen: Finished, Out, Did not start. comment carries free text such as Penalized 10 seconds or No time. Rows beyond the points positions have no points. Some series publish the time behind the winner in time for every row but the first (IndyCar), and comment can read OUT: Retired; treat time, gap and interval as strings in the form the series publishes.competitor is the driver or rider (kind individual) with their team; for type=team the row itself is the constructor (kind team). type=team is published for the Formula 1 and MotoGP seasons and the Formula 1 event, and returns 404 for races, sessions, NASCAR, WRC and cycling.sofascore/stage-substages. A WRC season table has about 200 rows and a cycling stage about 120.type returns an invalid-parameter error before any upstream request.Example response (shortened):
{
"code": 200,
"msg": "OK",
"data": {
"stage_id": 214258,
"type": "competitor",
"count": 4,
"source_url": "https://api.sofascore.com/api/v1/stage/214258/standings/competitor",
"fetched_at": "2026-10-07T14:00:00Z",
"standings": [
{
"position": 2,
"competitor": {
"id": 191417,
"name": "Max Verstappen",
"short_name": "M. Verstappen",
"code": "VER",
"slug": "verstappen-max",
"kind": "individual",
"country": "Netherlands",
"country_code": "NL",
"team": {
"id": 214902,
"name": "Red Bull Racing",
"short_name": "Red Bull Racing",
"code": "RBR",
"country": "Austria",
"chassis": "RB22",
"engine": "Red Bull Ford DM01"
}
},
"start_number": 3,
"grid_position": 8,
"points": 18,
"time": "1:38:02.339",
"gap": "+0.196",
"interval": "+0.196",
"laps": 51,
"pit_stops": 2,
"fastest_lap_time": "1:44.993",
"personal_fastest_lap": 48,
"personal_fastest_lap_time": "1:44.993",
"tyre_type": "S",
"tyre_state": "Used",
"tyre_stints": [
{
"type": "M",
"laps": 31
},
{
"type": "S",
"laps": 20
}
],
"updated_timestamp": 1790428823
},
{
"competitor": {
"id": 41600,
"name": "Valtteri Bottas",
"short_name": "V. Bottas",
"code": "BOT",
"slug": "bottas-valtteri",
"kind": "individual",
"country": "Finland",
"country_code": "FI",
"team": {
"id": 1164925,
"name": "Cadillac Formula 1 Team",
"short_name": "Cadillac",
"code": "CAD",
"country": "USA",
"chassis": "MAC-26",
"engine": "Ferrari 067"
}
},
"start_number": 77,
"grid_position": 19,
"gap": "DNF",
"interval": "+32.838",
"laps": 49,
"pit_stops": 2,
"fastest_lap_time": "1:48.852",
"personal_fastest_lap": 49,
"personal_fastest_lap_time": "1:48.852",
"tyre_type": "S",
"tyre_state": "Used",
"tyre_stints": [
{
"type": "M",
"laps": 25
},
{
"type": "S",
"laps": 25
}
],
"status": "Out",
"sub_status": "Retired",
"comment": "Retired",
"did_not_finish": 1,
"updated_timestamp": 1790432289
}
]
}
}
| Field | Filled in, of 22 checked | Values in the sample |
|---|---|---|
| position | 15 | 1 to 15, median 8 |
| competitor | 22 | |
| start_number | 22 | 1 to 87, median 23 |
| grid_position | 22 | 1 to 22, median 11 |
| points | 10 | 1 to 25, median 8 |
| time | 15 | “1:38:02.143” and 14 other values |
| laps | 22 | 7 to 51, median 51 |
| laps_led | 1 | 51 |
| pit_stops | 20 | 1 to 3, median 2 |
| fastest_laps | 1 | 1 |
| fastest_lap_time | 22 | “1:44.916” and 21 other values |
| personal_fastest_lap | 22 | 7 to 50, median 45 |
| personal_fastest_lap_time | 22 | “1:44.916” and 21 other values |
| tyre_type | 22 | S (16), M (6) |
| tyre_state | 22 | Used (15), New (7) |
| tyre_stints | 22 | median 2 entries |
| updated_timestamp | 22 | 2026-09-26 |
| gap | 21 | “+0.196” and 14 other values |
| interval | 21 | “+0.196” and 17 other values |
| comment | 8 | Retired (7), Penalized 10 seconds (1) |
| status | 7 | Out in all 7 |
| sub_status | 7 | Retired in all 7 |
| did_not_finish | 7 | 1 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore stage id of a season, event, session or cycling stage | 214258 | |
| type | string | Yes | Classification kind Allowed values: competitor, team. | competitor | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/stage-standings?id=214258&type=competitor" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"stage_id": 214258,
"type": "competitor",
"count": 4,
"source_url": "https://api.sofascore.com/api/v1/stage/214258/standings/competitor",
"fetched_at": "2026-10-07T14:00:00Z",
"standings": [
{
"position": 2,
"competitor": {
"id": 191417,
"name": "Max Verstappen",
"short_name": "M. Verstappen",
"code": "VER",
"slug": "verstappen-max",
"kind": "individual",
"country": "Netherlands",
"country_code": "NL",
"team": {
"id": 214902,
"name": "Red Bull Racing",
"short_name": "Red Bull Racing",
"code": "RBR",
"country": "Austria",
"chassis": "RB22",
"engine": "Red Bull Ford DM01"
}
},
"start_number": 3,
"grid_position": 8,
"points": 18,
"time": "1:38:02.339",
"gap": "+0.196",
"interval": "+0.196",
"laps": 51,
"pit_stops": 2,
"fastest_lap_time": "1:44.993",
"personal_fastest_lap": 48,
"personal_fastest_lap_time": "1:44.993",
"tyre_type": "S",
"tyre_state": "Used",
"tyre_stints": [
{
"type": "M",
"laps": 31
},
{
"type": "S",
"laps": 20
}
],
"updated_timestamp": 1790428823
},
{
"competitor": {
"id": 41600,
"name": "Valtteri Bottas",
"short_name": "V. Bottas",
"code": "BOT",
"slug": "bottas-valtteri",
"kind": "individual",
"country": "Finland",
"country_code": "FI",
"team": {
"id": 1164925,
"name": "Cadillac Formula 1 Team",
"short_name": "Cadillac",
"code": "CAD",
"country": "USA",
"chassis": "MAC-26",
"engine": "Ferrari 067"
}
},
"start_number": 77,
"grid_position": 19,
"gap": "DNF",
"interval": "+32.838",
"laps": 49,
"pit_stops": 2,
"fastest_lap_time": "1:48.852",
"personal_fastest_lap": 49,
"personal_fastest_lap_time": "1:48.852",
"tyre_type": "S",
"tyre_state": "Used",
"tyre_stints": [
{
"type": "M",
"laps": 25
},
{
"type": "S",
"laps": 25
}
],
"status": "Out",
"sub_status": "Retired",
"comment": "Retired",
"did_not_finish": 1,
"updated_timestamp": 1790432289
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.stageStandingsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.StageStandingsResponse | No | ||||
| data.count | integer | No | ||||
| data.fetched_at | string | No | ||||
| data.source_url | string | No | ||||
| data.stage_id | integer | No | 214258 | |||
| data.standings | array | No | ||||
| data.standings[].bonus_points | number | No | ||||
| data.standings[].comment | string | No | Retired | |||
| data.standings[].competitor | sofascore.StageEntity | No | ||||
| data.standings[].competitor.code | string | No | RUS | Code is the three-letter timing code (for example RUS), when published. | ||
| data.standings[].competitor.country | string | No | United Kingdom | |||
| data.standings[].competitor.country_code | string | No | GB | |||
| data.standings[].competitor.id | integer | No | 271315 | |||
| data.standings[].competitor.kind | string | No | individual | Kind is individual for a driver or rider and team for a team or constructor. | ||
| data.standings[].competitor.name | string | No | George Russell | |||
| data.standings[].competitor.short_name | string | No | G. Russell | |||
| data.standings[].competitor.slug | string | No | russell-george | |||
| data.standings[].competitor.team | object | No | Team is the team or constructor of an individual competitor. | |||
| data.standings[].competitor.team.chassis | string | No | W17 | Chassis and Engine are published for Formula 1 constructors only. | ||
| data.standings[].competitor.team.code | string | No | MER | |||
| data.standings[].competitor.team.country | string | No | Germany | |||
| data.standings[].competitor.team.engine | string | No | Mercedes-AMG F1 M17 | |||
| data.standings[].competitor.team.id | integer | No | 214910 | |||
| data.standings[].competitor.team.name | string | No | Mercedes | |||
| data.standings[].competitor.team.short_name | string | No | Mercedes | |||
| data.standings[].did_not_finish | integer | No | 1 | DidNotFinish is 1 in a race row for a competitor who did not finish; in a NASCAR season row it counts the races not finished. | ||
| data.standings[].distance | number | No | 400 | Distance is the distance covered in a NASCAR race, in the series' unit (miles). | ||
| data.standings[].fastest_lap_time | string | No | 1:44.916 | |||
| data.standings[].fastest_laps | integer | No | 1 | FastestLaps is the number of fastest laps (race row) or fastest laps of the season (season row). | ||
| data.standings[].gap | string | No | +0.196 | Gap is the time behind the leader, or DNF (did not finish) or DNS (did not start). | ||
| data.standings[].grid_position | integer | No | 1 | GridPosition is the starting grid slot of a race. | ||
| data.standings[].interval | string | No | +0.196 | Interval is the time behind the competitor ahead. | ||
| data.standings[].jersey | string | No | general | Jersey is the classification jersey a cycling rider wears (general for the overall leader). | ||
| data.standings[].laps | integer | No | 51 | |||
| data.standings[].laps_behind | integer | No | ||||
| data.standings[].laps_led | integer | No | 51 | |||
| data.standings[].personal_fastest_lap | integer | No | 49 | |||
| data.standings[].personal_fastest_lap_time | string | No | 1:44.916 | |||
| data.standings[].pit_stops | integer | No | 2 | |||
| data.standings[].podiums | integer | No | 13 | |||
| data.standings[].points | number | No | 25 | Points are omitted when the row earned none published. | ||
| data.standings[].pole_positions | integer | No | 6 | |||
| data.standings[].position | integer | No | 1 | Position is the classified position. It is omitted for competitors who did not finish or set no time. | ||
| data.standings[].races_started | integer | No | 16 | |||
| data.standings[].races_with_points | integer | No | 14 | |||
| data.standings[].rank | integer | No | Rank is the points rank of a NASCAR classification, which can differ from Position. | |||
| data.standings[].start_number | integer | No | 63 | StartNumber is the car, bike or bib number. | ||
| data.standings[].status | string | No | Out | Status is Finished, Out or Did not start; SubStatus gives the reason (Retired, Did not start); Comment is free text. | ||
| data.standings[].sub_status | string | No | Retired | |||
| data.standings[].time | string | No | 1:38:02.143 | Time is the race time, the best lap of a practice or qualifying session, or a stage time. Some series (IndyCar) publish the time behind the winner here for every row but the first. | ||
| data.standings[].top10 | integer | No | ||||
| data.standings[].top5 | integer | No | ||||
| data.standings[].total_time | string | No | 28:57:04 | |||
| data.standings[].tyre_state | string | No | Used | |||
| data.standings[].tyre_stints | array | No | ||||
| data.standings[].tyre_stints[].laps | integer | No | 31 | |||
| data.standings[].tyre_stints[].type | string | No | M | |||
| data.standings[].tyre_type | string | No | S | TyreType is the compound code at the finish (S, M observed); TyreStints lists every stint. | ||
| data.standings[].updated_timestamp | integer | No | 1790428823 | UpdatedTimestamp is when SofaScore last updated the row (Unix seconds). | ||
| data.standings[].victories | integer | No | 8 | Season championship totals. | ||
| data.type | string | No | competitor | |||
| 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-standings?id=214258&type=competitor" \
-H "x-api-key: $CRAWLORA_API_KEY"