Dale Steyn took four wickets to help dismiss India for 169 before stumps yesterday on the fourth day and leave South Africa 211 runs to win the third test and the series.
South Africa was 55-2 at the close, requiring another 156 runs for victory at the Newlands Stadium.
A.B de Villiers was caught by wicketkeeper Dinesh Karthik for 22 off Zaheer Khan and Hashim Amla was leg-before-wicket to Anil Kumble for 10 in the final over. Graeme Smith was not out 21 at stumps.
India, which scored 414 in its first innings and then dismissed South Africa for 373, lost its last seven second-innings wickets for 79 runs. Steyn had the best figures with four for 30 off seven overs.
In the morning, Steyn induced Virender Sehwag - who batted back at the top of the order - to drive loosely outside off stump on 4 and give wicketkeeper Mark Boucher an easy catch.
In the next over, Makhaya Ntini got a delivery to climb sharply on Wasim Jaffer, who gloved it to De Villiers at first slip to depart for 2.
There was a long delay before Sourav Ganguly came in at No. 4. Sachin Tendulkar was due in, but because he was off the field when South Africa's innings closed overnight, he had to wait an equivalent amount of time before he could bat.
Ganguly was not ready and the umpires conferred with South Africa captain Smith and asked him not to appeal for a timed-out dismissal in the interests of sportsmanship.
Smith agreed, and Ganguly took eight minutes to get to the crease. India went to lunch at 73-2.
Ganguly was the first batsman to be dismissed after the break, guiding a simple catch to Herschelle Gibbs in the gully off Jacques Kallis for 46.
Rahul Dravid was caught-and-bowled for 47 by left-arm spinner Paul Harris and India was 114-4.
One run later, V.V.S Laxman was run out for 1 by a powerful throw from Shaun Pollock at square leg.
Pollock then had Tendulkar out leg-before-wicket for 14 just before tea.
The last four wickets fell in just five overs for 22 runs after tea.
Kumble was caught by Gibbs off Steyn for 6. Khan was run out for 1 by De Villiers at extra cover.
Sree Sreesanth was caught by Kallis off Steyn for 4, and Munaf Patel was caught for a duck by Pollock on Steyn's very next ball - the seventh, as the umpires miscounted.
The series is tied at 1-1.