They trailed at the break to Nathaniel Knight-Percival’s strike, only for Brett Pitman to thunder home a leveller after the interval.
But the Blues were unable to build on that and some sloppy defending allowed Matty Lund to restore the Bantams’ lead, with Charlie Wyke adding a third goal in stoppage-time.
It was a disappointing evening with play-off rivals Charlton beating Shrewsbury, although Pompey remain a single point outside the top six.
Kenny Jackett made one change from the side that drew with Plymouth at the weekend.
Connor Ronan replaced Stuart O’Keefe in the centre of midfield, meaning Ben Close continued in the holding role in front of the back four.
Pompey were slow to get going, although a couple of balls into the box caused problems in the opening stages.
Jack Whatmough’s long throws were providing the biggest threat, however, and when one was flicked on by Kal Naismith, Bradford keeper Colin Doyle had to fumble the ball clear.
But it was the hosts who broke the deadlock on 14 minutes after Alex Gilliead had pressured Dion Donohue into conceding a corner.
It was sent into the box by Tony McMahon and nodded on by Matt Kilgallon for Knight-Percival to lash home at the far post.
There were not an abundance of openings at either end of the pitch in truth, although Matt Clarke headed wide following good work from Jamal Lowe to win a corner.
Pitman thought he should have won a penalty after going down in the box under pressure from Kilgallon, only for referee Andy Woolmer to wave away his protests.
It was a bright spell for the Blues and when Ronan let fly from 25 yards, Doyle dived to his right to palm the ball clear.
Another opportunity arrived after Close had been felled on the edge of the ‘D’, with Pitman placing a clever low free-kick through the wall and Doyle doing well to smother the danger.
The Bantams still had their moments, though, and Knight-Percival could not quite guide the ball on the target from another set-piece.
Pompey had one more chance from a corner deep into stoppage-time, but when Whatmough met Donohue’s cross, the home defence scrambled clear.
Bradford City 1
There was a bright start to the second half, with Gareth Evans slipping a low pass across the box for Lowe. His close-range finish was deflected wide, although the linesman’s flag was raised for offside.
A couple of corners caused problems at the other end, with one punched clear by Luke McGee, while Clarke got down low to head away the second.
Jackett freshened things up with a double switch on 55 minutes, as Ronan and Evans made way for O’Keefe and Oli Hawkins.
That also led to a slight change in formation, as Pitman dropped in behind Hawkins in a 4-2-3-1 system.
And the Blues almost grabbed a leveller soon after, with Lowe cutting the ball back and Close stabbing a shot just past the upright.
But the equaliser did arrive just past the hour mark and there were no prizes for guessing who scored it.
PITMAN continued his prolific scoring spell by collecting a pass from O’Keefe and expertly bending a 25-yard effort past Doyle’s despairing dive and into the net.
The scores were level for just 10 minutes, however, as Bradford retook the lead following a spell of frantic play when the Blues were unable to get the ball clear.
There was a mix-up at the back between Donohue and Clarke, which allowed substitute Lund to bundle through and slot past a helpless McGee.
Jackett made a final throw of the dice by bringing on Conor Chaplin for Naismith to add to the attack on 75 minutes.
There was a lengthy break in play when Tyrell Robinson went down injured for the hosts and was eventually stretchered off the pitch, receiving warm applause from both sets of fans.
A display of nine additional minutes from the fourth official raised the hopes of the large army of travelling Pompey fans behind the goal.
But they were dashed when McGee parried away a free-kick from McMahon and Wyke followed up to score.
Bradford (4-4-2): Doyle; McMahon (c), Knight-Percival, Kilgallon, Warnock; Gilliead, Guy (Vincelot 75), Dieng, Robinson (Poleon 83); Wyke, Bruenker (Lund 64)
Goals: Knight-Percival 14, Lund 71, Wyke 90+5
Subs not used: Raeder, Chicksen, Patrick, McCartan
Pompey (4-1-4-1): McGee; Thompson, Whatmough, Clarke, Donohue; Close; Lowe, Evans (Hawkins 55), Ronan (O’Keefe 55), Naismith (Chaplin 75); Pitman (c)
Goals: Pitman 61
Booked: O’Keefe, Pitman
Subs not used: Bass, Burgess, Haunstrup, May
Referee: Andy Woolmer
Attendance: 19,554 (912 Pompey fans)