Tracciamento dei crawler AI
Aggiornato il 18 ottobre 2026
I crawler AI non eseguono JavaScript, quindi lo script di Statsdot non li rileva mai. Per sapere quali di essi leggono il tuo sito, il tuo server segnala le loro richieste a Statsdot. Vedrai quindi, nel report del sito, ogni crawler con il suo numero di richieste e le pagine che i crawler leggono maggiormente.
Vengono archiviate solo le richieste il cui user agent corrisponde a un crawler della directory dei crawler AI, insieme al crawler, al percorso senza query string e al codice di stato. Le richieste provenienti da persone vengono ignorate anche se il tuo server le invia, e nessun indirizzo IP viene archiviato.
1. Attivalo
Nelle impostazioni del sito, sotto Tracciamento dei crawler AI, scegli Attiva e crea una chiave. Copia la chiave (inizia con sdb_). La chiave può solo segnalare richieste dei crawler; ruotala nello stesso punto se viene compromessa.
2. Connetti il tuo sito
WordPress
In Impostazioni > Statsdot del plugin, incolla la chiave in Tracciamento dei crawler AI e salva. Tutto qui.
Laravel
Aggiungi questo middleware al gruppo web. Segnala dopo che la risposta è stata inviata, così i crawler non vengono rallentati:
<?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;
}
}
}
}
Inserisci la chiave nel file .env come STATSDOT_BOT_KEY e in config/services.php come 'statsdot' => ['bot_key' => env('STATSDOT_BOT_KEY')]. Statsdot riconosce più crawler rispetto al breve elenco sopra; estendilo con i token della directory che ti interessano.
PHP semplice
Alla fine del tuo front controller (ad esempio index.php), dopo che la pagina è stata inviata:
$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 ed 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
In middleware.ts, segnala senza ritardare la risposta:
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();
}
L'endpoint
POST https://statsdot.com/api/bots con l'header X-Statsdot-Bot-Key e un corpo JSON {"user_agent": "...", "url": "...", "status": 200}, oppure {"events": [...]} con un massimo di 100 richieste. Risponde con 202 e il numero registrato. Fino a 600 richieste al minuto per chiave.
Limiti
Ogni account registra fino a 100.000 richieste di crawler al mese tra i suoi siti; oltre tale soglia non vengono registrate fino al mese successivo. Le richieste dei crawler non contano ai fini degli eventi del tuo piano. Vengono conservate per la stessa durata delle tue visite (24 mesi).