Mario Balotelli's last-minute penalty secured Manchester City a 1-1 Champions League draw with Borussia Dortmund that they scarcely deserved on Wednesday. (Read: Mancini vows to fix City's problems)
A goal from Marco Reus looked to be enough to secure victory for Jurgen Klopp's team and leave a major dent in City's hopes of progressing from Group D and into the knock-out phase.
But with just two minutes left Neven Subotic was penalised for handball and Balotelli converted from the spot to earn City a point that could prove crucial.
They now face a double-header against Ajax before hosting Real Madrid and then travelling to Dortmund for their final match.
But on this evidence Dortmund must be strong favourites to progress along with Real.
City are still waiting for a first clean sheet of the season and have managed just three wins in their nine matches.
On their last visit to England, Dortmund were easily beaten by Arsenal last season but Klopp's side looked a far more mature side in the opening period at the Etihad Stadium.
Samir Nasri had a shot saved by Roman Weidenfeller after just 25 seconds.
But the Germans were soon in the ascendency.
Robert Lewandowski headed wide from a Marcel Schmelzer cross and did the same with a ball in from deep from fellow Pole Lukasz Piszcek.
David Silva has struggled since the turn of the year but the Spaniard looked on form again, clipping over the top for Sergio Aguero, who was denied by Weidenfeller before Pablo Zabaleta lifted over from Silva's pass.
After a rare mistake by Vincent Kompany in midfield, Lewandowski slid through for Gotze, whose shot was pushed on to the post by Hart.
Ilkay Gundogan and Neven Subotic both missed with shots from outside the area as the German side continued their dominance.
City suffered a further blow just after the half-hour mark when Javier Garcia limped off to be replaced by Jack Rodwell.
Silva created another fine opportunity when he drifted in from the right and guided a pass through for Aguero, whose effort was blocked by the goalkeeper.
Yet another patient Dortmund passing move resulted in Gotze being played in behind the City defence and he was only denied by a fine block from Hart.
Seconds later the England goalkeeper pulled off another fine stop when he pushed on to the bar with yet another effort from Gotze.
But City almost struck just before the interval when Zabaleta's cross was missed by Edin Dzeko and, at full stretch, Silva volleyed over from a couple of yards out.
After the restart, Dzeko worked Weidenfeller once again when he controlled a Toure pass on his chest and had a half volley saved by the Dortmund goalkeeper.
But it was still Dortmund that were creating the dangerous chances, with Piszczek clipping a ball back for Gotze to once again have a driven effort pushed wide by Hart.
Just after the hour they pulled ahead thanks to an error from Rodwell.
The England midfielder's weak pass to Matija Nastasic was easily cut out by Reus, who burst through and hit a shot with enough power to finally beat Hart.
They threatened once again when Jackub Blaszczykowski prodded a pass through for Reus and Hart came up with an impressive block.
The England goalkeeper also swatted away a curling shot from Gundogan as Dortmund pressed hard.
Lewandowski should have killed the game with a quarter of an hour remaining but he prodded wide after he was picked out by Blaszczykowski.
Aguero had a header from Zabaleta's crossed pushed away by Weidenfeller.
But with two minutes remaining, City got a reprieve when Aguero's flick hit Subotic's hand and referee Pavel Kralovec pointed to the spot.
Balotelli made no mistake from the spot to pull City level but Hart had to make another great save from Lewandowski to preserve the point.