England must face a weekend decider in Cape Town after Chris Morris' maiden one-day international 50 sent them to an agonising one-wicket defeat at the Wanderers.
Following Joe Root's century, and despite a middle-order collapse of five wickets for 21 runs, the tourists appeared set to defend their total of 262 all out.
But number eight Morris (62) cashed in, after being badly-dropped by Adil Rashid, with some brilliant late hitting as South Africa won with 16 balls to spare and levelled the series at 2-2.
It was an aggravating outcome for England, who were all but home when Rashid seemed sure to hold a routine chance at mid-off from the bowling of Reece Topley.
Instead, Morris escaped on 14 - with eight wickets down and 52 runs still needed - and responded with a 30-ball 50 containing three sixes and two fours.
It was the only half-century of patchy South Africa chase, transformed in a ninth-wicket stand of 52 with Kyle Abbott.
Then even after Rashid bowled Morris with scores level, number 11 Imran Tahir strode in and hit his first ball past cover for four for victory.
England had made their own problems, with three dropped catches in all, and they had no answer to Morris - who last week landed a million-dollar Indian Premier League deal with Delhi Daredevils.
But it was hard on Root (109) and Chris Woakes in particular to end up on the losing side - after the latter had shared a 95-run stand for the seventh wicket with England's centurion, bowled well too and pulled off a brilliant run-out to eliminate home captain AB de Villiers.