The two-time MotoGP world champion beat the six-time MotoGP world champion by 0.372s after 25 laps around Jerez, with Marco Bezzecchi finishing more than three seconds further back in an all-Ducati podium.
Jorge Martin leads the championship by 17 points over Bagnaia but it could have been so much more if he did not crash out of the lead on Lap 11, with Jack Miller also among the eight non-finishers having been hit by Franco Morbidelli on Lap 18.
Marc Marquez (Gresini Ducati) converted pole position into the early lead, from Martin (Prima Pramac Ducati), Bezzecchi (Pertamina VR46 Ducati), and Bagnaia (Ducati Team), the latter from seventh on the starting grid.
The two-time MotoGP world champion was up to second place when he outbraked Martin and Bezzecchi on the outside of Turn 6 and rounded them up.
Bagnaia then passed Marc Marquez when he cut back to the inside as they exited Turn 13, before #93 tried to reclaim the lead at the other end of the main straight.
Marc Marquez ran a little wide, though, and the net result was that he ceded second place to Martin.
At that point, Alex Marquez (Gresini Ducati) sat fifth and Brad Binder (Red Bull KTM) was at the back of the leading group in sixth, with Miguel Oliveira (Trackhouse Aprilia) seventh and Miller (Red Bull KTM) up to eighth from 15th on the starting grid.
Bagnaia ran wide on Lap 2 at Turn 13 and Martin grabbed the lead, although the Italian at least fended off Marc Marquez.
Exactly two laps later, Marc Marquez was overtaken by Bezzecchi for third place, before the top two began to creep a few tenths of a second clear.
Martin crashed out of the lead when he folded the front of his Desmosedici on Lap 11 at Turn 6, meaning Bagnaia was in front by about 0.9s.
That became 1.2s when Bezzecchi ran wide on Lap 13 at Turn 13, before Marc Marquez passed the VR46 rider for second place on Lap 14 at Turn 6.
The six-time premier class champion cut Bagnaia’s margin to less than a full second on Lap 16 and continued to close in on the #1 entry.
Pedro Acosta (Red Bull GasGas Tech3), who had lost ground due to an opening lap touch with Johann Zarco, was back in the top 10 when he passed Miller on Lap 16 at Turn 6.
Two laps later, Miller and Morbidelli (Prima Pramac Ducati) were picking themselves up from the gravel lap when the latter went for an inside move at Turn 5 and made contact with the #43 KTM.
With five laps to go, Marc Marquez had caught Bagnaia, and he made a move at Turn 9 on Lap 21.
However, the Gresini rider ran slightly wide on exit and Bagnaia threw his factory-entered Ducati back down the inside at Turn 10, making contact as he prised the lead back.
A lap later, it was near enough to a repeat, with Marc Marquez down the inside at Turn 9 but unable to pull up sufficiently on exit to make the pass stick.
Bagnaia then belted out a new fastest lap of the race and his lead was 0.424s with two laps to go.
‘Pecco’ added another tenth to his buffer on Lap 24 and, try as he might, Marc Marquez could not bridge the gap again.
Bezzecchi was a lonely third in the end, with Alex Marquez pipping Enea Bastianini (Ducati Team) to fourth, while Binder claimed sixth on his KTM.
Rounding out the top 10 were Fabio Di Giannantonio (Pertamina VR46 Ducati), Oliveira, Maverick Viñales (Aprilia Racing), and Acosta.
Dani Pedrosa’s hopes of a repeat podium were dashed when the Red Bull KTM wildcard crashed on Lap 4 at Turn 8.
Aleix Espargaro (Aprilia Racing) and Zarco (Castrol LCR Honda) went down when they made contact on Lap 10 at Turn 9.
The MotoGP field stays on at Jerez for a day of testing, after which Round 5, the French Grand Prix, takes place at Le Mans on May 10-12.
Race results: Grand Prix race
Pos | Num | Rider | Nat | Team | Bike | Time/Gap |
1 | 1 | F. Bagnaia | ITA | Ducati Lenovo Team | Ducati | 40:58.053 |
2 | 93 | M. Marquez | ESP | Gresini Racing MotoGP | Ducati | +0.372 |
3 | 72 | M. Bezzecchi | ITA | Pertamina Enduro VR46 Racing Team | Ducati | +3.903 |
4 | 73 | A. Marquez | ESP | Gresini Racing MotoGP | Ducati | +7.205 |
5 | 23 | E. Bastianini | ITA | Ducati Lenovo Team | Ducati | +7.253 |
6 | 33 | B. Binder | RSA | Red Bull KTM Factory Racing | KTM | +7.801 |
7 | 49 | F. Di Giannantonio | ITA | Pertamina Enduro VR46 Racing Team | Ducati | +10.063 |
8 | 88 | M. Oliveira | POR | Trackhouse Racing | Aprilia | +10.979 |
9 | 12 | M. Viñales | ESP | Aprilia Racing | Aprilia | +11.217 |
10 | 31 | P. Acosta | ESP | Red Bull GASGAS Tech3 | GasGas | +20.762 |
11 | 25 | R. Fernandez | ESP | Trackhouse Racing | Aprilia | +23.508 |
12 | 36 | J. Mir | ESP | Repsol Honda Team | Honda | +23.584 |
13 | 42 | A. Rins | ESP | Monster Energy Yamaha MotoGP | Yamaha | +28.452 |
14 | 30 | T. Nakagami | JPN | LCR Honda | Honda | +29.049 |
15 | 20 | F. Quartararo | FRA | Monster Energy Yamaha MotoGP | Yamaha | +32.015 |
16 | 6 | S. Bradl | GER | HRC Test Team | Honda | +41.433 |
17 | 10 | L. Marini | ITA | Repsol Honda Team | Honda | +43.323 |
DNF | 37 | A. Fernandez | ESP | Red Bull GASGAS Tech3 | GasGas | 19 laps |
DNF | 21 | F. Morbidelli | ITA | Prima Pramac Racing | Ducati | 17 laps |
DNF | 43 | J. Miller | AUS | Red Bull KTM Factory Racing | KTM | 17 laps |
DNF | 32 | L. Savadori | ITA | Aprilia Racing | Aprilia | 11 laps |
DNF | 89 | J. Martin | ESP | Prima Pramac Racing | Ducati | 10 laps |
DNF | 41 | A. Espargaro | ESP | Aprilia Racing | Aprilia | 9 laps |
DNF | 5 | J. Zarco | FRA | LCR Honda | Honda | 9 laps |
DNF | 26 | D. Pedrosa | ESP | Red Bull KTM Factory Racing | KTM | 3 laps |
Race winner: 25 laps
Riders’ championship
Pos | Rider | Nat | Pts |
1 | J. Martin | ESP | 92 |
2 | F. Bagnaia | ITA | 75 |
3 | E. Bastianini | ITA | 70 |
4 | P. Acosta | ESP | 69 |
5 | M. Viñales | ESP | 63 |
6 | M. Marquez | ESP | 60 |
7 | B. Binder | RSA | 59 |
8 | A. Espargaro | ESP | 39 |
9 | M. Bezzecchi | ITA | 36 |
10 | F. Di Giannantonio | ITA | 34 |
11 | A. Marquez | ESP | 27 |
12 | F. Quartararo | FRA | 25 |
13 | M. Oliveira | POR | 23 |
14 | J. Miller | AUS | 22 |
15 | R. Fernandez | ESP | 12 |
16 | J. Mir | ESP | 12 |
17 | A. Fernandez | ESP | 10 |
18 | D. Pedrosa | ESP | 7 |
19 | A. Rins | ESP | 6 |
20 | F. Morbidelli | ITA | 6 |
21 | J. Zarco | FRA | 5 |
22 | T. Nakagami | JPN | 4 |
23 | L. Marini | ITA | 0 |
24 | S. Bradl | GER | 0 |
25 | L. Savadori | ITA | 0 |