{
    "schema": "https://saferpage.de/schemas/dach-crawler-operations.v1",
    "generated_at": "2026-06-09T20:58:05+00:00",
    "available": true,
    "health": "operational",
    "summary": "DACH-Crawler operational: 702 deutschsprachige Checks, Queue 626, Fehlerquote 2,95%.",
    "metrics": {
        "german_count": 702,
        "queue_count": 626,
        "visited_count": 921,
        "skipped_count": 194,
        "error_count": 28,
        "error_rate_percent": 2.95,
        "last_batch_scanned": 8,
        "last_run_refreshed": 0,
        "last_run_refresh_candidates": 0,
        "last_run_duration_seconds": 63.22,
        "last_run_scanned_per_minute": 7.59,
        "last_run_average_host_seconds": 8.76,
        "estimated_queue_minutes": 82.5,
        "retry_pending_count": 28,
        "retry_due_count": 20,
        "retry_scheduled_count": 0,
        "preview_coverage_percent": 100,
        "preview_missing_count": 0,
        "seed_file_host_count": 86,
        "seed_host_count": 110,
        "seed_new_count": 0,
        "seed_queue_added_count": 0
    },
    "schedule": {
        "manager": "systemd",
        "unit": "saferpage-crawler.service",
        "timer": "saferpage-crawler.timer",
        "on_boot_after": "10min",
        "cadence": "every 30min after previous unit activation",
        "randomized_delay": "8min",
        "persistent": true,
        "next_step_if_idle": "Timerstatus mit systemctl list-timers saferpage-crawler.timer prüfen."
    },
    "performance_limits": {
        "max_hosts_per_run": 8,
        "concurrency": 2,
        "timeout_seconds": 90,
        "delay_between_batches_seconds": 1,
        "refresh_days": 7,
        "refresh_limit": 2000,
        "retry_base_hours": 12,
        "robots_policy": "SaferPageCrawler und SaferPageBot respektieren robots.txt.",
        "browser_policy": "Headless Chromium nur fuer Screenshot-, Cookie-, Storage- und Consent-Nachweise."
    },
    "crawler_identity": {
        "user_agent": "SaferPageCrawler/0.3 (+https://saferpage.de/bot; schedules passive DACH website checks; report examples: https://saferpage.de/tests)",
        "agent_name": "SaferPageCrawler",
        "policy_url": "https://saferpage.de/bot",
        "transparency_url": "https://saferpage.de/bot",
        "example_report_url": "https://saferpage.de/anrufer.info",
        "test_index_url": "https://saferpage.de/tests",
        "purpose": "Passive Datenschutz-, Consent-, Security- und Seitenvorschau-Pruefung fuer oeffentliche Website-Reports.",
        "contact_url": "https://saferpage.de/bot",
        "robots_txt_policy": "Robots.txt wird fuer automatische Crawler-Laeufe respektiert; manuelle Einzelchecks bleiben oeffentlich ausloesbar.",
        "no_attack_policy": "Keine Passwortversuche, Exploits, Belastungstests, Formularangriffe oder Umgehung von Zugriffssperren."
    },
    "last_run_parameters": {
        "max_hosts_per_run": 8,
        "concurrency": 2,
        "timeout_seconds": 90,
        "delay_seconds": 1
    },
    "capacity_plan": {
        "last_run_duration_label": "1,1 min",
        "throughput_per_minute": 7.59,
        "estimated_queue_label": "82,5 min",
        "scaling_rule": "Concurrency und max_hosts_per_run nur erhoehen, wenn API-Health, CPU, Screenshot-Worker und Fehlerquote stabil bleiben.",
        "safe_next_step": "Batchgroesse schrittweise um 2 Hosts erhoehen und Fehlerquote nach jedem Lauf pruefen."
    },
    "retry_policy": {
        "pending_count": 28,
        "due_count": 20,
        "base_backoff_hours": 12,
        "strategy": "Exponentieller Backoff pro Host; Timeout, DNS, TLS, 403/429/5xx und sonstige Fehler werden klassifiziert und spaeter kontrolliert erneut versucht.",
        "error_classes": {
            "other": 28
        }
    },
    "preview_coverage": {
        "total": 714,
        "preview_count": 714,
        "missing_count": 0,
        "legacy_size_count": 658,
        "preview_percent": 100,
        "source_counts": {
            "page_preview": 714
        },
        "missing_preview": [],
        "contract": {
            "width": 160,
            "height": 150,
            "fit": "contain",
            "source_capture": "full_page",
            "capture_version": "contain-v3-fullpage-to-160x150",
            "renderer": "playwright-chromium",
            "favicon_policy": "Favicon nur Zusatzsignal, nie Ersatz fuer Seitenvorschau."
        },
        "policy": "160x150-Seitenvorschau pro oeffentlichem Check; vollstaendig sichtbar skaliert; Full-Page-Screenshot als Quelle; Favicon nur als Zusatzsignal."
    },
    "scope": {
        "market": "deutschsprachiger Raum",
        "priority_tlds": [
            ".de",
            ".at",
            ".ch",
            ".li",
            ".lu"
        ],
        "generic_domains": "standardmaessig nicht einbezogen",
        "blocked_classes": [
            "Suchmaschinen",
            "Social Networks",
            "Adtech",
            "CDN-/Asset-Nebendomains",
            "Cloud-Infrastruktur"
        ]
    },
    "seed_manifest": {
        "generated_at": "2026-06-09T20:51:46+00:00",
        "seed_file": "config/dach-seed-domains.txt",
        "seed_file_host_count": 86,
        "cli_seed_count": 0,
        "recent_seed_count": 24,
        "seed_host_count": 110,
        "seed_new_count": 0,
        "seed_existing_count": 110,
        "seed_queue_added_count": 0,
        "refresh_candidate_count": 0,
        "include_generic": false,
        "market_tlds": [
            ".de",
            ".at",
            ".ch",
            ".li",
            ".lu"
        ],
        "source_policy": "Versioned DACH seed file plus recent public checks; bounded timer batch keeps discovery controlled.",
        "seed_preview": [
            "7sentidos.de",
            "abokiste24.de",
            "adac.de",
            "adlerkroenert.de",
            "aldi-sued.de",
            "alter-pflege-demenz-nrw.de",
            "angel-minerals.de",
            "aok.de",
            "apo-coach.de",
            "araonline.de",
            "arbeitsagentur.de",
            "awa7.de",
            "ayurveda-tut-gut.de",
            "bahn.de",
            "barmer.de",
            "berlin.de",
            "bfdi.bund.de",
            "bmw.de",
            "br.de",
            "bremen.de",
            "bsi.bund.de",
            "bund.de",
            "bundesnetzagentur.de",
            "bundesregierung.de"
        ]
    },
    "user_agent": "SaferPageCrawler/0.3 (+https://saferpage.de/bot; schedules passive DACH website checks; report examples: https://saferpage.de/tests)",
    "last_run": {
        "started_at": "2026-06-09T20:51:46+00:00",
        "finished_at": "2026-06-09T20:52:49+00:00",
        "scanned": 8,
        "queued_after_run": 626,
        "refreshed": 0,
        "errors": 28,
        "duration_seconds": 63.22,
        "scanned_per_minute": 7.59,
        "average_host_seconds": 8.76,
        "estimated_queue_minutes": 82.5,
        "succeeded": 4,
        "failed": 0,
        "robots_skipped": 2,
        "non_german_skipped": 2,
        "retried": 0,
        "retry_scheduled": 0
    },
    "queue_preview": [
        {
            "host": "blowerdoor-unlimited.de",
            "report_url": "https://saferpage.de/blowerdoor-unlimited.de",
            "priority": "de_first"
        },
        {
            "host": "bund-stuttgart.de",
            "report_url": "https://saferpage.de/bund-stuttgart.de",
            "priority": "de_first"
        },
        {
            "host": "bund.de",
            "report_url": "https://saferpage.de/bund.de",
            "priority": "de_first"
        },
        {
            "host": "bundesnetzagentur.de",
            "report_url": "https://saferpage.de/bundesnetzagentur.de",
            "priority": "de_first"
        },
        {
            "host": "bundesregierung.de",
            "report_url": "https://saferpage.de/bundesregierung.de",
            "priority": "de_first"
        },
        {
            "host": "bundestag.de",
            "report_url": "https://saferpage.de/bundestag.de",
            "priority": "de_first"
        },
        {
            "host": "check24.de",
            "report_url": "https://saferpage.de/check24.de",
            "priority": "de_first"
        },
        {
            "host": "comdirect.de",
            "report_url": "https://saferpage.de/comdirect.de",
            "priority": "de_first"
        },
        {
            "host": "connect.haendlerbund.de",
            "report_url": "https://saferpage.de/connect.haendlerbund.de",
            "priority": "de_first"
        },
        {
            "host": "consolar.de",
            "report_url": "https://saferpage.de/consolar.de",
            "priority": "de_first"
        },
        {
            "host": "dasguteruft.de",
            "report_url": "https://saferpage.de/dasguteruft.de",
            "priority": "de_first"
        },
        {
            "host": "datev.de",
            "report_url": "https://saferpage.de/datev.de",
            "priority": "de_first"
        }
    ],
    "recent_reports": [
        {
            "host": "blowerdoor.de",
            "score": 0,
            "checked_at": "2026-06-09 22:52:49.448603+02",
            "report_url": "https://saferpage.de/blowerdoor.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "bio-tierkost.de",
            "score": 0,
            "checked_at": "2026-06-09 22:52:34.943049+02",
            "report_url": "https://saferpage.de/bio-tierkost.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "bergwaldprojekt.de",
            "score": 0,
            "checked_at": "2026-06-09 22:52:22.393951+02",
            "report_url": "https://saferpage.de/bergwaldprojekt.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "awa7grow.de",
            "score": 0,
            "checked_at": "2026-06-09 22:52:01.953057+02",
            "report_url": "https://saferpage.de/awa7grow.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "ayurveda-tut-gut.de",
            "score": 0,
            "checked_at": "2026-06-09 22:18:48.608848+02",
            "report_url": "https://saferpage.de/ayurveda-tut-gut.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "awa7.de",
            "score": 0,
            "checked_at": "2026-06-09 22:18:47.594186+02",
            "report_url": "https://saferpage.de/awa7.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "araonline.de",
            "score": 0,
            "checked_at": "2026-06-09 22:17:31.120843+02",
            "report_url": "https://saferpage.de/araonline.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "apo-coach.de",
            "score": 12,
            "checked_at": "2026-06-09 22:17:30.310079+02",
            "report_url": "https://saferpage.de/apo-coach.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "adlerkroenert.de",
            "score": 0,
            "checked_at": "2026-06-09 22:17:24.547643+02",
            "report_url": "https://saferpage.de/adlerkroenert.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "angel-minerals.de",
            "score": 0,
            "checked_at": "2026-06-09 22:17:17.503165+02",
            "report_url": "https://saferpage.de/angel-minerals.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "7sentidos.de",
            "score": 0,
            "checked_at": "2026-06-09 21:44:57.382207+02",
            "report_url": "https://saferpage.de/7sentidos.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "abokiste24.de",
            "score": 0,
            "checked_at": "2026-06-09 21:44:56.598895+02",
            "report_url": "https://saferpage.de/abokiste24.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "einfach-jetzt-machen.de",
            "score": 0,
            "checked_at": "2026-06-09 21:44:40.66491+02",
            "report_url": "https://saferpage.de/einfach-jetzt-machen.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "klivoportal.de",
            "score": 0,
            "checked_at": "2026-06-09 21:44:31.613975+02",
            "report_url": "https://saferpage.de/klivoportal.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "klima-allianz.de",
            "score": 0,
            "checked_at": "2026-06-09 21:44:28.634376+02",
            "report_url": "https://saferpage.de/klima-allianz.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "anrufer.info",
            "score": 0,
            "checked_at": "2026-06-09 21:34:11.104241+02",
            "report_url": "https://saferpage.de/anrufer.info",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "klimawandel-gesundheit.de",
            "score": 0,
            "checked_at": "2026-06-09 21:11:17.519663+02",
            "report_url": "https://saferpage.de/klimawandel-gesundheit.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "kinderschutzbund-bw.de",
            "score": 0,
            "checked_at": "2026-06-09 21:10:59.500307+02",
            "report_url": "https://saferpage.de/kinderschutzbund-bw.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "kitaportal.dresden.de",
            "score": 0,
            "checked_at": "2026-06-09 21:10:56.766979+02",
            "report_url": "https://saferpage.de/kitaportal.dresden.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "forum-seniorenarbeit.de",
            "score": 0,
            "checked_at": "2026-06-09 21:10:50.069689+02",
            "report_url": "https://saferpage.de/forum-seniorenarbeit.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "dkf-kda.de",
            "score": 0,
            "checked_at": "2026-06-09 20:41:55.245521+02",
            "report_url": "https://saferpage.de/dkf-kda.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "alter-pflege-demenz-nrw.de",
            "score": 0,
            "checked_at": "2026-06-09 20:41:24.885359+02",
            "report_url": "https://saferpage.de/alter-pflege-demenz-nrw.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "berufundpflege-nrw.de",
            "score": 0,
            "checked_at": "2026-06-09 20:41:19.592442+02",
            "report_url": "https://saferpage.de/berufundpflege-nrw.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "kda.de",
            "score": 0,
            "checked_at": "2026-06-09 20:41:07.070119+02",
            "report_url": "https://saferpage.de/kda.de",
            "summary": "Nur mit Vorsicht nutzen"
        }
    ],
    "error_preview": [
        {
            "host": "otto.de",
            "error": "Remote end closed connection without response",
            "error_class": "other",
            "at": "2026-06-07T06:02:10+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "live.manager-magazin.de",
            "error": "Remote end closed connection without response",
            "error_class": "other",
            "at": "2026-06-07T08:21:25+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "kurs.manage-forward.de",
            "error": "Remote end closed connection without response",
            "error_class": "other",
            "at": "2026-06-07T08:21:25+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "mobile-university-fernstudium.de",
            "error": "<urlopen error [Errno 111] Connection refused>",
            "error_class": "other",
            "at": "2026-06-07T08:21:28+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "mobile-university.de",
            "error": "<urlopen error [Errno 111] Connection refused>",
            "error_class": "other",
            "at": "2026-06-07T08:21:28+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "reisewelt.spiegel.de",
            "error": "<urlopen error [Errno 111] Connection refused>",
            "error_class": "other",
            "at": "2026-06-07T08:21:29+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "presseportal-fuer-schulen.de",
            "error": "<urlopen error [Errno 111] Connection refused>",
            "error_class": "other",
            "at": "2026-06-07T08:21:30+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "leading-medicine-guide.de",
            "error": "Remote end closed connection without response",
            "error_class": "other",
            "at": "2026-06-07T09:33:01+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "promoting-fsnd.de",
            "error": "Remote end closed connection without response",
            "error_class": "other",
            "at": "2026-06-07T10:08:24+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "shop.t3n.de",
            "error": "Remote end closed connection without response",
            "error_class": "other",
            "at": "2026-06-07T10:08:24+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "taz.de",
            "error": "<urlopen error [Errno 111] Connection refused>",
            "error_class": "other",
            "at": "2026-06-07T10:08:25+00:00",
            "attempts": 0,
            "retry_after": ""
        },
        {
            "host": "telepolis.de",
            "error": "<urlopen error [Errno 111] Connection refused>",
            "error_class": "other",
            "at": "2026-06-07T10:08:25+00:00",
            "attempts": 0,
            "retry_after": ""
        }
    ],
    "run_history": [
        {
            "started_at": "2026-06-09T15:58:47+00:00",
            "finished_at": "2026-06-09T15:59:46+00:00",
            "scanned": 8,
            "queued": 579,
            "german": 658,
            "errors": 30
        },
        {
            "started_at": "2026-06-09T16:30:24+00:00",
            "finished_at": "2026-06-09T16:31:40+00:00",
            "scanned": 8,
            "queued": 574,
            "german": 663,
            "errors": 28
        },
        {
            "started_at": "2026-06-09T17:02:27+00:00",
            "finished_at": "2026-06-09T17:03:09+00:00",
            "scanned": 8,
            "queued": 583,
            "german": 669,
            "errors": 27
        },
        {
            "started_at": "2026-06-09T17:37:19+00:00",
            "finished_at": "2026-06-09T17:38:10+00:00",
            "scanned": 8,
            "queued": 580,
            "german": 672,
            "errors": 28
        },
        {
            "started_at": "2026-06-09T18:10:09+00:00",
            "finished_at": "2026-06-09T18:11:01+00:00",
            "scanned": 8,
            "queued": 575,
            "german": 678,
            "errors": 26
        },
        {
            "started_at": "2026-06-09T18:40:16+00:00",
            "finished_at": "2026-06-09T18:41:55+00:00",
            "scanned": 8,
            "queued": 577,
            "german": 683,
            "errors": 26
        },
        {
            "started_at": "2026-06-09T19:10:22+00:00",
            "finished_at": "2026-06-09T19:11:17+00:00",
            "scanned": 8,
            "queued": 572,
            "german": 687,
            "errors": 26
        },
        {
            "started_at": "2026-06-09T19:44:07+00:00",
            "finished_at": "2026-06-09T19:44:57+00:00",
            "scanned": 8,
            "queued": 589,
            "german": 692,
            "errors": 26
        },
        {
            "started_at": "2026-06-09T20:17:10+00:00",
            "finished_at": "2026-06-09T20:18:48+00:00",
            "scanned": 8,
            "queued": 641,
            "german": 698,
            "errors": 28
        },
        {
            "started_at": "2026-06-09T20:51:46+00:00",
            "finished_at": "2026-06-09T20:52:49+00:00",
            "scanned": 8,
            "queued": 626,
            "german": 702,
            "errors": 28
        }
    ],
    "runbook": [
        "Bei hoher Queue --max und --concurrency nur nach API-/CPU-Reserve erhöhen.",
        "Bei Fehlerquote ueber 20 Prozent API-Log, DNS/Timeouts und robots.txt-Skiprate prüfen.",
        "Fehlerhosts nicht hart durchdrücken: Retry-Backoff und Fehlerklasse aus Ops-JSON prüfen.",
        "Backlog-ETA aus Durchsatz und Queue beobachten; bei stabilem Lauf schrittweise skalieren statt grosse Spruenge zu machen.",
        "Screenshot-Abdeckung unter 95 Prozent als Backfill-Arbeit behandeln; fehlende Hosts aus preview_coverage.missing_preview erneut scannen.",
        "Deutschraum-Seeds ueber die versionierte Seed-Datei oder Recent-Checks erweitern; Plattform- und CDN-Domains weiter filtern.",
        "Jeder gespeicherte Check muss unter der kanonischen Kurz-URL /{domain} verlinkt bleiben."
    ],
    "links": {
        "html": "https://saferpage.de/crawler",
        "json": "https://saferpage.de/crawler/ops-json",
        "csv": "https://saferpage.de/crawler/ops-csv",
        "markdown": "https://saferpage.de/crawler/ops-md",
        "bot": "https://saferpage.de/bot",
        "tests": "https://saferpage.de/tests",
        "monitoring_feed": "https://saferpage.de/monitoring/feed.json"
    },
    "disclaimer": "Crawler-Operations zeigen öffentliche Betriebs- und Queue-Signale. Sie veröffentlichen keine Secrets, keine internen IPs und keine personenbezogenen Besucherlogs."
}