South Africa won the toss and elected to bat, posting 164 for five in their 20 overs. New Zealand were bowled out for 145 in reply.
Both sides were missing several regulars as they gave chances to fringe players.
Connor Esterhuizen was the anchor for the South African innings with a career-best 57 from 36 balls, with Rubin Hermann unbeaten on 28 from 25 deliveries.
There was little else of note for the visitors as fast bowler Kyle Jamieson was the pick of the New Zealand bowlers with 2-29 in his four overs.
The home side made a bright start to their reply but once South Africa introduced their spinners, they strangled the scoring rate and that scoreboard pressure brought wickets.
Captain Keshav Maharaj took 2-22 in his four overs, while Prenelan Subrayan managed 2-13 in three overs and seamer Gerald Coetzee 3-31 in 3.5 overs.
"There was a lot of good energy and a little bit of hunger within the group, and we showed that," Maharaj said. "It is a young team that is finding its way in international cricket, but to see the response after three games is superb.
"I think the way the debutant (Subrayen) took two wickets was fantastic. There were dropped catches but there was no panic. There were no pre-planned ideas coming in and the guys just adapted."
