Stuart Dallas scored late in the first half but Leeds' celebrations were cut short when Liam Cooper was sent off minutes later. Ferran Torres' late strike seemed to rescue a point for City before Dallas scored a second in added time.
"It is a great result for us. It was tough out there. It is hard enough with 11, never mind 10," Dallas said after the game.
"We defended really well and kept them to very few good chances. We knew if we could have a bit more composure we could get one chance.
"You should never give up. Down to 10 and they equalise. But we managed to find something. It is about how much you really want it."
City had enjoyed much of the possession before Dallas' shot ricocheted off the post and into the net on 42 minutes to give Leeds an unlikely lead.
There was controversy two minutes later when referee Andre Marriner gave Cooper a yellow card for a clumsy tackle on Gabriel Jesus.
VAR then asked Marriner to take a second look at the challenge and after a pitchside review the yellow card was upgraded to a red.
The traffic was all one way in the second half with City enjoying close to 70% of the possession.
Leeds broke on 91 minutes through Dallas who calmly slotted the ball by Ederson.
The result means City's six-game winning streak in all competitions has ended as they remain 14 points clear of second-placed Manchester United having played two more games, while Leeds move up to ninth.