The result leaves Ronald Koeman’s side 12 points adrift of leader Atlético Madrid, while newly-promoted Cádiz moved to fifth after picking up its first home victory in the league this season.
Cádiz, which has now beaten Barcelona and Real Madrid upon its return to La Liga, took the lead early on when Óscar Mingueza headed a corner towards his own goal, producing a save from Marc-André ter Stegen that fell into the path of Álvaro Giménez to score from close range.
Barcelona leveled when Lionel Messi found Jordi Alba in the box, whose cross was deflected off Pedro Alcalá for an own goal.
However, just six minutes later, Cádiz’s lead was restored when Alba’s defensive throw-in was missed by Clément Lenglet and a clearance from ter Stegen was blocked by Álvaro Negredo.
The striker was left to tap into an open net to score his side’s second and secure the victory.
“It shows we were not concentrating. The attitude was not good tonight. I’m very disappointed and we have to improve.”
Despite having won all five of its Champions Leagues fixtures so far this season, Barcelona has struggled in the league, winning just four of its first 10 games.
“It’s very difficult to explain the goals we are conceding lately. It could be down to a lack of concentration,” said Koeman.
“When we equalized, we had half an hour left to score again but then we conceded a goal that we cannot afford to concede, from a throw-in. We also lacked aggression when we didn’t have the ball today.”
He added: “It’s a gigantic step back for our chances of fighting for the title.
“We have to see it like that after getting such a disappointing result today. 12 points is a very big distance but we have to keep going.”
In Saturday’s other games, an own goal from goalkeeper Yassine Bounou saw Real Madrid secure an important 1-0 away win against Sevilla, while second-half goals from Thomas Lemar and Marcos Llorente gave table-topper Atlético Madrid — the league’s only undefeated side so far this season — a 2-0 victory over Valladolid.