Zo controleer je je serverlogs op AI-crawlers
Zoek in het user-agentveld van je toegangslog naar tokens als GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot en PerplexityBot, en kijk daarna naar de statuscodes die ze kregen. Een user agent alleen bewijst niets, dus controleer elk bron-IP aan de hand van de gepubliceerde IP-lijst van de aanbieder, of voor Google en Apple met reverse en forward DNS.
Robots.txt zegt wat je crawlers vraagt te doen. Je toegangslog laat zien wat er echt gebeurde: welke AI-crawlers kwamen, welke pagina's ze opvroegen en wat je server antwoordde. Het is het meest directe bewijs dat je hebt, en je hebt er niets meer voor nodig dan de logbestanden en een terminal. De voorbeelden hieronder gebruiken het combined-logformaat dat nginx en Apache standaard gebruiken.
Op deze pagina
- Hoe ziet het bezoek van een AI-crawler eruit in een toegangslog?
- Hoe tel ik bezoeken van AI-crawlers?
- Wat kreeg elke crawler eigenlijk?
- Hoe verifieer ik dat een bezoek echt van OpenAI, Anthropic of Perplexity kwam?
- Hoe verifieer ik Googlebot, Applebot en CCBot?
- Hoe zien nep-AI-crawlers eruit?
- Wat kunnen logs je niet vertellen?
Hoe ziet het bezoek van een AI-crawler eruit in een toegangslog?
In het combined-formaat bevat elke regel het client-IP, de tijd, de requestregel, de statuscode, de grootte van het antwoord, de referrer en de user agent. nginx definieert het als $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent", en het combined-formaat van Apache heeft dezelfde velden. Een bezoek van de trainingscrawler van OpenAI ziet er zo uit:
20.171.206.5 - - [12/Nov/2026:10:00:01 +0000] "GET /pricing HTTP/1.1" 200 5120 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot"
De tokens waarnaar je moet zoeken, zijn die welke de aanbieders documenteren: GPTBot, OAI-SearchBot en ChatGPT-User (OpenAI); ClaudeBot, Claude-SearchBot en Claude-User (Anthropic); PerplexityBot en Perplexity-User (Perplexity); Googlebot, Applebot, meta-externalagent, meta-webindexer en CCBot. Google-Extended en Applebot-Extended zie je nooit. Google zegt dat Google-Extended geen aparte user-agentstring heeft, en Apple zegt dat Applebot-Extended niet crawlt; beide zijn alleen robots.txt-tokens.
Hoe tel ik bezoeken van AI-crawlers?
Als je elke regel splitst op het dubbele aanhalingsteken, komt de user agent in veld 6 terecht. Door alleen dat veld te matchen, voorkom je valse treffers van URL's die toevallig de naam van een bot bevatten. Dit telt bezoeken per crawler in de huidige log en in de geroteerde, gecomprimeerde logs:
zcat -f /var/log/nginx/access.log* \
| awk -F'"' '{print $6}' \
| grep -Eo 'GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User|Googlebot|bingbot|Applebot|meta-externalagent|meta-webindexer|CCBot' \
| sort | uniq -c | sort -rn
Pas het pad aan voor Apache, vaak /var/log/apache2/access.log* of /var/log/httpd/access_log*. zcat -f leest zowel gewone als gzip-bestanden. Ontbreekt een crawler die je verwacht, dan is dat alleen geen bewijs van een blokkade: hij kan in de periode die je logs beslaan simpelweg niet zijn langsgekomen.
Wat kreeg elke crawler eigenlijk?
Bezoeken zijn minder belangrijk dan antwoorden. Een crawler die op elk verzoek een 403 krijgt, is langsgekomen maar heeft niets gelezen. Deze commando's tonen statuscodes, de meest opgevraagde paden en of de crawler robots.txt heeft opgehaald:
# Status codes returned to PerplexityBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /PerplexityBot/ {split($3, s, " "); print s[1]}' | sort | uniq -c
# Most requested paths for OAI-SearchBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /OAI-SearchBot/ {split($2, r, " "); print r[2]}' | sort | uniq -c | sort -rn | head -20
# Did ClaudeBot fetch robots.txt, and what did it get?
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /ClaudeBot/ && $2 ~ /robots\.txt/ {split($3, s, " "); print s[1]}' | sort | uniq -c
Overwegend 200-antwoorden zijn wat je wilt. Veel 403's of 429's wijzen op een firewallregel of een rate limit. 5xx-antwoorden op robots.txt zijn ernstig: onder RFC 9309 moet een crawler die een serverfout voor robots.txt krijgt, aannemen dat de hele site verboden is.
Staat je site achter een cdn, dan verandert er twee dingen. Verzoeken die de cdn blokkeert, bereiken je origin nooit en staan dus helemaal niet in de logs ervan; bekijk in plaats daarvan de eigen beveiligingsgebeurtenissen van de cdn. En tenzij je het IP van de bezoeker herstelt, logt de origin het adres van de cdn. Cloudflare stuurt bijvoorbeeld het oorspronkelijke IP mee in de header CF-Connecting-IP en logt standaard een Cloudflare-IP.
Hoe verifieer ik dat een bezoek echt van OpenAI, Anthropic of Perplexity kwam?
Deze aanbieders publiceren de IP-bereiken die hun agents gebruiken: OpenAI op openai.com/gptbot.json, openai.com/searchbot.json en openai.com/chatgpt-user.json; Anthropic op claude.com/crawling/bots.json; Perplexity op perplexity.ai/perplexitybot.json en perplexity.ai/perplexity-user.json. Anthropic zegt dat een bron-IP op zijn lijst aangeeft dat de crawler van Anthropic komt. Geen van deze drie documenteert verificatie via reverse DNS, dus gebruik de lijsten.
De bestanden hebben dezelfde vorm, een prefixes-lijst met ipv4Prefix- of ipv6Prefix-items, zodat één klein script een IP tegen elk ervan kan controleren:
python3 - 20.171.206.5 https://openai.com/gptbot.json <<'EOF'
import ipaddress, json, sys, urllib.request
ip = ipaddress.ip_address(sys.argv[1])
req = urllib.request.Request(sys.argv[2], headers={"User-Agent": "log-check"})
prefixes = json.load(urllib.request.urlopen(req))["prefixes"]
nets = [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix")) for p in prefixes]
print(ip, "listed" if any(ip in n for n in nets) else "NOT listed")
EOF
Om de IP's te tonen die zich als een bepaalde crawler voordeden, draai je awk -F'"' '$6 ~ /GPTBot/ {split($1, a, " "); print a[1]}' over de log en stuur je de uitvoer door sort | uniq -c | sort -rn. Controleer elk IP aan de hand van de bijbehorende lijst. De lijsten veranderen, dus haal ze vers op in plaats van een oude kopie te bewaren.
Hoe verifieer ik Googlebot, Applebot en CCBot?
Google, Apple en Common Crawl documenteren een controle met reverse en forward DNS. Zoek de hostnaam van het IP op, controleer het domein, zoek vervolgens die hostnaam op en bevestig dat hij naar hetzelfde IP terugwijst:
host 66.249.66.1
# 1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com.
host crawl-66-249-66-1.googlebot.com
# crawl-66-249-66-1.googlebot.com has address 66.249.66.1
Voor Google moet de hostnaam eindigen op googlebot.com, google.com of googleusercontent.com, afhankelijk van de crawler; Google publiceert ook zijn bereiken, met Googlebot in common-crawlers.json. Voor Apple moet hij in applebot.apple.com staan, met de bereiken in applebot.json. Voor Common Crawl moet hij onder crawl.commoncrawl.org vallen, en Common Crawl waarschuwt dat andere crawlers ten onrechte de naam CCBot gebruiken.
Hoe zien nep-AI-crawlers eruit?
Scrapers lenen vaak de user agent van een bekende crawler om filters te omzeilen. Typische kenmerken:
- De user agent noemt een crawler, maar het IP staat niet in de gepubliceerde lijst van die aanbieder, of de reverse DNS komt niet overeen.
- De bron is een woonnetwerk of een cloudprovider die de aanbieder niet vermeldt.
- De client vraagt nooit robots.txt op, of vraagt paden op die robots.txt voor die crawler verbiedt.
- De aanvraagfrequentie of het patroon wijkt sterk af van het geverifieerde verkeer onder dezelfde naam, bijvoorbeeld pieken op zoek- of inlogendpoints.
Het omgekeerde probleem bestaat ook: een crawler die een gewone browser-user-agent gebruikt, is in de logregel helemaal niet te herkennen. In 2025 zei Cloudflare te hebben waargenomen dat Perplexity crawlde met niet-gedeclareerde, browserachtige user agents vanaf IP's buiten zijn gepubliceerde bereiken; Perplexity betwistte die voorstelling en schreef een deel van het verkeer toe aan een externe dienst. Logs alleen kunnen zulke gevallen niet beslechten, en daarom is verificatie aan de hand van gepubliceerde IP-bereiken in beide richtingen belangrijk.
Wat kunnen logs je niet vertellen?
Logs laten zien wat je server bereikte. Ze laten niet zien wat je cdn vóór de origin blokkeerde, of een pagina die 200 teruggaf de tekst bevatte of alleen een scriptomhulsel, of dat een crawler zou worden toegelaten als hij vandaag kwam. Ze beslaan ook alleen de periode die je bewaart, en op rustige sites komen AI-crawlers misschien zelden langs.
In een AISeeWhy-account kun je een toegangslog in combined-formaat uploaden (gewoon of .gz, tot 50 MB); die wordt geanalyseerd en weggegooid, en de verzoeken van elke AI-crawler worden geteld met hun statuscodes en gecontroleerd aan de hand van de IP-bereiken die de aanbieders publiceren.
Veelgestelde vragen
Waarom zie ik Google-Extended niet in mijn logs?
Google zegt dat Google-Extended geen aparte user-agentstring heeft. Het crawlen gebeurt door de bestaande crawlers van Google en het token bepaalt alleen hoe de content gebruikt mag worden. Hetzelfde geldt voor Applebot-Extended, dat volgens Apple niet crawlt.
Kan ik de user agent in mijn logs vertrouwen?
Nee. Iedereen kan elke user agent sturen. Zie hem als een bewering en bevestig hem met de gepubliceerde IP-bereiken van de aanbieder of, voor Google, Apple en Common Crawl, met een reverse en forward DNS-lookup.
Mijn logs tonen geen bezoeken van AI-crawlers. Ben ik geblokkeerd?
Niet per se. De crawler is misschien nog niet langsgekomen, je cdn kan hem vóór de origin hebben geblokkeerd, of je logs registreren mogelijk alleen de IP-adressen van de cdn. Bekijk de beveiligingsgebeurtenissen van je cdn en test de pagina met de user agent van elke crawler.
Is verkeer van ChatGPT-User een crawler?
Volgens OpenAI wordt ChatGPT-User gebruikt voor bepaalde acties van gebruikers en niet om het web automatisch te crawlen. De bezoeken volgen meestal op een vraag van iemand aan ChatGPT over een pagina, dus het gaat om kleine aantallen.
Bronnen
- nginx: ngx_http_log_module (combined-logformaat)
- Apache HTTP Server 2.4: logbestanden
- OpenAI: overzicht van de OpenAI-crawlers
- Anthropic: crawlt Anthropic gegevens van het web, en hoe kunnen site-eigenaren de crawler blokkeren?
- Perplexity: Perplexity-crawlers
- Google: Google-crawlers en -fetchers verifiëren
- Google: veelgebruikte crawlers, inclusief Google-Extended
- Apple: over Applebot
- Common Crawl: CCBot
- RFC 9309: Robots Exclusion Protocol
- Cloudflare: het oorspronkelijke IP van bezoekers herstellen
- Cloudflare: Perplexity gebruikt stealth-crawlers zonder verklaring om no-crawl-instructies van websites te omzeilen
- Perplexity: agents of bots? AI op het open web begrijpen