Manchester City’s title ambitions suffered a setback as Diafra Sakho scored for the sixth straight league game to help earn West Ham victory.
City, five points behind leaders Chelsea, fell behind when Morgan Amalfitano stabbed home Enner Valencia’s cut-back from three yards.
Sergio Aguero and Yaya Toure hit the bar for the visitors before Sakho headed in Aaron Cresswell’s cross.
David Silva pulled one back with a curled shot into the far corner.
City poured forward in the closing stages in search of an equaliser, Stevan Jovetic denied by a fine Adriano save.
But Manuel Pellegrini’s men were poor overall, and West Ham full value for a third straight win that lifts them one point behind last season’s champions.
For long periods, City played like a side jaded after their long midweek Champions League trip to Russia, where they were held to a draw by CSKA Moscow after blowing a 2-0 lead.
They lacked cutting edge in attack and organisation at the back as Enner Valencia and Sakho used their pace to torment a defence that has kept just three clean sheets in 13 league and cup games.
Keeper Joe Hart needed treatment after he was hurt in denying Valencia and it was the Ecuador forward’s ball that led to the opening goal moments later.
City’s England international keeper was left badly exposed as Amalfitano side-footed home in the 21st minute after Eliaquim Mangala had been outpaced by Valencia following Song’s defence-splitting pass.
With the visitors looking a shadow of the side that had destroyed Tottenham a week earlier, Stewart Downing twice went close, Valencia screwed a chance wide and James Collins narrowly failed to connect with Amalfitano’s ball across the six-yard area.
In contrast, Aguero only looked like adding to his nine Premier League goals once the match entered its frantic closing stages.
The Argentine was denied when Adrian finger-tipped his 65th-minute effort on to the bar following Toure’s surge.
It was then Toure’s turn to hit the woodwork with a thunderous effort – before Sakho doubled the hosts’ lead.
When the 24-year-old Senegalese climbed to meet Cresswell’s 75th-minute cross, Hart dropped to his left to get a hand to the ball and turn it away from goal.
But the assistant referee correctly ruled the ball had crossed the line, leaving the £3.5m summer signing from Boulogne to celebrate becoming the first Hammers player to score in six straight Premier League games.
City pulled a goal back two minutes later when Silva weaved through the West Ham defence before launching a shot into the far corner.
Adrian denied Jovetic in the dying moments but Sam Allardyce’s men hung on for a deserved win.