Borussia Dortmund ended Bayern Munich's unbeaten start to the league campaign with a 1-0 Der Klassiker victory courtesy of Pierre-Emerick Aubameyang's first-half goal.
The hosts, who had not triumphed over their fierce rivals in the league since 2014, ignited their Bundesliga title hopes with a gritty display at Signal Iduna Park, where they spent long spells on the back foot en route to a 27th home league match without defeat.
Thomas Tuchel's men rode their luck at times and were ultimately indebted to Aubameyang's close-range 11th-minute finish, which brought them to within three points of their visitors.
It is RB Leipzig – 3-2 winners over Bayer Leverkusen on Friday – who lead the way, but Bayern will wonder how they did not at least claim a draw on Saturday.
Franck Ribery had a goal ruled out for offside and Xabi Alonso struck the woodwork for Carlo Ancelotti's side, who almost conceded a second when Aubameyang proved uncharacteristically profligate after finding himself one-on-one with Manuel Neuer.
As the game entered its final 10 minutes there was an increasing desperation about Bayern, who ran out of ideas and then time, leaving them to reflect on a rare loss before a return to European football on Tuesday.
It was Aubameyang, who scored four in the 5-2 win over Hamburg before the international break, who broke the deadlock following a frenetic start to the match.
With the hosts applying pressure, Bayern failed to clear their lines and ex-Allianz Arena favourite Mario Gotze got past former team-mate Mats Hummels to pick out Aubameyang, who slide in to poke home his 12th league goal of the season.
Neuer was called into action in the 20th minute when Andre Schurrle drove a powerful half-volley into his grateful grasp.
Bayern pressed and probed for a leveller, with Robert Lewandowski awkwardly heading over the crossbar with his back to goal, while Hummels got on the end of an Alonso free-kick to send a header on target, but it was easy for Roman Burki.
The visitors caused panic in the Dortmund box just before the break, with Lewandowski lurking as Sokratis Papastathopoulos made a telling interception from Ribery's cross.
But Ancelotti's side were almost caught cold at the start of the second half as Aubameyang nodded Marcel Schmelzer's delivery over the target from eight yards.
Ribery was denied an equaliser by the offside flag after deftly flicking in behind his standing leg, but Bayern kept coming and Alonso curled a glorious shot onto the underside of the bar just past the hour mark.
Aubameyang should have sealed it in the 70th minute, racing clear on goal, only to shoot tamely at an alert Neuer, who turned it behind for a corner.
Tempers flared late on, with Ribery and Adrian Ramos going into the book following a minor scuffle, which proved to be the last action of note.