Match ends, Manchester City 1, Middlesbrough 1.
Marten de Roon's injury-time equaliser snatched a draw for Middlesbrough as Manchester City were made to pay for a sloppy second-half performance at Etihad Stadium.
Sergio Aguero put City ahead, stabbing in Kevin de Bruyne's cross for his 150th City goal with their 18th shot of the afternoon.
Boro were hugely improved after the break and Alvaro Negredo brought a fine save from Claudio Bravo with an audacious lob from the halfway line.
Pep Guardiola's side looked to have withstood the isolated spells of Boro pressure but De Roon's header from George Friend's 91st-minute cross denied them.
It was the midfielder's first goal in a Middlesbrough shirt, and came just a minute after De Bruyne missed an empty net following a mistake by Boro keeper Victor Valdes.
Five minutes before that, Aguero missed another clear chance to seal the win, firing badly wide when found by Jesus Navas in the box.
Pep's City blues
Guardiola described City's 3-1 victory over Barcelona in the Champions League on Tuesday as a landmark win for his side - and warned against letting standards drop in the league.
But for all of City's first-half dominance, that is exactly what happened. The home side managed 19 attempts on the Boro goal in the opening 45 minutes, but only six in the second half as they let the away side back in.
There was sloppy play in midfield, silly fouls that allowed the balance of play to turn at crucial moments, and then - after Aguero and De Bruyne's bad misses - slack defending in injury time.
In the Premier League, City have drawn each of their past three home games 1-1, are without a home win since September, and have now lost their place at the top of the table.
Chelsea's 5-0 victory over Everton means they lead City by one point, and Guardiola's side could slip a further point behind in the title race if Arsenal beat Tottenham or Liverpool beat Watford on Sunday.
Boro's repeat performance
Two weeks ago, Aitor Karanka's side put in brilliant defensive display at Arsenal to earn a point from a match they might even have won with some better finishing.
Here, luck had a greater role in keeping City at bay until just before the break - and some solid close-range stops by Valdes.
Aguero, Ilkay Gundogan and De Bruyne were all denied as the home side failed to take advantage of Boro's inability to keep the ball and their risky play at the back.
But in the second half they were a team transformed.
Negredo's attempt to score from almost inside his own half spoke of a greater sense of confidence within the side, and Boro continued to snatch chances from City's 71% share of possession.
Bravo smothered the ball at Adam Forshaw's feet to stop one counter, and Stewart Downing should have done better with his finish on another.
Even though they had to wait until injury time for the goal to come, and even though they rode their luck, Boro deserved their point.
Last year's Championship runners-up are now unbeaten in three matches, and move up to 14th in the table.
The stats you need to know
- City have drawn three consecutive home Premier League matches for the first time since November 2009 under Mark Hughes.
- They have failed to keep a clean sheet in nine of their 11 league matches this season.
- Aguero has scored against 28 of the 30 different sides he has faced in the Premier League.
- Since his debut in September 2015, De Bruyne has provided 19 assists for Man City in all competitions; six more than any other City player.
- Middlesbrough have won just one of their last 19 Premier League away games (D5 L13).
What they said
Manchester City manager Pep Guardiola: "We did absolutely everything to win the game, controlled the game and in the last minute we concede a goal. It is a pity.
"We have to close the game with a second or third goal and we couldn't do that. We created six or seven chances and didn't score."
On Sergio Aguero's second-half miss at 1-0: "When you miss you have to accept that, but the league is still long. It is a miss because we have dropped six points in the last three home games but we are still there. We have to move forward."
Middlesbrough manager Aitor Karanka: "It was an amazing result. In the first half we went on to the pitch with too much respect for them.
"I told them at half-time we weren't just there to defend and that we could play like we did in the second half. I was pleased with our performance.
"Two weeks ago at Arsenal was more difficult than today because Arsenal didn't score and we were organised. Our reaction was really good and it is a big step to showing how good we are."
Man of the match - Marten de Roon (Middlesbrough)
He made some excellent interceptions in midfield, crowded out the influential Fernandinho, and drove in Boro's equaliser at the death.
His phone was alight with messages of congratulations in the post-match interview but he did manage to say: "I saw the little Spaniard come in - City sub Aleix Garcia - and knew I could get above him. The cross had so much power on it, it couldn't be stopped.
"I ran straight into the fans and I didn't know what was happening in my head. I never score, it was full happiness."
Simon Stone, BBC Sport at Etihad Stadium
You can adjust statistics to suit any argument but one win in five Premier League games is not a great return, even if the win was by four goals and - during that run - you have beaten Barcelona for the first time.
By the end of this weekend, City could be in fourth, their lowest position since the opening day of the season.
Not that Middlesbrough's determination should be overlooked. It wasn't pretty at times but they found a way to stay in the game when they could easily have been blown away.
BBC Match of the Day commentator Guy Mowbray
That's the most exciting finish I've seen in a Premier League game this season. The look on Marten de Roon's face was priceless - he was overjoyed and bewildered at the same time.
Former England winger Chris Waddle on BBC Radio 5 live
Boro worked hard and you get your rewards. For all of their possession, City looked sluggish in the second half.
They dominated the game but seemed to run out of legs in the second half.
Boro carved out one glorious chance towards the end of the game and it's a fantastic header from Marten de Roon.
Former Arsenal and England striker Ian Wright on BBC Match Of The Day
Manchester City dominated a game again but they just didn't get the luck or take their chances. They created some good opportunities - Aguero, Silva and De Bruyne all got into good positions but it just didn't happen for them.
You could see from the faces of the City players as they came off the pitch they were very disappointed. Middlesbrough were terrible in the first half but they tried to get forward more in the second and put City under pressure. At 1-0 you are always in the game.
City play away at Crystal Palace on Saturday, 19 November, after the international break.
Middlesbrough are at home to Chelsea on Sunday, 20 November.
- 15NavasSubstituted forGarcíaat 86'minutes
- 17De Bruyne
- 8GündoganSubstituted forNolitoat 75'minutes
- 10AgüeroBooked at 88minsSubstituted forIheanachoat 90'minutes
- 37TraoréSubstituted forStuaniat 90+3'minutes
- 34ForshawBooked at 20mins
- 8ClaytonBooked at 52mins
- 14de RoonBooked at 89mins
- 19DowningSubstituted forFischerat 78'minutes
- 2da Silva
- Kevin Friend
- Shots on Target
Second Half ends, Manchester City 1, Middlesbrough 1.
Offside, Manchester City. Kelechi Iheanacho tries a through ball, but Nolito is caught offside.
Aleix García (Manchester City) wins a free kick in the defensive half.
Foul by Cristhian Stuani (Middlesbrough).
Substitution, Middlesbrough. Cristhian Stuani replaces Adama Traoré.
Goal! Manchester City 1, Middlesbrough 1. Marten de Roon (Middlesbrough) header from the centre of the box to the high centre of the goal. Assisted by George Friend with a cross.
Substitution, Manchester City. Kelechi Iheanacho replaces Sergio Agüero.
Attempt missed. Kevin De Bruyne (Manchester City) right footed shot from outside the box is too high.
Marten de Roon (Middlesbrough) is shown the yellow card for a bad foul.
David Silva (Manchester City) wins a free kick in the defensive half.
Foul by Marten de Roon (Middlesbrough).
Sergio Agüero (Manchester City) is shown the yellow card.
Foul by Sergio Agüero (Manchester City).
Adam Forshaw (Middlesbrough) wins a free kick in the defensive half.
Substitution, Manchester City. Aleix García replaces Jesús Navas.
Attempt missed. Sergio Agüero (Manchester City) right footed shot from the centre of the box is close, but misses the top right corner. Assisted by Jesús Navas.
Foul by Pablo Zabaleta (Manchester City).
Viktor Fischer (Middlesbrough) wins a free kick in the defensive half.
Hand ball by Adama Traoré (Middlesbrough).