{
    "scan_id": "api-20260419-045802-214d06",
    "url": "https://veiligbaden.nl",
    "status": "done",
    "created_at": "2026-04-19 06:58:02",
    "completed_at": "2026-04-19 07:00:06",
    "scores": {
        "mobile": {
            "scores": {
                "performance": 72,
                "accessibility": 94,
                "best-practices": 100,
                "seo": 100
            },
            "cwv": {
                "LCP": "4.7 s",
                "FCP": "3.6 s",
                "CLS": "0.02",
                "TBT": "40 ms",
                "Speed Index": "5.2 s",
                "Time to Interactive": "4.7 s"
            },
            "top_opportunities": [],
            "a11y_violations": [
                {
                    "id": "image-delivery-insight",
                    "title": "Improve image delivery",
                    "description": "Reducing the download time of images can improve the perceived load time of the page and LCP. [Learn more about optimizing image size](https://developer.chrome.com/docs/performance/insights/image-deli",
                    "score": 0,
                    "items": [
                        {
                            "selector": "div.ps-grid > div.ps-card > div.ps-image > img",
                            "snippet": "",
                            "explanation": ""
                        },
                        {
                            "selector": "div.ps-grid > div.ps-card > div.ps-image > img",
                            "snippet": "",
                            "explanation": ""
                        },
                        {
                            "selector": "div.solutions-grid > div.solution-card > div.solution-image > img",
                            "snippet": "",
                            "explanation": ""
                        }
                    ]
                },
                {
                    "id": "color-contrast",
                    "title": "Background and foreground colors do not have a sufficient contrast ratio.",
                    "description": "Low-contrast text is difficult or impossible for many users to read. [Learn how to provide sufficient color contrast](https://dequeuniversity.com/rules/axe/4.11/color-contrast).",
                    "score": 0,
                    "items": [
                        {
                            "selector": "header#siteHeader > div.container > div.header-actions > a.btn",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Element has insufficient color contrast of 3.05 (foreground color: #ffffff, background color"
                        },
                        {
                            "selector": "div.trust-item > div.trust-content > strong.trust-stat-line > span.js-counter-re",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Element has insufficient color contrast of 3.66 (foreground color: #8a7d74, background color"
                        },
                        {
                            "selector": "div.trust-grid > div.trust-item > div.trust-content > span",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Element has insufficient color contrast of 3.66 (foreground color: #8a7d74, background color"
                        }
                    ]
                },
                {
                    "id": "heading-order",
                    "title": "Heading elements are not in a sequentially-descending order",
                    "description": "Properly ordered headings that do not skip levels convey the semantic structure of the page, making it easier to navigate and understand when using assistive technologies. [Learn more about heading or",
                    "score": 0,
                    "items": [
                        {
                            "selector": "div.container > div.voordelen-grid > div.voordeel-card > h4",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Heading order invalid"
                        }
                    ]
                },
                {
                    "id": "label-content-name-mismatch",
                    "title": "Elements with visible text labels do not have matching accessible names.",
                    "description": "Visible text labels that do not match the accessible name can result in a confusing experience for screen reader users. [Learn more about accessible names](https://dequeuniversity.com/rules/axe/4.11/l",
                    "score": 0,
                    "items": [
                        {
                            "selector": "body > div#chatbotWidget > button#chatbotToggle",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Text inside the element is not included in the accessible name"
                        }
                    ]
                }
            ],
            "avg": 92
        },
        "desktop": {
            "scores": {
                "performance": 98,
                "accessibility": 94,
                "best-practices": 100,
                "seo": 100
            },
            "cwv": {
                "LCP": "1.0 s",
                "FCP": "0.8 s",
                "CLS": "0.003",
                "TBT": "0 ms",
                "Speed Index": "0.8 s",
                "Time to Interactive": "1.0 s"
            },
            "top_opportunities": [
                {
                    "id": "unused-css-rules",
                    "title": "Reduce unused CSS",
                    "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
                    "saving_ms": 50,
                    "score": 0,
                    "items": [
                        {
                            "url": "https://veiligbaden.nl/assets/css/styles.css?v=20260412",
                            "bytes": 60241,
                            "wasted_ms": 0,
                            "wasted_bytes": 37139
                        },
                        {
                            "url": "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css",
                            "bytes": 18663,
                            "wasted_ms": 0,
                            "wasted_bytes": 18434
                        }
                    ]
                },
                {
                    "id": "unminified-css",
                    "title": "Minify CSS",
                    "description": "Minifying CSS files can reduce network payload sizes. [Learn how to minify CSS](https://developer.chrome.com/docs/lighthouse/performance/unminified-css/).",
                    "saving_ms": 50,
                    "score": 0,
                    "items": [
                        {
                            "url": "https://veiligbaden.nl/assets/css/styles.css?v=20260412",
                            "bytes": 60548,
                            "wasted_ms": 0,
                            "wasted_bytes": 21661
                        },
                        {
                            "url": "https://veiligbaden.nl/assets/css/chatbot.css",
                            "bytes": 10186,
                            "wasted_ms": 0,
                            "wasted_bytes": 3146
                        }
                    ]
                },
                {
                    "id": "unused-javascript",
                    "title": "Reduce unused JavaScript",
                    "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
                    "saving_ms": 10,
                    "score": 50,
                    "items": [
                        {
                            "url": "https://veiligbaden.nl/assets/js/chatbot.js",
                            "bytes": 31314,
                            "wasted_ms": 0,
                            "wasted_bytes": 25645
                        }
                    ]
                }
            ],
            "a11y_violations": [
                {
                    "id": "heading-order",
                    "title": "Heading elements are not in a sequentially-descending order",
                    "description": "Properly ordered headings that do not skip levels convey the semantic structure of the page, making it easier to navigate and understand when using assistive technologies. [Learn more about heading or",
                    "score": 0,
                    "items": [
                        {
                            "selector": "div.container > div.voordelen-grid > div.voordeel-card > h4",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Heading order invalid"
                        }
                    ]
                },
                {
                    "id": "image-delivery-insight",
                    "title": "Improve image delivery",
                    "description": "Reducing the download time of images can improve the perceived load time of the page and LCP. [Learn more about optimizing image size](https://developer.chrome.com/docs/performance/insights/image-deli",
                    "score": 50,
                    "items": [
                        {
                            "selector": "div.ps-grid > div.ps-card > div.ps-image > img",
                            "snippet": "",
                            "explanation": ""
                        },
                        {
                            "selector": "div.solutions-grid > div.solution-card > div.solution-image > img",
                            "snippet": "",
                            "explanation": ""
                        },
                        {
                            "selector": "div.ps-grid > div.ps-card > div.ps-image > img",
                            "snippet": "",
                            "explanation": ""
                        }
                    ]
                },
                {
                    "id": "label-content-name-mismatch",
                    "title": "Elements with visible text labels do not have matching accessible names.",
                    "description": "Visible text labels that do not match the accessible name can result in a confusing experience for screen reader users. [Learn more about accessible names](https://dequeuniversity.com/rules/axe/4.11/l",
                    "score": 0,
                    "items": [
                        {
                            "selector": "body > div#chatbotWidget > button#chatbotToggle",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Text inside the element is not included in the accessible name"
                        }
                    ]
                },
                {
                    "id": "color-contrast",
                    "title": "Background and foreground colors do not have a sufficient contrast ratio.",
                    "description": "Low-contrast text is difficult or impossible for many users to read. [Learn how to provide sufficient color contrast](https://dequeuniversity.com/rules/axe/4.11/color-contrast).",
                    "score": 0,
                    "items": [
                        {
                            "selector": "header#siteHeader > div.container > div.header-actions > a.btn",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Element has insufficient color contrast of 3.05 (foreground color: #ffffff, background color"
                        },
                        {
                            "selector": "div.trust-item > div.trust-content > strong.trust-stat-line > span.js-counter-nu",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Element has insufficient color contrast of 3.66 (foreground color: #8a7d74, background color"
                        },
                        {
                            "selector": "div.trust-item > div.trust-content > strong.trust-stat-line > span.js-counter-re",
                            "snippet": "",
                            "explanation": "Fix any of the following:\n  Element has insufficient color contrast of 3.66 (foreground color: #8a7d74, background color"
                        }
                    ]
                }
            ],
            "avg": 98
        }
    },
    "findings": {
        "meta": {
            "type": "meta",
            "title": "Veilige badkamers voor senioren | SaniSafe Badkamers",
            "description": "SaniSafe Badkamers - Specialist in veilige inloopdouches en badkamerrenovaties voor senioren. Binnen 1 dag klaar. Gratis advies!",
            "ogImage": "https://veiligbaden.nl/assets/images/hero-badkamer.webp",
            "canonical": "https://veiligbaden.nl/",
            "h1Count": 1,
            "imgCount": 40,
            "imgNoAlt": 0,
            "hasFavicon": true,
            "viewport": true,
            "msg": "📝 Title: Veilige badkamers voor senioren | SaniSafe Badkame · H1: 1 · Images zonder alt: 0/40",
            "ts": 1776574743.481,
            "page_url": "https://veiligbaden.nl",
            "page_label": "Homepage",
            "page_index": 0
        },
        "linkcheck": {
            "type": "linkcheck",
            "total": 45,
            "checked": 8,
            "ok": 8,
            "bad": 0,
            "bad_links": [],
            "msg": "🔗 8/8 links OK",
            "ts": 1776574743.47,
            "page_url": "https://veiligbaden.nl",
            "page_label": "Homepage",
            "page_index": 0
        },
        "errors": {
            "type": "errors",
            "count": 0,
            "errors": [],
            "msg": "✓ Geen JS errors",
            "ts": 1776574743.481,
            "page_url": "https://veiligbaden.nl",
            "page_label": "Homepage",
            "page_index": 0
        },
        "schema": {
            "type": "schema",
            "count": 1,
            "types": [
                "HomeAndConstructionBusiness"
            ],
            "msg": "📊 Schema.org: 1 blocks (HomeAndConstructionBusiness)",
            "ts": 1776574743.484,
            "page_url": "https://veiligbaden.nl",
            "page_label": "Homepage",
            "page_index": 0
        },
        "security": {
            "type": "security",
            "hsts": false,
            "csp": false,
            "xfo": false,
            "xcto": false,
            "referrer": false,
            "permissions_policy": false,
            "server": "Apache",
            "https": true,
            "present": 0,
            "total": 5,
            "msg": "🛡️ Security: 0/5 headers aanwezig · HTTPS ✓",
            "ts": 1776574743.484,
            "page_url": "https://veiligbaden.nl",
            "page_label": "Homepage",
            "page_index": 0
        },
        "content": {
            "type": "content",
            "word_count": 1303,
            "reading_min": 7,
            "top_keywords": [
                {
                    "k": "badkamer",
                    "v": 23
                },
                {
                    "k": "gratis",
                    "v": 18
                },
                {
                    "k": "inloopdouche",
                    "v": 13
                },
                {
                    "k": "binnen",
                    "v": 13
                },
                {
                    "k": "advies",
                    "v": 12
                },
                {
                    "k": "wandpanelen",
                    "v": 11
                },
                {
                    "k": "offerte",
                    "v": 11
                },
                {
                    "k": "renovatie",
                    "v": 10
                },
                {
                    "k": "sanitair",
                    "v": 10
                },
                {
                    "k": "garantie",
                    "v": 9
                },
                {
                    "k": "antislip",
                    "v": 8
                },
                {
                    "k": "inmeting",
                    "v": 8
                },
                {
                    "k": "contact",
                    "v": 7
                },
                {
                    "k": "veilige",
                    "v": 7
                },
                {
                    "k": "douche",
                    "v": 7
                }
            ],
            "h1": [
                "Veilig douchen zonder zorgen – binnen 1 dag klaar"
            ],
            "h2": [
                "Van onveilig bad naar veilige douche",
                "Onze oplossingen",
                "Onze werkwijze",
                "Onze garanties",
                "Waarom SaniSafe?",
                "Before & After",
                "Zie uw nieuwe badkamer in 30 seconden",
                "Vraag nu gratis advies aan",
                "Veelgestelde vragen",
                "Wat onze klanten zeggen"
            ],
            "h3_count": 32,
            "nap": {
                "kvk": null,
                "btw": null,
                "tel": "+310103220556",
                "email": "info@sanisafe.nl",
                "postcode": null,
                "cities": [
                    "Rotterdam",
                    "Eindhoven",
                    "Tilburg",
                    "Breda"
                ]
            },
            "readability": {
                "flesch": 32,
                "avg_words_per_sentence": 16.9,
                "avg_syllables_per_word": 2.06,
                "passive_pct": 1
            },
            "language": {
                "html_lang": "nl",
                "hreflangs": [],
                "is_multilang": false
            },
            "images": {
                "total": 40,
                "webp": 30,
                "jpg": 0,
                "png": 0,
                "svg": 10,
                "gif": 0,
                "lazy": 37,
                "large": [
                    {
                        "src": "https://veiligbaden.nl/assets/images/portfolio/after/sanisafe-badkamer-houtlook-inloopdouche-after-2.webp",
                        "dims": "1366x2048"
                    },
                    {
                        "src": "https://veiligbaden.nl/assets/images/portfolio/before/sanisafe-badkamer-ligbad-douche-before.webp",
                        "dims": "1884x4080"
                    },
                    {
                        "src": "https://veiligbaden.nl/assets/images/portfolio/after/sanisafe-badkamer-houtlook-inloopdouche-after-3.webp",
                        "dims": "1366x2048"
                    },
                    {
                        "src": "https://veiligbaden.nl/assets/images/portfolio/after/sanisafe-badkamer-houtlook-inloopdouche-after-2.webp",
                        "dims": "1366x2048"
                    },
                    {
                        "src": "https://veiligbaden.nl/assets/images/portfolio/after/sanisafe-badkamer-dubbele-wastafel-led-spiegel-after.webp",
                        "dims": "1366x2048"
                    }
                ],
                "noLazy": 3,
                "noDims": 0,
                "webp_pct": 75
            },
            "socials": [],
            "gdpr": {
                "has_banner": false,
                "has_tracking": false,
                "banner_text": null,
                "gdpr_risk": false
            },
            "msg": "📖 1303 woorden · Flesch 32 · 0 socials · 40 images (75% WebP)",
            "ts": 1776574743.479,
            "page_url": "https://veiligbaden.nl",
            "page_label": "Homepage",
            "page_index": 0
        },
        "techstack": {
            "type": "techstack",
            "cms": null,
            "framework": null,
            "ecommerce": null,
            "analytics": [],
            "cdn": null,
            "hosting": "Apache",
            "builder": null,
            "server_header": "apache",
            "msg": "⚙️ Tech-stack: Apache",
            "ts": 1776574743.484,
            "page_url": "https://veiligbaden.nl",
            "page_label": "Homepage",
            "page_index": 0
        },
        "whois": {
            "domain": "veiligbaden.nl",
            "registrar": "Domain Robot",
            "created": "2025-11-05",
            "updated": "2026-03-05",
            "expires": null,
            "age_days": 165,
            "days_to_expiry": null,
            "nameservers": [],
            "tld": "nl"
        },
        "cta": {
            "text": "Gratis advies",
            "msg": "🖱️ Hover: \"Gratis advies\" → /offerte.php"
        },
        "subpages": [],
        "web_intel": {
            "mentions": [],
            "reviews": [],
            "news": []
        },
        "vision": {
            "first_impression": "Een professionele en overzichtelijke website die vertrouwen uitstraalt door een rustig kleurgebruik en duidelijke waardepropositie.",
            "visual_grade": "A",
            "strengths": [
                "Sterke visuele hiërarchie met een duidelijke 'Before & After' sectie die direct overtuigt.",
                "Goede balans tussen witruimte en content, wat zorgt voor een prettige leeservaring op mobiel."
            ],
            "issues": [
                "De cookie-banner overlapt de content en is visueel niet optimaal geïntegreerd met de rest van de huisstijl.",
                "Sommige tekstblokken (zoals bij 'Onze werkwijze') hebben te weinig contrast of visuele aanknopingspunten om de scanbaarheid te verhogen.",
                "De 'Before & After' sliders nemen veel verticale ruimte in beslag, waardoor de pagina erg lang wordt."
            ],
            "design_tips": [
                "Voeg meer iconografie of korte bulletpoints toe aan de tekstsecties om de leesbaarheid voor de doelgroep te vergroten.",
                "Optimaliseer de cookie-banner zodat deze minder storend is voor de eerste indruk van de hero-sectie."
            ],
            "primary_colors": [
                "#c18e47",
                "#332e2a",
                "#f9f7f4"
            ]
        },
        "gmb": null,
        "kvk_validation": null,
        "ssl_dns": {
            "ssl": {
                "valid_to": "2026-10-07",
                "valid_from": "2026-04-10",
                "days_left": 171,
                "issuer": "Sectigo Public Server Authentication CA DV R36",
                "cn": "veiligbaden.nl",
                "sans": 2,
                "expires_soon": false
            },
            "dns": {
                "spf": null,
                "spf_ok": false,
                "dmarc": "v=DMARC1;p=reject;",
                "dmarc_ok": true,
                "mx_count": 1,
                "mx_hosts": [
                    "smtp.rzone.de"
                ],
                "has_mail": true
            }
        },
        "robots": {
            "robots_txt": false,
            "sitemap_xml": false,
            "sitemap_count": 0,
            "blocks_all": false
        }
    },
    "action_plan": [],
    "sector_analysis": {
        "sector_key": "badkamerspecialist",
        "sector_label": "Badkamerspecialist",
        "sbi": "4332",
        "gmb": "GMB",
        "matched_services": [
            {
                "title": "Badkamer renovatie",
                "slug": "badkamer-renovatie",
                "hits": 1
            }
        ],
        "confidence": 1,
        "benchmark": {
            "n_scans": 7,
            "perf_mobile_avg": 72,
            "perf_desktop_avg": 95,
            "seo_mobile_avg": 100,
            "seo_desktop_avg": 100
        },
        "total_sector_services": 7,
        "competitors": [
            {
                "domain": "badkamerspecialist.nl",
                "naam": "Badkamerspecialist",
                "waarom": "Grootste speler in Nederland"
            },
            {
                "domain": "sanitairwinkel.nl",
                "naam": "Sanitairwinkel",
                "waarom": "Brede range aan badkamerproducten"
            },
            {
                "domain": "badkamerstudio.nl",
                "naam": "Badkamerstudio",
                "waarom": "Focust op high-end badkameroplossingen"
            }
        ],
        "keywords": {
            "covered": [
                "badkamer verbouwen",
                "badkamerrenovatie",
                "badkamer plaatsen",
                "sanitair installeren",
                "lekkage badkamer",
                "douche plaatsen",
                "douchecabine installeren",
                "onderhoud badkamer",
                "badkamer check"
            ],
            "missing": [
                "waterlekkage",
                "toilet plaatsen",
                "wc installeren",
                "bad installeren",
                "ligbad plaatsen"
            ],
            "coverage_pct": 64,
            "total_sector_keywords": 14
        },
        "cbs": {
            "total": 230,
            "solo": 210,
            "small": 20,
            "medium": 0,
            "large": 0,
            "period": "2026KW02",
            "sbi_key": "433200",
            "source": "CBS StatLine (tabel 81589NED)"
        }
    },
    "pdf_url": "/website-scan/runs/api-20260419-045802-214d06/report.pdf",
    "video_url": "/website-scan/runs/api-20260419-045802-214d06/scan.mp4",
    "exported_at": "2026-04-19T14:48:15+00:00",
    "exported_by": "IT Live Website Scanner"
}