Virat Kohli and Cheteshwar Pujara hit half-centuries for India but South Africa's fast bowlers dominated the first day of the third and final Test at the Wanderers Stadium on Wednesday.
India were bowled out for 187 despite contrasting innings of 54 by Kohli and 50 by Pujara.
South Africa were six for one at the close.
Kohli and Pujara put on 84 for the third wicket but there were no other major partnerships. Bhuvneshwar Kumar, who made 30 batting at number eight, was the only other Indian to reach double figures.
South Africa picked a five-pronged pace attack and the Indian batsmen were under pressure all day on a pitch which offered pace and sideways movement.
All five bowlers took wickets. Kagiso Rabada took three for 39, while Morne Morkel, Vernon Philander and Andile Phehlukwayo took two apiece. Lungi Ngidi only took one wicket but it was the key one of Kohli, who was caught at third slip by AB de Villiers.
Kohli won the toss and decided to bat on a hard, well-grassed pitch in cool, overcast conditions.
As in the first two Tests, Kohli was batting early in the innings after both openers were dismissed inside the first nine overs.
While Pujara played a dogged, defensive innings, Kohli attacked when the bowlers strayed in line or length.
Pujara took 54 balls to score his first runs and battled for 261 minutes and 179 balls, hitting eight boundaries before he was caught behind off the medium-paced Andile Phehlukwayo.
Two dropped catches and a wicket overturned because of a no-ball hampered South Africa on a day when the bowlers were able to extract considerable sideways movement off the pitch.
Kohli, who made his runs off 106 balls with nine fours, was the beneficiary of both dropped catches. He was put down when he had 11 by Philander off Rabada and on 32 by De Villiers at third slip off Morkel.
De Villiers made amends when he held a sharp chance off Lungi Ngidi to end Kohli's innings but South Africa's star batsman did not field after tea while receiving ice treatment on a bruised right middle finger suffered when he held the catch.
Philander took the first wicket when he had Lokesh Rahul caught behind and bowled a remarkable first spell of one for one in eight overs. He was later denied a second wicket when Ajinkya Rahane, on three, edged him to wicketkeeper Quinton de Kock, only to get a reprieve when replays showed he had overstepped the bowling crease.
Rahane made only six more runs before he was leg before wicket to Morkel shortly before tea.
Pujara faced 31 balls without scoring a run in Philander's first spell and was beaten several times as well as surviving an unsuccessful review for a leg before wicket decision which showed the ball hitting the bails in the umpire's call zone.
South Africa suffered an early blow when Aiden Markram edged an outswinger from Kumar to wicketkeeper Parthiv Patel in the third over.
Both teams selected all-seam attacks, with no spinner in either team.
"There is good grass cover but the surface is nice and hard. If we bat first and bat well it's an advantage," Kohli said at the toss.
"We played some really good cricket at this ground last time and we are looking to correct the mistakes we made in the first two games."