Virat Kohli lays into a cover drive. Photo: BCCI
A strokeful 51 from Shikhar Dhawan, a confident 46 from Captain Virat Kohli helped India overhaul South Africa's lowly total of 118 with nearly 30 overs to spare.
Rohit Sharma was the only wicket to fall after making a typically breezy 15.
The only jarring note in the Indian innings was not related to the cricket itself! The umpires called for the lunch break when India were just two runs away from victory and the players were not too pleased. The break had been delayed given the early close of the South African innings.
Yuzvendra Chahal recorded career- best figures of 5 for 22 and in Kuldeep Yadav's company skittled out South Africa for 118, their lowest ODI total at home soil.
Chahal and Yadav (3/20) continued their wrist-spin magic and shared eight wickets for 42 runs between them to rattle the hosts in 32.2 overs after Virat Kohli won the toss and elected to bowl.
The packed Supersport Park was forced into silence for majority of the morning as Chahal-Yadav ripped apart the Proteas' batting line-up.
It was the lowest total for South Africa in ODI cricket on home soil, after 119 versus England at Port Elizabeth in 2009.
Incidentally, it was also the lowest ODI total at this venue after Zimbabwe's 119 against South Africa in 2009.
Chahal and Yadav's performances had historic significance as well, becoming only the second spin pairing to pick up three-plus wickets each in the same innings.
West Indies' Carl Hooper and Keith Arthurton had previously shared six wickets at Bloemfontein in 1999.
Chahal also returned the best figures for any Indian spinner against South Africa in South Africa. The previous best hauls for an Indian spinner was Yuvraj Singh's 4 for 6 versus Namibia at Pietermaritzburg in 2003.
Chahal also became only the second Indian bowler to pick up a five-wicket haul in ODIs on South African soil, after Ashish Nehra's 6/23 against England at Durban, also in 2003.
Chahal also became the first spinner to take a five-for against South Africa in South Africa, routing their innings in 135 minutes total.
Earlier, Aiden Markram became the second-youngest ODI skipper for South Africa.
South Africa made two changes, handing Khaya Zondo his ODI debut for the injured Faf du Plessis. They also included chinaman Tabraiz Shamsi in place of all-rounder Andile Phehlukwayo while India went unchanged.
Sent into bat, Hashim Amla (23) and Quinton de Kock (20) made a watchful start against Bhuvneshwar Kumar (1/19) and Jasprit Bumrah (1/12). While the Indian pacers were on the money with their line and length, the Proteas' openers were more watchful and wary of losing wickets early on.
The duo nearly negotiated the first 10 overs safely, as Hardik Pandya (0/34) once again proved to be expensive in his opening spell.
India got the breakthrough they wanted when Kumar, bowling from changed ends, induced a faint inside edge off Amla. The batsman asked for DRS review but the decision stayed with India. South Africa were placed at 39/1 after 10 overs and their 50 came up in the 13th over.
Chahal immediately came into the attack and struck in his second over as de Kock was caught in the deep. It became two wickets in two balls when Markram (8) played a poor stroke off Yadav in the very next over and was caught in the deep as well, with Kumar taking a well-judged catch.
Four balls later, Miller was bamboozled by Yadav and was caught at slip.
South Africa, by then, had lost three wickets for 0 runs in a space of 6 balls, but the worst was yet to come.
Zondo (25) and JP Duminy (25) added 48 runs for the fifth wicket to somewhat stabilise the innings.
But the procession began once again when the wrist spinners were brought back in action. Zondo miscued one off Chahal in the 27th over and was caught at midwicket, with Pandya latching on second attempt.
South Africa barely crossed 100 in that over, and then Chahal came with another breakthrough, trapping Duminy plumb LBW.
The Proteas then their last five wickets for 11 runs.
Chahal trapped Morne Morkel (1) LBW as well, while Yadav got rid of Kagiso Rabada (1) with a wrong one, out LBW. Bumrah got on the wickets' tally too, bowling Imran Tahir (0) to complete the hosts' misery.