AI Crawler-spårning
Besökskollen kan visa exakt vilka AI-bottar som hämtar din sajt, GPTBot, ClaudeBot, PerplexityBot och fler, när du installerar en kort kodsnutt på din server.
Varför mäta AI-crawlers?
AI-bottar kör inte JavaScript, så de syns inte i din vanliga statistik. Ändå avgör de om dina sidor kan citeras av ChatGPT, Perplexity, Claude och andra. Att mäta deras besök ger dig:
- Vilka AI-modeller känner till din sajt , Varje plattform har sin egen bot. Ser du PerplexityBot men ingen GPTBot? Då vet du var du står hos respektive AI.
- Vilka sidor som indexeras mest , Sidor som AI:n hämtar ofta är de som har störst chans att citeras. Det styr var du bör lägga din optimeringsenergi.
- När indexeringen pågår , Daglig GPTBot-trafik = OpenAI uppdaterar sin syn på din sajt. Långa pauser kan signalera att innehållet inte uppfattas som färskt nog.
Så fungerar det
Snippet-koden du installerar kollar User-Agent på varje request till din server. När en AI-crawler matchar gör den ett asynkront POST till https://besokskollen.se/api/ai-crawl med crawler-namn och URL. Allt körs server-side, ingen påverkan på besökarens upplevelse.
Vi lagrar bara crawler-namn, URL, User-Agent och tidsstämpel. Inga personuppgifter, inga cookies. Spårningen gäller bara bottar, riktiga besökare ignoreras.
Installation
Välj plattform. Byt ut YOUR_SITE_ID mot ditt sajt-ID (samma som i din vanliga tracking-snippet). Snippet:en kan köras parallellt med vår vanliga JS-tracker, de stör inte varandra.
Next.js (App Router eller Pages)
Lägg till i din befintliga middleware.ts (eller skapa en ny). Vercel kör middleware vid edge, minimal latens.
// middleware.ts (eller utvidga befintlig)
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
const SITE_ID = 'YOUR_SITE_ID';
const AI_API = 'https://besokskollen.se/api/ai-crawl';
const AI_CRAWLER_PATTERNS = [
'GPTBot', 'ChatGPT-User', 'OAI-SearchBot',
'PerplexityBot', 'Perplexity-User',
'ClaudeBot', 'Claude-Web', 'Claude-User', 'Claude-SearchBot', 'anthropic-ai',
'Google-Extended', 'GoogleOther',
'Applebot-Extended',
'meta-externalagent', 'meta-externalfetcher',
'Amazonbot', 'cohere-ai', 'Bytespider', 'CCBot',
'DuckAssistBot', 'YouBot', 'Diffbot',
];
export function middleware(request: NextRequest) {
const ua = request.headers.get('user-agent') || '';
const matched = AI_CRAWLER_PATTERNS.find(p =>
ua.toLowerCase().includes(p.toLowerCase())
);
if (matched) {
// Fire-and-forget, blockerar inte response
fetch(AI_API, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
siteId: SITE_ID,
pathname: request.nextUrl.pathname,
userAgent: ua,
}),
}).catch(() => {});
}
return NextResponse.next();
}
export const config = {
matcher: ['/((?!_next|favicon.ico).*)'],
};WordPress
Lägg till i ditt temas functions.php eller skapa en mu-plugin. wp_remote_post med 'blocking' => false körs asynkront och påverkar inte sidladdningen.
// I functions.php (i ditt aktiva tema) eller som mu-plugin
add_action('template_redirect', function() {
$site_id = 'YOUR_SITE_ID';
$api = 'https://besokskollen.se/api/ai-crawl';
$patterns = [
'GPTBot', 'ChatGPT-User', 'OAI-SearchBot',
'PerplexityBot', 'Perplexity-User',
'ClaudeBot', 'Claude-Web', 'Claude-User', 'Claude-SearchBot', 'anthropic-ai',
'Google-Extended', 'GoogleOther',
'Applebot-Extended',
'meta-externalagent', 'meta-externalfetcher',
'Amazonbot', 'cohere-ai', 'Bytespider', 'CCBot',
'DuckAssistBot', 'YouBot', 'Diffbot',
];
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
foreach ($patterns as $p) {
if (stripos($ua, $p) !== false) {
wp_remote_post($api, [
'blocking' => false, // Asynkron, blockerar inte sidladdningen
'timeout' => 1,
'headers' => ['Content-Type' => 'application/json'],
'body' => wp_json_encode([
'siteId' => $site_id,
'pathname' => $_SERVER['REQUEST_URI'] ?? '/',
'userAgent' => $ua,
]),
]);
break;
}
}
});Node.js / Express
Generisk middleware för Express, Fastify eller liknande. Använder fetch (Node 18+), ingen extra dependency.
// Express middleware
const SITE_ID = 'YOUR_SITE_ID';
const AI_API = 'https://besokskollen.se/api/ai-crawl';
const AI_CRAWLER_PATTERNS = [
'GPTBot', 'ChatGPT-User', 'OAI-SearchBot',
'PerplexityBot', 'Perplexity-User',
'ClaudeBot', 'Claude-Web', 'Claude-User', 'Claude-SearchBot', 'anthropic-ai',
'Google-Extended', 'GoogleOther',
'Applebot-Extended',
'meta-externalagent', 'meta-externalfetcher',
'Amazonbot', 'cohere-ai', 'Bytespider', 'CCBot',
'DuckAssistBot', 'YouBot', 'Diffbot',
];
app.use((req, res, next) => {
const ua = req.get('user-agent') || '';
const matched = AI_CRAWLER_PATTERNS.find(p =>
ua.toLowerCase().includes(p.toLowerCase())
);
if (matched) {
fetch(AI_API, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
siteId: SITE_ID,
pathname: req.path,
userAgent: ua,
}),
}).catch(() => {});
}
next();
});Vilka AI-bottar spåras?
Vi känner igen dessa AI-modellers crawlers idag. Listan uppdateras allt eftersom nya bots dyker upp.
Vanliga frågor
Påverkar snippet:en min sajts prestanda?
Nej. Alla varianter använder asynkron eller fire-and-forget-fetch som kör i bakgrunden utan att blockera responsen till besökaren eller boten.
Vad händer om en bot blockeras av min CDN/brandvägg?
Då får snippet:en aldrig se requesten, och vi får ingen rapport. Det är korrekt beteende. Om du vill se ALLA bots inklusive blockerade behöver du logga på edge/CDN-nivå istället.
Kan jag rapportera fler crawlers själv?
Just nu är listan av kända crawlers central, endast bots vi känner igen sparas. Om du upptäcker en ny AI-crawler vi missar: hör av dig så lägger vi till den.