Suivi des robots d'indexation IA
Mis à jour le 18 octobre 2026
Les robots d'indexation IA n'exécutent pas de JavaScript, le script Statsdot ne peut donc pas les détecter. Pour savoir lesquels parcourent votre site, votre serveur doit signaler leurs requêtes à Statsdot. Vous visualisez ensuite, dans le rapport du site, chaque robot avec son nombre de requêtes et les pages les plus consultées.
Seules les requêtes dont l'agent utilisateur correspond à un robot présent dans le répertoire des robots d'indexation IA sont enregistrées, avec le nom du robot, le chemin sans chaîne de requête et le code de statut. Les requêtes effectuées par des visiteurs réels sont ignorées même si votre serveur les envoie, et aucune adresse IP n'est stockée.
1. Activer la fonctionnalité
Dans les paramètres du site, sous Suivi des robots d'indexation IA, choisissez Activer et créer une clé. Copiez la clé (elle commence par sdb_). Cette clé permet uniquement de signaler les requêtes des robots ; régénérez-la au même endroit en cas de fuite.
2. Connecter votre site
WordPress
Dans Réglages > Statsdot du plugin, collez la clé dans Suivi des robots d'indexation IA et enregistrez. C'est tout.
Laravel
Ajoutez ce middleware au groupe web. Il effectue le signalement après l'envoi de la réponse, afin de ne pas ralentir les robots :
<?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;
}
}
}
}
Placez la clé dans .env sous le nom STATSDOT_BOT_KEY et dans config/services.php sous 'statsdot' => ['bot_key' => env('STATSDOT_BOT_KEY')]. Statsdot reconnaît davantage de robots que la liste courte ci-dessus ; étendez-la avec les jetons du répertoire qui vous intéressent.
PHP standard
À la fin de votre contrôleur frontal (par exemple index.php), après l'envoi de la page :
$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 et 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
Dans middleware.ts, effectuez le signalement sans retarder la réponse :
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 avec l'en-tête X-Statsdot-Bot-Key et un corps JSON {"user_agent": "...", "url": "...", "status": 200}, ou {"events": [...]} pour envoyer jusqu'à 100 requêtes. Il répond 202 avec le nombre de requêtes enregistrées. Limite de 600 requêtes par minute et par clé.
Limites
Chaque compte enregistre jusqu'à 100 000 requêtes de robots par mois pour l'ensemble de ses sites ; au-delà, elles ne sont plus comptabilisées jusqu'au mois suivant. Les requêtes des robots ne sont pas décomptées des événements de votre formule. Elles sont conservées aussi longtemps que vos visites (24 mois).