Fast bowler Nandre Burger took 4-33 as South Africa bowled out India for just 131 in their second innings to win the first Test in Centurion by an innings and 32 runs.
Virat Kohli was the only batsman to test the home attack on the third day, top-scoring with 76 before being the last man out.
The Proteas had earlier taken a first-innings lead of 163 as Dean Elgar (185) and Marco Jansen (84*) extended their first innings to 408.
India were 62-3 at tea, still 101 runs in arrears, with India captain Rohit Sharma (nought), fellow opener Yashasvi Jaiswal (five) and Shubman Gill (26) all back in the pavilion.
The collapse began in earnest after the resumption as Burger, who had already removed Jaiswal with a sharp lifter, had first innings centurion KL Rahul, Ravi Ashwin and Mohammed Siraj all caught behind the wicket.
Jansen showed his all-round value to the team by taking 3-36.
Kagiso Rabada, who took five wickets in the first innings, picked up 2-32 and completed the victory by taking a sensational catch to remove Kohli whose 76 included 12 fours and a six.
𝐓𝐡𝐞 𝐏𝐫𝐨𝐭𝐞𝐚𝐬 𝐫𝐮𝐧 𝐫𝐢𝐨𝐭 𝐚𝐭 𝐒𝐮𝐩𝐞𝐫𝐒𝐩𝐨𝐫𝐭 𝐏𝐚𝐫𝐤 🏟
Virat Kohli goes after Marco Jansen but he is caught by Kagiso Rabada in the deep 🤝
— SuperSport 🏆 (@SuperSportTV) December 28, 2023
The India innings lasted just 34.1 overs and leaves them looking for answers ahead of the second Test in Cape Town next week.
The loss means India will have to wait a while longer if they are to win a Test series in South Africa.
They are the only regular Test-playing country where India have yet to win a series.
© Agence France-Presse
Photo: Sydney Seshibedi/Gallo Images