Match ends, Manchester City 2, West Ham United 1.
Manchester City came from behind to win a record-equalling 13th Premier League match in a row with victory over stubborn West Ham at Etihad Stadium.
Angelo Ogbonna's header on the stroke of half-time put the lowly Hammers ahead, but Nicolas Otamendi responded with a predatory finish shortly after the break.
David Silva won it for City, acrobatically converting a Kevin de Bruyne pass with seven minutes left.
Victory meant Pep Guardiola's side re-established their eight-point lead over Manchester United, who they play at Old Trafford next Sunday (16:30 GMT).
They also equalled the longest winning run within a top-flight season, matching Sunderland and Preston (1891-92), Arsenal (2001-02) and Chelsea (2016-17).
West Ham, though, have set a club record for the fewest points after 15 Premier League matches - they have just 10.
The Londoners had their chances - as well as Ogbonna's goal, Michail Antonio almost pounced when Ederson spilled the ball, and Manuel Lanzini forced the goalkeeper to save at his near post.
But it always looked as though City's pressure would tell and, shortly after De Bruyne's free-kick was palmed away, Gabriel Jesus skipped through and slid the ball to Otamendi, who scored.
Leroy Sane, Raheem Sterling, De Bruyne and Jesus had further chances before Silva won it for the home side, but there was still time for the Hammers to go close, with Diafra Sakho shooting just wide after Marko Arnautovic pulled the ball back.
- Analysis: Total belief, squad unity and late goals - who can stop Man City?
- 5 live's Football Daily: Another late goal, another Man City victory
- Relive Manchester City's victory over West Ham
City leave it late to win - again
Silva's strike made this the fourth game in a row City have won thanks to a goal scored in or after the 83rd minute. Sterling had scored the past three, having also hit an injury-time winner at Bournemouth in August.
A home victory always looked the likeliest result, with City extending their unbeaten run in all competitions to 28 matches.
They were made to fight for the points, though, and Silva's late winner was one of 18 shots they had in the second half.
While City have been in full flow for much of the season, they have also shown their resilience - taking a league-high 10 points from losing positions.
Prior to their late winners against Huddersfield last month and now West Ham, City had won only one of their past 30 games in which they had been behind at half-time.
That combination of silk and steel has taken them eight points clear at the top, and it will take something special to stop them.
Positives in defeat for Moyes
Despite the defeat, there was plenty for Hammers boss David Moyes to take heart from as his side kept the league leaders at bay for almost an hour.
The first half was particularly encouraging and, though a deflected strike from Silva extended Adrian, West Ham had better chances through Antonio and Lanzini.
They looked defensively solid and confident in their gameplan, and Moyes' only disappointment will be they could not keep it up.
Jesus' half-time introduction made a difference, but Sane, De Bruyne and Silva - who had not been at their best in the first half - also began to influence things.
City had had six shots to the Hammers' four prior to that, but Adrian was forced into a string of saves as the hosts bombarded his goal in search of a winner.
Adrian, who came in as Joe Hart was unable to face his parent club, was a standout performer but the Hammers had opportunities of their own despite the absence of strikers Andy Carroll and Javier Hernandez.
And the agonising nature of this defeat was summed up by the reaction of former City defender Pablo Zabaleta when Silva's shot hit the back of the net.
'We deserved to equalise'
David Moyes speaking to BBC Radio 5 live: "I have to say it was a really good effort. We defended much better today. We've worked a bit on it, we had one day where we could prepare.
"We needed our goalkeeper to play well. He got both hands to most things. I thought most of it was outside the box. I have to say we did a really good job.
"What a chance we have to make it 2-2 late on. My feeling was I thought we deserved it (to equalise). You get results in different ways and it looked as though we might have got one today. For long parts of the game we were in with a chance."
Pep Guardiola speaking to Match of the Day: "We started really well but we lost our patience. We didn't have any rhythm because Adrian was taking 30 seconds every time.
"It was similar to the last few games, in the second half I thought we would score. They played 10 players inside the box, it was almost impossible.
"It's a big victory. It showed what we are. We had two strikers in the second half and that helped, it was a big lesson for me. We created more with two.
"We spoke a lot about defending set-pieces but they are taller. It will happen again next week against United so we have to try and concede fewer set-pieces."
Record-equalling success and record-breaking disappointment - the best of the stats
- City have equalled the longest winning run within a top-flight season.
- City's haul of 43 points from 15 games is a joint top-flight record, level with Tottenham in 1960-61 (converted to three points for a win).
- West Ham's total of 10 points from 15 games is their lowest in the Premier League and lowest in the top-flight since 1976-77 (nine, converted to three for a win).
- Since his debut for City in September 2015, De Bruyne has provided 35 assists in the league - more than any other in the big five European leagues.
- Jesus has been directly involved in 21 goals in his 24 Premier League appearances so far (15 goals, 6 assists).
- Ogbonna scored his first goal in the big five European leagues, in his 144th appearance.
Man of the match - Adrian
West Ham return to London Stadium to face Chelsea on Saturday (12:30 GMT) in the first of two successive home games - with Arsenal to come afterwards.
Manchester City travel to Ukraine to take on Shakhtar Donetsk in the Champions League on Wednesday (19:45 GMT) and return to league action against Manchester United at Old Trafford on Sunday (16:30).
- 3DaniloSubstituted forGabriel Jesusat 45'minutesBooked at 90mins
- 17De BruyneBooked at 59mins
- 10AgüeroSubstituted forFernandinhoat 85'minutes
- 19SanéSubstituted forBernardo Silvaat 90+3'minutes
- 20Bernardo Silva
- 33Gabriel Jesus
- 42Y Touré
- 13AdriánBooked at 90mins
- 41RiceBooked at 17mins
- 8KouyatéSubstituted forSakhoat 43'minutes
- 10LanziniSubstituted forArnautovicat 69'minutes
- 30AntonioSubstituted forA Ayewat 88'minutes
- 20A Ayew
- Mike Dean
- Shots on Target
Second Half ends, Manchester City 2, West Ham United 1.
Gabriel Jesus (Manchester City) is shown the yellow card.
Foul by Raheem Sterling (Manchester City).
Edimilson Fernandes (West Ham United) wins a free kick in the defensive half.
Adrián (West Ham United) is shown the yellow card for a bad foul.
Gabriel Jesus (Manchester City) wins a free kick on the right wing.
Foul by Adrián (West Ham United).
Substitution, Manchester City. Bernardo Silva replaces Leroy Sané.
Attempt missed. Diafra Sakho (West Ham United) right footed shot from the centre of the box is close, but misses to the right. Assisted by Marko Arnautovic.
Substitution, West Ham United. André Ayew replaces Michail Antonio because of an injury.
Substitution, Manchester City. Fernandinho replaces Sergio Agüero.
Goal! Manchester City 2, West Ham United 1. David Silva (Manchester City) left footed shot from very close range to the bottom right corner. Assisted by Kevin De Bruyne.
Attempt saved. Michail Antonio (West Ham United) right footed shot from outside the box is saved in the top right corner. Assisted by Pedro Obiang.
Attempt blocked. Sergio Agüero (Manchester City) right footed shot from a difficult angle on the right is blocked. Assisted by David Silva.
Attempt blocked. Sergio Agüero (Manchester City) right footed shot from outside the box is blocked.
Corner, Manchester City. Conceded by Michail Antonio.
Corner, Manchester City. Conceded by Marko Arnautovic.
Attempt blocked. Gabriel Jesus (Manchester City) right footed shot from the centre of the box is blocked. Assisted by Raheem Sterling.
Attempt blocked. David Silva (Manchester City) left footed shot from the centre of the box is blocked. Assisted by Raheem Sterling.