Bayern Munich missed the chance to seal a ninth successive Bundesliga title as they suffered a shock 2-1 defeat at Mainz.
Jonathan Burkardt's swerving third-minute shot deceived Manuel Neuer on its way into the net and Robin Quaison doubled the Mainz lead before half-time.
Robert Lewandowski, back from a five-game absence, claimed his 36th Bundesliga goal of the season deep into stoppage time after Mainz had frustrated Bayern in the second period.
Bayern still have three games left to get the three points needed to wrap up the title – unless RB Leipzig slip up against Stuttgart on Sunday – while Mainz move five points clear of the relegation play-off spot.
Borussia Dortmund's Erling Haaland scored twice in a 2-0 win at Wolfsburg as England midfielder Jude Bellingham was sent off for the first time in his career.
Haaland struck his 24th and 25th Bundesliga goals of the season after 12 and 68 minutes.
The 17-year-old Bellingham was sent off in the 59th minute following a second bookable offence.
Dortmund's victory reduced the gap on third-placed Wolfsburg to two points.
Fourth-placed Eintracht Frankfurt failed to take advantage of Wolfsburg's defeat by losing 3-1 at Bayer Leverkusen.
Leon Bailey, Lucas Alario and Kerem Demirbay were on target for Leverkusen, with Andre Silva replying for Eintracht.
Joel Pohjanpalo scored a second-half hat-trick as Union Berlin overcame Werder Bremen 3-1.
Pohjanpalo's treble boosted Union's hopes of a top-six finish, while Theodor Gebre Selassie grabbed a late consolation for relegation-threatened Bremen.
Vincenzo Grifo kept Freiburg's fading European hopes alive by cancelling out Andrej Kramaric's opener in a 1-1 draw with Hoffenheim.
Real Madrid's LaLiga title hopes were dented in a dour 0-0 home draw against Real Betis.
Rodrygo hit the crossbar with a mishit cross but Zinedine Zidane's side created few chances and Real now trail city neighbours Atletico by two points having played a game more.
Elche won for the first time in eight games as Lucas Boye's 32nd-minute strike saw off Levante 1-0.
Ten-man Alaves drew 1-1 at Valencia after John Guidetti gave them the lead six minutes from time.
Javi Lopez was sent off for the visitors before Jose Gaya equalised at the death.
Valladolid and Cadiz also drew 1-1 as Cala cancelled out an earlier effort from Oscar Plano.
Kylian Mbappe scored twice as Paris St Germain took over at the top of Ligue 1 with a 3-1 win at Metz.
Mbappe opened the scoring after four minutes before Fabien Centonze levelled moments after the restart.
PSG reclaimed the lead in the 58th minute when Mbappe got his 25th league goal of the season with a deflected effort from outside the box.
Mbappe limped off in the closing stages to hand PSG a scare ahead of their Champions League semi-final with Manchester City, but Mauro Icardi settled matters in the dying moments with a 'Panenka' penalty.
Gaetan Charbonnier scored twice as Brest won 2-1 at St Etienne to claim a first win in seven games. Wahbi Khazri had given Les Verts an early lead.
In Italy's Serie A, Sassuolo kept up the chase for a European spot with Domenico Berardi on target in a 1-0 victory against Sampdoria. Genoa boosted their survival hopes as substitutes Gianluca Scamacca and Eldor Shomurodov came off the bench to score in a 2-0 win over Spezia.
A first win in five games lifted Genoa eight points clear of the relegation zone and three above Spezia.
Crotone won the battle of the bottom two against Parma with Simy scoring twice in a 4-3 away success.