Cape Town: Virat Kohli's masterclass and a pouncing pack of wrist-spinners ensured a 124-run win for India in the third ODI, giving the visitors an unassailable 3-0 lead and taking them one step closer to a maiden series triumph in South Africa.
Kohli reaffirmed his status as an ODI great with an unbeaten 160 off 159 balls on a challenging surface, propelling India to 303 for six.
It was the 34th ODI hundred for the Indian captain, who is now 15 shy of Sachin Tendulkar's mark of 49.
Kohli has been simply unstoppable in the 50-over format of late and Wednesday's match-winning effort was his fourth three-figure score in the last six ODIs. It was also his second hundred of the series and third of the tour.
While most Indian batsmen struggled after South Africa opted to bowl, Kohli made batting look easy. Shikhar Dhawan too stood out with a fluent 76 off 63 balls.
South Africa started the chase on a promising note with captain Aiden Markram (32) and JP Duminy (51) sharing a 78-run stand for the second wicket.
But most of their runs came against the pacers and when Indian spinners got into the act, it was a familiar story as South Africa surrendered to Yuzvendra Chahal (4/46) and Kuldeep Yadav (4/23) to end way behind at 170 all out in 40 overs.
The South African batsmen failed to pick India's wily wrist-spinners, as was the case in the first two ODIs.
The slide began with the fall of Markram, who was stumped by MS Dhoni after getting beaten by a flighted delivery from Yadav.
It happened to be Dhoni's 400th dismissal in ODIs as he became only the fourth wicket-keeper to reach that milestone in ODIs.
Not reading the spinners led to South African batsmen being defensive which pushed the run-rate up. From a healthy 79 for one in the 17th over, the hosts were reduced to 129 for five in the 33rd over, ending all their hopes of a recovery.
Earlier, Kohli scored the highest individual score by an Indian batsman against South Africa in South Africa, going past Sourav Ganguly's 127 at Johannesburg in 2001. It was also Kohli's second-highest ODI score after 183 against Pakistan in 2012.
Such was the nature of his innings that he scored only 60 runs through boundaries while he had to run hard for the remaining 100. In total, he collected 12 fours and two sixes.
He also became the first Indian batsman to score a hundred against South Africa at Newlands. Only Ganguly previously had an ODI century at this ground, but that came against Kenya in March 2003.
Records kept tumbling as his innings progressed. He also became the Indian ODI captain with most hundreds to his name.
He went past Ganguly again, who has 11 centuries in 142 innings.
Kohli now boasts of 12 hundreds as skipper but in only 43 innings.
Kohli, with 318 runs in this series so far, now also has the most runs for a visiting batsman in a bilateral ODI series against South Africa in South Africa. Ricky Ponting, with 283 runs in 2001-02, was the previous best.
In terms of balls faced, it was the joint-slowest hundred for Kohli, after he faced 119 balls against Pakistan at Adelaide in 2015. But in doing so, Kohli put on 140 runs with Dhawan for the second wicket.
The Proteas made three changes to their playing eleven after the Centurion defeat. Lungi Ngidi and Heinrich Klaasen were handed their ODI debuts and came in for Morne Morkel and injured Quinton de Kock, respectively.
Andile Phehlukwayo was included ahead of Tabraiz Shamsi as the hosts played only full-time spinner. India fielded an unchanged side again.
Rohit Sharma (0) continued his poor run in this ODI series and was caught behind off the sixth ball he faced. The three-time ODI double-centurion now averages 12.10 in 10 innings on South African soil and has an ODI high score of only 23.
Kohli (on 0*) survived an early lbw shout off Kagiso Rabada (1-54) in the third over. He immediately asked for DRS review, which showed an inside edge and the decision was overturned.
Dhawan and Kohli then came together, and piled on the runs, almost continuing from where they had left off in the previous match.
Momentarily though, India's run-rate dipped below 5/over as Chris Morris (1-45) exerted some control over proceedings. In the meantime, Dhawan scored his 25th ODI half-century off 42 balls and took his team past 100 in the 18th over.
Dhawan accelerated after reaching his mark, and scored 26 runs off next 21 balls he faced. Part of the reason had to do with Imran Tahir's (1-52) inclusion into the attack as Dhawan-Kohli pairing milked his bowling for runs.
JP Duminy (2-60) then provided the breakthrough. In fact, it was stand-in skipper Markram who did all the hard work and took a stunning diving catch to dismiss Dhawan who had danced down to the part-timer.
South Africa then triggered a mini-collapse in the middle order as India lost three wickets for 48 runs.
MS Dhoni (10) then stemmed the down-curve and added 40 runs with Kohli.
Kedar Jadhav (1) played a nothing shot and edged behind off Phehlukwayo (1-42) as India were reduced to 236 for six in the 43rd over.
The skipper then found a stable partner in Bhuvneshwar Kumar (16 not out) and the duo added 63 runs off only 43 balls for the seventh wicket.