Reaching 141 for four at tea, India looked good for a 250 plus first innings score before losing six wickets for 82 runs in the final session.
Kohli (79 off 201 balls), back to lead the side after missing the second Test due to a back spasm, worked extremely hard for his first half-century of the series but eventually ran out of partners.
Cheteshwar Pujara (43) was the other batter who came with up a substantial contribution.
Lead South Africa pacer Kagiso Rabada, playing his 50th Test, was the standout bowler of the day and ended with four wickets for 73 runs in 22 overs. Tall left-arm pacer Marco Jansen picked up three wickets.
India got the important wicket of South African skipper Dean Elgar (3) towards close of play with Jasprit Bumrah getting him caught at first slip.
At stumps, the hosts were 17 for one in eight overs with Aiden Markram (8) and night watchman Keshav Maharaj (6) in the middle.
Earlier, Rabada and Kohli were engaged in a fascinating battle throughout the day before the South African removed the opposition captain who was looking for boundaries towards the end of the innings.
The hallmark of Kohli’s special knock was how he dealt with balls in the off-stump channel, something he had struggled with heading into the series-decider.
What was remarkable was that he did not shy away from playing those glorious drives he is known for, he just picked the right balls to go for his strokes and did not play recklessly around the off-stump.
Kohli, who took 15 balls to get off the mark, got going with an expansive cover drive off Jansen and got his second slowest fifty with a sublime straight drive.
However, for the major part of his innings, Kohli was all grit and gumption as South African bowlers, especially Rabada, kept attacking the off-stump corridor in favourable conditions.
The Indian lower-order failed to contribute this time, leaving Kohli stranded.
Rishabh Pant (27) was the first to be dismissed in the final session as he tried to cut a ball too close to his body and ended up giving a simple catch to gully.
Jansen had Ashwin (2) caught behind by getting one to angle away and Shardul Thakur (12) was caught at short cover for spinner Keshav Maharaj’s first wicket of the series.
In the afternoon session that yielded 66 runs, Pujara and Ajinkya Rahane (9 off 12 balls) were dismissed.
Kohli, who got off the mark with a delightful cover drive in the morning, hit another majestic one off Jansen in the afternoon besides a six he collected from a mis-timed pull off Rabada.
Rabada breathed fire in his seven-over spell but Kohli was able to see it off with required patience and discipline.
Pujara once again showed positive intent but was undone by a beauty from Jansen that angled in from round the wicket and straightened just enough to take the outside edge.
Rahane, who has shown sublime touch all through the series but has not been able to convert the starts, was caught behind after Rabada got one to straighten from good length.