Tour de France Rankings & Stages Scraper avatar

Tour de France Rankings & Stages Scraper

Pricing

Pay per event

Go to Apify Store
Tour de France Rankings & Stages Scraper

Tour de France Rankings & Stages Scraper

Scrapes official Tour de France jersey rankings (GC, points, mountains, youth, team) and stage metadata (start/finish cities, distance, elevation, type) from letour.fr. Covers all 21 stages — ideal for fantasy cycling, sports analytics, and content pipelines during the July race window.

Pricing

Pay per event

Rating

0.0

(0)

Developer

BowTiedRaccoon

BowTiedRaccoon

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

2

Monthly active users

11 days ago

Last modified

Categories

Share

Scrapes official Tour de France jersey rankings (GC, points, mountains, youth, and team) plus stage metadata (start/finish cities, distance, elevation, stage type) directly from letour.fr. Covers all 21 stages — updated daily during the July race window.

What does it do?

Each run retrieves:

  • Stage metadata — start/finish cities, total distance, elevation gain, and stage classification (Flat, Hilly, Mountain, Individual Time Trial, Team Time Trial)
  • Jersey rankings for each stage across up to 7 classification types: General (GC yellow), Points (green), Mountains (polka-dot), Youth (white), Team, Combative, and Lanterne Rouge
  • Rider details — position, bib number, name, country (ISO 3-letter code), team name, accumulated time, time gap to leader, and points

Data is sourced from the official site's AJAX ranking endpoints, which return server-rendered HTML for every completed stage.

Why use this instead of scraping ProCyclingStats?

ProCyclingStats is the de facto third-party cycling data source but it is protected by Cloudflare (verified 403 in pre-flight testing). letour.fr serves the same official rankings from clean, datacenter-friendly HTML with no bot protection — no residential proxy required.

Input

FieldTypeDefaultDescription
yearinteger2026Tour de France year to scrape
stageNumbersarray of integersall 21 stagesFilter to specific stages, e.g. [1, 2, 21]
rankingTypesarray of stringsall typesWhich jersey rankings to scrape: general, points, mountains, youth, team, combative, lanterne_rouge
maxItemsinteger0 (unlimited)Hard cap on total records saved

Output dataset fields

FieldTypeDescription
yearintegerTour de France year
stage_numberintegerStage number (1–21)
stage_typestringFlat / Hilly / Mountain / Individual Time Trial / Team Time Trial
start_citystringStage start city
finish_citystringStage finish city
distance_kmnumberStage distance in km
elevation_gain_mintegerTotal elevation gain in metres
ranking_typestringgeneral / points / mountains / youth / team / combative / lanterne_rouge
positionintegerRider position in the ranking
bibintegerRider bib number
rider_namestringRider abbreviated name (e.g. "T. POGACAR")
rider_countrystringCountry code (ISO 3166-1 alpha-3, e.g. "SLO")
team_namestringFull team name
team_codestringTeam 3-letter code (where available)
finish_timestringAccumulated race time for general/youth/team rankings
time_gapstringTime gap to race leader
pointsintegerPoints total for green/mountains rankings
sourcestringSource URL of the ranking data

Sample output (Stage 21 GC, 2025)

{
"year": 2026,
"stage_number": 21,
"stage_type": "Flat",
"start_city": "Thoiry",
"finish_city": "Paris Champs-Élysées",
"distance_km": 133,
"elevation_gain_m": 1000,
"ranking_type": "general",
"position": 1,
"bib": 1,
"rider_name": "T. POGACAR",
"rider_country": "SLO",
"team_name": "UAE TEAM EMIRATES XRG",
"team_code": null,
"finish_time": "76h 00' 32''",
"time_gap": null,
"points": null,
"source": "https://www.letour.fr/en/ajax/ranking/21/itg/2b9.../subtab"
}

Usage tips

  • During the race window (July 4–26, 2026): Run daily to capture updated standings after each stage finishes. Stage 1–20 rankings update that evening; Stage 21 (Paris) closes the tour.
  • Historical data: Stage results from the 2025 Tour are accessible at the same URL paths.
  • Future stages: Ranking tabs are only populated for completed stages. Running the scraper on a future stage returns 0 results for that stage — no error is thrown.
  • Scaling: For a full run (21 stages × 5 jersey types = ~105 ranking tables × ~160 riders = ~16,800 rows), a single run completes in under 3 minutes at the default concurrency of 5.

Technical notes

The actor uses a 4-level hierarchical crawl:

  1. /en/overall-route → discovers all stage links
  2. /en/stage-N → extracts stage metadata (city names from page title, distance/type/elevation from stageHeader__infos blocks)
  3. /en/rankings/stage-N → discovers AJAX subtab URLs (hash-keyed, rotated per year)
  4. /en/ajax/ranking/N/<type>/<hash>/subtab → parses rider rows from the rankings table HTML