South African bowlers Kagiso Rabada and Bjorn Fortuin combined to keep Sri Lanka down to 120 for eight in the third Twenty20 international on Tuesday.
Sri Lanka, who have already lost the three-match series after going down in the first two matches, suffered from lack of partnerships after electing to bat in Colombo.
Rabada rattled the top order with his pace to send back Avishka Fernando for 12 and then bowled Bhanuka Rajapaksa for five.
Fortuin got two key wickets including Dhananjaya de Silva, stumped for one, and Wanindu Hasaranga, out of four, to return figures of 2-21 with his left-arm spin.
Opener Kusal Perera top-scored with 39 before falling to skipper and left-arm spinner Keshav Maharaj who trapped the wicketkeeper-batsman lbw.
South Africa, who lost the one-day series to the hosts 2-1 last week, need 121 to sweep the T20s.