Saddlers top scorer Andy Cook was sent off after just six minutes for elbowing Nathaniel Knight-Percival.
And Bradford quickly capitalised by going ahead in the 12th minutes as Eoin Doyle headed home Jack Payne’s cross.
Walsall levelled in the 42nd minute when Josh Gordon rifled home a loose ball in the box, and the 10 men led in the 47th minute when Joe Edwards nodded home after Matt Jarvis’ header came back off the bar.
Bradford equalised in the 53rd minute, with Anthony O’Connor slotting in after Walsall keeper Liam Roberts had parried Lewis O’Brien’s fierce strike.
O’Brien rattled the bar from 25 yards and a Payne shot was cleared off the line by Jon Guthrie - but Walsall won it just after the hour mark when Gordon flashed a header home from Luke Leahy’s corner.
Bradford could have rescued a point but Guthrie blocked Doyle’s point-blank volley and Roberts saved superbly from Payne to leave City three points from safety.