City began 2020 by extending their unbeaten run to seven matches - following a 1-0 victory over Morecambe.
Gary Bowyer's side recorded back-to-back triumphs after substitute Aramide Oteh's late strike.
The visitors started on the front foot and went close to opening the scoring after 10 minutes - when Steven Old’s header rattled the woodwork.
The Bantams grew into the half and could have broken the deadlock - as half-time approached - through a pair of headers from skipper James Vaughan.
The introduction of Zeli Ismail and Aramide Oteh gave City added attacking impetus - after the interval.
After working to create openings, Bowyer's men drew first blood - through Oteh - with 10 minutes remaining.
Connor Wood's ball in was helped on by Vaughan before breaking for the Queens Park Rangers loanee who lifted the ball over Mark Halstead.
The hosts were then inches away from doubling their advantage just three minutes later, when a spectacular long-range volley from Ismail struck the crossbar.
Despite looking to further add to their solitary goal, the City were made to settle for 1-0, which saw them maintain fourth place in Sky Bet League Two.
CITY: Richard O’Donnell; Anthony O’Connor, Paudie O’Connor (booked 68'), Ben Richards-Everton; Adam Henley (Aramide Oteh 61'), Jake Reeves, Matt Palmer, Connor Wood; Dylan Connolly, James Vaughan (c, yellow 72'), Shay McCartan (Zeli Ismail 61'). Subs (not used): George Sykes-Kenworthy (GK), Callum Cooke, Chris Taylor, Jermaine Anderson, Jordan Gibson.
GOALS: Oteh (80').
MORECAMBE: Mark Halstead; George Tanner, Ritchie Sutton, Steven Old, Luke Conlan (booked 45+2’); John O’Sullivan, Aaron Wildig (Kevin Ellison 86'), Alex Kenyon (c), Tom Brewitt, Carlos Mendes-Gomes; A-Jay Leitch-Smith. Subs (not used): Andre Da Silva Mendes (GK), Lewis Alessandra, Sam Lavelle, Michael Howard, Jordan Cranston.
GOALS: None.
ATTENDANCE: 14,111 (404 visitors).
REFEREE: Andy Haines (Tyne and Wear).