Oscar Bobb's early disallowed goal for a fractional offside was the closest either side came until Nathan Ake poked home in the 87th minute after Tottenham goalkeeper Guglielmo Vicario had failed to clear a City corner.
Defeat means Spurs will play just 41 games this season, and leaves Ange Postecoglou's side competing in just the Premier League in the second half of the campaign.
Here's how we rated the Spurs players...
Guglielmo Vicario 5
At fault for City's winner when he failed to convincingly deal with a corner before Ake poked home. Had a couple of nervy moments when pressed but got down well to shots from Bernardo Silva and Jeremy Doku at 0-0.
Made an important block to deny Bobb in the first half and stood up well to substitute Doku. Added creativity in possession.
Outstanding with the ball at his feet.
Micky van de Ven 8
Spurs' last line of defence made several important last-ditch interventions, including a block to deny Julian Alvarez a certain goal.
Covered confidently behind the back four and stepped into midfield with usual poise.
Composed on the ball and helped Spurs to play through City's press. His height was useful at defending corners.
Pierre-Emile Hojbjerg 5
Nearly cost Spurs a goal at 0-0 when he was caught in possession leading to a chance for De Bruyne. More positively, he twice dissected City's back four with cute passes for Spurs' forward runners in the first half.
Struggled to get on the ball and make any meaningful impact at No10.
Forced Stefan Ortega into a brave block after running in behind. Showed a couple of glimpses but final ball was missing.
An occasional threat from the left, playing in Johnson and putting in a couple of dangerous crosses.
No shortage of application but anonymous in the box and never looked like scoring.
Oliver Skipp (Johnson 72') 5
A couple of nice touches.
James Maddison (Bentancur 72') 5
Did not get an opportunity to impact the game on his long-awaited return.
Dane Scarlett (Hojbjerg 89') N/A
Not used: Forster, Dragusin, Gil, Emerson, Davies, Santiago.