Phil Foden became City’s third-youngest Premier League goalscorer as he headed home after just five minutes of a tense clash with Spurs, three days after their Champions League classic.
The victory took City back above Liverpool, but the downside was another injury to playmaker Kevin De Bruyne, who limped off with what looked like another knee problem before half-time.
The game lacked the goals of the midweek clash, but there was still plenty of incident, with both sides having numerous chances and penalty appeals turned down.
In the end City were grateful to an impressive performance from goalkeeper Ederson, who made two particularly good saves to deny Son Heung-min.
City – and their fans – were clearly fired up after their Champions League exit and, as they did in Wednesday’s epic, took an early lead.
Foden, unexpectedly brought into the side in place of David Silva, made an immediate impact. The outstanding Bernardo Silva floated a cross into the box and Sergio Aguero nodded across goal for Foden to meet with a powerful diving header at the back post.
It was an ideal start for City, but Spurs, who made five changes with injured goalkeeper Hugo Lloris among those to drop out, showed plenty of energy themselves.
Son capitalised on an error by John Stones to force a save from Ederson and and Christian Eriksen also tested the goalkeeper when he might have made more of the attention of Aymeric Laporte.
Laporte then did much better when Son broke through again, producing a perfectly-timed tackle to deny the Korean a shooting chance.
Silva continued to cause Spurs problems and Jan Vertonhgen was perhaps lucky to get away with a clumsy challenge on the Portuguese in the area before Foden shot at Spurs back-up keeper Paulo Gazzaniga.
Silva also shot at the keeper before De Bruyne appeared to jar his knee attempting an effort on goal. The Belgian slumped to the turf and was immediately replaced by Fernandinho as City manager Pep Guardiola took no chances, but the signs did not look good for the 27-year-old.
Spurs could have been level before the break as Son raced clear again, but Ederson smothered his shot.
City had two more penalty appeals early in the second half. First the ball hit Vertonhgen’s hand after he had blocked an Aguero strike and Foden went down in a challenge from Juan Foyth. Referee Michael Oliver gave nothing, as he did when Spurs claimed Kyle Walker had handled in the area.
Spurs pressed further with Eriksen having a shot blocked and Lucas Moura firing into the crowd.
Raheem Sterling had a quiet game but he moved up front after Aguero was substituted and was denied in front of goal by a reaction save from Gazzaniga at point-blank range.
Spurs’ frustrations continued as Lucas Moura blazed over.
The game ended in scrappy fashion with a number of bad challenges and Sterling getting involved in some pushing and shoving with Spurs players.
It suggested both sides had probably seen enough of each other after three meetings in just over a week, but City held on three vital points.