Kyle Mayers made two early strikes as the West Indies put South Africa under pressure on the third day of the second Test at the Wanderers Stadium in Johannesburg on Friday.
South Africa were 69 for four at lunch, an overall lead of 138.
The medium-paced Mayers opened the bowling when South Africa resumed at four for no wicket and had success with his fourth delivery when Dean Elgar steered a wide ball to gully, where Roston Chase held the catch.
Four overs later Tony de Zorzi chopped a ball from Mayers into his stumps and South Africa were eight for two.
The batsmen were given no free runs by a disciplined bowling attack as the West Indies stayed in contention to earn a share of the series.
Aiden Markram looked solid until he was caught behind for 18 off a good ball from Kemar Roach which climbed off the pitch and moved away just enough to catch the edge of his bat.
Ryan Rickelton played a loose shot to be caught behind for 10 off part-time left-arm seamer Raymon Reifer in the last over before lunch to leave captain Temba Bavuma unbeaten on 35 with no batsmen with proven Test records to come.
South Africa lead the two-Test series after winning the opener in Centurion by 87 runs.
South Africa 320 and 69-4 (T. Bavuma 35 not out; K. Mayers 2-10)
West Indies 251
Match situation: South Africa lead by 138 runs with six wickets remaining in the second innings
Toss: South Africa