Kagiso Rabada and his fellow fast bowlers ripped through the West Indian batting line-up to take South Africa within sight of victory on the third day of the first Test at SuperSport Park in Centurion on Thursday.
Set to make 247 to win, West Indies were 93 for six at tea.
Rabada made three key strikes, while Jermaine Blackwood kept West Indies in the hunt with a fine counter-attacking 52 not out.
The match hurtled towards a conclusion as South Africa were bowled out for 116 in their second innings in the morning, with Kemar Roach taking five for 47. They lost six wickets for 67 runs after resuming on 49 for four.
On a pitch of variable bounce, wickets continued to fall when the West Indies batted.
There was time for one over before lunch and captain Kraig Brathwaite was caught down the leg side off Rabada for nought off the third ball.
Rabada had first innings top-scorer Raymon Reifer caught behind for eight soon after lunch and Marco Jansen took two wickets in his first over.
Roston Chase was bowled first ball by Marco Jansen and when Gerald Coetzee had Kyle Mayers caught at first slip by Dean Elgar for nought, the third duck in the top six, West Indies were 33 for five.
But Blackwood played aggressively as he and Joshua Da Silva added 58 for the sixth wicket before Rabada had Da Silva caught at third slip by Keegan Petersen for 17 shortly before tea.
Blackwood hit eight fours and a six in reaching his fifty off 51 balls.
South Africa 342 and 116 (A. Markram 47; K. Roach 5-47)
West Indies 212 and 93-6 (J. Blackwood 52 not out; K. Rabada 3-19)
Match situation: West Indies need 154 runs to win with four wickets remaining
Toss: South Africa