Rotherham United's three-matching winning streak came to an end as they lost out in the League One Yorkshire derby at Valley Parade.
The Millers pressed hard in the second half after falling behind before the break but lacked the quality they have shown in previous games to force an equaliser.
Richie Towell's 55th-minute shot deflected off Kieffer Moore, passed fit despite a tight groin, and home goalkeeper Colin Doyle gratefully saved as Paul Warne's men got on top.
Eight minutes later, Towell tested Doyle with a low effort and Lee Frecklington's fierce follow-up was blocked by Nathaniel Knight-Percival.
Despite late pressure, Rotherham couldn't make the breakthrough and went down to Romain Vincelot's 21st-minute goal.
The home side took advantage of poor Rotherham defending to take the lead as Tony McMahon crossed from the right to the unmarked Romain Vincelot who headed home.
The Millers thought they were level in the 26th minute as Ryan Williams' superb pass released Jon Taylor to beat Doyle but Matthew Kilgallon produced a stunning goalline clearance as Moore looked to finish off the move.
The visitors were guilty of misplacing too many simple passes in the opening period and keeper Marek Rodak kept them in the game two minutes before the break, spreading himself well to thwart Dominic Poleon in a one-on-one.
Left-back Joe Mattock was sent off for a second yellow card in time added on to compound a frustrating afternoon for Rotherham.
Goals: Vincelot 21 (Bradford).
Bradford (4-4-2): Doyle; McMahon, Knight-Percival, Kilgallon, Chicksen; Gilliead, Reeves, Vincelot, Law (Thompson 82); Wyke, Poleon (Patrick 62). Subs not used: Raeder, Taylor, McCartan, Hendrie, Jones.
Rotherham (4-1-4-1): Rodak; Vaulks, Wood, Ihiekwe, Mattock; Potter; Williams (Newell 62), Frecklington, Towell (Clarke-Harris, 80), Taylor (Forde 72); Moore. Subs not used: O'Donnell, Ajayi, Purrington, Yates.
Referee: Jeremy Simpson (Lancashire).
Attendance: 20,881 (1,641).