Wilfried Zaha became the first player to score 50 top-flight goals for Crystal Palace as 10-man Manchester City suffered a shock defeat at Etihad Stadium.
Zaha struck after just six minutes when Conor Gallagher robbed Aymeric Laporte inside his own half before Gallagher wrapped up the points when he fired home two minutes from time.
Laporte was red-carded by referee Andre Marriner in first-half stoppage time when he committed a professional foul by bringing down Zaha 35 yards from the City goal.
Even a man down, the hosts remained a goal threat and Gabriel Jesus thought he had levelled when he turned home Phil Foden's superb far-post cross, only for video assistant referee Lee Mason to rule the England forward was offside in the build-up.
City fans were infuriated by what they saw as time-wasting from Palace, which started in the opening period, and manager Pep Guardiola - marking his 200th match in the Premier League as a manager - was less than impressed with what he saw too, judging by the number of times he spoke to fourth official Anthony Taylor.
But Palace were a danger on the break, with Jordan Ayew and Gallagher both wasting decent chances before Gallagher finished Michael Olise's lay-off to give Patrick Vieira's men victory and end a frustrating run of four consecutive Premier League draws.