Manchester City's hopes of Champions League qualification took a major hit as they were held to a draw by relegation-threatened Middlesbrough.
Boro took the lead through Alvaro Negredo's unconventional effort before Sergio Aguero tucked home a contentious penalty, but City needed a late Gabriel Jesus header to spare their blushes after Calum Chambers had netted a scrappy goal.
City came agonisingly close to opening the scoring within the first minute, with Gabriel Jesus firing a cross across the six-yard box with no one on the receiving end of the Brazilian's pass, before Aleks Kolarov lashed a shot over as the visitors dominated.
George Friend slammed an effort high and wide when invited to take Middlesbrough's first shot of the game, but Steve Agnew's side were largely restricted to defensive duties as City monopolised possession.
City, whose season has disappointedly petered out with no chance of winning a trophy, zipped the ball around nicely as they experimented a new formation, with wing-backs Jesus Navas and Gael Clichy looking to bomb forward and provide width in attack while Nicolas Otamendi, Vincent Kompany and Kolarov sat as part of a back three.
That defence was very nearly breached early on as Alvaro Negredo almost grabbed a strike against his former club, whistling a shot across the goalmouth with no Boro player gambling to convert from close range.
Marten de Roon, fresh from his winner against Sunderland in midweek, nearly grabbed his second of the week but could only spoon an effort over the bar as the ball fell to his feet at a set-piece.
Boro have little hope of avoiding relegation but held their own for much of the game, although it was surprising to see Negredo score the game's opening goal. Latching onto a loose ball following a quick break, the Spaniard curled home, swinging his left boot, missing and instead catching the ball with his right and watching on as his strike went in via the post.
Pep Guardiola brought on Raheem Sterling and Leroy Sane for Gael Clichy and Aleix Garcia but Boro had the second-half's first opportunity, with Adam Clayton seeing his low 25-yard strike easily saved by Caballero.
City laboured in front of goal and struggled to make opportunities for striker Sergio Aguero, and Kevin De Bruyne, always heavily influential for City, was also largely frustrated by Boro, slamming wide from the edge of the box after neat play from Sane.
However, the Citizens were soon gifted a penalty as Sane fell to ground under the challenge of De Roon. The Dutchman was convinced the spot-kick should not have been awarded, insisting Sane dived, but referee Kevin Friend judged the contact between the pair warranted the decision and Aguero made no mistake in converting the opportunity.
Guardiola's side remain embroiled in a top four battle and, with United drawing against Swansea earlier on Sunday, needed to take all three points to put the pressure firmly on their rivals.
It was Middlesbrough, however, who struck the next blow by taking the lead through defender Calum Chambers. After Stewart Downing's initial free-kick was saved, a number of crosses and shots were deflected and blocked before Negredo's effort fell kindly for the loanee, who finished simply to give Boro the lead.
— Middlesbrough FC (@Boro) April 30, 2017
Their lead didn't last long as Gabriel Jesus got himself on the scoresheet, nodding home from Aguero's cross to equalise.
A number of close shaves were survived by Boro, with centre-backs Chambers and Ben Gibson making plenty of important interventions, and the Riverside Stadium team came through a number of corners unscathed to earn a point for their own against relegation and dent City's chances of finishing in the top four.
Middlesbrough XI: Guzan, Fabio, Chambers, Gibson, Friend, Clayton, Forshaw, de Roon, Stuani, Downing, Negredo
Manchester City XI: Caballero, Otamendi, Kompany, Kolarov, Navas, Fernandinho, Garcia, Clichy, De Bruyne, Jesus, Aguero