
Saturday, September 13: Stage 20, Robledo de Chavela - Bola del Mundo - Puerto de Navacerrada, 155.8 km
Stage 20 map & profile | Stage 20 photos

Jonas Vingegaard wins the stage and effectively wins the 2025 Vuelta a España.
Bill & Carol McGann’s book The Story of the 2023 Tour de France, 2023: The Viking Again Conquers the Tour is available in both Kindle eBook & audiobook versions. To get your copy, just click on the Amazon link on the right.
Weather at the city of Guadarrama, on the route, 30 km from the finish., at 2:20 PM, local time: 27C (80F), fair, with the wind from the northwest at 11 km/hr (7 mph). No rain is forecast.
Rated ascents:
The stage: Final mountain stage of this edition. The stage will be very winding, with hardly any flat areas, and will bring back such historic climbs as the Alto del León. An escape may happen from the first climb of the day, at Escondida, in order to push the peloton to its limits as they battle for a stage victory. The Navacerrada mountain pass will be the star of the day, first on its Segovian side with its ‘siete revueltas’ (or seven tight curves) and then the final climb from Becerril de la Sierra to Bola del Mundo climb. The Guadarrama Mountain Range will crown the winner of La Vuelta 25.
The race: Here's the race organizer's stage 20 report.
Jonas Vingegaard (Visma-Lease a Bike) all but sealed his overall triumph in Madrid as he powered to victory on the gruelling slopes of Bola del Mundo, the penultimate stage of La Vuelta 25. The Danish climber fended off aggressive racing from UAE Team Emirates-XRG and Red Bull-Bora-Hansgrohe, and then put the hammer down with 1.2 km to go on the steepest gradients of the final climb of the Spanish Grand Tour.
His lieutenant Sepp Kuss came 2nd on his 31st birthday, highlighting Visma-Lease a Bike’s dominance, while Jai Hindley (Red Bull-Bora-Hansgrohe) took 3rd but couldn’t push Tom Pidcock (Q36.5) off the overall podium. Already a two-time Tour de France winner, Vingegaard now has five La Vuelta stage wins and is set to become the first Dane to win the event, ahead of Portugal’s Joao Almeida (UAE Team Emirates-XRG).

The scene at the start line.
The race
It’s time for the final mountain showdown of La Vuelta 25! On the eve of the arrival in Madrid, the riders face the stage with most elevation - 4,226m - to reach the highest summit of this edition: the mighty Bola del Mundo, at 2,251 metres of altitude, with a brutal three final kilometres.
A strong break closely watched by the bunch
The start is uphill as well, on the slopes up the Alto de la Escondida. Ineos Grenadiers want to force a strong move. Filippo Ganna is the first attacker of the day, followed by Egan Bernal. The likes of Michal Kwiatkowski, Bob Jungels and Brandon Rivera also get in the mix… A 37-man breakaway eventually goes clear on the second ascent of the day, Alto de Parpadilla.

Stage 20 gets rolling.
Bernal is up there, with Jungels and Rivera. There are four riders from Lidl-Trek, with the local hero Carlos Verona on his home roads, alongside Mads Pedersen, Giulio Ciccone and Julien Bernard. Fierce attackers like Eddie Dunbar (Jayco AlUla) and Mikel Landa (Soudal Quick-Step) made the break as well. But the peloton don’t give them much leeway.
UAE Team Emirates-XRG and Red Bull-Bora-Hansgrohe collaborate to maintain the gap under 2 minutes. The breakaway conquers the Alto del Leon (km 59) and explodes on the Alto de Navacerrada, crested in first position by Jardi van der Lee (EF Education-EasyPost).

The peloton with about 60 km to go, before the Alto de Navacerrada climb. A large break is 1min 20sec up the road.
Almeida and Hindley try, Vingegaard takes off
At the bottom of the final climb (12.3 km at 8.6%, with gradients up to 20%), the Dutch attacker is with Bernal, Landa, and Ciccone, a minute ahead of the bunch. Ciccone and Landa rapidly isolate themselves at the front while UAE Team Emirates-XRG up the ante in the GC group.
The two leaders are caught 3 kilometres before the summit, as they hit the steepest gradients of the ascent. Jay Vine steps aside, Joao Almeida (UAE Team Emirates-XRG) sets the pace. Jai Hindley (Red Bull-Bora-Hansgrohe) accelerates with 2.5 km to go. He’s followed by Jonas Vingegaard, Sepp Kuss (Visma-Lease a Bike), Joao Almeida and Tom Pidcock (Q36.5).
Vingegaard sets off 1.2 km away from the line and takes victory 11’’ ahead of Kuss, on his 31st birthday. Hindley rounds the podium on the day (+13’’), ahead of Pidcock (+18’’), who retains 3rd place in the overall standings.
Complete results:
155.8 kilometers raced at an average speed of 39.546 km/hr
| 1 | Jonas Vingegaard | Team Visma | Lease a Bike | 3hr 56min 23sec |
| 2 | Sepp Kuss | Team Visma | Lease a Bike | @ 11sec |
| 3 | Jai Hindley | Red Bull-BORA-hansgrohe | 0:13 |
| 4 | Tom Pidcock | Q36.5 Pro Cycling Team | 0:18 |
| 5 | João Almeida | UAE Team Emirates-XRG | 0:22 |
| 6 | Matthew Riccitello | Israel-Premier Tech | 0:24 |
| 7 | Jay Vine | UAE Team Emirates-XRG | 0:47 |
| 8 | Giulio Ciccone | Lidl-Trek | 1:11 |
| 9 | Junior Lecerf | Soudal Quick-Step | 1:22 |
| 10 | Finlay Pickering | Bahrain Victorious | 1:30 |
| 11 | Matteo Jorgenson | Team Visma | Lease a Bike | 1:45 |
| 12 | Torstein Træen | Bahrain Victorious | 1:52 |
| 13 | Felix Gall | Decathlon AG2R La Mondiale | 2:16 |
| 14 | Mikel Landa | Soudal Quick-Step | 2:21 |
| 15 | Damien Howson | Q36.5 Pro Cycling Team | 2:40 |
| 16 | Giulio Pellizzari | Red Bull-BORA-hansgrohe | 2:50 |
| 17 | Abel Balderstone | Caja Rural-Seguros RGA | 3:06 |
| 18 | Jaume Guardeño | Caja Rural-Seguros RGA | 3:56 |
| 19 | Ben Tulett | Team Visma | Lease a Bike | 4:18 |
| 20 | Sergio Chumil | Burgos Burpellet BH | 4:32 |
| 21 | Egan Bernal | INEOS Grenadiers | 4:51 |
| 22 | Edward Dunbar | Team Jayco-AlUla | 4:54 |
| 23 | Mario Aparicio | Burgos Burpellet BH | 5:18 |
| 24 | Harold Tejada | XDS Astana Team | 5:32 |
| 25 | Martin López | XDS Astana Team | 5:43 |
| 26 | Rudy Molard | Groupama-FDJ | 5:50 |
| 27 | Bruno Armirail | Decathlon AG2R La Mondiale | 6:14 |
| 28 | Felix Grossschartner | UAE Team Emirates-XRG | 7:03 |
| 29 | Wilco Kelderman | Team Visma | Lease a Bike | s.t. |
| 30 | Jan Hirt | Israel-Premier Tech | 7:17 |
| 31 | Louis Rouland | Arkea-B&B Hotels | 7:49 |
| 32 | Julien Bernard | Lidl-Trek | 8:55 |
| 33 | Eduardo Sepulveda | Lotto | 8:59 |
| 34 | Sergio Samitier | Cofidis | 9:08 |
| 35 | Joan Bou | Caja Rural-Seguros RGA | 9:22 |
| 36 | José Luis Faura | Burgos Burpellet BH | 9:25 |
| 37 | Louis Meintjes | Intermarché-Wanty | s.t. |
| 38 | Clément Braz Afonso | Groupama-FDJ | 9:34 |
| 39 | Kevin Vermaerke | Team Picnic PostNL | 9:48 |
| 40 | Pierre Thierry | Arkea-B&B Hotels | 10:04 |
| 41 | Jardi Van Der Lee | EF Education-EasyPost | 10:11 |
| 42 | Mathijs Paasschens | Bahrain Victorious | 10:21 |
| 43 | Santiago Buitrago | Bahrain Victorious | 11:05 |
| 44 | Antonio Tiberi | Bahrain Victorious | 11:05 |
| 45 | Nicola Conci | XDS Astana Team | 12:09 |
| 46 | Joel Nicolau | Caja Rural-Seguros RGA | 13:01 |
| 47 | Wout Poels | XDS Astana Team | 13:20 |
| 48 | Lars Craps | Lotto | 13:40 |
| 49 | Bob Jungels | INEOS Grenadiers | 13:45 |
| 50 | David González | Q36.5 Pro Cycling Team | 14:40 |
| 51 | Marco Frigo | Israel-Premier Tech | 14:46 |
| 52 | Fausto Masnada | XDS Astana Team | 15:03 |
| 53 | Jonas Gregaard | Lotto | 15:32 |
| 54 | Kamiel Bonneu | Intermarché-Wanty | 16:08 |
| 55 | Hugo de la Calle | Burgos Burpellet BH | 16:10 |
| 56 | Louis Vervaeke | Soudal Quick-Step | 17:04 |
| 57 | Patrick Gamper | Team Jayco-AlUla | 17:56 |
| 58 | Juan Ayuso | UAE Team Emirates-XRG | 18:11 |
| 59 | Carlos Canal | Movistar Team | s.t. |
| 60 | Marc Soler | UAE Team Emirates-XRG | 18:12 |
| 61 | Giovanni Aleotti | Red Bull-BORA-hansgrohe | s.t. |
| 62 | Jakub Otruba | Caja Rural-Seguros RGA | 18:19 |
| 63 | Carlos Verona | Lidl-Trek | 18:27 |
| 64 | Chris Hamilton | Team Picnic PostNL | 19:11 |
| 65 | Gijs Leemreize | Team Picnic PostNL | s.t. |
| 66 | Jesus Herrada | Cofidis | 19:15 |
| 67 | Andrea Bagioli | Lidl-Trek | 19:23 |
| 68 | Alex Molenaar | Caja Rural-Seguros RGA | s.t. |
| 69 | Christopher Juul-Jensen | Team Jayco-AlUla | 19:29 |
| 70 | Simone Petilli | Intermarché-Wanty | 19:49 |
| 71 | Ben Zwiehoff | Red Bull-BORA-hansgrohe | 20:05 |
| 72 | Juan Martinez | Team Picnic PostNL | 20:09 |
| 73 | Emanuel Buchmann | Cofidis | 20:25 |
| 74 | Max Schachmann | Soudal Quick-Step | 20:44 |
| 75 | Callum Scotson | Decathlon AG2R La Mondiale | 20:47 |
| 76 | James Shaw | EF Education-EasyPost | 20:56 |
| 77 | Michel Hessmann | Movistar Team | 21:00 |
| 78 | Roman Ermakov | Bahrain Victorious | 21:20 |
| 79 | David Gaudu | Groupama-FDJ | 21:39 |
| 80 | Jefferson Cepeda | Movistar Team | 21:52 |
| 81 | Kelland O'Brien | Team Jayco-AlUla | 21:54 |
| 82 | Nickolas Zukowsky | Q36.5 Pro Cycling Team | 22:00 |
| 83 | Jordan Labrosse | Decathlon AG2R La Mondiale | 22:14 |
| 84 | Alessandro Verre | Arkea-B&B Hotels | 22:26 |
| 85 | Markel Beloki | EF Education-EasyPost | 22:39 |
| 86 | Orluis Aular | Movistar Team | 24:29 |
| 87 | Léo Bisiaux | Decathlon AG2R La Mondiale | s.t. |
| 88 | Iván García Cortina | Movistar Team | 24:48 |
| 89 | Edward Planckaert | Alpecin-Deceuninck | 24:54 |
| 90 | Marcel Camprubí | Q36.5 Pro Cycling Team | 24:58 |
| 91 | Dylan van Baarle | Team Visma | Lease a Bike | 25:02 |
| 92 | Mauri Vansevenant | Soudal Quick-Step | s.t. |
| 93 | Lorenzo Fortunato | XDS Astana Team | 26:45 |
| 94 | Johannes Staune-Mittet | Decathlon AG2R La Mondiale | 27:06 |
| 95 | Sander De Pestel | Decathlon AG2R La Mondiale | s.t. |
| 96 | Alec Segaert | Lotto | 27:23 |
| 97 | Lukas Nerurkar | EF Education-EasyPost | 27:52 |
| 98 | Sean Quinn | EF Education-EasyPost | s.t. |
| 99 | Nans Peters | Decathlon AG2R La Mondiale | 28:15 |
| 100 | Thibaud Gruel | Groupama-FDJ | s.t. |
| 101 | Luca Van Boven | Intermarché-Wanty | s.t. |
| 102 | Ben Turner | INEOS Grenadiers | 28:22 |
| 103 | Michal Kwiatkowski | INEOS Grenadiers | s.t. |
| 104 | Magnus Sheffield | INEOS Grenadiers | s.t. |
| 105 | Victor Langellotti | INEOS Grenadiers | s.t. |
| 106 | Brieuc Rolland | Groupama-FDJ | s.t. |
| 107 | Jack Haig | Bahrain Victorious | s.t. |
| 108 | Dries De Pooter | Intermarché-Wanty | s.t. |
| 109 | Dion Smith | Intermarché-Wanty | s.t. |
| 110 | Pier-André Côté | Israel-Premier Tech | 28:33 |
| 111 | Nicolò Buratti | Bahrain Victorious | 28:42 |
| 112 | Filippo Ganna | INEOS Grenadiers | 28:46 |
| 113 | Matteo Sobrero | Red Bull-BORA-hansgrohe | s.t. |
| 114 | Huub Artz | Intermarché-Wanty | 29:01 |
| 115 | Stefan Küng | Groupama-FDJ | 29:49 |
| 116 | Nadav Raisberg | Israel-Premier Tech | s.t. |
| 117 | David de la Cruz | Q36.5 Pro Cycling Team | 29:57 |
| 118 | Bjoern Koerdt | Team Picnic PostNL | 30:01 |
| 119 | Ivo Oliveira | UAE Team Emirates-XRG | 30:52 |
| 120 | Liam Slock | Lotto | 31:11 |
| 121 | Brandon Rivera | INEOS Grenadiers | 32:03 |
| 122 | Anders Foldager | Team Jayco-AlUla | 33:56 |
| 123 | Thomas Silva | Caja Rural-Seguros RGA | 34:05 |
| 124 | Léandre Lozouet | Arkea-B&B Hotels | s.t. |
| 125 | Jonas Rickaert | Alpecin-Deceuninck | 34:10 |
| 126 | Gal Glivar | Alpecin-Deceuninck | 34:13 |
| 127 | Nicolas Vinokurov | XDS Astana Team | 34:33 |
| 128 | Madis Mihkels | EF Education-EasyPost | 34:36 |
| 129 | Elia Viviani | Lotto | 34:56 |
| 130 | Jasper De Buyst | Lotto | s.t. |
| 131 | Victor Guernalec | Arkea-B&B Hotels | 35:04 |
| 132 | Domen Novak | UAE Team Emirates-XRG | 35:22 |
| 133 | Jenthe Biermans | Arkea-B&B Hotels | 35:39 |
| 134 | Ethan Vernon | Israel-Premier Tech | 35:43 |
| 135 | Jake Stewart | Israel-Premier Tech | 35:47 |
| 136 | Tim van Dijke | Red Bull-BORA-hansgrohe | 35:49 |
| 137 | Fabio Christen | Q36.5 Pro Cycling Team | 36:08 |
| 138 | Finn Fisher-Black | Red Bull-BORA-hansgrohe | s.t. |
| 139 | Timo Roosen | Team Picnic PostNL | s.t. |
| 140 | Oscar Riesebeek | Alpecin-Deceuninck | 36:42 |
| 141 | Daan Hoole | Lidl-Trek | 36:51 |
| 142 | Mads Pedersen | Lidl-Trek | s.t. |
| 143 | Søren Kragh Andersen | Lidl-Trek | s.t. |
| 144 | Amanuel Ghebreigzabhier | Lidl-Trek | s.t. |
| 145 | Tobias Bayer | Alpecin-Deceuninck | s.t. |
| 146 | Jasper Philipsen | Alpecin-Deceuninck | s.t. |
| 147 | Arne Marit | Intermarché-Wanty | s.t. |
| 148 | Patrick Eddy | Team Picnic PostNL | s.t. |
| 149 | Remi Cavagna | Groupama-FDJ | s.t. |
| 150 | Nico Denz | Red Bull-BORA-hansgrohe | s.t. |
| 151 | Mikkel Bjerg | UAE Team Emirates-XRG | s.t. |
| 152 | Stanislaw Aniolkowski | Cofidis | 37:13 |
| 153 | Bryan Coquard | Cofidis | 37:44 |
GC after stage 20
3,031.1 kilometers raced so far at an average speed of 41.579 km/hr
| 1 | Jonas Vingegaard | Team Visma | Lease a Bike | 72hr 53min 57sec |
| 2 | João Almeida | UAE Team Emirates-XRG | @ 1min 16sec |
| 3 | Tom Pidcock | Q36.5 Pro Cycling Team | 3:11 |
| 4 | Jai Hindley | Red Bull-BORA-hansgrohe | 3:41 |
| 5 | Matthew Riccitello | Israel-Premier Tech | 5:55 |
| 6 | Giulio Pellizzari | Red Bull-BORA-hansgrohe | 7:23 |
| 7 | Sepp Kuss | Team Visma | Lease a Bike | 7:45 |
| 8 | Felix Gall | Decathlon AG2R La Mondiale | 7:50 |
| 9 | Torstein Træen | Bahrain Victorious | 9:48 |
| 10 | Matteo Jorgenson | Team Visma | Lease a Bike | 12:16 |
| 11 | Junior Lecerf | Soudal Quick-Step | 14:00 |
| 12 | Harold Tejada | XDS Astana Team | 21:31 |
| 13 | Abel Balderstone | Caja Rural-Seguros RGA | 28:07 |
| 14 | Jaume Guardeño | Caja Rural-Seguros RGA | 30:30 |
| 15 | Santiago Buitrago | Bahrain Victorious | 45:38 |
| 16 | Louis Meintjes | Intermarché-Wanty | 45:39 |
| 17 | Egan Bernal | INEOS Grenadiers | 46:26 |
| 18 | Giulio Ciccone | Lidl-Trek | 48:17 |
| 19 | Bruno Armirail | Decathlon AG2R La Mondiale | 48:30 |
| 20 | Kevin Vermaerke | Team Picnic PostNL | 50:08 |
| 21 | Edward Dunbar | Team Jayco-AlUla | 57:19 |
| 22 | Martin López | XDS Astana Team | 59:23 |
| 23 | Rudy Molard | Groupama-FDJ | 1:00:51 |
| 24 | Ben Tulett | Team Visma | Lease a Bike | 1:04:46 |
| 25 | Felix Grossschartner | UAE Team Emirates-XRG | 1:09:30 |
| 26 | Marc Soler | UAE Team Emirates-XRG | 1:11:14 |
| 27 | Mikel Landa | Soudal Quick-Step | 1:18:26 |
| 28 | Damien Howson | Q36.5 Pro Cycling Team | 1:19:07 |
| 29 | Finlay Pickering | Bahrain Victorious | 1:22:02 |
| 30 | Jay Vine | UAE Team Emirates-XRG | 1:27:41 |
| 31 | Sergio Samitier | Cofidis | 1:33:20 |
| 32 | Marco Frigo | Israel-Premier Tech | 1:34:17 |
| 33 | Julien Bernard | Lidl-Trek | 1:39:06 |
| 34 | Jefferson Cepeda | Movistar Team | 1:43:22 |
| 35 | Clément Braz Afonso | Groupama-FDJ | 1:43:34 |
| 36 | Wout Poels | XDS Astana Team | 1:48:56 |
| 37 | Louis Vervaeke | Soudal Quick-Step | 1:50:12 |
| 38 | Andrea Bagioli | Lidl-Trek | 1:57:31 |
| 39 | Pierre Thierry | Arkea-B&B Hotels | 1:59:17 |
| 40 | Fausto Masnada | XDS Astana Team | 2:01:00 |
| 41 | Antonio Tiberi | Bahrain Victorious | 2:01:24 |
| 42 | Johannes Staune-Mittet | Decathlon AG2R La Mondiale | 2:01:41 |
| 43 | Jan Hirt | Israel-Premier Tech | 2:01:43 |
| 44 | Bob Jungels | INEOS Grenadiers | 2:04:14 |
| 45 | Brieuc Rolland | Groupama-FDJ | 2:04:21 |
| 46 | Callum Scotson | Decathlon AG2R La Mondiale | 2:09:37 |
| 47 | Luis Faura | Burgos Burpellet BH | 2:13:57 |
| 48 | José Lorenzo Fortunato | XDS Astana Team | 2:15:02 |
| 49 | Gijs Leemreize | Team Picnic PostNL | 2:16:48 |
| 50 | Markel Beloki | EF Education-EasyPost | 2:21:45 |
| 51 | Ben Zwiehoff | Red Bull-BORA-hansgrohe | 2:22:31 |
| 52 | Léo Bisiaux | Decathlon AG2R La Mondiale | 2:22:34 |
| 53 | Chris Hamilton | Team Picnic PostNL | 2:25:56 |
| 54 | Juan Martinez | Team Picnic PostNL | 2:27:08 |
| 55 | Giovanni Aleotti | Red Bull-BORA-hansgrohe | 2:28:38 |
| 56 | Carlos Canal | Movistar Team | s.t. |
| 57 | Lars Craps | Lotto | 2:29:14 |
| 58 | Eduardo Sepulveda | Lotto | 2:30:57 |
| 59 | Victor Langellotti | INEOS Grenadiers | 2:32:10 |
| 60 | Carlos Verona | Lidl-Trek | 2:32:57 |
| 61 | Sander De Pestel | Decathlon AG2R La Mondiale | 2:33:33 |
| 62 | Wilco Kelderman | Team Visma | Lease a Bike | 2:38:47 |
| 63 | Hugo de la Calle | Burgos Burpellet BH | 2:42:30 |
| 64 | Joan Bou | Caja Rural-Seguros RGA | 2:43:12 |
| 65 | Magnus Sheffield | INEOS Grenadiers | 2:44:56 |
| 66 | James Shaw | EF Education-EasyPost | 2:46:06 |
| 67 | David González | Q36.5 Pro Cycling Team | 2:47:42 |
| 68 | Juan Ayuso | UAE Team Emirates-XRG | 2:47:57 |
| 69 | Sergio Chumil | Burgos Burpellet BH | 2:49:38 |
| 70 | Alex Molenaar | Caja Rural-Seguros RGA | 2:50:43 |
| 71 | Nicola Conci | XDS Astana Team | 2:51:32 |
| 72 | Michel Hessmann | Movistar Team | 2:51:52 |
| 73 | Mauri Vansevenant | Soudal Quick-Step | 2:52:37 |
| 74 | Max Schachmann | Soudal Quick-Step | 2:54:04 |
| 75 | Sean Quinn | EF Education-EasyPost | 2:55:04 |
| 76 | Stefan Küng | Groupama-FDJ | 2:55:41 |
| 77 | Jesus Herrada | Cofidis | 2:56:36 |
| 78 | Thomas Silva | Caja Rural-Seguros RGA | 2:58:10 |
| 79 | Roman Ermakov | Bahrain Victorious | 2:58:48 |
| 80 | Jack Haig | Bahrain Victorious | 2:59:42 |
| 81 | Brandon Rivera | INEOS Grenadiers | 3:01:23 |
| 82 | Mathijs Paasschens | Bahrain Victorious | 3:01:46 |
| 83 | Michal Kwiatkowski | INEOS Grenadiers | 3:02:25 |
| 84 | Finn Fisher-Black | Red Bull-BORA-hansgrohe | 3:05:04 |
| 85 | Jordan Labrosse | Decathlon AG2R La Mondiale | 3:09:59 |
| 86 | Nans Peters | Decathlon AG2R La Mondiale | 3:10:09 |
| 87 | Nico Denz | Red Bull-BORA-hansgrohe | 3:10:43 |
| 88 | Orluis Aular | Movistar Team | 3:11:03 |
| 89 | Jonas Gregaard | Lotto | 3:11:10 |
| 90 | Jakub Otruba | Caja Rural-Seguros RGA | 3:12:26 |
| 91 | Mario Aparicio | Burgos Burpellet BH | 3:12:44 |
| 92 | Bjoern Koerdt | Team Picnic PostNL | 3:13:49 |
| 93 | Jardi Van Der Lee | EF Education-EasyPost | 3:14:12 |
| 94 | Kelland O'Brien | Team Jayco-AlUla | 3:14:30 |
| 95 | Simone Petilli | Intermarché-Wanty | 3:15:26 |
| 96 | Alec Segaert | Lotto | 3:16:15 |
| 97 | David Gaudu | Groupama-FDJ | 3:16:55 |
| 98 | Emanuel Buchmann | Cofidis | 3:17:06 |
| 99 | Louis Rouland | Arkea-B&B Hotels | 3:17:20 |
| 100 | Patrick Gamper | Team Jayco-AlUla | 3:18:44 |
| 101 | Gal Glivar | Alpecin-Deceuninck | 3:19:37 |
| 102 | David de la Cruz | Q36.5 Pro Cycling Team | 3:21:52 |
| 103 | Thibaud Gruel | Groupama-FDJ | 3:24:03 |
| 104 | Lukas Nerurkar | EF Education-EasyPost | 3:24:13 |
| 105 | Nicolas Vinokurov | XDS Astana Team | 3:26:40 |
| 106 | Jonas Rickaert | Alpecin-Deceuninck | 3:28:01 |
| 107 | Iván García Cortina | Movistar Team | 3:28:55 |
| 108 | Pier-André Côté | Israel-Premier Tech | 3:31:36 |
| 109 | Ivo Oliveira | UAE Team Emirates-XRG | 3:31:41 |
| 110 | Christopher Juul-Jensen | Team Jayco-AlUla | 3:32:28 |
| 111 | Joel Nicolau | Caja Rural-Seguros RGA | 3:36:13 |
| 112 | Nickolas Zukowsky | Q36.5 Pro Cycling Team | 3:38:01 |
| 113 | Alessandro Verre | Arkea-B&B Hotels | 3:38:20 |
| 114 | Marcel Camprubí | Q36.5 Pro Cycling Team | 3:39:36 |
| 115 | Kamiel Bonneu | Intermarché-Wanty | 3:40:58 |
| 116 | Huub Artz | Intermarché-Wanty | 3:42:02 |
| 117 | Nicolò Buratti | Bahrain Victorious | 3:42:13 |
| 118 | Luca Van Boven | Intermarché-Wanty | 3:42:14 |
| 119 | Edward Planckaert | Alpecin-Deceuninck | 3:44:23 |
| 120 | Léandre Lozouet | Arkea-B&B Hotels | 3:49:26 |
| 121 | Victor Guernalec | Arkea-B&B Hotels | 3:52:49 |
| 122 | Matteo Sobrero | Red Bull-BORA-hansgrohe | 3:53:01 |
| 123 | Dion Smith | Intermarché-Wanty | 3:53:08 |
| 124 | Remi Cavagna | Groupama-FDJ | 3:55:18 |
| 125 | Mads Pedersen | Lidl-Trek | 3:56:59 |
| 126 | Madis Mihkels | EF Education-EasyPost | 4:00:51 |
| 127 | Ben Turner | INEOS Grenadiers | 4:06:04 |
| 128 | Dries De Pooter | Intermarché-Wanty | 4:07:09 |
| 129 | Dylan van Baarle | Team Visma | Lease a Bike | 4:07:16 |
| 130 | Jake Stewart | Israel-Premier Tech | 4:08:08 |
| 131 | Filippo Ganna | INEOS Grenadiers | 4:08:59 |
| 132 | Tobias Bayer | Alpecin-Deceuninck | 4:10:00 |
| 133 | Fabio Christen | Q36.5 Pro Cycling Team | 4:11:52 |
| 134 | Liam Slock | Lotto | 4:11:58 |
| 135 | Amanuel Ghebreigzabhier | Lidl-Trek | 4:13:29 |
| 136 | Bryan Coquard | Cofidis | 4:15:14 |
| 137 | Tim van Dijke | Red Bull-BORA-hansgrohe | 4:20:23 |
| 138 | Timo Roosen | Team Picnic PostNL | s.t. |
| 139 | Mikkel Bjerg | UAE Team Emirates-XRG | 4:20:41 |
| 140 | Jasper De Buyst | Lotto | 4:21:15 |
| 141 | Nadav Raisberg | Israel-Premier Tech | 4:24:53 |
| 142 | Ethan Vernon | Israel-Premier Tech | 4:31:47 |
| 143 | Jenthe Biermans | Arkea-B&B Hotels | 4:32:15 |
| 144 | Domen Novak | UAE Team Emirates-XRG | 4:32:39 |
| 145 | Jasper Philipsen | Alpecin-Deceuninck | 4:35:03 |
| 146 | Arne Marit | Intermarché-Wanty | 4:36:51 |
| 147 | Anders Foldager | Team Jayco-AlUla | 4:43:01 |
| 148 | Søren Kragh Andersen | Lidl-Trek | 4:43:07 |
| 149 | Daan Hoole | Lidl-Trek | 4:44:12 |
| 150 | Elia Viviani | Lotto | 4:44:32 |
| 151 | Patrick Eddy | Team Picnic PostNL | 4:54:07 |
| 152 | Stanislaw Aniolkowski | Cofidis | 4:57:02 |
| 153 | Oscar Riesebeek | Alpecin-Deceuninck | 5:08:37 |
Stage 20 map & profile:

Stage 20 map

Stage 20 profile
Stage 20 photos by Fotoreporter Sirotti:
Taken on the final Bola del Mundo climb.

Riders enjoying the gentle slopes of the Bola del Mundo climb.

Jonas Vingegaard riding to a stage win

Sepp Kuss was second, just 11 seconds behind Vingegaard.

Jay Hindley was third, finishing two seconds behind Sepp Kuss.

GC third place Tom Pidcock was fourth in the stage.

Joao Almeida riding to fifth in the stage.

Matthew Riccitello was sixth.

King of the Mountains Jay Vine was seventh in the stage.

Giulio Ciccone riding to eighth place.

Junior Lecerf was ninth.

Jonas Vingegaard celebrates his stage win.

Jonas Vingegaard has this Vuelta just about won. That will make three Grand Tours; he won the Tour de France in 2022 & 2023.