South Africa, replying to West Indies' total of 292 for nine, were bowled out for 249 in 46.5 overs squaring the seven-match series 1-1.
A record fourth-wicket stand of 226 off 225 balls between Shivnarine Chanderpaul and Carl Hooper rescued West Indies after they had been 46 for three.
Their partnership was a West Indies record for the fourth wicket in all limited overs internationals.
Chanderpaul's brilliant 150 was his highest one-day score and the highest by any batsman against South Africa. Hooper made 108.
Man-of-the-match Chanderpaul faced 136 deliveries before he was bowled by Shaun Pollock in the 48th over. Hooper fell in the previous over, caught by Pollock off Lance Klusener.
West Indies began disastrously losing Philo Wallace and Nixon McLean in the opening over to Pollock.
South Africa struck late, taking the last six wickets for 18. Three fell to Pollock who recorded career-best figures of six for 35.
South Africa also got off to a poor start, slumping to 18 for three in the sixth over. But a fourth-wicket stand of 60 between Jacques Kallis and Jonty Rhodes kept them close to the run rate of 5.86.
In the 16th over Rhodes was caught by Neil McGarrell off Reon King for 21. Kallis fell in the 25th over for 51, caught by Keith Semple off Hooper for 51. When Pollock was run out for six South Africa's fate was sealed.
Mark Boucher with 51 and Klusener, last out for 46, ensured South Africa an eighth-wicket stand of 64.
The series' third match is in Durban on Wednesday.