Keshav Maharaj made a hard-hit 84 before the Proteas were bowled out for 453 on the second day of the second Test against Bangladesh at St George’s Park.
Maharaj struck his runs off 95 balls with nine fours and three sixes as South Africa added 175 runs to their overnight 278-5.
Bangladesh left-arm spinner Taijul Islam took 6-135 – the 10th time he has bagged five wickets or more in a Test innings.
An early tea was taken when the last wicket fell.
Maharaj raced to his fourth Test half-century off 50 balls with four fours and three sixes and went on to make his highest Test score.
He came in after Kyle Verreynne was bowled for 22 by Khaled Ahmed and almost immediately went on the attack, being severe on fellow left-arm spinner Taijul, whose first ball of the day went for six.
Taijul conceded 27 runs in six overs before switching ends and bowling Wiaan Mulder for 33 to end an 81-run seventh-wicket partnership.
Taijul finally dismissed Maharaj when the batsman tried one big shot too many and was bowled. The spinner also had Simon Harmer smartly stumped for 29 by wicketkeeper Liton Das.
The first nine South African batsmen made 20 runs or more, but none went on to a century.
© Agence France-Presse