Lucas Perez scored what proved the only goal with a 48th-minute finish.
Lucas Perez scored what proved the only goal with a 48th-minute finish, following up after Marc-Andre Ter Stegen had twice parried Ruben Sobrino efforts, to condemn Barca to defeat once again, four days on from their Europa League exit at the hands of Eintracht Frankfurt.
The result – a first league loss for Xavi’s men since December, ending a seven-game winning streak – marked another step towards Real Madrid securing the title. Second-placed Barca, who have played 31 games, are 15 points behind leaders Real, who have played 32.
Cadiz, meanwhile, moved out of the relegation zone, rising to 16th, two points above it.
In Serie A, Napoli’s title bid took a hit as a stoppage-time Stephan El-Shaarawy equaliser saw them held to a 1-1 draw by 10-man Roma at the Stadio Diego Armando Maradona.
Luciano Spalletti’s third-placed side had led from the 11th minute, when Lorenzo Insigne converted a penalty.
Roma had Daniel Fuzato sent off in the 78th minute before El-Shaarawy’s late finish ensured the spoils were shared.
Napoli are now four points behind leaders AC Milan with five games left, while Jose Mourinho’s Roma stay fifth, with a five-point gap to fourth-placed Juventus.
Also on Monday, Hellas Verona won 2-1 at Atalanta thanks to a Federico Ceccherini effort and a Teun Koopmeiners own goal either side of the break.
Giorgio Scalvini replied for the home side with eight minutes of normal time remaining but Verona held on.