The Bantams' eight-game unbeaten run came to an end with a narrow 1-0 away defeat to Crewe Alexandra in Sky Bet League Two.
The hosts converted an early penalty to take a 1-0 lead into the break against the run of play, but City failed to find an equalising goal despite pushing to the very last second.
Just 12 minutes into the game, Crewe had the chance to draw first blood, as Chris Long was played through on goal and Jonathan Tomkinson was adjudged to have brought him down in the box.
Long sent Harry Lewis the wrong way from the penalty spot to give the hosts an early lead.
City looked to respond as Alex Gilliead had their first effort on target in the 20th minute - a low, driven effort held by Tom Booth in the Crewe net.
Just after the half-hour mark, Clarke Oduor found a pocket of space inside the box and drilled a low ball across the box, but Tyler Smith could only turn it wide.
Oduor himself then had a long-range effort saved by Booth, who spilled a parried effort into a mix of bodies, but Crewe were able to clear.
While City had the better chances after the goal, it was Crewe who ended the half better. Lewis was called into action to collect a couple of dangerous low balls into the box.
Into the second half, and the Bantams continued to pile forward. Andy Cook thought he had found the equaliser with a strong header from a Richie Smallwood free-kick, though the assistant's flag was up for offside and the goal was chalked off.
After some attack-minded changes from Graham Alexander, with Bobby Pointon, Vadaine Oliver and Matt Derbyshire introduced, City were pushing for a goal back.
Oliver rose well to win a good ball in the air, but his header flew wide, before the Bantams came even closer when Cook saw his header pushed onto the crossbar and away by Booth.
Alexander's men threw everything they had at the Crewe backline, with Booth scrambling to keep Tomkinson's goalbound header out in the dying seconds, but City would leave empty handed after their first defeat in nine matches.
CREWE: Tom Booth, Rio Adebisi, Mickey Demetriou, Luke Offord (C), Chris Long (Elliott Nevitt 60’), Courtney Baker-Richardson, Shilow Tracey (Ryan Cooney 84’), Connor O’Riordan, Aaron Rowe, Lewis Billington, Joe White. SUBS NOT USED: Harvey Davies, Zak Kampster-Down, Calum Agius, Lewis Nolan, Nathan Robinson.
GOAL: Long (12’).
CITY: Harry Lewis, Brad Halliday, Liam Ridehalgh (Vadaine Oliver 75’), Matty Platt, Richie Smallwood (C), Andy Cook, Alex Gilliead (Bobby Pointon 75’), Clarke Oduor, Tyler Smith (Matt Derbyshire 60’), Ciarán Kelly, Jonathan Tomkinson. SUBS NOT USED: Colin Doyle, Ash Taylor, Emmanuel Osadebe, Kevin McDonald.
ATTENDANCE: 5,529 (with 1,294 travelling City supporters).