Simon Grayson's Bantams finished their home campaign for the season with a 1-1 draw against Walsall.
Walsall - who knew coming into the game that a point would be enough to secure their League One status - took the lead midway through the first period when Erhun Oztumer stooped to head home from close range.
Matthew Lund's second City goal for the season on the stroke of half time levelled things up for the Bantams, however, with the midfielder powering home a header following Stephen Warnock's cross into the box from the left.
City pushed for a winner after the break, but despite substitute Jordan Gibson and Tony McMahon going close, Grayson's men were force to settle for a share of the spoils.
The City chief made two changes to his side following the weekend loss to Southend United.
The injured Kai Bruenker and Matthew Kilgallon were forced to miss out, meaning Romain Vincelot and Shay McCartan were handed recalls.
Ahead of kick off, and in keeping with tradition, there was an impeccable minute's silence to remember the 56 victims of the 1985 Valley Parade Fire Disaster.
McMahon, who kept the captain's armband despite Vincelot's return to the side, and Walsall skipper Adam Chambers also laid wreaths by the dug-outs pre-match.
Once the action got underway, it was the Bantams who began the game on the front-foot, but they initially found it difficult to break through the Saddlers' well-manned defences.
Against the run of play, Walsall actually took the lead through their diminutive playmaker Oztumer.
As Walsall broke into City's penalty area, George Dobson latched onto a loose ball before firing a left-footed drive across goal.
The scuffed effort from Dobson appeared to be heading wide of the far post, but Ozhumer was on hand to convert with a diving header from close range.
City went in pursuit of an equaliser but Callum Guy and Lund saw efforts blocked from outside the box.
Later in the half, Wyke shouldered a cross from the left by Warnock just past Saddler 'keeper Liam Roberts' near post.
Although City looked the aggressors for the most part in the first half, Walsall did have their moments after taking the lead.
The talented Oztumer, who has caught the eye of many observers in League One this season, volleyed at Colin Doyle following Kieron Morris' lofted pass into the box.
Just as it looked like the visitors would make it back into the safety of the dressing rooms with their lead intact, though, City pounced to pull themselves level.
In the one and only minute of added on time at the end of the first period, Lund stole into the box unmarked to head home Warnock's pin-point cross from the left flank.
With City tweaking their formation slightly, and helped by the introduction of Jordan Gibson off the bench, Grayson's side seemed to up the tempo towards the start of the second period.
Gibson actually nearly netted his first home goal in City colours just a minute of so after coming on.
The winger was fed into space inside the box by Shay McCartan but his low angled drive whistled narrowly past the far post.
In the 56th minute, there was a touching moment when those within the Northern Commercials Stadium stood to applaud in memory of the 56 supporters we lost in the fire disaster.
The interaction from the fans certainly seemed to spur City on; Timothee Dieng saw a goal-bound half-volley blocked in the box by Jon Guthrie soon after and Charlie Wyke had a headed saved by Roberts from a Tony McMahon cross minutes later.
As City kept the pressure on past the hour mark, they threatened again when McCartan saw a drive from outside the box parried by Roberts.
McMahon came charging in to connect with the loose ball first, but he could only fire over from around ten yards out with Roberts grounded.
Walsall were reduced to counter-attacks at this stage, but they did nearly trouble the Bantams through one such break soon after McMahon's miss.
Amadou Bakayoko tried to play Morris in on goal as Walsall sprung forward, but a watchful Timothee Dieng was in the right place to make a timely clearance.
During the Walsall break, Guy appeared to tweak his hamstring attempting a tackle on Dobson.
Guy was booked for the challenge and then forced off due to the injury.
He was replaced by 18 year-old fellow midfielder Cameron Hawkes, who was making his senior debut for the club after joining from Sheffield United earlier in the year.
Although Hawkes and those close to him will have been delighted with his maiden involvement in the first team scene, another substitution for the Bantams twelve minutes from the end received an even greater response.
Warnock, who was playing his final home match before retirement, was given an opportunity by Grayson to receive a standing ovation from the City supporters when he was replaced by Adam Chicksen.
Even some of Warnock's team-mates, including Colin Doyle who ran out of his penalty area to join in, took the time to pass on their appreciation to the left back.
City huffed and puffed for a winner in the time that remained but Walsall seemed intent on keeping hold of the point that they knew would secure their place in League One next season.
You could sense the relief in the away contingent as the full time whistle blew, with loud roars of approval coming for the visiting fans and Saddlers boss Dean Keates acknowledging his side's safety with a clenched fist of celebration.
For City, they now head to Scunthorpe United on Saturday evening to complete their schedule of fixtures for the 2017/2018 campaign.