Gary Bowyer's battling Bantams were denied in heart-breaking, and hugely controversial, circumstances as late drama saw Oxford United snatch all three points in gut-wrenching fashion for City.
With City looking set to earn a hard-fought point after fighting against tricky windy conditions, Bowyer's men burst forward on the attack in injury time and Eoin Doyle laid the ball invitingly across the box for Lewis O'Brien.
O'Brien looked set to tap home for an all-important match-winner, but the midfielder appeared to be denied an almost certain goal by a recovery tackle from Cameron Brannagan.
No corner was given as Brannagan slid out of play, however, allowing Oxford to quickly get on the attack themselves and grab the winning goal.
Just seconds after O'Brien's chance, a Gavin Whyte shot fortunately deflected into Jamie Mackie's path in the Bantams box and the Oxford sub rifled home from inside the area.
Along with the gutting late nature of the goal, there were several huge question marks against the goal itself - including why a corner wasn't given for City and whether the goal kick quickly taken by Oxford soon after was actually legal or not.
The laws of the game state that goal kicks can only take place when all opposition players are out of the box and that the kick must go outside the area - both things that didn't seem to happen.
As City looked to restart the game following Mackie's goal, truly chaotic scenes followed.
Referee Mr Andy Davies consulted with his linesman and seemed to disallow Mackie's goal. Most in the Kassam Stadium thought that a penalty had been awarded to the Bantams, although on reflection it seems that the match official might have been pointing towards Oxford's area to signal the retake of the goal kick.
The decision to initially rule out the goal sparked heated scenes on the touchline and between the two sides for prolonged periods.
Mr Davies eventually went across to his other linesman and following a discussion with him, amazingly decided to cancel the penalty award/retake of the goal kick and allow the goal after all.
The whole incident took around six minutes to resolve, and it sadly left City with a bitter taste in their mouth at the end of an important fixture for the club.
Ahead of the dramatic scenes, Bowyer had made one change to his starting XI for the trip to the Kassam Stadium; Billy Clarke coming into the side for O'Brien.
Jack Payne recovered well enough from a throat infection earlier in the week to be named on the bench.
On a bobbly Kassam Stadium surface, it seemed to take both sides a while to get going on a windy afternoon in Oxford.
Oxford did carry more of a threat in the early stages, however, and Jerome Sinclair fired into the side-netting after Richard O'Donnell had parried a Brannagan drive from distance into his path.
In truth, that was the only real opening of note in a low-key first quarter of the match.
Sinclair tried to get a shot away from inside the box seventeen minutes in, but Anthony O'Connor's out-stretched boot took the sting out of the angled drive and the ball bounced through into O'Donnell's path.
In what was largely a strong defensive display by City's back four, blocks then came from Nathaniel Knight-Percival and Adam Chicksen in quick succession later in the half following efforts in the box from Jordan Graham and Sinclair.
City's first sight of goal arguably came twenty-five minutes in when the ball bounced out to Jacob Butterfield's just outside the box.
Butterfield went for goal but his first time effort on the half-volley flew over.
Following a curling effort from outside the box by Ahmed Kashi that was held by O'Donnell half an hour in, Whyte then got involved in proceedings.
Whyte drove into the box minutes later with purpose but his rising drive sailed over.
The young winger was in the action again soon after when he teed up James Henry, but the Oxford skipper's low drive rolled wide of the O'Donnell's far post.
Following his earlier opening, Butterfield was at the heart of another City opening when David Ball's low cross found him in the area.
Butterfield was forced wide, though, and his eventual shot for goal from a tight angle deflected wide for a corner.
After enjoying the better of the first period, Oxford continued to look a threat going forward after the break.
A curling cross from Graham - a one-time City loanee - wasn't cleared properly by Chicksen and Whyte fired narrowly over as the ball landed at his feet in the box.
The Bantams responded soon after by bringing on George Miller for Ball.
Oxford still kept probing away, though, with Graham firing over from just inside the box after a forceful run from Whyte.
The U's won a free-kick just outside the area shortly after the hour mark, but Henry's low curling was pushed away by a watchful O'Donnell.
O'Connor, who was a strong performer at the back for City, sent the ball bouncing over via a downward header from a Butterfield corner at the other end.
Oxford came back again, though, with two efforts from the lively Whyte that missed the target.
Shortly after the second of Whyte's two wayward efforts, City made their final moves from the bench; bringing on Payne and O'Brien.
Despite those positive changes for City, though, it was Oxford who were doing all the pushing in the final minutes of normal time.
City received a let-off when Brannagan's drive was parried by O'Donnell into the path of Sinclair right in front of goal - but the striker somehow completely missed his kick.
Sinclair's blushes were spared, however, by the linesman raising his flag for offside against the forward.
SInclair himself then fired wide of the far post shortly afterwards with an angled drive just inside the box.
Brannagan went even closer a minute or so before injury time when his fierce drive from distance went a whisker over.
Despite Oxford's late pressure, though, City looked to have seen off the danger to earn a battling point - until the late and unbelievably frustrating controversy.
As City broke forward on the counter-attack, Doyle laid the ball invitingly across the box for O'Brien.
O'Brien looked set to tap in for a huge City goal but Brannagan was crucially on hand to slide the ball behind.
A corner should have been given, but a goal kick was awarded instead - something that Oxford took quickly.
If a corner wasn't the correct decision and Brannagan didn't actually get a touch on the ball, there is some suggestion then that City perhaps should have been awarded a penalty instead for the midfielder's challenge on O'Brien.
There were still four City players in Oxford's penalty area at the time when Oxford 'keeper Simon Eastwood passed to team-mate Josh Ruffels in the area from the goal-kick.
The nearside linesman appeared to signal that the goal-kick should have been retaken due to these two points, but play was allowed to continue.
The ball was quickly moved up into City's area and Mackie was sadly on hand to break Bantams hearts when he slammed home after a strike had kindly deflected into his path.
As City lined up to restart the match, Mr Davies spoke with the same linesmen and initially appeared to disallow Mackie's goal.
Most in the Kassam Stadium thought the referee pointed for a City penalty after disallowing the goal, but it appears the match official could have been actually signalling for the goal-kick.
Much to City's amazement, though, the referee then decided to go over to the other linesman on the far side and consult with him.
Confusion reigned as several minutes of discussions followed; leading to a number of heated exchanges between both benches and sets of players.
Mr Davies then eventually decided to reverse his decision to retake the goal-kick, allowing the goal to stand after all.
City tried to rally in the final thirty seconds or so of the encounter when play resumed at last some six minutes later.
Oxford got themselves over the line, though, to leave City with a sense of bitter disappointment.
Match line ups, stats and updates from the Oxford United fixture can be found via the Match Centre - HERE.
Updated at (UK)
Commentary to begin soon
There are currently no key moments to display.
Are you sure you want to delete this event?Delete Cancel