Wales fell agonisingly short of a first Rugby World Cup final as Handre Pollard's 76th-minute penalty secured the Springboks' spot alongside England in Saturday's showpiece.
Warren Gatland's side were level at 9-9 early in the second half as Dan Biggar and Pollard swapped kicks.
Springbok centre Damian de Allende barged over on the 57th minute, but Josh Adams dived in to make it 16-16.
Wales were ultimately undone though as Pollard landed a penalty late on.
More to follow.
Wales: Halfpenny; North, J Davies, Parkes, Adams; Biggar, G Davies; Wyn Jones, Owens, Francis, Ball, Alun Wyn Jones (capt), Wainwright, Moriarty, Tipuric.
Replacements: Dee, R Carre, D Lewis, Beard, Shingler, T Williams, Patchell, Watkin.
South Africa: Le Roux; Nkosi, Am, De Allende, Mapimpi; Pollard, De Klerk; Mtawarira, Mbonambi, Malherbe, Etzebeth, De Jager, Kolisi (capt), Du Toit, Vermeulen.
Replacements: Marx, Kitschoff, Koch, Snyman, Mostert, Louw, H Jantjies, Steyn.