Zum Inhalt springen

KI-Crawler-Tracking

Aktualisiert am 18. Oktober 2026

KI-Crawler führen kein JavaScript aus, daher sieht das Statsdot-Skript sie nicht. Um zu erfahren, welche davon Ihre Website lesen, meldet Ihr Server deren Anfragen an Statsdot. Im Bericht der Website sehen Sie dann jeden Crawler mit der Anzahl seiner Anfragen und den Seiten, die von Crawlern am häufigsten gelesen wurden.

Nur Anfragen, deren User-Agent mit einem Crawler aus dem KI-Crawler-Verzeichnis übereinstimmt, werden gespeichert – zusammen mit dem Crawler, dem Pfad ohne Query-String und dem Statuscode. Anfragen von Personen werden ignoriert, selbst wenn Ihr Server sie sendet, und es werden keine IP-Adressen gespeichert.

1. Aktivieren

Wählen Sie in den Website-Einstellungen unter KI-Crawler-Tracking die Option Aktivieren und Schlüssel erstellen. Kopieren Sie den Schlüssel (er beginnt mit sdb_). Der Schlüssel kann nur Crawler-Anfragen melden; rotieren Sie ihn an derselben Stelle, falls er in fremde Hände gelangt.

2. Website verbinden

WordPress

Fügen Sie in den Einstellungen > Statsdot des Plugins den Schlüssel unter KI-Crawler-Tracking ein und speichern Sie. Das ist alles.

Laravel

Fügen Sie diese Middleware der web-Gruppe hinzu. Sie meldet die Anfrage erst, nachdem die Antwort gesendet wurde, damit Crawler nicht verlangsamt werden:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Symfony\Component\HttpFoundation\Response;

class ReportAiCrawlers
{
    private const TOKENS = ['gptbot', 'oai-searchbot', 'chatgpt-user', 'claudebot', 'claude-user', 'claude-searchbot', 'perplexitybot', 'perplexity-user', 'google-extended', 'googlebot', 'bingbot', 'applebot', 'meta-externalagent', 'bytespider', 'ccbot', 'amazonbot', 'duckassistbot', 'mistralai-user'];

    public function handle(Request $request, Closure $next): Response
    {
        return $next($request);
    }

    public function terminate(Request $request, Response $response): void
    {
        $agent = strtolower((string) $request->userAgent());

        foreach (self::TOKENS as $token) {
            if (str_contains($agent, $token)) {
                Http::timeout(2)->withHeaders(['X-Statsdot-Bot-Key' => config('services.statsdot.bot_key')])
                    ->post('https://statsdot.com/api/bots', [
                        'user_agent' => $request->userAgent(),
                        'url' => $request->fullUrl(),
                        'status' => $response->getStatusCode(),
                    ]);

                return;
            }
        }
    }
}

Hinterlegen Sie den Schlüssel in der .env als STATSDOT_BOT_KEY und in config/services.php als 'statsdot' => ['bot_key' => env('STATSDOT_BOT_KEY')]. Statsdot erkennt mehr Crawler als in der obigen Liste; erweitern Sie diese mit den Tokens aus dem Verzeichnis, die für Sie relevant sind.

Reines PHP

Am Ende Ihres Front-Controllers (zum Beispiel index.php), nachdem die Seite gesendet wurde:

$agent = $_SERVER['HTTP_USER_AGENT'] ?? '';

if (preg_match('/gptbot|oai-searchbot|chatgpt-user|claudebot|claude-user|claude-searchbot|perplexitybot|perplexity-user|googlebot|bingbot|applebot|meta-externalagent|bytespider|ccbot|amazonbot/i', $agent)) {
    if (function_exists('fastcgi_finish_request')) {
        fastcgi_finish_request();
    }

    $context = stream_context_create(['http' => [
        'method' => 'POST',
        'timeout' => 2,
        'header' => "Content-Type: application/json\r\nX-Statsdot-Bot-Key: sdb_your_key\r\n",
        'content' => json_encode([
            'user_agent' => $agent,
            'url' => 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'],
            'status' => http_response_code(),
        ]),
    ]]);

    @file_get_contents('https://statsdot.com/api/bots', false, $context);
}

Node.js und Express

const CRAWLERS = /gptbot|oai-searchbot|chatgpt-user|claudebot|claude-user|claude-searchbot|perplexitybot|perplexity-user|googlebot|bingbot|applebot|meta-externalagent|bytespider|ccbot|amazonbot/i;

app.use((req, res, next) => {
  const agent = req.get('user-agent') || '';
  if (CRAWLERS.test(agent)) {
    res.on('finish', () => {
      fetch('https://statsdot.com/api/bots', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json', 'X-Statsdot-Bot-Key': process.env.STATSDOT_BOT_KEY },
        body: JSON.stringify({ user_agent: agent, url: `${req.protocol}://${req.get('host')}${req.originalUrl}`, status: res.statusCode }),
      }).catch(() => {});
    });
  }
  next();
});

Next.js

Melden Sie die Anfrage in middleware.ts, ohne die Antwort zu verzögern:

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

const CRAWLERS = /gptbot|oai-searchbot|chatgpt-user|claudebot|claude-user|claude-searchbot|perplexitybot|perplexity-user|googlebot|bingbot|applebot|meta-externalagent|bytespider|ccbot|amazonbot/i;

export function middleware(request: NextRequest, event: NextFetchEvent) {
  const agent = request.headers.get('user-agent') ?? '';
  if (CRAWLERS.test(agent)) {
    event.waitUntil(fetch('https://statsdot.com/api/bots', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json', 'X-Statsdot-Bot-Key': process.env.STATSDOT_BOT_KEY! },
      body: JSON.stringify({ user_agent: agent, url: request.url }),
    }).catch(() => {}));
  }
  return NextResponse.next();
}

Der Endpunkt

POST https://statsdot.com/api/bots mit dem Header X-Statsdot-Bot-Key und einem JSON-Body {"user_agent": "...", "url": "...", "status": 200} oder {"events": [...]} mit bis zu 100 Anfragen. Er antwortet mit 202 und der Anzahl der erfassten Anfragen. Maximal 600 Anfragen pro Minute und Schlüssel.

Limits

Jedes Konto erfasst bis zu 100.000 Crawler-Anfragen pro Monat über alle Websites hinweg; darüber hinaus werden sie bis zum nächsten Monat nicht mehr aufgezeichnet. Crawler-Anfragen zählen nicht zu den Ereignissen Ihres Plans. Sie werden so lange gespeichert wie Ihre Besuche (24 Monate).