{
    "schema": "https://saferpage.de/schemas/operator-integration-setup.v1",
    "generated_at": "2026-06-08T23:30:56+00:00",
    "summary": "Betreiber-Setup fuer Jira, Slack, Teams, Webhooks und E-Mail: Zielsysteme, Secret-Referenzen, Events, Dry-Run-Status, Retry-/Security-Regeln und Delivery-Quellen in einem Paket.",
    "metrics": {
        "channel_count": 6,
        "enabled_channel_count": 5,
        "ready_channel_count": 0,
        "missing_channel_count": 5,
        "delivery_source_count": 4,
        "check_count": 5,
        "passed_check_count": 0
    },
    "channels": [
        {
            "id": "webhook",
            "label": "Generischer Webhook",
            "selected": true,
            "status": "missing_configuration",
            "owner": "IT/Platform",
            "purpose": "Alerts, Remediation-Tickets, Portfolio-Digests und Scan-Dispatches an eigene Orchestrierung senden.",
            "events": [
                "operator.remediation.ticket_ready",
                "monitoring.alert",
                "saferpage.portfolio.scan_dispatch",
                "saferpage.portfolio.digest"
            ],
            "required_env_refs": [
                "SAFERPAGE_WEBHOOK_URL",
                "SAFERPAGE_WEBHOOK_SECRET"
            ],
            "config_flags": [
                "webhook_url_set",
                "webhook_secret_set"
            ],
            "secret_policy": "Nur Secret-Referenzen oder gesetzte Ja/Nein-Flags anzeigen; keine Tokens, Webhook-URLs oder API-Keys im oeffentlichen Export."
        },
        {
            "id": "slack",
            "label": "Slack",
            "selected": true,
            "status": "missing_configuration",
            "owner": "PrivacyOps",
            "purpose": "PrivacyOps-Kanaele mit priorisierten Buttons, Ownern und SLA-Hinweisen informieren.",
            "events": [
                "operator.remediation.ticket_ready",
                "monitoring.alert",
                "saferpage.portfolio.scan_dispatch"
            ],
            "required_env_refs": [
                "SAFERPAGE_SLACK_WEBHOOK_URL",
                "SAFERPAGE_SLACK_CHANNEL"
            ],
            "config_flags": [
                "slack_webhook_set",
                "slack_channel_set"
            ],
            "secret_policy": "Nur Secret-Referenzen oder gesetzte Ja/Nein-Flags anzeigen; keine Tokens, Webhook-URLs oder API-Keys im oeffentlichen Export."
        },
        {
            "id": "teams",
            "label": "Microsoft Teams",
            "selected": true,
            "status": "missing_configuration",
            "owner": "Website-Betrieb",
            "purpose": "Adaptive Cards fuer Betreiber-, Datenschutz- oder Security-Teams vorbereiten.",
            "events": [
                "operator.remediation.ticket_ready",
                "monitoring.alert",
                "saferpage.portfolio.scan_dispatch"
            ],
            "required_env_refs": [
                "SAFERPAGE_TEAMS_WEBHOOK_URL"
            ],
            "config_flags": [
                "teams_webhook_set"
            ],
            "secret_policy": "Nur Secret-Referenzen oder gesetzte Ja/Nein-Flags anzeigen; keine Tokens, Webhook-URLs oder API-Keys im oeffentlichen Export."
        },
        {
            "id": "jira",
            "label": "Jira",
            "selected": true,
            "status": "missing_configuration",
            "owner": "Projekt-/Ticket-Owner",
            "purpose": "Remediation- und Alert-Aufgaben mit External-ID, Labels, Prioritaet und Akzeptanzkriterien anlegen.",
            "events": [
                "operator.remediation.ticket_ready",
                "monitoring.alert"
            ],
            "required_env_refs": [
                "SAFERPAGE_JIRA_BASE_URL",
                "SAFERPAGE_JIRA_EMAIL",
                "SAFERPAGE_JIRA_API_TOKEN"
            ],
            "config_flags": [
                "jira_base_set",
                "jira_auth_set",
                "jira_project_set"
            ],
            "secret_policy": "Nur Secret-Referenzen oder gesetzte Ja/Nein-Flags anzeigen; keine Tokens, Webhook-URLs oder API-Keys im oeffentlichen Export."
        },
        {
            "id": "email",
            "label": "E-Mail/SMTP",
            "selected": true,
            "status": "missing_configuration",
            "owner": "Programm-Owner",
            "purpose": "Portfolio-Digests und Eskalationen an Management, Datenschutz und Webbetrieb zustellen.",
            "events": [
                "saferpage.portfolio.digest",
                "monitoring.alert"
            ],
            "required_env_refs": [
                "SAFERPAGE_MAIL_FROM",
                "SAFERPAGE_MAIL_TO"
            ],
            "config_flags": [
                "mail_from_set",
                "mail_to_set"
            ],
            "secret_policy": "Nur Secret-Referenzen oder gesetzte Ja/Nein-Flags anzeigen; keine Tokens, Webhook-URLs oder API-Keys im oeffentlichen Export."
        },
        {
            "id": "sendgrid",
            "label": "SendGrid",
            "selected": false,
            "status": "disabled",
            "owner": "IT/Platform",
            "purpose": "Wiederkehrende Portfolio-Digests ueber einen Mail-Provider ausliefern.",
            "events": [
                "saferpage.portfolio.digest"
            ],
            "required_env_refs": [
                "SENDGRID_API_KEY",
                "SAFERPAGE_MAIL_FROM",
                "SAFERPAGE_MAIL_TO"
            ],
            "config_flags": [
                "sendgrid_key_set",
                "mail_from_set",
                "mail_to_set"
            ],
            "secret_policy": "Nur Secret-Referenzen oder gesetzte Ja/Nein-Flags anzeigen; keine Tokens, Webhook-URLs oder API-Keys im oeffentlichen Export."
        }
    ],
    "validation_checks": [
        {
            "id": "webhook_configuration",
            "channel": "webhook",
            "label": "Generischer Webhook konfigurieren",
            "status": "missing",
            "owner": "IT/Platform",
            "evidence": "Zielsystem, Secret-Referenzen und Projekt-/Kanalzuordnung fehlen noch.",
            "action": "Secrets in Serverumgebung oder Secret Manager setzen; oeffentliche URLs/Tokens nicht in Querystrings speichern."
        },
        {
            "id": "slack_configuration",
            "channel": "slack",
            "label": "Slack konfigurieren",
            "status": "missing",
            "owner": "PrivacyOps",
            "evidence": "Zielsystem, Secret-Referenzen und Projekt-/Kanalzuordnung fehlen noch.",
            "action": "Secrets in Serverumgebung oder Secret Manager setzen; oeffentliche URLs/Tokens nicht in Querystrings speichern."
        },
        {
            "id": "teams_configuration",
            "channel": "teams",
            "label": "Microsoft Teams konfigurieren",
            "status": "missing",
            "owner": "Website-Betrieb",
            "evidence": "Zielsystem, Secret-Referenzen und Projekt-/Kanalzuordnung fehlen noch.",
            "action": "Secrets in Serverumgebung oder Secret Manager setzen; oeffentliche URLs/Tokens nicht in Querystrings speichern."
        },
        {
            "id": "jira_configuration",
            "channel": "jira",
            "label": "Jira konfigurieren",
            "status": "missing",
            "owner": "Projekt-/Ticket-Owner",
            "evidence": "Zielsystem, Secret-Referenzen und Projekt-/Kanalzuordnung fehlen noch.",
            "action": "Secrets in Serverumgebung oder Secret Manager setzen; oeffentliche URLs/Tokens nicht in Querystrings speichern."
        },
        {
            "id": "email_configuration",
            "channel": "email",
            "label": "E-Mail/SMTP konfigurieren",
            "status": "missing",
            "owner": "Programm-Owner",
            "evidence": "Zielsystem, Secret-Referenzen und Projekt-/Kanalzuordnung fehlen noch.",
            "action": "Secrets in Serverumgebung oder Secret Manager setzen; oeffentliche URLs/Tokens nicht in Querystrings speichern."
        }
    ],
    "delivery_sources": [
        {
            "id": "remediation_tickets",
            "label": "Remediation Tickets",
            "event": "operator.remediation.ticket_ready",
            "schema": "operator-remediation-ticket-delivery.v1",
            "example_url": "https://saferpage.de/fix-guides/anrufer.info/tickets-delivery-json"
        },
        {
            "id": "monitoring_alerts",
            "label": "Monitoring Alerts",
            "event": "monitoring.alert",
            "schema": "monitoring-alert-delivery.v1",
            "example_url": "https://saferpage.de/alarme/anrufer.info/delivery-json"
        },
        {
            "id": "portfolio_scan_dispatch",
            "label": "Portfolio Scan Dispatch",
            "event": "saferpage.portfolio.scan_dispatch",
            "schema": "portfolio-scan-dispatch.v1",
            "example_url": "https://saferpage.de/portfolio/dispatch-json"
        },
        {
            "id": "portfolio_digest",
            "label": "Portfolio Digest Delivery",
            "event": "saferpage.portfolio.digest",
            "schema": "portfolio-digest-delivery.v1",
            "example_url": "https://saferpage.de/portfolio/digest-delivery-json"
        }
    ],
    "security_controls": [
        {
            "id": "secret_storage",
            "label": "Secrets nur serverseitig speichern",
            "requirement": "Webhook-URLs, Tokens und API-Keys in Secret Manager oder Environment, nie im oeffentlichen Export."
        },
        {
            "id": "signature",
            "label": "Payload-Signatur pruefen",
            "requirement": "HMAC mit X-SaferPage-Signature oder provider-spezifischer Signatur validieren."
        },
        {
            "id": "idempotency",
            "label": "Deduplizierung erzwingen",
            "requirement": "X-SaferPage-Idempotency-Key als External-ID fuer Jira/Webhook/Queue nutzen."
        },
        {
            "id": "rate_limit",
            "label": "Rate-Limits und Retry-Policy setzen",
            "requirement": "Exponential Backoff, Dead-Letter-Queue und Betreiber-Alarm bei wiederholtem Fehler."
        },
        {
            "id": "least_privilege",
            "label": "Minimale Berechtigungen",
            "requirement": "Jira-/Mail-/Webhook-Token nur fuer benoetigte Projekte, Kanaele und Events freigeben."
        }
    ],
    "dry_run": {
        "enabled_by_query_flags": true,
        "example_query": "https://saferpage.de/integrationen/setup-json?channels=webhook,jira&webhook_url_set=yes&webhook_secret_set=yes&jira_base_set=yes&jira_auth_set=yes&jira_project_set=yes",
        "does_not_send": true
    },
    "links": {
        "html": "https://saferpage.de/integrationen",
        "json": "https://saferpage.de/integrationen/setup-json",
        "csv": "https://saferpage.de/integrationen/setup-csv",
        "markdown": "https://saferpage.de/integrationen/setup-md",
        "operator_workbench": "https://saferpage.de/betreiber",
        "comparison": "https://saferpage.de/vergleich",
        "schemas": "https://saferpage.de/schemas"
    },
    "disclaimer": "Dieses Setup versendet nichts und zeigt keine Secrets. Produktive Zustellung braucht Betreiberfreigabe, Zielsystemberechtigungen, Datenschutz-/Security-Abnahme und Monitoring."
}
