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.

Tips: är du inloggad hittar du samma kodsnuttar färdigifyllda med ditt sajt-ID under AI Insights på sajtens dashboard, tillsammans med en testknapp som verifierar installationen.

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.

ts
// middleware.ts (create in project root, or merge into your existing middleware)
import { NextResponse } from 'next/server';
import type { NextRequest, NextFetchEvent } from 'next/server';

const SITE_ID = 'YOUR_SITE_ID';
const AI_API = 'https://besokskollen.se/api/ai-crawl';

const AI_CRAWLER_PATTERNS = [
  'OAI-SearchBot', 'ChatGPT-User', 'GPTBot', 'Claude-User',
  'Claude-SearchBot', 'Claude-Web', 'ClaudeBot', 'anthropic-ai',
  'Perplexity-User', 'PerplexityBot', 'Google-Extended', 'GoogleOther',
  'Google-CloudVertexBot', 'Google-NotebookLM', 'GoogleAgent-Mariner', 'MistralAI-User',
  'Grok-DeepSearch', 'xAI-Grok', 'GrokBot', 'Applebot-Extended',
  'Applebot', 'meta-externalfetcher', 'Meta-ExternalFetcher', 'meta-externalagent',
  'Meta-ExternalAgent', 'Amazonbot', 'cohere-ai', 'cohere-training-data-crawler',
  'Bytespider', 'CCBot', 'DuckAssistBot', 'Diffbot',
  'YouBot',
];

export function middleware(request: NextRequest, event: NextFetchEvent) {
  const ua = request.headers.get('user-agent') || '';
  const matched = AI_CRAWLER_PATTERNS.some(p =>
    ua.toLowerCase().includes(p.toLowerCase())
  );

  if (matched) {
    // waitUntil keeps the report alive after the response is sent
    // (a plain fire-and-forget fetch can be cancelled on serverless hosts)
    event.waitUntil(
      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

Enklast: använd WordPress-pluginen

Pluginen Savri Analytics (version 1.1.0 eller senare) rapporterar AI-botbesök automatiskt, inget kodande behövs.

Öppna pluginen på wordpress.org

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.

php
// Add to functions.php in your active theme (or as an mu-plugin)

add_action('template_redirect', function () {
    $site_id = 'YOUR_SITE_ID';
    $api = 'https://besokskollen.se/api/ai-crawl';

    $patterns = array(
        'OAI-SearchBot', 'ChatGPT-User', 'GPTBot', 'Claude-User',
        'Claude-SearchBot', 'Claude-Web', 'ClaudeBot', 'anthropic-ai',
        'Perplexity-User', 'PerplexityBot', 'Google-Extended', 'GoogleOther',
        'Google-CloudVertexBot', 'Google-NotebookLM', 'GoogleAgent-Mariner', 'MistralAI-User',
        'Grok-DeepSearch', 'xAI-Grok', 'GrokBot', 'Applebot-Extended',
        'Applebot', 'meta-externalfetcher', 'Meta-ExternalFetcher', 'meta-externalagent',
        'Meta-ExternalAgent', 'Amazonbot', 'cohere-ai', 'cohere-training-data-crawler',
        'Bytespider', 'CCBot', 'DuckAssistBot', 'Diffbot',
        'YouBot',
    );

    $ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
    foreach ($patterns as $p) {
        if (stripos($ua, $p) !== false) {
            wp_remote_post($api, array(
                'blocking' => false, // async, never slows down the page
                'timeout'  => 1,
                'headers'  => array('Content-Type' => 'application/json'),
                'body'     => wp_json_encode(array(
                    '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.

js
// Express middleware, add before your routes
const SITE_ID = 'YOUR_SITE_ID';
const AI_API = 'https://besokskollen.se/api/ai-crawl';

const AI_CRAWLER_PATTERNS = [
  'OAI-SearchBot', 'ChatGPT-User', 'GPTBot', 'Claude-User',
  'Claude-SearchBot', 'Claude-Web', 'ClaudeBot', 'anthropic-ai',
  'Perplexity-User', 'PerplexityBot', 'Google-Extended', 'GoogleOther',
  'Google-CloudVertexBot', 'Google-NotebookLM', 'GoogleAgent-Mariner', 'MistralAI-User',
  'Grok-DeepSearch', 'xAI-Grok', 'GrokBot', 'Applebot-Extended',
  'Applebot', 'meta-externalfetcher', 'Meta-ExternalFetcher', 'meta-externalagent',
  'Meta-ExternalAgent', 'Amazonbot', 'cohere-ai', 'cohere-training-data-crawler',
  'Bytespider', 'CCBot', 'DuckAssistBot', 'Diffbot',
  'YouBot',
];

app.use((req, res, next) => {
  const ua = req.get('user-agent') || '';
  const matched = AI_CRAWLER_PATTERNS.some(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.

OpenAI: OAI-SearchBot, ChatGPT-User, GPTBot
Anthropic: Claude-User, Claude-SearchBot, Claude-Web, ClaudeBot
Perplexity: Perplexity-User, PerplexityBot
Google: Google-Extended, GoogleOther, Google-CloudVertexBot, Google-NotebookLM, GoogleAgent-Mariner
Mistral AI: MistralAI-User
xAI: Grok
Apple: Applebot-Extended, Applebot
Meta: meta-externalfetcher, meta-externalagent
Amazon: Amazonbot
Cohere: cohere-ai
ByteDance: Bytespider
Common Crawl: CCBot
DuckDuckGo: DuckAssistBot
Diffbot: Diffbot
You.com: YouBot

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.