A second half equaliser from Aston Villa through Leon Bailey condemned Man City to a second successive draw away from home in the Premier League.
City ought to have taken the lead inside three minutes after a lovely move sent Kyle Walker in behind. The full-back had Erling Haaland in space for a tap-in at point-blank range, but the Englishman took the shot on himself before firing way over.
Kevin De Bruyne flashed a ferocious effort wide of Emiliano Martinez's far post, before the Belgian turned architect to supply Ilkay Gundogan.
Delivering wide on the right, the midfielder whipped a delicious curling cross towards the German, but he failed to connect with the ball inside the six-yard box.
Villa were dogged in their defensive duties and they almost sprung a surprise on Pep Guardiola's men on the counter-attack. Ashley Young did ever so well to dispossess De Bruyne before play was moved onto Douglas Luiz. The Brazilian threaded a pass through to Ollie Watkins whose deflected effort trickled inches wide of the far post.
However, City put their foot down immediately after the restart to break the deadlock. A sweeping move down the right saw De Bruyne float a pinpoint cross towards the far post and over the reach of Martinez, where Haaland lurked to cushion his finish into an empty net.
Villa engineered a decent opportunity find an immediate equaliser. Steven Gerrard's men broke into space before Watkins freed Jacob Ramsey, but Ederson was quick off his line to smother the midfielder as he broke through one-on-one.
The excellent De Bruyne cracked the crossbar from a free-kick before he went close from inside the penalty area after a neat one-two with Haaland.
However, Villa found an equaliser out of nothing with a little over 15 minutes remaining to stun Guardiola's men. Ramsey ghosted down the left before pulling the ball across goal for Leon Bailey to slam a cultured finish into the top corner.
Villa were unfortunate not to take the lead when Philippe Coutinho's curling effort crashed off the underside of the bar and into the net, only for the linesman to have raised his flag earlier in the move. However, replays showed that the Brazilian hadn't strayed offside in the build-up.
Rodri arrowed an effort inches wide from the edge of the area before Riyad Mahrez spurned a glorious opportunity on his weaker right side from a tight angle inside the penalty area.
Here's how both teams rated.
Aston Villa vs Man City player ratings
1. Aston Villa (4-3-1-2)
GK: Emiliano Martinez - 5/10 - Made a couple of smart stops, although he was caught under De Bruyne's wicked cross for City's opener.
RB: Matty Cash - N/A - Forced off inside 25 minutes through injury.
CB: Ezri Konsa - 5/10 - Stood firm in the first half, but as Haaland raised his level, the Englishman seemed to look less assured.
CB: Tyrone Mings - 5/10 - Distribution was wayward on a couple of key ocassions, but he marshalled Haaland incredibly well.
LB: Lucas Digne - 4/10 - A difficult afternoon dealing with the rotating cast of City midfielders and wingers.
CM: Boubacar Kamara - 5/10 - Positioning was typically sound at the base of the Villa midfield, but couldn't do much when he got his foot on the ball.
CM: Jacob Ramsey - 8/10 - His qualities complemented Gerrard's midfield selection. Tremendous work to tee up Bailey for Villa's equaliser, which typified his display.
CM: John McGinn - 4/10 - Tends to struggle when he's instructed to stand off players as opposed to getting in their faces.
CM: Douglas Luiz - 6/10 - Restored to the starting lineup despite questions over his Villa future earlier this week. Played in a slightly more advanced role and thrived supplying through passes.
ST: Leon Bailey - 6/10 - Isolated in attack and Villa seemed to struggle finding him in-behind City's high line, but he made his mark with a terrific finish to level.
ST: Ollie Watkins - 6/10 - Had an opportunity to put Villa ahead in the first half after being sent through by Douglas Luiz. More involved than Bailey but not anything to write home about.
SUB: Ashley Young (25' for Cash) - 6/10 - Offered incredible energy upon his introduction, barging De Bruyne off the ball on one occasion.
SUB: Philippe Coutinho (65' for McGinn) - 5/10 - Provided a greater creative thrust to Villa's attack.
SUB: Emi Buendia (90' for Bailey) - N/A
Manager: Steven Gerrard - 5/10 - Made the bold decision to beef up Villa's midfield. His side were quite passive but they responded excellently to falling behind.
2. Man City (4-3-3)
GK: Ederson - 7/10 - Had very little to contend with given City's dominance of the ball, but was quick off his line to thwart Ramsey with a one-on-one chance.
RB: Kyle Walker - 6/10 - Woeful decision making prevented him from putting City into an early lead. His underlapping runs caused Villa several issues.
CB: John Stones - 7/10 - Strong defensively, especially when mopping up behind Dias as Villa went direct.
CB: Ruben Dias - 6/10 - Really dominant in the air when Villa attempted to launch crosses into the penalty area.
LB: Joao Cancelo - 6/10 - Caused Villa issues with his ability to step inside from full-back. Not as involved as he typically is during home games.
CM: Rodri - 6/10 - Pulled the strings for the Cityzens in midfield. His positioning pulled the home side in all sorts of different directions.
CM: Ilkay Gundogan - 6/10 - Made one of his trademark late runs that almost put City ahead early in the game. Not hugely influential but combined well on the edge of the area on a couple of ocassions.
CM: Kevin De Bruyne - 9/10 - Chance creation was as consistently high as it has always been. Nearly supplied Gundogan with a goal in the first half before he laid the ball on a plate for Haaland to break the deadlock after the interval.
RW: Bernardo Silva - 7/10 - Passing was uncharacteristically wayward at times, but he dovetailed effectively with De Bruyne as the Belgian looked to overlap.
ST: Erling Haaland - 8/10 - Enjoyed the physical battle with Mings. Took the first chance that came his way from De Bruyne's accurate delivery, underling his predatory nature.
LW: Phil Foden - 6/10 - Doesn't seem to produce his best football when he's holding the width on the left. It was a similar tale today.
SUB: Riyad Mahrez (72' for Silva) - N/A
SUB: Nathan Ake (80' for Walker) - N/A
Manager: Pep Guardiola - 5/10 - His side lacked their usual intensity in attack, but on another day they score a second and the game is out of Villa's reach.