Spurs took an early lead when Son fired through Ederson’s legs to score his ninth league goal this season and Lo Celso drilled under the Brazilian to wrap up the points 35 seconds after coming on as a second half substitute.
Both teams had first half goals disallowed, with Harry Kane flagged for offside, whilst Aymeric Laporte’s curling strike was ruled out after referee Mike Dean checked the pitch-side VAR monitor and determined the ball had hit Gabriel Jesus’ arm in the build-up.
City were on the front foot for much of the contest, but were unable to find a way through the home side’s stubborn defence.
City got off to the worst possible start as Son took advantage of our high defensive line, latching onto Tanguy Ndombele’s ball over the top and calmly converting Jose Mourinho’s side’s first shot of the game.
From there, Spurs sat deep and looked to counter and it worked wonderfully as Steven Bergwijn, Son and Kane combined to slice City open, only for the latter to stray offside as he applied the finishing touch to the Korean’s pass across goal.
Pep Guardiola's side were assured in possession, but struggled to penetrate the wall of white shirts.
Laporte thought he’d bagged an equaliser, finishing like a seasoned striker from Jesus’ cutback, but the celebrations proved premature when the Brazilian was penalised for handball as he brought Rodrigo’s cross under control in the build-up.
The Spaniard and Ferran Torres both sent efforts straight at Hugo Lloris, but for all City probed, the North Londoners’ fast breaks created the better chances.
But for a heavy touch Son would have scored after rounding Ederson from Kane’s slide-rule ball, but Lo Celso made no mistake when he was fed by his captain, extending Spurs’ lead after they turned defence into attack in two passes.
Guardiola sent on Phil Foden and Raheem Sterling in a bid to inspire a fightback, but the host's defence held firm.
Ruben Dias had an excellent chance to pull one back in the dying minutes, but his header from Kevin De Bruyne’s teasing cross was straight at Lloris.
GUARDIOLA: POOR DEFENDING FOR OPENING GOAL
"It could be better, we played similar to how have all season. We did not defend good for the first goal. They then defended so deep, they defended with six and it was not easy.
"We had our chances, but we couldn’t score and they made two or three chances on the counter attack and we lost the game."
What it means
We remain 10th in the Premier League table, with 12 points from eight games.
That could change depending on other results this weekend, with Arsenal, West Ham United, Manchester United and Leeds United all capable of leapfrogging us should they win.
The Champions League returns on Wednesday, when we travel to Greece to face Olympiakos. Kick-off is at 17:55 (UK).
We're back in Premier League action against Burnley next Saturday. We get under way at the Etihad Stadium at 15:00 (UK).
CITY: Ederson, Walker, Dias, Laporte, Cancelo, Rodrigo, De Bruyne (C), Bernardo (Foden 72'), Mahrez (Sterling 72), Torres, Jesus.
SUBS: Steffen, Stones, Gundogan, Aguero, Garcia.
SPURS: Lloris, Aurier, Alderweireld, Dier, Reguilon, Sissoko, Hojbjerg, Bergwijn (Lucas 73'), Ndombele (Lo Celso 64'), Son, Kane.
SUBS: Hart, Davies, Rodon, Bale, Vinicius.