Bradford manger David Hopkin urged his struggling Bantams to take responsibility after another defeat.
Hopkin’s charges have won just once in their last eight and time is running out if they are to survive the drop.
The visitors had a man advantage for 84 minutes after Andy Cook’s early sending off.
Eoin Doyle’s header put them ahead before Josh Gordon equalised just before half-time.
Joe Edwards edged the hosts ahead before Anthony O’Connor levelled again.
But Gordon grabbed the spoils just after the hour to end Walsall’s five-game losing streak.
After being booed off, Hopkin fumed: “We have conceded some really poor goals. Some of the players need to start taking responsibility.
“Me and my staff are working as hard as we can to make sure we stay in League One. I’ve told the players a few home truths that they need to start giving me something back.”
Cook saw red for an alleged elbow on Nathaniel Knight-Percival – a decision Walsall are expected to appeal – just six minutes in and the visitors quickly cashed in to lead.
But Walsall hauled themselves level and then went in front through Edwards’s header after Matt Jarvis hit the bar.
O’Connor levelled before Gordon struck again to send the Banks’s Stadium wild.
Bradford piled on late pressure and Lewis O’Brien was denied by the post. Jack Payne and Doyle also had close-range efforts blocked as Walsall hung on.
Walsall: Roberts, Devlin, Scarr, Guthrie, Leahy, Kinsella, Edwards, Jarvis (Dobson 87), Gordon (Oteh 83), Ismail (Osbourne 79), Cook. Unused substitutes: Laird, Fitzwater, Blackett-Taylor, Dunn.
Bradford City: O’Donnell, Caddis (Mellor 85), O’Connor, Knight-Percival, Chicksen, Butterfield, O’Brien (Miller 85), Ball, Payne, Clarke (Anderson 72), Doyle. Unused substitutes: Wood, Akpan, Wilson.
Referee: B Huxtable (Devon).