Prosper Utseya took a hat-trick as Zimbabwe gave South Africa a scare before crumbling in match three of the triangular series in Harare.
Utseya, who has been reported to the International Cricket Council for a suspected illegal bowling action, became only the second Zimbabwean to take three wickets in as many balls in one-day internationals, following Eddo Brandes' feat against England in 1997, but it was not enough to prevent a 61-run defeat for his side.
The hosts completed a remarkable turnaround in the first innings as the Proteas went from 142 without loss to 231 all out off 49.5 overs, Utseya taking 5-36.
That opened up the prospect of a surprise win, but South Africa's bowlers were up the challenge, dismissing Zimbabwe for 170 in less than 39 overs.
Home skipper Elton Chigumbura's decision to field first looked set to backfire when openers Hashim Amla and Quinton de Kock lasted almost 25 overs together.
The pair scored at a healthy rate pushing six an over until Amla, having made his 24th ODI fifty, was stumped for 66 off Utseya.
Utseya's magic moment then changed the complexion of the innings in his next over.
The in-form De Kock was first to go, well caught by Tendai Chetara for 76, before Utseya had Rilee Roussow held at slip first ball and pinned David Miller lbw to complete the hat-trick.
South Africa were now 147-3 and continued losing regular wickets - including JP Duminy becoming Utseya's fifth scalp - until a last-wicket stand of 36 between Aaron Phangiso and Imran Tahir (23no) offered a late boost.
Zimbabwe's reply started dreadfully, Tino Mawoyo run out for nought, but Sikandar Raza (35) and Hamilton Masakadza (25) knuckled down to add 42 runs.
Masakadza and new man Brendan Taylor were nipped out in quick succession by Phangiso to leave the score 46-3, a position South Africa did not allow them to recover from.
Raza fell to the spin of Imran Tahir and, although Sean Williams top-scored with a positive 46 from number five, the frequent loss of wickets undermined the hosts.
Ryan McLaren and Dale Steyn were too good for the lower order, sharing six wickets as the collapse escalated quickly and left 11.3 overs unbowled.