The Saddlers secured League One survival with a hard-fought point at mid-table Bradford.
Erhun Oztumer’s 17th goal of the season gave the visitors a 22nd-minute lead but Matty Lund equalised with a header in first half injury time.
Jordan Gibson and Tony McMahon had chances for City after the break, but Walsall held on to move four points clear of the relegation zone, with just one match remaining.
George Dobson, the Saddlers’ saviour against Northampton, was the first player to threaten in a quiet start to the game.
The midfielder collected possession in midfield and drove towards the box, eluding two players before hitting a left-footed shot which was straight at home keeper Colin Doyle.
The visitors had a scare on 11 minutes as Tony McMahon skipped past Luke Leahy and delivered a low cross which Liam Roberts pushed out, with the ball eventually being scrambled away.
After a fairly uneventful and evenly balanced opening 22 minutes, Dean Keates’ men edged in front.
Oztumer collected Luke Leahy's ball down the line and crossed towards Bakayoko, who looked to turn but was snuffed out by a defender.
Dobson seized upon the loose ball and his deflected drive ran through for Oztumer to plant a diving header into the net from close range.
Bradford offered little in response, with an off-target Charlie Wyke header from a Stephen Warnock cross a rare attempt at goal.
Walsall were looking comfortable but a defensive lapse in first-half injury time allowed City to draw level, Matthew Lund guiding a free header past Roberts from Warnock’s inviting first-time centre.
After a slow start to the second half, the Bantams began to increase the pressure around the hour mark.
Substitute Jordan Gibson almost had an instant impact, latching onto Shay McCartan’s through ball and skipping away from a lunging Dobson before pulling a low shot wide of the far post.
City had an even better chance on 62 minutes as McCartan’s fierce strike was beaten away by Roberts but McMahon blazed the rebound over.
The Saddlers spent the majority of the second half defending deep with plenty of men behind the ball, looking to stifle their hosts and secure the point required to assure safety.
Dobson twice drove purposefully forward into dangerous positions, but the visitors were unable to create any real opportunities.
For all their possession, City failed to seriously trouble a well-organised Saddlers rearguard in a dour final half-hour as Walsall comfortably held on.
Team (4-4-1-1): L Roberts; K Roberts, Fitzwater, Guthrie, Leahy; Devlin, Chambers, Dobson, Morris; Oztumer (Cuvelier 86’); Bakayoko.
Subs not used: Gillespie, Kinsella, Flanagan, Kouhyar, Ngoy, Candlin.