India were bowled out for 202 by South Africa on day one of the second Test in the absence of injured captain Virat Kohli.
Kohli was ruled out on the morning of the match because of a back spasm, with stand-in skipper KL Rahul hitting 50.
Proteas left-arm fast bowler Marco Jansen took 4-31, while Kagiso Rabada and Duanne Olivier both claimed 3-64.
The hosts reached 35-1 in reply by the close of play in Johannesburg, trailing by 167 runs.
With regular vice-captain Rohit Sharma already missing the series through injury, Rahul took over the captaincy from Kohli and Hanuma Vihari came into the starting side.
Rahul won the toss and chose to bat at the Wanderers, but India slipped to 49-3 as Olivier removed Cheteshwar Pujara and Ajinkya Rahane in consecutive deliveries.
Pace bowler Olivier is playing his first Test for South Africa in almost three years, having signed a Kolpak deal to play for Yorkshire in 2019, before Kolpak registrations were terminated at the end of the 2020 season following Brexit.
Having taken 4-55 in the second innings of his debut Test last week, Jansen impressed again by having opener Mayank Agarwal caught behind for 26, before removing Rahul for a watchful 50 off 133 balls.
Jansen also dismissed India wicketkeeper Rishabh Pant and all-rounder Ravichandran Ashwin, whose 46 off 50 balls helped the tourists edge past 200 on a tricky pitch for scoring.
South Africa opener Aiden Markram fell lbw to Mohammed Shami, but captain Dean Elgar ended 11 not out and Keegan Petersen unbeaten on 14 at the close.
India are 1-0 up in the three-match series after a 113-run first-Test victory at Centurion.
Last month, Kohli, 33, was removed as India’s one-day international captain, and with Rohit injured, Rahul will also lead the side in the ODIs which follow this Test series.