KI-Agenten beobachten

KI-Crawler — von GPTBot über ClaudeBot bis PerplexityBot — lesen Ihre Website jeden Tag, und die meisten Betreiber sehen davon nichts. Der Beobachtungsmodus ist Stufe 1 der KI-Agenten-Kontrolle von SilentShield: Er zeichnet auf, welche KI-Dienste welche Seiten besuchen — ohne etwas zu blockieren und ohne das Verhalten Ihrer Website zu verändern.

Sichtbarkeit kommt vor Kontrolle: Erst wenn Sie wissen, wer Ihre Inhalte liest, können Sie sinnvoll entscheiden, wen Sie zulassen, drosseln oder blockieren. Jede Sichtung wird dafür einer von drei Kategorien zugeordnet:

Dies beobachtet nur — es blockiert nie

Die Snippets auf dieser Seite sind Fire-and-Forget: Sie melden, welche KI-Agenten vorbeikommen, und verändern die Antwort nie. Eine Regel im Dashboard auf "Blockieren" zu setzen, wirkt allein durch dieses Snippet nicht. Echtes Blockieren (ein 403 für unerwünschte Bots) erfordert die separate Enforce-Komponente — Stufe 2 — auf Ihrem Server.

Enforcement (Stufe 2) einrichten →

Training
Der Crawler sammelt Ihre Inhalte, um künftige KI-Modelle zu trainieren (z. B. GPTBot, ClaudeBot, CCBot).
KI-Suche
Der Dienst liest Seiten, um Nutzerfragen zu beantworten, und kann Ihre Website dabei als Quelle zitieren (z. B. OAI-SearchBot, PerplexityBot).
Agenten
Ein Bot handelt in Echtzeit im Auftrag einer konkreten Person und recherchiert z. B. ein Produkt oder füllt ein Formular auf Ihrer Website aus (z. B. ChatGPT-User, Claude-User).

Einrichtung nach Plattform

WordPress

Der eingebaute Observer kommt mit einem kommenden Update des SilentShield-Plugins. Bis dahin aktivieren Sie die Beobachtung mit einem kleinen Must-Use-Plugin — eine Datei, keine Konfiguration:

Legen Sie die Datei wp-content/mu-plugins/silentshield-observer.php mit diesem Inhalt an (mu-plugins laden automatisch; zum Deaktivieren die Datei löschen):

wp-config.phpphp
<?php
/**
 * Plugin Name: SilentShield — AI Agent Observer
 * Description: Reports AI crawler visits to SilentShield (fire-and-forget;
 * IP/UA are hashed server-side, GDPR). Delete this file to disable.
 *
 * Install: save this file as wp-content/mu-plugins/silentshield-observer.php
 * (mu-plugins load automatically — no activation needed). To force it off
 * without deleting: define('SILENTSHIELD_OBSERVER', false) in wp-config.php.
 * An upcoming SilentShield plugin update will build this in.
 */
if (!defined('ABSPATH')) exit;
if (defined('SILENTSHIELD_OBSERVER') && !SILENTSHIELD_OBSERVER) return;

const SS_OBSERVE_URL = "https://api.silentshield.io/api/v1/agent/telemetry";
const SS_API_KEY = "YOUR_API_KEY"; // publishable site key
// For the always-fresh list, cache https://api.silentshield.io/api/v1/agent/bot-directory daily.
$ss_bots = ["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User",
  "PerplexityBot","Perplexity-User","Bingbot","Applebot","Amazonbot","CCBot",
  "Bytespider","meta-externalagent","Google-Agent"];

register_shutdown_function(function () use ($ss_bots) {
  $ua = $_SERVER["HTTP_USER_AGENT"] ?? "";
  $signed = !empty($_SERVER["HTTP_SIGNATURE"]);
  $isBot = $signed;
  foreach ($ss_bots as $b) { if (stripos($ua, $b) !== false) { $isBot = true; break; } }
  if (!$isBot) return;

  if (function_exists("fastcgi_finish_request")) { fastcgi_finish_request(); }

  wp_remote_post(SS_OBSERVE_URL, [
    "timeout"  => 3,
    "blocking" => false,
    "headers"  => ["Content-Type" => "application/json", "x-api-key" => SS_API_KEY],
    "body"     => wp_json_encode(["sightings" => [[
      "ua"     => $ua,
      "ip"     => $_SERVER["REMOTE_ADDR"] ?? "",
      "path"   => strtok($_SERVER["REQUEST_URI"] ?? "/", "?"),
      "method" => $_SERVER["REQUEST_METHOD"] ?? "GET",
    ]]]),
  ]);
});

Next.js

Eine eigenständige Middleware — ohne SDK. Die Beobachtung läuft über event.waitUntil() abseits des Antwortpfads und verzögert Ihre Seiten daher nie:

middleware.tstypescript
// middleware.ts — self-contained observer, no SDK required.
// Sightings are reported via event.waitUntil(), off the response path,
// so your pages never wait. Best-effort and fail-open by design.

import { NextResponse, type NextRequest } from "next/server";

const OBSERVE_URL = "https://api.silentshield.io/api/v1/agent/telemetry";
const API_KEY = "YOUR_API_KEY"; // publishable site key

// Known AI-agent UA tokens. For the always-fresh list, fetch
// https://api.silentshield.io/api/v1/agent/bot-directory once a day and cache it.
const BOTS = ["GPTBot", "OAI-SearchBot", "ChatGPT-User", "ClaudeBot", "Claude-User",
  "PerplexityBot", "Perplexity-User", "Bingbot", "Applebot", "Amazonbot", "CCBot",
  "Bytespider", "meta-externalagent", "Google-Agent"];

export function middleware(req: NextRequest, event: { waitUntil(p: Promise<unknown>): void }) {
  const ua = req.headers.get("user-agent") ?? "";
  const signed = !!req.headers.get("signature");
  if (signed || BOTS.some((b) => ua.toLowerCase().includes(b.toLowerCase()))) {
    const sighting = {
      ua,
      path: req.nextUrl.pathname,
      method: req.method,
      ip: req.headers.get("x-forwarded-for")?.split(",")[0]?.trim(),
      ...(signed && {
        signature: req.headers.get("signature"),
        signature_input: req.headers.get("signature-input"),
        signature_agent: req.headers.get("signature-agent"),
        authority: req.nextUrl.host,
        scheme: req.nextUrl.protocol.replace(":", ""),
      }),
    };
    event.waitUntil(
      fetch(OBSERVE_URL, {
        method: "POST",
        headers: { "Content-Type": "application/json", "x-api-key": API_KEY },
        body: JSON.stringify({ sightings: [sighting] }),
      }).catch(() => {}) // best-effort, fail-open
    );
  }
  return NextResponse.next();
}

Node.js (Express)

Für Express (oder jeden anderen Node-Server) ergänzen Sie eine Fire-and-forget-Middleware. Sie meldet nur Anfragen, deren User-Agent zu einem bekannten KI-Agenten passt oder die eine Web-Bot-Auth-Signatur tragen — und blockiert die Antwort nie:

server.jsjavascript
import express from "express";
const app = express();

const OBSERVE_URL = "https://api.silentshield.io/api/v1/agent/telemetry";
const API_KEY = "YOUR_API_KEY";

// Known AI-agent UA tokens. For the always-fresh list, fetch
// https://api.silentshield.io/api/v1/agent/bot-directory once a day and cache it.
const BOTS = ["GPTBot", "OAI-SearchBot", "ChatGPT-User", "ClaudeBot", "Claude-User",
  "PerplexityBot", "Perplexity-User", "Bingbot", "Applebot", "Amazonbot", "CCBot",
  "Bytespider", "meta-externalagent", "Google-Agent"];

// Fire-and-forget observer — never blocks the response.
app.use((req, res, next) => {
  const ua = req.headers["user-agent"] || "";
  const signed = !!req.headers["signature"];
  if (signed || BOTS.some((b) => ua.toLowerCase().includes(b.toLowerCase()))) {
    const sighting = {
      ua, ip: req.ip, path: req.path, method: req.method,
      ...(signed && {
        signature: req.headers["signature"],
        signature_input: req.headers["signature-input"],
        signature_agent: req.headers["signature-agent"],
        authority: req.headers["host"], scheme: req.protocol,
      }),
    };
    fetch(OBSERVE_URL, {
      method: "POST",
      headers: { "Content-Type": "application/json", "x-api-key": API_KEY },
      body: JSON.stringify({ sightings: [sighting] }),
    }).catch(() => {}); // best-effort, fail-open
  }
  next();
});

PHP

Für pures PHP binden Sie diesen Observer ganz oben in Ihrem Front-Controller ein. Er sendet die Sichtung erst, nachdem die Antwort ausgeliefert wurde (fastcgi_finish_request) — die Seite wird dadurch nie langsamer:

observer.phpphp
<?php
// Drop-in observer: include at the very top of your front controller.
// It runs after the response is sent (fastcgi_finish_request) so it never
// slows down the page. Reuses the same publishable key.

const SS_OBSERVE_URL = "https://api.silentshield.io/api/v1/agent/telemetry";
const SS_API_KEY = "YOUR_API_KEY";
// For the always-fresh list, cache https://api.silentshield.io/api/v1/agent/bot-directory daily.
$ss_bots = ["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User",
  "PerplexityBot","Perplexity-User","Bingbot","Applebot","Amazonbot","CCBot",
  "Bytespider","meta-externalagent","Google-Agent"];

register_shutdown_function(function () use ($ss_bots) {
  $ua = $_SERVER["HTTP_USER_AGENT"] ?? "";
  $signed = !empty($_SERVER["HTTP_SIGNATURE"]);
  $isBot = $signed;
  foreach ($ss_bots as $b) { if (stripos($ua, $b) !== false) { $isBot = true; break; } }
  if (!$isBot) return;

  if (function_exists("fastcgi_finish_request")) { fastcgi_finish_request(); }

  $sighting = [
    "ua" => $ua,
    "ip" => $_SERVER["REMOTE_ADDR"] ?? "",
    "path" => strtok($_SERVER["REQUEST_URI"] ?? "/", "?"),
    "method" => $_SERVER["REQUEST_METHOD"] ?? "GET",
  ];
  $ch = curl_init(SS_OBSERVE_URL);
  curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 3,
    CURLOPT_HTTPHEADER => ["Content-Type: application/json", "x-api-key: " . SS_API_KEY],
    CURLOPT_POSTFIELDS => json_encode(["sightings" => [$sighting]]),
  ]);
  curl_exec($ch); // best-effort, fail-open
  curl_close($ch);
});

Go

Ein eigenständiger Observer in wenigen Zeilen — nur Standardbibliothek, kein SDK. Sichtungen werden fire-and-forget gemeldet, sodass keine Anfrage Latenz gewinnt:

main.gogo
// Self-contained observer — stdlib only, no SDK required.
// Reports AI-agent sightings fire-and-forget: never blocks a request,
// fail-open on any error. For the always-fresh bot list, cache
// https://api.silentshield.io/api/v1/agent/bot-directory daily.

const observeURL = "https://api.silentshield.io/api/v1/agent/telemetry"
const siteKey = "YOUR_API_KEY" // publishable — or os.Getenv("SILENTSHIELD_SITE_KEY")

var bots = []string{"GPTBot", "OAI-SearchBot", "ChatGPT-User", "ClaudeBot",
    "Claude-User", "PerplexityBot", "Perplexity-User", "Bingbot", "Applebot",
    "Amazonbot", "CCBot", "Bytespider", "meta-externalagent", "Google-Agent"}

func observe(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        ua, signed := r.UserAgent(), r.Header.Get("Signature") != ""
        hit := signed
        for _, b := range bots {
            if strings.Contains(strings.ToLower(ua), strings.ToLower(b)) {
                hit = true
                break
            }
        }
        if hit {
            ip, _, _ := net.SplitHostPort(r.RemoteAddr)
            s := map[string]any{"ua": ua, "ip": ip, "path": r.URL.Path, "method": r.Method}
            if signed { // Web Bot Auth (RFC 9421) — forward for verification
                s["signature"] = r.Header.Get("Signature")
                s["signature_input"] = r.Header.Get("Signature-Input")
                s["signature_agent"] = r.Header.Get("Signature-Agent")
                s["authority"] = r.Host
            }
            body, _ := json.Marshal(map[string]any{"sightings": []any{s}})
            go func() { // best-effort, fail-open
                req, _ := http.NewRequest("POST", observeURL, bytes.NewReader(body))
                req.Header.Set("Content-Type", "application/json")
                req.Header.Set("x-api-key", siteKey)
                if resp, err := (&http.Client{Timeout: 3 * time.Second}).Do(req); err == nil {
                    resp.Body.Close()
                }
            }()
        }
        next.ServeHTTP(w, r)
    })
}

// net/http:  http.ListenAndServe(":8080", observe(mux))
// Gin:       srv := &http.Server{Addr: ":8080", Handler: observe(r)}
//            srv.ListenAndServe()

Verbindung testen

Sie müssen nicht auf den ersten echten KI-Crawler warten, um zu prüfen, ob Ihre Integration funktioniert. Senden Sie einen leeren Batch — er registriert einen Heartbeat für Ihren Key, ohne falsche Sichtungen zu schreiben:

Terminalbash
curl -X POST https://api.silentshield.io/api/v1/agent/telemetry \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  --data '{"sightings":[]}'

Der Agenten-Hub Ihres API-Keys (API-Keys → Key auswählen → Agent) wechselt dann von „nicht verbunden“ auf „verbunden — lauscht“. Ihr Report bleibt leer, bis ein echter Agent vorbeikommt: SilentShield erfindet keine Daten.

DSGVO

Die Beobachtung stützt sich auf berechtigtes Interesse (Art. 6 Abs. 1 lit. f DSGVO). IP-Adressen werden serverseitig mit einem täglich wechselnden Salt gehasht — Roh-IPs werden nie gespeichert. Sichtungen werden 14 Tage aufbewahrt, und gespeichert werden überhaupt nur Anfragen bekannter KI-Agenten: normaler Besucher-Traffic wird nie erfasst.

FAQ

Macht das meine Website langsamer?

Nein. Jede Integration ist Fire-and-forget: Next.js nutzt event.waitUntil(), PHP meldet erst nach ausgelieferter Antwort, Node und Go senden im Hintergrund. Und sollte die SilentShield-API einmal nicht erreichbar sein, bleibt Ihre Website unbeeinträchtigt — alles arbeitet fail-open.

Was zählt als KI-Agent?

Nur Anfragen, die zu SilentShields Bot-Verzeichnis bekannter KI-Crawler und -Agenten passen (GPTBot, ClaudeBot, PerplexityBot, …) oder eine Web-Bot-Auth-Signatur tragen. Die stets aktuelle Liste finden Sie unter https://api.silentshield.io/api/v1/agent/bot-directory.

Warum sehe ich noch keine Daten?

KI-Crawler kommen nach ihrem eigenen Zeitplan. Auf den meisten Websites erscheinen die ersten Sichtungen innerhalb von 24–72 Stunden; bei kleineren Websites kann es länger dauern. Währenddessen bestätigt der Heartbeat in Ihrem Agenten-Hub, dass die Integration selbst funktioniert.

Weiter: Agenten-Regeln durchsetzen (Stufe 2) →