NICKY Law’s tap-in proved the difference as Oxford United were edged out by promotion-chasing Bradford City at Valley Parade.

The midfielder bundled in Charlie Wyke’s knock-down on the hour mark to break a visiting defence which had looked strong.

It extended City’s unbeaten home league run to an impressive 29 games, but United had threatened to end the long streak.

They were on top before half-time and chances came after falling behind, but Conor McAleny in particular was frustrated by Bantams goalkeeper Colin Doyle.

The result all but guaranteed Bradford’s place in the Sky Bet League One play-offs, while United’s efforts proved in vain.

The big team news saw Christian Ribeiro finally make his debut, ten months after signing from Exeter City.

He replaced Canice Carroll at right back, while Josh Ruffels replaced the injured Ryan Ledson in United’s other change from the 1-1 draw at Walsall six days earlier.

The U’s had edged the two meetings between the sides in league and cup this season and it was a similar story in the first half.

Chris Maguire forced a save from Bantams goalkeeper Colin Doyle with a fourth-minute free-kick, but chances from open play took time to appear.

Both defences were on top form – and United’s back four needed to be against a Bradford side in great form.

Charlie Raglan made one early intervention to cut out Mark Marshall’s dangerous cross after a ricochet had sent the winger clear.

Goalkeeper Simon Eastwood also had to be alert, making a strong one-handed save to deny Rory McArdle’s towering header at the back post from a corner after 15 minutes.

The contest was tight, with both sides working hard out of possession to restrict space on a patchy Valley Parade surface.

City were particularly frustrated and needed a moment of quality from Charlie Wyke just before the half-hour mark to open up the visitors.

The striker’s sharp turn and pass found Jordy Hiwula in space, but Curtis Nelson was on hand to make a vital block.

Although the pacy forward was a tough opponent for Ribeiro, who missed the first half of the season with a broken ankle sustained on the final day of pre-season, the full back looked assured and snuffed out a chance when City broke on 33 minutes.

Aside from the early Maguire free-kick, United had hardly threatened, but they went on to finish the half on top.

Raglan glanced a header wide from a Maguire corner, while the excellent Ruffels was off-target with an effort from range.

Nelson almost finished off a move he started with an interception deep in United’s half, but the centre back stabbed wide when Marvin Johnson’s shot looped his way after continuing his run.

To the dismay of the home fans, United’s chances kept coming.

Conor McAleny fired a tricky chance wide on the half-volley, before blazing over from an acute angle at the end of the best move of the half just before the break.

The interval came at a good time for the hosts, who got on the front foot after the restart.

Eastwood saved from Wyke’s header at a 57th-minute corner, but the next time the striker rose in the box it proved crucial.

He nodded Marshall’s cross down for Law, who could not miss two yards out and duly opened the scoring.

Only a brilliant block from Tony McMahon denied Joe Rothwell an equaliser two minutes later, after the midfielder ran on to Johnson’s flick-on.

At the other end Wyke nearly caught out Eastwood with a dipping effort from near the touchline, but United continued to threaten.

McAleny forced two good saves from Doyle in quick succession, but United, even with Kane Hemmings and Rob Hall coming off the bench, struggled to exert pressure late on.

City did what was needed to grind out a precious three points, showing why they remain in the battle to play in the Championship next season.

Bradford City (4-3-3): Doyle, McMahon, McArdle, Knight-Percival, Meredith, Cullen, Vincelot, Law (Dieng 72), Marshall (Clarke 90), Wyke, Hiwula (Darby 84).

Unused subs: Sattelmaier, Toner, Jones, Devine.

Booked: None.

Oxford Utd (4-4-2): Eastwood, Ribeiro (Edwards 85), Nelson, Raglan, Skarz, Maguire (Hall 80), Lundstram, Ruffels, Rothwell (Hemmings 75), McAleny, Johnson.

Unused subs: Stevens, Carroll, Long, Dunkley.

Booked: Skarz, Raglan.

Referee: Richard Clark (Northumberland).

Attendance: 19,346 (577 visitors).