Harry Kane scored the only goal of the game in the first-half when Tottenham pounced on a mix-up at the back to finish past Ederson.
Riyad Mahrez came closest to an equaliser just before half-time with a volley that smacked off the woodwork.
Spurs were reduced to 10 men in the dying minutes when Cristian Romero was sent off but the home side survived.
City made four changes to the side that beat Arsenal in the FA Cup, with Kyle Walker returning as captain and teenager Rico Lewis moving across to left-back.
And we dominated the early moments with nearly 85% of possession in the opening 10 minutes but opportunities were difficult to come by.
Nathan Ake found himself free at the back-post from a Jack Grealish corner, but the ball ricocheted around the box before bouncing into the gloves of Hugo Lloris.
But it was Spurs who broke the deadlock when Pierre-Emile Hojbjerg pounced on Rodrigo’s pass before feeding Kane whose scuffed shot evaded Ederson.
Bernardo tried to hit straight back moments later when he crafted himself a sight of goal but his 20-yard strike was collected by Lloris.
CITY+ | SUBSCRIBE TO EXCLUSIVE CONTENT
The Frenchman was called upon again five minutes before half-time to dive on Rodrigo’s low drive while Jack Grealish was off-target with a curling effort.
When Lloris was finally beaten on the stroke of half-time, the woodwork came to Tottenham’s rescue as Mahrez’s volley thumped off the underside of the crossbar.
The second half started in a similar pattern with the home side happy to soak up the pressure and trying to break on the counter-attack.
Kevin De Bruyne came on just after the hour and almost teed up an equaliser within minutes with a clever free-kick. The Belgian pulled the ball back to Alvarez but his goalbound effort clipped Eric Dier’s knee and over the bar.
De Bruyne and Alvarez both had shots as City chased equalisers but their efforts were just off-target.
Spurs remained a threat on the break and Kane almost bundled in a second but for a smart save from Ederson, who was also at full-stretch to keep out a Son Heung-Min strike.
With four minutes remaining Romero was sent off for a challenge on Grealish with the Argentinian already in the book for a scything challenge on Haaland.
But the home side survived as City chased an equaliser with Rodrigo and De Bruyne trying to force chances.
Spurs XI: Lloris, Emerson, Romero, Dier, Davies, Perisic (Sessegnon 79), Hojbjerg, Bentancur, Kulusevski (Sanchez 88), Kane, Son (Bissouma 84).
Subs: Forster, Skipp, Richarlison, Danjuma, Porro, Lengle.
CITY XI: Ederson, Lewis, Walker, Akanji, Ake, Rodrigo, Bernardo (Gundogan 84), Mahrez (De Bruyne 59), Grealish, Alvarez, Haaland
Subs: Ortega, Dias, Phillips, Laporte, Gomez, Perrone, Palmer.
City probably couldn’t have had a worse venue to try to take advantage of Arsenal’s slip at Everton on Saturday.
We have now lost all five of our visits to the Tottenham Hotspur Stadium since it opened in April 2019.
And we have yet to score in more than 450 minutes at the stadium despite 84 attempts with even our greatest ever goalscorer Sergio Aguero missing from the penalty spot in the Champions League.
It's also the away venue that Guardiola has managed at the most without ever winning in his managerial career.
Grealish was a big threat for City and he went close with a curling effort in the first half and almost set up a chance for Rodrigo in the dying minutes but Lloris punched the ball clear.
The winger continually drove at Spurs full-back Emerson Royal and was comfortably the most fouled player on the pitch.
He was chopped down by Romero for the Argentinian’s second yellow card as he threatened to break into the Spurs’ box.
But his contribution wasn’t confined to the final third, as he made three tackles with the home side constantly threatening on the break.
WHAT IT MEANS
City remain third in the Premier League table, five points behind leaders Arsenal, having played a game more.
The Gunners also dropped points on Saturday when they were beaten at Everton.
Fifth-placed Tottenham reduced the gap to City to six points in the race for Champions League places having played a game more.
Our next game is on Sunday when we host Aston Villa at the Etihad Stadium at 16:30 (UK) with the game live on Sky Sports.
Unai Emery’s side currently sit 11th in the Premier League after their 4-2 defeat at home to Leicester City at the weekend.
We met earlier in the season in a 1-1 draw when an Erling Haaland goal was cancelled out by Leon Bailey’s equaliser.
News about Spurs v Man City
Spurs 1-0 City: Brief highlights
Watch the action from City’s trip to the Tottenham Hotspur Stadium in the Barclays Premier League. Watch more
Extended highlights: Spurs 1-0 City
Watch the longer highlights from City’s game against Spurs in the Barclays Premier League. Watch more
Grealish mentality praised by Pep after Spurs defeat
Pep Guardiola said the aggression of Jack Grealish almost helped to rescue City in their 1-0 defeat to Spurs. Watch more
Spurs v City: Full Match Replay
The full, uninterrupted 90 minutes... Watch more
Guardiola says his players 'gave everything'
Pep Guardiola says his players gave everything against Spurs - without reward. Read more
Spurs 1-0 City: Match reaction and stats
Look back at how our clash with Spurs unfolded as our live blog progressed through the day... Read more
Spurs 1-0 City: Pitcam highlights
Watch City’s trip to the Tottenham Hotspur Stadium from a unique angle. Watch more