Manchester City came back from two goals down for the first time under Pep Guardiola to earn a point at West Ham that means victory over Aston Villa on the final day will see them crowned champions.
City's grip on the Premier League title was looking distinctly shaky at the break as the Hammers led thanks to Jarrod Bowen's well-taken double.
But Jack Grealish struck for the visitors four minutes after the re-start and Vladmir Coufal headed Riyad Mahrez's free-kick into his own net as City avoided defeat after coming back from two goals down in a top-flight game for the first time since 2012.
They even had a chance to win it five minutes from time but Lukasz Fabianski saved Mahrez's penalty after Craig Dawson had fouled Gabriel Jesus.
Guardiola looked devastated at that. But given the situation they found themselves in at the break, with Liverpool potentially having the chance to catch them when they play on Tuesday, the final outcome was positive for the visitors.
It certainly was for West Ham, who have qualified for European football through their league position in successive seasons for the first time in their history.
City drag themselves out of trouble
It is a measure of the success Guardiola has had in this stadium that his first five visits all yielded victories - and a staggering total of 22 goals.
Now City have drawn on three successive visits - losing on penalties in the Carabao Cup earlier this season.
In the week they signed Erling Haaland, they found it impossible to hold West Ham's number nine, Michail Antonio, and were unsettled by Bowen's direct running.
Without Grealish's volley from Rodri's knock-down flicking off Craig Dawson's leg and over Fabianski, they might have been in for a very fraught second half.
As it was, they dominated possession and put the Hammers defence under so much pressure, it felt inevitable an equaliser would come. That Coufal provided it was unfortunate as the Czech did not have to dive at Mahrez's free-kick, which Fabianksi seemed to have covered.
Mahrez blew the opportunity to avoid a nervy final day - but, 10 years after Sergio Aguero's famous injury-time title winner, City fans do at least know that anything can happen if events start to conspire against them again.
Europa Conference joy for West Ham
Jarrod Bowen has scored 12 Premier League goals this season, and has assisted another 12This has been an excellent season for West Ham - with European qualification being welcomed by manager David Moyes, even if it ends up being the Europa Conference League.
Bowen, a Premier League player of the year nominee, has been one of the stand-out stars.
The former Hull man showed an impressive turn of pace to run on to Pablo Fornals' hooked long pass, sprint round Ederson and finish from an acute angle.
Bowen showed composure also when he ran on to Antonio's through ball and found the net again.
However, had he pulled a cross back rather than try to score from an impossibly narrow angle shortly after Grealish had breathed new life into the game, West Ham might have got their first home win over City for 22 years.
Antonio also fluffed his lines when Fernandinho's woeful back-pass sent him through, chipping wide of Ederson and the City goal.
Hammers stalwart Noble says farewell
Mark Noble will leave West Ham at the end of the season, having made 567 appearances for the club in all competitionsMark Noble was 17 when he made his Hammers debut.
Born in Canning Town and growing up only a mile from Upton Park, Noble has been a fan all his life and other than short loan spells at Hull and Ipswich early in his career, has played for the club through the intervening 18 seasons.
West Ham were determined to make the most of Noble's final home game. His face adorned the side of the stadium, clearly visible on the walk up from the Westfield centre. A cake in his honour was left in the media room, with members of the press also given a letter from Noble thanking them for their support throughout his career.
The front page of the programme was dedicated to Noble, a distinctive number 16 shirt was laid on the pitch before the game, supporters applauded throughout the 16th minute.
Under the circumstances, it was hardly a surprise he was fighting back the tears as he came out to take the acclaim just before the teams emerged from the tunnel.
Moyes trusted Noble enough to bring him on near the end as West Ham secured their point, before Noble received the acclaim of virtually a full stadium that waited to hear his final farewell long after the whistle had gone.
Player of the match
BowenJarrod Bowen
West Ham United
Squad number20Player nameBowen
Squad number41Player nameRice
Squad number16Player nameNoble
Squad number9Player nameAntonio
Squad number8Player nameFornals
Squad number10Player nameLanzini
Squad number28Player nameSoucek
Squad number1Player nameFabianski
Squad number15Player nameDawson
Squad number3Player nameCresswell
Squad number4Player nameZouma
Squad number31Player nameJohnson
Squad number7Player nameYarmolenko
Squad number5Player nameCoufal
Line-ups
West Ham
Formation 4-2-3-1
1Fabianski
5Coufal15Dawson4Zouma3Cresswell
28Soucek41Rice
20Bowen10Lanzini8Fornals
9Antonio
1FabianskiBooked at 60mins5CoufalBooked at 58mins15Dawson4Zouma3Cresswell28Soucek41Rice20BowenBooked at 32mins10LanziniSubstituted forNobleat 77'minutes8FornalsSubstituted forJohnsonat 90+2'minutes9AntonioSubstituted forYarmolenkoat 90+5'minutesSubstitutes
7Yarmolenko11Vlasic13Areola16Noble24Fredericks26Masuaku31Johnson33Král40Oko-FlexMan City
Formation 4-3-3
31Ederson
27Cancelo25Fernandinho14Laporte11Zinchenko
20Bernardo Silva16Rodri17De Bruyne
26Mahrez9Gabriel Jesus10Grealish
31Ederson27Cancelo25Fernandinho14Laporte11Zinchenko20Bernardo Silva16Rodri17De Bruyne26Mahrez9Gabriel JesusBooked at 90mins10GrealishSubstitutes
6Aké7Sterling8Gündogan13Steffen47Foden56Egan-Riley79Mbete80Palmer90LaviaReferee:Anthony TaylorAttendance:59,972Live Text
Match ends, West Ham United 2, Manchester City 2.
Second Half ends, West Ham United 2, Manchester City 2.
Substitution, West Ham United. Andriy Yarmolenko replaces Michail Antonio.
Gabriel Jesus (Manchester City) is shown the yellow card for a bad foul.
Foul by Gabriel Jesus (Manchester City).
Jarrod Bowen (West Ham United) wins a free kick on the right wing.
Attempt blocked. Jack Grealish (Manchester City) right footed shot from outside the box is blocked. Assisted by Riyad Mahrez.
Attempt missed. Rodri (Manchester City) header from the centre of the box misses to the right. Assisted by Aymeric Laporte with a cross.
Substitution, West Ham United. Ben Johnson replaces Pablo Fornals.
Attempt missed. Rodri (Manchester City) header from the centre of the box misses to the right. Assisted by Oleksandr Zinchenko with a cross.
Attempt blocked. Oleksandr Zinchenko (Manchester City) right footed shot from the centre of the box is blocked. Assisted by Kevin De Bruyne.
Riyad Mahrez (Manchester City) wins a free kick on the right wing.
Foul by Aaron Cresswell (West Ham United).
Foul by Rodri (Manchester City).
Vladimir Coufal (West Ham United) wins a free kick in the defensive half.
Corner, Manchester City. Conceded by Declan Rice.
Penalty saved! Riyad Mahrez (Manchester City) fails to capitalise on this great opportunity, left footed shot saved in the bottom right corner.
VAR Decision: Penalty Manchester City.
Penalty Manchester City. Gabriel Jesus draws a foul in the penalty area.
Penalty conceded by Craig Dawson (West Ham United) after a foul in the penalty area.
Our coverage of your Premier League club is bigger and better than ever before - here's everything you need to know to make sure you never miss a moment