Mauricio Pochettino's side headed into the match on a superb run of nine consecutive victories that had prevented Chelsea from turning their bid for glory into a procession.
But they were short of their best at London Stadium and Manuel Lanzini's goal 20 minutes into the second period ensured Spurs would remain four points behind Chelsea, having played a game more.
Victory over lowly Middlesbrough at Stamford Bridge on Monday would put Antonio Conte's men seven points clear with three games remaining and Chelsea's seemingly favourable run-in comprises matches with West Brom, Watford and Sunderland.
Lanzini further enhanced his reputation as a London derby specialist, the Argentinian's strike standing as his ninth in 14 all-capital encounters, and Slaven Bilic's team are up to ninth in the table on 42 points – extinguishing their faintly lingering relegation fears.
Kyle Walker was called back into the Tottenham line-up in place of Kieran Trippier and he was caught napping in the sixth minute, with Lanzini racing onto Andre Ayew's raking ball into the space behind the England right-back to drag a shot wide.
West Ham were in down Walker's flank again five minutes later and Victor Wanyama raced back to make an excellent clearing header as Sam Byram waited to convert.
Walker was then booked for a robust follow through on Lanzini as Spurs looked to launch a counter-attack, with Mark Noble clattering into Eric Dier shortly afterwards to even up that aspect of a feisty start.
Adrian shovelled a Harry Kane drive back into his area, with Son Heung-min's follow-up blocked before the West Ham goalkeeper atoned for his mistake by brilliantly denying Kane with his boot.
Spurs keeper Hugo Lloris charged out of his area to challenge Lanzini in the 27th minute and was relieved to see Cheikhou Kouyate's lobbed follow-up squirt behind.
Christian Eriksen drilled narrowly wide from outside the area but Tottenham were still searching for the breakthrough when the interval arrived.
Ayew lashed over from 18 yards seven minutes into the second half and Spurs appeared increasingly edgy as the hour approached – Eriksen's tame sidefoot at Adrian lacking conviction when promisingly placed.
Son took advantage of Walker's run down the outside to open up room by lashing towards the bottom-left corner from the edge of the box, giving Adrian a more taxing workout.
But Tottenham's title hopes were in tatters after 65 minutes as West Ham opened the scoring.
West Ham United (@WestHamUtd) May 5, 2017
Aaron Cresswell shovelled a cross in from the left at the second attempt and, after Jonathan Calleri and Ayew had attempts blocked, Lanzini was on hand to lash in from six yards.
Pochettino sent on Mousa Dembele and Vincent Janssen in an attempt to rouse his side but they remained scrambled.
Toby Alderweireld played himself into trouble inside his own area and it needed an excellent save from Lloris to thwart Calleri.
Eriksen lashed over but Tottenham were running on empty, with West Ham substitute Ashley Fletcher going agonisingly close to number two just before a final whistle that will have prompted significant celebrations in west London.
Key Opta stats:
- West Ham have now won three of their last four home Premier League games against Spurs (L1).
- Tottenham have lost their last three Premier League games in the month of May (final two May games in 2016 and this one) and lost just three out of 34 matches between August 2016 and April 2017.
- Of players to appear in 10 or more Premier League London derbies, only Harry Kane, Thierry Henry and Jurgen Klinsmann have a better goal per game ratio than Manuel Lanzini (0.64, nine goals in 14 games).
- West Ham have kept three consecutive Premier League clean sheets for the first time since December 2015.