The result trimmed the gap at the summit to two points and marked City's sixth consecutive head-to-head win over Leeds. Despite the defeat, Leeds remain six points clear of the relegation zone.
City arrived in West Yorkshire with the greater imperative for victory, yet it was Leeds who began on the front foot. The hosts pressed aggressively and disrupted City's build-up, leaving the visitors struggling to establish control. It took 39 minutes for City to register a meaningful attempt on goal.
Leeds fashioned the clearer openings in the first half. Dominic Calvert-Lewin squandered a gilt-edged opportunity when left unmarked, skewing a left-footed effort wide from Brenden Aaronson's delivery.
He later dragged another attempt wide after slipping into space inside the area. Aaronson also saw a near-post flick blocked by Marc Guehi.
City threatened sporadically. Karl Darlow reacted sharply to save Nico O'Reilly's header from six yards, while Guehi's goalbound header at the other end was clawed off the line by Darlow. Ruben Dias miscued a strike that dropped to Omar Marmoush, who stretched but prodded wide.
Against the run of play, the breakthrough arrived in first-half stoppage time when Antoine Semenyo turned in Rayan Ait-Nouri's cross.
Leeds continued to press after the interval. Calvert-Lewin was denied by a last-ditch block from Matheus Nunes, and manager Daniel Farke introduced an attack-minded double substitution with 15 minutes remaining.
Sustained late pressure on Gianluigi Donnarumma's goal, however, failed to yield an equaliser as City held firm.