India collapsed following battling half-centuries from Cheteshwar Pujara and Virat Kohli but Bhuvneshwar Kumar struck early in South Africa's reply on day one of the third and final Test.
Kohli opted to bat first after winning the toss in bowler-friendly conditions at the Wanderers and combined for a much-needed third-wicket stand of 84 with the patient Pujara, who took 54 balls to get off the mark.
The captain was dropped twice prior to his dismissal for 54 and Pujara grafted it out with the ball swinging around and moving sharply off the seam on a green pitch before he fell for a 179-ball 50.
Kagiso Rabada took 3-39, while Vernon Philander (2-31), Morne Morkel (2-47) and Andile Phehlukwayo (2-25) - replacing Keshav Maharaj in an all-seam attack - claimed two wickets apiece to bowl India out for 187.
Bhuvneshwar, recalled at the expense of Ravichandran Ashwin as India went about trying to avoid a 3-0 whitewash without a spinner, saw the back of Aiden Markram to reduce South Africa to 6-1 at stumps on Wednesday.
End of an intriguing day one of the 3rd #SunfoilTest in the #FreedomSeries. The visitors were bowled out for 187. SA reduced to 6/1 by the close. @VDP_24 took 2/31 in what was his 50th Test. @KagisoRabada25 the best of the bowlers with 3/39 #ProteaFire#SAvINDpic.twitter.com/pFmYYgQng6
-- Cricket South Africa (@OfficialCSA) January 24, 2018
The probing Philander snared KL Rahul caught behind in the fourth over and Rabada got in on the act to dismiss Murali Vijay in the same fashion in his first over, leaving India in trouble on 13-2.
Lungi Ngidi (1-27), man of the match at Centurion, would have had Pujara lbw without scoring if South Africa had reviewed, before Philander - playing his 50th Test - undid some of the good work from an incredible opening spell of 8-7-1-1 when he put Kohli down off Rabada on 11.
There were cheers when the obdurate Pujara finally scored his first run, having showed unwavering discipline with the ball jagging around, and AB de Villiers gave Kohli another life after the captain edged Morkel to second slip with 32 to his name.
Kohli hooked Rabada to the boundary to bring up his half-century, but De Villiers made no mistake when Ngidi drew an edge in the next over and Ajinkya Rahane, returning in place of Rohit Sharma, fell cheaply after being given a reprieve when he edged behind but Philander over-stepped.
Phehlukwayo finally removed Pujara after he had reached his fifty off 173 balls and sent Hardik Pandya on his way when Quinton de Kock took a fifth catch, three wickets falling in as many overs as India crumbled in testing conditions.
Rabada wrapped up a painstaking innings, but not before Bhuvneshwar went on the offensive with a useful 30, then tempted Markram to fish outside the off stump and nick behind to give India a breakthrough late in the day.