Data files

The JSON files behind every page: the 2026 race calendars, Grand Tour stages, results, rankings, FTP levels and event cut-offs. Each one with what it holds, its fields and types, and when it changes.

Published · Updated

Licence: not decided yet. Ask before reusing: https://pavel-f.com.

When each file last changed

The results files stopped on 4 Oct 2026. The newest race in them ended on 13 Sep 2026 (men) and 29 Aug 2026 (women); 5 men's and 7 women's races that have finished since are not in them.

Fetch a file

Every file is at https://cyclinggrid.com/data/v1/<path>. The same file stays at https://cyclinggrid.com/data/<path>, so older links keep working.

curl https://cyclinggrid.com/data/v1/races-2026.json

Each .json file is sent with Access-Control-Allow-Origin: *, so a page on any site can fetch it, and with Link: <https://cyclinggrid.com/data>; rel="describedby", which points here. Caches keep a file for 5 minutes in a browser and 1 hour at the edge. This page is also at /data/README.md.

Every file

FileHoldsHow oftenLast changed
races-2026.jsonRace calendarBy hand, when the calendar changesNot dated in the file
women/races-2026.jsonRace calendar (women)By hand, when the calendar changesNot dated in the file
grand-tours/giro-2026.jsonGrand tour stagesBy hand, when a route changesNot dated in the file
grand-tours/tour-2026.jsonGrand tour stagesBy hand, when a route changesNot dated in the file
grand-tours/vuelta-2026.jsonGrand tour stagesBy hand, when a route changesNot dated in the file
women/grand-tours/giro-2026.jsonGrand tour stages (women)By hand, when a route changesNot dated in the file
women/grand-tours/tour-2026.jsonGrand tour stages (women)By hand, when a route changesNot dated in the file
women/grand-tours/vuelta-2026.jsonGrand tour stages (women)By hand, when a route changesNot dated in the file
results/recent-results.jsonResultsEvery night at 20:00 UTC, when a race has finished
women/results/recent-results.jsonResults (women)Every night at 20:00 UTC, when a race has finished
results/rider-rankings.jsonRider rankingEvery night at 20:00 UTC, when a race has finished
women/results/rider-rankings.jsonRider ranking (women)Every night at 20:00 UTC, when a race has finished
results/team-standings.jsonTeam standingsEvery night at 20:00 UTC, when a race has finished
women/results/team-standings.jsonTeam standings (women)Every night at 20:00 UTC, when a race has finished
results/points-timeline.jsonPoints over the seasonEvery night at 20:00 UTC, when a race has finished
women/results/points-timeline.jsonPoints over the season (women)Every night at 20:00 UTC, when a race has finished
startlists.jsonStart listsBy hand
ftp-levels.jsonFTP levelsBy hand, when the source changes
events/etape-du-tour-2027.jsonEvent cut-offsBy hand, when the organiser publishes new figures
events/unbound-200.jsonEvent cut-offsBy hand, when the organiser publishes new figures

What each file holds

Race calendar

Every race of the 2026 season: the men's WorldTour, or the Women's WorldTour in women/. Dates, country, type, stages and distance.

Changes: By hand, when the calendar changes.

curl https://cyclinggrid.com/data/v1/races-2026.json
curl https://cyclinggrid.com/data/v1/women/races-2026.json
Fields and types
FieldTypeNotes
seasonnumber
racesarray of objects
races[].idstringThe race page is /race/<id>
races[].namestring
races[].startDatestring (YYYY-MM-DD)
races[].endDatestring (YYYY-MM-DD)
races[].countrystring
races[].countryCodestring
races[].categorystringOne of: classic, grand-tour, monument, one-day, stage-race
races[].classificationstringOne of: 1.UWT, 1.WWT, 2.UWT, 2.WWT
races[].stagesnumber1 for a one-day race
races[].distancenumberKilometres, all stages together
races[].importancenumber
tourstringNot in every file

Grand tour stages

The stages of one 2026 Grand Tour (Giro, Tour, Vuelta), men's or women's: date, start, finish, distance, type and profile.

Changes: By hand, when a route changes.

curl https://cyclinggrid.com/data/v1/grand-tours/giro-2026.json
curl https://cyclinggrid.com/data/v1/grand-tours/tour-2026.json
curl https://cyclinggrid.com/data/v1/grand-tours/vuelta-2026.json
curl https://cyclinggrid.com/data/v1/women/grand-tours/giro-2026.json
curl https://cyclinggrid.com/data/v1/women/grand-tours/tour-2026.json
curl https://cyclinggrid.com/data/v1/women/grand-tours/vuelta-2026.json
Fields and types
FieldTypeNotes
namestring
yearnumber
startDatestring (YYYY-MM-DD)
endDatestring (YYYY-MM-DD)
totalDistancenumberKilometres
stagesarray of objects
stages[].stagenumberNot in every item
stages[].datestring (YYYY-MM-DD)
stages[].startstringNot in every item
stages[].endstringNot in every item
stages[].distancenumberKilometres. Not in every item
stages[].typestringOne of: itt, road. Not in every item
stages[].profilestringOne of: flat, hilly, mountain. Not in every item
stages[].restbooleanNot in every item

Results

The podium (first three) of finished 2026 races, and of each stage of a stage race. Not the full classification.

Changes: Every night at 20:00 UTC, when a race has finished. Each file dates itself in lastUpdated.

Missing (men): Giro dell'Emilia, Tre Valli Varesine, Milano–Torino, Giro di Lombardia, Tour of Guangxi.

Missing (women): Vuelta España Femenina, Simac Ladies Tour, GP de Plouay–Bretagne Women, Ceratizit Challenge Madrid, Giro dell'Emilia Women, Tour of Guangxi Women, Japan Cup Women.

curl https://cyclinggrid.com/data/v1/results/recent-results.json
curl https://cyclinggrid.com/data/v1/women/results/recent-results.json
Fields and types
FieldTypeNotes
lastUpdatedstring (YYYY-MM-DD)
resultsarray of objects
results[].raceIdstringThe id in the race calendar
results[].raceNamestring
results[].datestring (YYYY-MM-DD)
results[].countrystring
results[].countryCodestring
results[].categorystringOne of: grand-tour, one-day, stage-race
results[].classificationstringOne of: 1.1, 2.Pro, GT, ProSeries, UWT, WWT
results[].podiumarray of objects
results[].podium[].positionnumber
results[].podium[].riderstring
results[].podium[].teamstring
results[].podium[].timestringA time, or a gap such as +0:05; can be empty
results[].endDatestring (YYYY-MM-DD)Not in every item
results[].stagesarray of objectsNot in every item
results[].stages[].stagenumber
results[].stages[].podiumarray of objects
results[].stages[].podium[].positionnumber
results[].stages[].podium[].riderstring
results[].stages[].podium[].teamstring
results[].stages[].podium[].timestringA time, or a gap such as +0:05; can be empty

Rider ranking

The top 30 riders by points, added up from the podiums with the UCI scale. Not the official ranking.

Changes: Every night at 20:00 UTC, when a race has finished. Each file dates itself in lastUpdated.

curl https://cyclinggrid.com/data/v1/results/rider-rankings.json
curl https://cyclinggrid.com/data/v1/women/results/rider-rankings.json
Fields and types
FieldTypeNotes
lastUpdatedstring (YYYY-MM-DD)
seasonnumber
rankingsarray of objects
rankings[].ranknumber
rankings[].riderstring
rankings[].teamstring
rankings[].pointsnumber

Team standings

The teams by points, added up from their riders’ podiums, each with its three highest-scoring riders.

Changes: Every night at 20:00 UTC, when a race has finished. Each file dates itself in lastUpdated.

curl https://cyclinggrid.com/data/v1/results/team-standings.json
curl https://cyclinggrid.com/data/v1/women/results/team-standings.json
Fields and types
FieldTypeNotes
lastUpdatedstring (YYYY-MM-DD)
seasonnumber
teamsarray of objects
teams[].teamstring
teams[].pointsnumber
teams[].topRidersarray of objects
teams[].topRiders[].riderstring
teams[].topRiders[].pointsnumber
teams[].ranknumber

Points over the season

For the top 5 riders, the points of each race they scored in, and their total after it.

Changes: Every night at 20:00 UTC, when a race has finished. Each file dates itself in lastUpdated.

curl https://cyclinggrid.com/data/v1/results/points-timeline.json
curl https://cyclinggrid.com/data/v1/women/results/points-timeline.json
Fields and types
FieldTypeNotes
lastUpdatedstring (YYYY-MM-DD)
seasonnumber
ridersarray of objects
riders[].riderstring
riders[].teamstring
riders[].timelinearray of objects
riders[].timeline[].datestring (YYYY-MM-DD)
riders[].timeline[].racestring
riders[].timeline[].pointsnumber
riders[].timeline[].cumulativenumberPoints so far this season, after this race

Start lists

The star riders on the start lists of some men's races, by race id.

Changes: By hand. Each file dates itself in lastUpdated.

curl https://cyclinggrid.com/data/v1/startlists.json
Fields and types
FieldTypeNotes
lastUpdatedstring (YYYY-MM-DD)
startlistsobject
startlists.<race id>object
startlists.<race id>.starsarray of objects
startlists.<race id>.stars[].riderstring
startlists.<race id>.stars[].teamstring
startlists.<race id>.stars[].uciRanknumber

FTP levels

FTP levels in W/kg for men and women (Garmin FTP ratings, after Allen and Coggan), with their source.

Changes: By hand, when the source changes. Each file dates itself in asOf.

curl https://cyclinggrid.com/data/v1/ftp-levels.json
Fields and types
FieldTypeNotes
sourcestring
sourceUrlstring
attributionstring
asOfstring (YYYY-MM-DD)
unitstring
notestring
levelsarray of objects
levels[].namestring
levels[].menarray of numbers or no value[from, to] in W/kg; an open end has no value
levels[].womenarray of numbers or no value[from, to] in W/kg; an open end has no value

Event cut-offs

One amateur event: its date and distance, and its start time, checkpoints and cut-offs; while the organiser has not published them, time_limits has no value and the file holds the route and its climbs. Every figure carries its source, source name and a licence tag.

Changes: By hand, when the organiser publishes new figures. Each file dates itself in lastUpdated.

curl https://cyclinggrid.com/data/v1/events/etape-du-tour-2027.json
curl https://cyclinggrid.com/data/v1/events/unbound-200.json
Fields and types
FieldTypeNotes
lastUpdatedstring (YYYY-MM-DD)
$commentstring
slugobject
slug.valuestring
slug.sourcestring
slug.licencestring
nameobject
name.valuestring
name.sourcestring
name.source_namestring
name.licencestring
name.asOfstring (YYYY-MM-DD)Not in every item
short_nameobject
short_name.valuestring
short_name.sourcestring
short_name.source_namestring
short_name.licencestring
short_name.asOfstring (YYYY-MM-DD)Not in every item
yearobjectNot in every file
year.valuenumber
year.sourcestring
year.source_namestring
year.licencestring
year.asOfstring (YYYY-MM-DD)
editionobjectNot in every file
edition.valuenumber
edition.sourcestring
edition.source_namestring
edition.licencestring
edition.asOfstring (YYYY-MM-DD)
dateobject
date.valuestring (YYYY-MM-DD)
date.labelstring
date.sourcestring
date.source_namestring
date.licencestring
date.asOfstring (YYYY-MM-DD)Not in every item
startobjectNot in every file
start.valueobject
start.value.namestring
start.value.regionstring
start.sourcestring
start.source_namestring
start.licencestring
start.asOfstring (YYYY-MM-DD)
finishobjectNot in every file
finish.valueobject
finish.value.namestring
finish.value.regionstring
finish.sourcestring
finish.source_namestring
finish.licencestring
finish.asOfstring (YYYY-MM-DD)
distance_kmobject
distance_km.valuenumberKilometres
distance_km.sourcestring
distance_km.source_namestring
distance_km.licencestring
distance_km.asOfstring (YYYY-MM-DD)Not in every item
elevation_mobject
elevation_m.valuenumber
elevation_m.sourcestring
elevation_m.source_namestring
elevation_m.licencestring
elevation_m.asOfstring (YYYY-MM-DD)
major_climbsobjectNot in every file
major_climbs.valuenumber
major_climbs.sourcestring
major_climbs.source_namestring
major_climbs.licencestring
major_climbs.asOfstring (YYYY-MM-DD)
climbsarray of objectsNot in every file
climbs[].namestring
climbs[].length_kmnumber or no valueKilometres; no value while the organiser has not published it
climbs[].gradient_pctnumber or no valueAverage gradient in %; no value while the organiser has not published it
climbs[].sourcestring
climbs[].source_namestring
climbs[].licencestringOne of: public-fact
climbs[].asOfstring (YYYY-MM-DD)
time_limitsno valueNot in every file
reference_2026objectNot in every file
reference_2026.valueobject
reference_2026.value.yearnumber
reference_2026.value.finishobject
reference_2026.value.finish.namestring
reference_2026.value.max_timestring
reference_2026.value.segmentsarray of objects
reference_2026.value.segments[].fromobject
reference_2026.value.segments[].from.namestring
reference_2026.value.segments[].from.kmnumber
reference_2026.value.segments[].toobject
reference_2026.value.segments[].to.namestring
reference_2026.value.segments[].to.kmnumber
reference_2026.value.segments[].kmnumber
reference_2026.value.segments[].clock_fromstring
reference_2026.value.segments[].clock_tostring
reference_2026.sourcestring
reference_2026.source_namestring
reference_2026.licencestring
reference_2026.asOfstring (YYYY-MM-DD)
registrationobjectNot in every file
registration.valuestring
registration.labelstring
registration.timezonestring
registration.sourcestring
registration.source_namestring
registration.licencestring
registration.asOfstring (YYYY-MM-DD)
distance_km.confirmedbooleanNot in every item
start_timeobjectNot in every file
start_time.valuestring
start_time.labelstring
start_time.sourcestring
start_time.source_namestring
start_time.licencestring
start_time.confirmedboolean
surfaceobjectNot in every file
surface.valuestring
surface.sourcestring
surface.source_namestring
surface.licencestring
checkpointsarray of objectsNot in every file
checkpoints[].namestring
checkpoints[].kmnumberKilometres from the start
checkpoints[].cutoff_localstringLocal clock time, HH:MM
checkpoints[].sourcestring
checkpoints[].source_namestring
checkpoints[].licencestringOne of: public-fact
checkpoints[].confirmedboolean
finish_cutoff_localobjectNot in every file
finish_cutoff_local.valuestringLocal clock time, HH:MM; +1 is the next day
finish_cutoff_local.labelstring
finish_cutoff_local.sourcestring
finish_cutoff_local.source_namestring
finish_cutoff_local.licencestring
finish_cutoff_local.confirmedboolean
cutoff_yearobjectNot in every file
cutoff_year.valuenumber
cutoff_year.sourcestring
cutoff_year.source_namestring
cutoff_year.licencestring
locationobjectNot in every file
location.valuestring
location.sourcestring
location.source_namestring
location.licencestring
lotteryobjectNot in every file
lottery.valuearray of objects
lottery.value[].labelstring
lottery.value[].datestring (YYYY-MM-DD)
lottery.sourcestring
lottery.source_namestring
lottery.licencestring