{
    "schema": "https://saferpage.de/schemas/portfolio-digest-delivery.v1",
    "generated_at": "2026-08-13T03:33:24+00:00",
    "summary": "Delivery-Paket für wiederkehrende Portfolio-Digests mit Empfängergruppen, E-Mail-/SendGrid-/Webhook-Payloads, Body-SHA-256, HMAC-Receiver-Vertrag, Test-Fixture, Versandfenster, Idempotency-Key und Retry-Policy.",
    "dry_run": true,
    "does_not_send": true,
    "metrics": {
        "recipient_group_count": 3,
        "delivery_job_count": 3,
        "recipient_count": 4,
        "receiver_check_count": 6,
        "test_fixture_negative_count": 4
    },
    "signature_verification": {
        "algorithm": "HMAC-SHA256",
        "canonical_body": "Exakt canonical_webhook_body aus dem jeweiligen delivery_job signieren; keine Pretty-Print- oder Reordering-Variante verwenden.",
        "signature_secret_ref": "SAFERPAGE_PORTFOLIO_DIGEST_WEBHOOK_SECRET oder zielsystemspezifisches Secret im Secret Manager",
        "signature_header": "X-SaferPage-Signature",
        "signature_format": "sha256=<hex_hmac_sha256>",
        "body_sha256_header": "X-SaferPage-Body-SHA256",
        "idempotency_header": "X-SaferPage-Idempotency-Key",
        "receiver_must_check": [
            "HMAC über den exakten Request-Body stimmt mit X-SaferPage-Signature überein.",
            "SHA-256 des exakten Request-Body stimmt mit X-SaferPage-Body-SHA256 überein.",
            "X-SaferPage-Event ist saferpage.portfolio.digest_ready.",
            "X-SaferPage-Schema ist portfolio-digest-delivery.v1.",
            "X-SaferPage-Idempotency-Key wurde für Empfängergruppe und Digest-Hash noch nicht verarbeitet.",
            "Empfängergruppe, Versandfenster, Domainportfolio und Betreiberfreigabe sind für diesen Digest erlaubt."
        ],
        "failure_policy": "Bei fehlender Signatur, Body-Hash-Abweichung, Replay oder unbekannter Empfängergruppe ablehnen, nicht teilweise verarbeiten und Auditlog ohne Secret-Werte schreiben."
    },
    "verification_test_fixture": {
        "public_test_secret": "saferpage_portfolio_digest_test_secret_do_not_use_in_production",
        "canonical_body": "{\"event\":\"saferpage.portfolio.digest_ready\",\"idempotency_key\":\"sp-digest-test-fixture\",\"recipient_group\":\"privacyops\",\"subject\":\"SaferPage Portfolio-Digest Test\",\"links\":{\"digest_json\":\"https://saferpage.de/portfolio/digest-json\",\"digest_markdown\":\"https://saferpage.de/portfolio/digest-md\",\"portfolio\":\"https://saferpage.de/portfolio\"}}",
        "canonical_body_sha256": "3969f72af3bd8fd8cbaef5cf52f5021ea606fdae36beb826ab47902c734cf6bc",
        "expected_signature": "sha256=c84f8dc970b6effdbf4f5dd5a2d52c5465c3987ea37a1040b202feeeb4c4ed36",
        "expected_signature_header": "X-SaferPage-Signature: sha256=c84f8dc970b6effdbf4f5dd5a2d52c5465c3987ea37a1040b202feeeb4c4ed36",
        "idempotency_key": "sp-digest-test-fixture",
        "positive_test": "Empfänger akzeptiert den unveränderten canonical_body mit expected_signature und verwirft ihn danach als Testevent.",
        "negative_tests": [
            "Ein geändertes Byte im Body muss abgelehnt werden.",
            "Ein fehlender oder doppelter X-SaferPage-Idempotency-Key muss abgelehnt werden.",
            "Eine Signatur mit anderem Secret muss abgelehnt werden.",
            "Ein erneuter Request mit derselben Idempotency-Key/Event-Kombination darf nicht erneut verarbeitet werden."
        ],
        "sample_commands": [
            "printf %s \"$BODY\" | openssl dgst -sha256 -hmac \"saferpage_portfolio_digest_test_secret_do_not_use_in_production\" -binary | xxd -p -c 256",
            "printf %s \"$BODY\" | sha256sum",
            "curl -X POST -H \"Content-Type: application/json\" -H \"X-SaferPage-Event: saferpage.portfolio.digest_ready\" -H \"X-SaferPage-Signature: sha256=c84f8dc970b6effdbf4f5dd5a2d52c5465c3987ea37a1040b202feeeb4c4ed36\" --data \"$BODY\" https://receiver.example.test/saferpage"
        ]
    },
    "recipient_groups": [
        {
            "id": "management",
            "label": "Management",
            "recipients": [
                "management@example.invalid"
            ],
            "cadence": "weekly",
            "language": "de-DE",
            "purpose": "Kurzlage zu Risiken, Fortschritt und Entscheidungen."
        },
        {
            "id": "privacyops",
            "label": "PrivacyOps",
            "recipients": [
                "privacyops@example.invalid",
                "datenschutz@example.invalid"
            ],
            "cadence": "weekly",
            "language": "de-DE",
            "purpose": "Nachverfolgung von Audit-Trail, Dispatches und Scanplan."
        },
        {
            "id": "webbetrieb",
            "label": "Webbetrieb",
            "recipients": [
                "webbetrieb@example.invalid"
            ],
            "cadence": "weekly",
            "language": "de-DE",
            "purpose": "Technische Umsetzung, Re-Scans und Deployment-Abgleich."
        }
    ],
    "delivery_jobs": [
        {
            "id": "sp-digest-management-a76afd77e3fb9a1f2c52",
            "recipient_group": "management",
            "label": "Management",
            "cadence": "weekly",
            "language": "de-DE",
            "send_window": {
                "weekday": "monday",
                "time_local": "09:00",
                "timezone": "Europe/Berlin"
            },
            "to": [
                "management@example.invalid"
            ],
            "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
            "preheader": "Keine kritischen Domains im aktuellen Portfolio-Digest erkannt.",
            "idempotency_key": "sp-digest-management-a76afd77e3fb9a1f2c52",
            "headers": {
                "X-SaferPage-Event": "saferpage.portfolio.digest_ready",
                "X-SaferPage-Schema": "portfolio-digest-delivery.v1",
                "X-SaferPage-Idempotency-Key": "sp-digest-management-a76afd77e3fb9a1f2c52",
                "X-SaferPage-Body-SHA256": "6d13a14f57c67bf0af2a5aac6798478bb64e4a31583159f085b1e82b1cb4c0b7",
                "X-SaferPage-Signature": "sha256=<HMAC über canonical_webhook_body>"
            },
            "retry_policy": {
                "max_attempts": 3,
                "backoff_seconds": [
                    300,
                    1800,
                    7200
                ],
                "dead_letter_queue": "privacyops.digest_delivery.failed"
            },
            "email_payload": {
                "from": "SaferPage Reports <kontakt@peoplecheck.de>",
                "to": [
                    "management@example.invalid"
                ],
                "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
                "text_markdown": "# SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches\n\nKeine kritischen Domains im aktuellen Portfolio-Digest erkannt.\n\n## Kennzahlen\n- Domains im Scanplan: 1\n- Woechentliche Scans: 0\n- Nächste 7 Tage: 1\n- Kritische Domains: 0\n- Dispatches: 1 (0 dringend)\n\n## Nächste Aktionen\n- **Programm-Verantwortung/Datenschutz** (hoch): Kritische woechentliche Scans prüfen, Verantwortlichkeit bestätigen und Dispatch-Paket in Nachweispositionen übernehmen. https://saferpage.de/portfolio/dispatch-json\n- **Website-Betrieb** (mittel): Nächste Batch-Termine aus dem Scanplan gegen Deployment- und Consent-Änderungen abgleichen. https://saferpage.de/portfolio/schedule-json\n- **Audit/Compliance** (mittel): Audit-Trail exportieren und Scan-IDs mit internen Freigaben oder Release-Nachweisen verbinden. https://saferpage.de/portfolio/audit-json\n\n## Nächste geplante Scans\n- saferpage.de: 2026-08-14T01:13:10+00:00, mittel, neuer Check, älter als 14 Tage\n\n## Dispatch-Vorschau\n- saferpage.de: scheduled_privacyops, 2026-08-14T01:13:10+00:00, sp-dispatch-3b6ac7427bb5916db7bfa2ac",
                "headers": {
                    "X-SaferPage-Event": "saferpage.portfolio.digest_ready",
                    "X-SaferPage-Schema": "portfolio-digest-delivery.v1",
                    "X-SaferPage-Idempotency-Key": "sp-digest-management-a76afd77e3fb9a1f2c52",
                    "X-SaferPage-Body-SHA256": "6d13a14f57c67bf0af2a5aac6798478bb64e4a31583159f085b1e82b1cb4c0b7",
                    "X-SaferPage-Signature": "sha256=<HMAC über canonical_webhook_body>",
                    "X-SaferPage-Digest-Schema": "portfolio-scan-digest.v1"
                },
                "attachments": [
                    {
                        "filename": "saferpage-portfolio-digest.md",
                        "content_type": "text/markdown",
                        "url": "https://saferpage.de/portfolio/digest-md"
                    },
                    {
                        "filename": "saferpage-portfolio-digest.json",
                        "content_type": "application/json",
                        "url": "https://saferpage.de/portfolio/digest-json"
                    }
                ]
            },
            "sendgrid_payload": {
                "personalizations": [
                    {
                        "to": [
                            {
                                "email": "management@example.invalid"
                            }
                        ],
                        "custom_args": {
                            "idempotency_key": "sp-digest-management-a76afd77e3fb9a1f2c52"
                        }
                    }
                ],
                "from": {
                    "email": "kontakt@peoplecheck.de",
                    "name": "SaferPage Reports"
                },
                "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
                "content": [
                    {
                        "type": "text/markdown",
                        "value": "# SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches\n\nKeine kritischen Domains im aktuellen Portfolio-Digest erkannt.\n\n## Kennzahlen\n- Domains im Scanplan: 1\n- Woechentliche Scans: 0\n- Nächste 7 Tage: 1\n- Kritische Domains: 0\n- Dispatches: 1 (0 dringend)\n\n## Nächste Aktionen\n- **Programm-Verantwortung/Datenschutz** (hoch): Kritische woechentliche Scans prüfen, Verantwortlichkeit bestätigen und Dispatch-Paket in Nachweispositionen übernehmen. https://saferpage.de/portfolio/dispatch-json\n- **Website-Betrieb** (mittel): Nächste Batch-Termine aus dem Scanplan gegen Deployment- und Consent-Änderungen abgleichen. https://saferpage.de/portfolio/schedule-json\n- **Audit/Compliance** (mittel): Audit-Trail exportieren und Scan-IDs mit internen Freigaben oder Release-Nachweisen verbinden. https://saferpage.de/portfolio/audit-json\n\n## Nächste geplante Scans\n- saferpage.de: 2026-08-14T01:13:10+00:00, mittel, neuer Check, älter als 14 Tage\n\n## Dispatch-Vorschau\n- saferpage.de: scheduled_privacyops, 2026-08-14T01:13:10+00:00, sp-dispatch-3b6ac7427bb5916db7bfa2ac"
                    }
                ]
            },
            "webhook_payload": {
                "event": "saferpage.portfolio.digest_ready",
                "idempotency_key": "sp-digest-management-a76afd77e3fb9a1f2c52",
                "recipient_group": "management",
                "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
                "links": {
                    "digest_json": "https://saferpage.de/portfolio/digest-json",
                    "digest_markdown": "https://saferpage.de/portfolio/digest-md",
                    "portfolio": "https://saferpage.de/portfolio"
                }
            },
            "canonical_webhook_body": "{\"event\":\"saferpage.portfolio.digest_ready\",\"idempotency_key\":\"sp-digest-management-a76afd77e3fb9a1f2c52\",\"recipient_group\":\"management\",\"subject\":\"SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches\",\"links\":{\"digest_json\":\"https://saferpage.de/portfolio/digest-json\",\"digest_markdown\":\"https://saferpage.de/portfolio/digest-md\",\"portfolio\":\"https://saferpage.de/portfolio\"}}",
            "canonical_body_sha256": "6d13a14f57c67bf0af2a5aac6798478bb64e4a31583159f085b1e82b1cb4c0b7"
        },
        {
            "id": "sp-digest-privacyops-a76afd77e3fb9a1f2c52",
            "recipient_group": "privacyops",
            "label": "PrivacyOps",
            "cadence": "weekly",
            "language": "de-DE",
            "send_window": {
                "weekday": "monday",
                "time_local": "09:00",
                "timezone": "Europe/Berlin"
            },
            "to": [
                "privacyops@example.invalid",
                "datenschutz@example.invalid"
            ],
            "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
            "preheader": "Keine kritischen Domains im aktuellen Portfolio-Digest erkannt.",
            "idempotency_key": "sp-digest-privacyops-a76afd77e3fb9a1f2c52",
            "headers": {
                "X-SaferPage-Event": "saferpage.portfolio.digest_ready",
                "X-SaferPage-Schema": "portfolio-digest-delivery.v1",
                "X-SaferPage-Idempotency-Key": "sp-digest-privacyops-a76afd77e3fb9a1f2c52",
                "X-SaferPage-Body-SHA256": "9b551385bb96bd18650c001ecab7ca4656c2f3c870296dcd6831bb649541dc95",
                "X-SaferPage-Signature": "sha256=<HMAC über canonical_webhook_body>"
            },
            "retry_policy": {
                "max_attempts": 3,
                "backoff_seconds": [
                    300,
                    1800,
                    7200
                ],
                "dead_letter_queue": "privacyops.digest_delivery.failed"
            },
            "email_payload": {
                "from": "SaferPage Reports <kontakt@peoplecheck.de>",
                "to": [
                    "privacyops@example.invalid",
                    "datenschutz@example.invalid"
                ],
                "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
                "text_markdown": "# SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches\n\nKeine kritischen Domains im aktuellen Portfolio-Digest erkannt.\n\n## Kennzahlen\n- Domains im Scanplan: 1\n- Woechentliche Scans: 0\n- Nächste 7 Tage: 1\n- Kritische Domains: 0\n- Dispatches: 1 (0 dringend)\n\n## Nächste Aktionen\n- **Programm-Verantwortung/Datenschutz** (hoch): Kritische woechentliche Scans prüfen, Verantwortlichkeit bestätigen und Dispatch-Paket in Nachweispositionen übernehmen. https://saferpage.de/portfolio/dispatch-json\n- **Website-Betrieb** (mittel): Nächste Batch-Termine aus dem Scanplan gegen Deployment- und Consent-Änderungen abgleichen. https://saferpage.de/portfolio/schedule-json\n- **Audit/Compliance** (mittel): Audit-Trail exportieren und Scan-IDs mit internen Freigaben oder Release-Nachweisen verbinden. https://saferpage.de/portfolio/audit-json\n\n## Nächste geplante Scans\n- saferpage.de: 2026-08-14T01:13:10+00:00, mittel, neuer Check, älter als 14 Tage\n\n## Dispatch-Vorschau\n- saferpage.de: scheduled_privacyops, 2026-08-14T01:13:10+00:00, sp-dispatch-3b6ac7427bb5916db7bfa2ac",
                "headers": {
                    "X-SaferPage-Event": "saferpage.portfolio.digest_ready",
                    "X-SaferPage-Schema": "portfolio-digest-delivery.v1",
                    "X-SaferPage-Idempotency-Key": "sp-digest-privacyops-a76afd77e3fb9a1f2c52",
                    "X-SaferPage-Body-SHA256": "9b551385bb96bd18650c001ecab7ca4656c2f3c870296dcd6831bb649541dc95",
                    "X-SaferPage-Signature": "sha256=<HMAC über canonical_webhook_body>",
                    "X-SaferPage-Digest-Schema": "portfolio-scan-digest.v1"
                },
                "attachments": [
                    {
                        "filename": "saferpage-portfolio-digest.md",
                        "content_type": "text/markdown",
                        "url": "https://saferpage.de/portfolio/digest-md"
                    },
                    {
                        "filename": "saferpage-portfolio-digest.json",
                        "content_type": "application/json",
                        "url": "https://saferpage.de/portfolio/digest-json"
                    }
                ]
            },
            "sendgrid_payload": {
                "personalizations": [
                    {
                        "to": [
                            {
                                "email": "privacyops@example.invalid"
                            },
                            {
                                "email": "datenschutz@example.invalid"
                            }
                        ],
                        "custom_args": {
                            "idempotency_key": "sp-digest-privacyops-a76afd77e3fb9a1f2c52"
                        }
                    }
                ],
                "from": {
                    "email": "kontakt@peoplecheck.de",
                    "name": "SaferPage Reports"
                },
                "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
                "content": [
                    {
                        "type": "text/markdown",
                        "value": "# SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches\n\nKeine kritischen Domains im aktuellen Portfolio-Digest erkannt.\n\n## Kennzahlen\n- Domains im Scanplan: 1\n- Woechentliche Scans: 0\n- Nächste 7 Tage: 1\n- Kritische Domains: 0\n- Dispatches: 1 (0 dringend)\n\n## Nächste Aktionen\n- **Programm-Verantwortung/Datenschutz** (hoch): Kritische woechentliche Scans prüfen, Verantwortlichkeit bestätigen und Dispatch-Paket in Nachweispositionen übernehmen. https://saferpage.de/portfolio/dispatch-json\n- **Website-Betrieb** (mittel): Nächste Batch-Termine aus dem Scanplan gegen Deployment- und Consent-Änderungen abgleichen. https://saferpage.de/portfolio/schedule-json\n- **Audit/Compliance** (mittel): Audit-Trail exportieren und Scan-IDs mit internen Freigaben oder Release-Nachweisen verbinden. https://saferpage.de/portfolio/audit-json\n\n## Nächste geplante Scans\n- saferpage.de: 2026-08-14T01:13:10+00:00, mittel, neuer Check, älter als 14 Tage\n\n## Dispatch-Vorschau\n- saferpage.de: scheduled_privacyops, 2026-08-14T01:13:10+00:00, sp-dispatch-3b6ac7427bb5916db7bfa2ac"
                    }
                ]
            },
            "webhook_payload": {
                "event": "saferpage.portfolio.digest_ready",
                "idempotency_key": "sp-digest-privacyops-a76afd77e3fb9a1f2c52",
                "recipient_group": "privacyops",
                "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
                "links": {
                    "digest_json": "https://saferpage.de/portfolio/digest-json",
                    "digest_markdown": "https://saferpage.de/portfolio/digest-md",
                    "portfolio": "https://saferpage.de/portfolio"
                }
            },
            "canonical_webhook_body": "{\"event\":\"saferpage.portfolio.digest_ready\",\"idempotency_key\":\"sp-digest-privacyops-a76afd77e3fb9a1f2c52\",\"recipient_group\":\"privacyops\",\"subject\":\"SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches\",\"links\":{\"digest_json\":\"https://saferpage.de/portfolio/digest-json\",\"digest_markdown\":\"https://saferpage.de/portfolio/digest-md\",\"portfolio\":\"https://saferpage.de/portfolio\"}}",
            "canonical_body_sha256": "9b551385bb96bd18650c001ecab7ca4656c2f3c870296dcd6831bb649541dc95"
        },
        {
            "id": "sp-digest-webbetrieb-a76afd77e3fb9a1f2c52",
            "recipient_group": "webbetrieb",
            "label": "Webbetrieb",
            "cadence": "weekly",
            "language": "de-DE",
            "send_window": {
                "weekday": "monday",
                "time_local": "09:00",
                "timezone": "Europe/Berlin"
            },
            "to": [
                "webbetrieb@example.invalid"
            ],
            "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
            "preheader": "Keine kritischen Domains im aktuellen Portfolio-Digest erkannt.",
            "idempotency_key": "sp-digest-webbetrieb-a76afd77e3fb9a1f2c52",
            "headers": {
                "X-SaferPage-Event": "saferpage.portfolio.digest_ready",
                "X-SaferPage-Schema": "portfolio-digest-delivery.v1",
                "X-SaferPage-Idempotency-Key": "sp-digest-webbetrieb-a76afd77e3fb9a1f2c52",
                "X-SaferPage-Body-SHA256": "6606f2418b733e4979b030ed3fc5f38fbd3bf8bb491677445a96273c70eccecd",
                "X-SaferPage-Signature": "sha256=<HMAC über canonical_webhook_body>"
            },
            "retry_policy": {
                "max_attempts": 3,
                "backoff_seconds": [
                    300,
                    1800,
                    7200
                ],
                "dead_letter_queue": "privacyops.digest_delivery.failed"
            },
            "email_payload": {
                "from": "SaferPage Reports <kontakt@peoplecheck.de>",
                "to": [
                    "webbetrieb@example.invalid"
                ],
                "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
                "text_markdown": "# SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches\n\nKeine kritischen Domains im aktuellen Portfolio-Digest erkannt.\n\n## Kennzahlen\n- Domains im Scanplan: 1\n- Woechentliche Scans: 0\n- Nächste 7 Tage: 1\n- Kritische Domains: 0\n- Dispatches: 1 (0 dringend)\n\n## Nächste Aktionen\n- **Programm-Verantwortung/Datenschutz** (hoch): Kritische woechentliche Scans prüfen, Verantwortlichkeit bestätigen und Dispatch-Paket in Nachweispositionen übernehmen. https://saferpage.de/portfolio/dispatch-json\n- **Website-Betrieb** (mittel): Nächste Batch-Termine aus dem Scanplan gegen Deployment- und Consent-Änderungen abgleichen. https://saferpage.de/portfolio/schedule-json\n- **Audit/Compliance** (mittel): Audit-Trail exportieren und Scan-IDs mit internen Freigaben oder Release-Nachweisen verbinden. https://saferpage.de/portfolio/audit-json\n\n## Nächste geplante Scans\n- saferpage.de: 2026-08-14T01:13:10+00:00, mittel, neuer Check, älter als 14 Tage\n\n## Dispatch-Vorschau\n- saferpage.de: scheduled_privacyops, 2026-08-14T01:13:10+00:00, sp-dispatch-3b6ac7427bb5916db7bfa2ac",
                "headers": {
                    "X-SaferPage-Event": "saferpage.portfolio.digest_ready",
                    "X-SaferPage-Schema": "portfolio-digest-delivery.v1",
                    "X-SaferPage-Idempotency-Key": "sp-digest-webbetrieb-a76afd77e3fb9a1f2c52",
                    "X-SaferPage-Body-SHA256": "6606f2418b733e4979b030ed3fc5f38fbd3bf8bb491677445a96273c70eccecd",
                    "X-SaferPage-Signature": "sha256=<HMAC über canonical_webhook_body>",
                    "X-SaferPage-Digest-Schema": "portfolio-scan-digest.v1"
                },
                "attachments": [
                    {
                        "filename": "saferpage-portfolio-digest.md",
                        "content_type": "text/markdown",
                        "url": "https://saferpage.de/portfolio/digest-md"
                    },
                    {
                        "filename": "saferpage-portfolio-digest.json",
                        "content_type": "application/json",
                        "url": "https://saferpage.de/portfolio/digest-json"
                    }
                ]
            },
            "sendgrid_payload": {
                "personalizations": [
                    {
                        "to": [
                            {
                                "email": "webbetrieb@example.invalid"
                            }
                        ],
                        "custom_args": {
                            "idempotency_key": "sp-digest-webbetrieb-a76afd77e3fb9a1f2c52"
                        }
                    }
                ],
                "from": {
                    "email": "kontakt@peoplecheck.de",
                    "name": "SaferPage Reports"
                },
                "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
                "content": [
                    {
                        "type": "text/markdown",
                        "value": "# SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches\n\nKeine kritischen Domains im aktuellen Portfolio-Digest erkannt.\n\n## Kennzahlen\n- Domains im Scanplan: 1\n- Woechentliche Scans: 0\n- Nächste 7 Tage: 1\n- Kritische Domains: 0\n- Dispatches: 1 (0 dringend)\n\n## Nächste Aktionen\n- **Programm-Verantwortung/Datenschutz** (hoch): Kritische woechentliche Scans prüfen, Verantwortlichkeit bestätigen und Dispatch-Paket in Nachweispositionen übernehmen. https://saferpage.de/portfolio/dispatch-json\n- **Website-Betrieb** (mittel): Nächste Batch-Termine aus dem Scanplan gegen Deployment- und Consent-Änderungen abgleichen. https://saferpage.de/portfolio/schedule-json\n- **Audit/Compliance** (mittel): Audit-Trail exportieren und Scan-IDs mit internen Freigaben oder Release-Nachweisen verbinden. https://saferpage.de/portfolio/audit-json\n\n## Nächste geplante Scans\n- saferpage.de: 2026-08-14T01:13:10+00:00, mittel, neuer Check, älter als 14 Tage\n\n## Dispatch-Vorschau\n- saferpage.de: scheduled_privacyops, 2026-08-14T01:13:10+00:00, sp-dispatch-3b6ac7427bb5916db7bfa2ac"
                    }
                ]
            },
            "webhook_payload": {
                "event": "saferpage.portfolio.digest_ready",
                "idempotency_key": "sp-digest-webbetrieb-a76afd77e3fb9a1f2c52",
                "recipient_group": "webbetrieb",
                "subject": "SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches",
                "links": {
                    "digest_json": "https://saferpage.de/portfolio/digest-json",
                    "digest_markdown": "https://saferpage.de/portfolio/digest-md",
                    "portfolio": "https://saferpage.de/portfolio"
                }
            },
            "canonical_webhook_body": "{\"event\":\"saferpage.portfolio.digest_ready\",\"idempotency_key\":\"sp-digest-webbetrieb-a76afd77e3fb9a1f2c52\",\"recipient_group\":\"webbetrieb\",\"subject\":\"SaferPage Portfolio-Digest: 1 Domains, 0 woechentliche Scans, 1 Dispatches\",\"links\":{\"digest_json\":\"https://saferpage.de/portfolio/digest-json\",\"digest_markdown\":\"https://saferpage.de/portfolio/digest-md\",\"portfolio\":\"https://saferpage.de/portfolio\"}}",
            "canonical_body_sha256": "6606f2418b733e4979b030ed3fc5f38fbd3bf8bb491677445a96273c70eccecd"
        }
    ],
    "links": {
        "portfolio": "https://saferpage.de/portfolio",
        "json": "https://saferpage.de/portfolio/digest-delivery-json",
        "csv": "https://saferpage.de/portfolio/digest-delivery-csv",
        "digest_json": "https://saferpage.de/portfolio/digest-json",
        "digest_markdown": "https://saferpage.de/portfolio/digest-md"
    },
    "sources": [
        {
            "title": "Cookiebot Terms",
            "url": "https://www.cookiebot.com/en/terms-of-service-cookiebot/",
            "note": "Orientierung für monatliche Scanreports und mehrere Report-Empfänger."
        },
        {
            "title": "Cookiebot Scan Reports",
            "url": "https://support.cookiebot.com/hc/en-us/articles/5007079527580-Understanding-the-scan-report",
            "note": "Orientierung für wiederkehrende Scanreports."
        },
        {
            "title": "Osano Compliance Check",
            "url": "https://www.osano.com/features/compliance-check",
            "note": "Orientierung für kontinuierliche Compliance-Nachweise und Audit Trails."
        }
    ],
    "disclaimer": "Payload-Vorlagen ohne aktive Zustellung und ohne echte Secrets. Betreiber müssen Mailserver, API-Keys, HMAC-Secret, Einwilligungen, Verteiler, Versandfreigaben und Aufbewahrungsregeln selbst konfigurieren.",
    "cache": {
        "status": "miss",
        "ttl_seconds": 180
    }
}
