Steed Malbranque scored in injury time to hand Fulham their first away win in the penultimate away game this season.
City were left empty-handed as Fulham claimed a memorable win
Defender Richard Dunne had put City ahead in the 68th minute, firing in Micah Richards' flicked-on header.
But Collins John levelled the scores seven minutes from time, stabbing home Luis Boa Morte's pass from close range.
Malbranque then defied the run of play in the dying minutes, driving the ball in from the edge of the box to seal an elusive away victory.
While Chelsea earlier won the title and relegation battles ensued elsewhere, both the City and Fulham managers still knew that plenty was riding on Saturday's Eastlands encounter.
Stuart Pearce, for his part, was keen to continue City's revival after the midweek win over Aston Villa and Chris Coleman was still looking for Fulham's first elusive away win.
Liam Rosenior seemed to share Coleman's frustration when he fired wide moments in and Simon Elliott saw his long-range effort brilliantly palmed away by David James to end a manic opening 10 minutes.
Later, Boa Morte should have done better with a close-range header and Rosenior nearly picked out Brian McBride with a superb cross.
But it was City who carried the greater attacking threat throughout the game, with Trevor Sinclair coming close before Antti Niemi blocked Antoine Sibierski's six-yard effort just before the break.
City's pressure should have bore fruit 10 minutes into the second half when Antoine Sibierski sent Darius Vassell one-on-one in the box with Niemi.
But the Finnish keeper showed more poise, smothering the ball before Vassell could fully connect with a shot.
The home side continued to pile on the pressure but struggled to find a way past Niemi, who blocked a long-range effort from Sibierski, while defender Richards headed over after the resulting corner.
Dunne finally broke the deadlock 23 minutes after the break, sliding in to connect with Richards' header and sending the ball into the roof of the net.
It seemed that City had the game wrapped up but Fulham had other ideas with substitute John, who came on for Heidar Helguson, latching onto Boa Morte's pass and slotting home in the 83rd minute.
The home side continued to push forward and were nearly rewarded when Vassell's replacement, Georgios Samaras, sent in a looping shot but was denied by Rosenior's off-the-line clearance.
The visitors then rubbed salt in City's wounds, claiming an injury-time winner through Malbranque.
The talismanic midfielder provided the finishing touch to a Fulham break and smashed his shot past James into the right-hand corner.
Manchester City boss Stuart Pearce:
"We got our noses in front in a scrappy game but we just weren't strong enough mentally to keep things tight.
"And once it went to 1-1, basically we've ended up leaving the door open and getting caught.
"Every defeat I suffer and every victory I gain goes straight on my CV - this was another defeat and another black mark on my CV - that's not acceptable."
Fulham boss Chris Coleman:
"It was a long time coming and the way we did it as well made it extra special.
"Going 1-0 down with 20 minutes to go, the lads showed a lot of courage and determination to get back from that.
"We could've folded, bearing in mind our away record, but full credit to the lads - they were fantastic from start to finish and gave us a magical three points."
Man City: James, Richards, Dunne, Distin, Sommeil, Sinclair, Barton, Reyna, Riera, Sibierski (Flood 80), Vassell (Samaras 66).
Subs Not Used: Weaver, Musampa, Jihai.
Goals: Dunne 69.
Fulham: Niemi, Rosenior, Knight (Christanval 26), Pearce, Bridge, Malbranque, Diop, Elliott, Boa Morte, Helguson (John 66), McBride.
Subs Not Used: Crossley, Volz, Radzinski.
Booked: Diop, Christanval, Malbranque.
Goals: John 84, Malbranque 90.
Ref: P Walton (Northamptonshire).