Leaders Norwich suffered a blow to their promotion hopes as lowly Bradford pulled off a shock victory.
On loan Alun Armstrong scored the crucial goal at the end of the first half to hand the Bantams the points.
Norwich should have already been ahead as Leon McKenzie and Darren Huckerby wasted several good openings.
After the break Bradford nearly scored again when Robert Green saved Paul Evans' volley, and McKenzie and Damien Francis went close for the Canaries.
The day had begun well for Norwich after Paul McVeigh signed a new two-and-a-half year contract.
But the visitors made a bright start, with Andy Gray seeing his shot blocked by Craig Fleming before three corners in quick succession came to nothing.
At the other end McVeigh almost celebrated his new deal in style with a 25-yard volley which went over the crossbar.
Norwich goalkeeper Green was called into action for the first time in the 18th minute to keep out Gray's volley and a minute later his opposite number Alan Combe denied Huckerby from close range.
The home side took control as the half went on and McKenzie saw a header cleared off the line by David Wetherall.
McKenzie wasted another good chance when he shot wide from the edge of the area and Armstrong stunned the home fans in the second minute of injury time.
Simon Francis crossed from the right and Armstrong beat Green with a well-struck first-time volley.
The Canaries failed to make the most of two goalmouth scrambles as they continued to dominate and then Green produced a fantastic save to hold Paul Evans' volley.
Bradford began to create more chances as Norwich pushed forward and Green twice had to deny substitute Ben Muirhead.
Combe then kept out a header by Francis and held on to keep a clean sheet.
Norwich: Green, Edworthy, Mackay, Fleming, Drury, Henderson, Holt, Mulryne, McVeigh, McKenzie, Huckerby.
Subs: Crichton, Roberts, Rivers, Brennan, Francis.
Bradford: Combe, Atherton, Wetherall, Gavin, Heckingbottom, Summerbee, Francis, Gray, Farrelly, Armstrong, Cadamarteri.
Subs: Davies, Evans, Branch, Bower, Muirhead.
Referee: K Friend (Leicestershire).