The visitors had almost snatched an early lead inside the first two minutes when Toni Kroos lost possession, which allowed Alex Fernandez to cross for Alvaro Negredo and his shot-on-the-turn was cleared off the line by Sergio Ramos.
Thibaut Courtois saved from Negredo and Juan Cala before Cadiz finally made their pressure count in the 16th minute.
Frontman Negredo knocked down a cross to Anthony Lozano, whose chip had enough to get over the Real Madrid keeper and into the net.
Cadiz, runners-up to Huesca last season, had a chance for a second after half an hour following a swift counter when Jose Mari found Lozano and his low shot was pushed away by Courtois at the near post.
Los Blancos – playing in pink to help raise awareness for the fight against breast cancer – finally sparked into life when Raphael Varane met a corner from Kroos, but his header was just wide.
The changes seemed to kick fresh life into the home side, as Cadiz were pushed back deep into their own half for long spells.
On 68 minutes, Kroos got into space out on the left and sent over a deep cross, which Cadiz goalkeeper Jeremias Ledesma failed to collect and the ball dropped to Vinicius, but the young Brazilian headed wide.
Real Madrid had a goal disallowed for offside with 10 minutes left when substitute Luka Jovic scored from close-range after a knockdown from Karim Benzema – before the Frenchman saw his 20-yard rising shot crash back off the crossbar with the keeper beaten.
Despite all of the second-half pressure, Cadiz held out for a first win over their illustrious hosts since 1991 as Real Madrid were left to regroup ahead of their opening Champions League match against Shakhtar Donetsk.
Zidane offered no excuses for his team’s lacklustre display, as Cadiz secured their first away victory against Real Madrid in the club’s history.
“We’ve got to accept defeat and that’s all there is to it,” the Real Madrid head coach told an online press conference. “We can’t be pleased with ourselves and we’re not, but these things can happen in football
“If you don’t get off to a good start, things can become an uphill struggle and that’s what happened tonight, but it’s no excuse.
“We’ve lost a game, nothing more than that. We have now got to focus on our next game and try to turn it around.”
Ramos’ substitution appeared to be down to a knee problem.
“Let’s hope it’s nothing major,” Zidane said.
“It’s a knock and we’ll do what we have to do tomorrow to see exactly what the issue is. Let’s hope it’s a minor one.”