Borussia Dortmund were handed a boost in the race for fourth place as Bundesliga rivals Frankfurt dropped points, while Robert Lewandowski set another goalscoring record.
Eintracht Frankfurt crashed to a 4-3 defeat at relegated Schalke 04 to all but dash their hopes of a top-four finish with one game left in the season.
Eintracht are in fifth place on 57 points, with Borussia Dortmund fourth on 58 and in action against Mainz 05 on Sunday. A win would see them secure fourth place before the final matchday.
Eintracht battled back after Klaas-Jan Huntelaar had put the hosts in front in the 15th minute, scoring the rebound after his penalty was saved.
Andre Silva levelled in the 29th and Evan Ndicka put them 2-1 up six minutes after the restart.
But Schalke, in last place and already relegated, struck three times in 12 minutes through Blendi Idrizi, Florian Flick and Matthew Hoppe to turn the game around.
Portuguese Silva struck again to set a club record with his 27th league goal in the season, one better than Bernd Hoelzenbein’s 1976/77 run, but it was not enough.
Bayern Munich striker Lewandowski on equalled Gerd Muller’s 49-year-old German league goal record when he scored with a 26th-minute penalty in their 2-2 draw at Freiburg to take his season tally to 40 goals.
The Poland striker is already second on the all-time scorers list in the Bundesliga, with 276 goals, behind only Muller’s 365. He has one more chance to break Muller’s 1971/72 record, with one game left in the season.
The Bavarians, who have already secured their ninth consecutive league crown, had their first good chance in the 20th minute when Lewandowski’s shot from the edge of the box sailed wide.
He did it much better six minutes later, sending keeper Mark Flekken the wrong way to equal the record.
Freiburg levelled three minutes later with Manuel Gulde’s header, but the Bavarians went back in front with Leroy Sane sliding in to connect with a Thomas Mueller cutback in the 53rd.
Lewandowski missed a chance in front of goal in the 78th minute and also had an 83rd-minute header saved by the keeper after Christian Guenter had drawn the hosts level.
Union Berlin ended Bayer Leverkusen’s outside hopes of finishing fifth with a 1-1 draw at the BayArena, while Werder Bremen’s chances of avoiding a relegation play-off took another hit as they were beaten 2-0 by Augsburg.
Similarly, Koln missed the chance to climb out of the bottom two with a 0-0 draw at Hertha Berlin, who are now mathematically safe. Arminia Bielefeld’s 1-1 draw with Hoffenheim means they go into the final day knowing only a win will guarantee their survival.
In the day’s midtable dead rubber, Stuttgart won 2-1 at Borussia Monchengladbach.