Wat leest een AI-assistent op je website?
Read this in EnglishEen AI-assistent leest de ruwe HTML die je server terugstuurt, en hij leest die in stukken, niet van boven naar beneden. Anders dan Google voeren de meeste AI-crawlers geen JavaScript uit, dus alles wat pas na een script verschijnt, is tekst die zij nooit binnenkrijgen. Daaromheen zoeken ze een paar simpele dingen: robots.txt, dat bepaalt of ze binnen mogen; het JSON-LD-blok dat in benoemde velden zegt wat het bedrijf is; je contactgegevens als tekens; en llms.txt als je die publiceert. Wat een assistent niet kan lezen, kan hij niet doorvertellen aan de klant die om een aanbeveling vraagt.
Ik bouw websites en ik run The Answer Report, een audit die een pagina ophaalt zoals die crawlers dat doen en laat zien welke tekst zij kregen; voor je eigen site doet de gratis check dat meteen. Hieronder staat wat ze lezen, in de volgorde waarin ze het ophalen.
De voordeur: robots.txt en de crawlers bij naam
Het eerste wat een nette crawler opvraagt is `/robots.txt`. Die crawlers hebben namen, en hun eigenaren publiceren ze.
OpenAI documenteert er vier: GPTBot, voor materiaal dat hun foundation-modellen kan trainen; OAI-SearchBot, voor de zoekfuncties van ChatGPT; ChatGPT-User, die ophaalt op verzoek van een gebruiker; en OAI-AdsBot. Anthropic documenteert er drie: ClaudeBot, Claude-SearchBot en Claude-User. Perplexity documenteert er twee: PerplexityBot, die sites laat opduiken en linkt in de resultaten, en Perplexity-User, voor verzoeken van gebruikers. OpenAI en Perplexity schrijven allebei dat robots.txt mogelijk niet geldt voor zo'n gebruikersverzoek. Anthropic maakt die uitzondering niet en zegt dat zijn bots het bestand volgen.
Daar volgen twee dingen uit. Trainen en antwoorden zijn losse taken van losse agents, dus alles in één keer blokkeren is een botte bijl. En Google-Extended is geen crawler: het is een stuurtoken dat twee dingen regelt, het trainen van toekomstige Gemini-modellen en grounding, het materiaal dat Gemini krijgt op het moment dat iemand iets vraagt. Google schrijft erbij dat het de opname en de positie in Zoeken niet raakt: blokkeren kost niets in Zoeken en haalt je pagina's uit de grounding van Gemini.
Mijn eigen keuze, nadrukkelijk een keuze en geen regel: ik laat elke agent binnen die mijn werk aan iemand kan tonen, trainingscrawlers erbij. Mijn site is een portfolio en een schrijfplek, dus in een model zitten is bereik en geen verlies. Een webshop met een betaalde catalogus, of een uitgever wiens archief zijn kapitaal is, kiest met reden anders. Wat ik niet zou doen: die keuze aan een standaardinstelling overlaten. Een hosting- of CDN-laag kan een robotsbeleid meesturen dat assistenten wegstuurt zonder dat iemand daarvoor koos, een patroon dat The Answer Report op live sites blijft tegenkomen. In de Nederlandse meting onder installatiebedrijven kwam die blokkade juist niet voor, dus kijk in je eigen bestand.
Een minimale toestemmingsgroep:
User-agent: OAI-SearchBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Google-Extended
Allow: /
User-agent: *
Allow: /
Sitemap: https://voorbeeld.nl/sitemap.xmlRobots.txt is trouwens een advies en geen slot: een voordeur, geen grendel.
Wat hij leest: de HTML zoals je server hem teruggaf
Google rendert wel. De gedocumenteerde volgorde is crawlen, renderen, indexeren, en in die renderstap draait een headless Chromium de pagina en voert het JavaScript uit. De meeste AI-crawlers hebben die machinerie niet.
Vercel en MERJ analyseerden AI-crawlerverkeer in serverlogs: de crawlers van OpenAI, Anthropic, Meta, ByteDance en Perplexity voeren geen JavaScript uit. Ze vragen de JavaScript-bestanden wel op. Ze draaien ze nooit. De uitzonderingen die zij noemen zijn Gemini, dat meerijdt op de infrastructuur van Googlebot, en AppleBot. SEO.AI beschrijft de browsetool van ChatGPT net zo: "It retrieves the raw HTML. It doesn't run JavaScript or wait for scripts."
Komen je dienstenlijst, je plaats of je openingstijden pas in de browser binnen, dan staan ze niet in het document dat de assistent las. Voor jou ziet de pagina er af uit, want jouw browser deed dat werk. De crawler niet.
Een afbeelding is geen tekst. Een foto van je openingstijden geeft een machine de alt-tekst die je schreef, of niets. Een gescande pdf is ook gewoon een afbeelding. Doet een feit ertoe, dan staat het als tekens in de HTML, of het bestaat niet.
Hij leest in stukken, niet van boven naar beneden
Dan Petrovic testte dit tegen de websearch-tool van OpenAI. Wat het model krijgt is geen pagina, maar een klein object: titel, URL en een fragment van één tot drie zinnen. Wil het meer, dan vraagt het een groter stuk van diezelfde pagina op, gecentreerd rond een regelnummer, en dat kan het op een andere regel herhalen. Hij noemt dat een sliding window.
Dat verandert waar feiten moeten staan. Staat de zin over wat je doet, voor wie en waar je werkt drie schermen lager onder "Over ons", dan gok je erop dat het venster daar landt. Zet hem in het eerste scherm, in een zin die een vreemde eruit kan tillen. Tien jaar preplijsten schrijven in keukens leerde me hetzelfde: wat niet staat waar de volgende kijkt, bestaat niet.
Gestructureerde data: dezelfde feiten, maar benoemd
Alles hierboven is een assistent die proza leest en er iets uit afleidt. Gestructureerde data slaat dat afleiden over. JSON-LD is een blok gelabelde JSON in een scripttag, en het zegt in een woordenschat die machines al delen wat de pagina is. De types die een klein bedrijf beschrijven zijn heel gewoon: Organization of LocalBusiness voor het bedrijf, Person voor een praktijk op naam, Service voor wat je verkoopt, FAQPage voor een vragenblok dat echt op de pagina staat.
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Loodgietersbedrijf Voorbeeld",
"url": "https://voorbeeld.nl/",
"telephone": "+31 30 123 4567",
"address": {
"@type": "PostalAddress",
"streetAddress": "Voorbeeldstraat 1",
"addressLocality": "Utrecht",
"addressCountry": "NL"
}
}Drie regels waar ik me aan hou. Eén blok, één identiteit: één beschrijving van het bedrijf, geen tweede naam en derde telefoonnummer elders op de site. Dezelfde feiten als de zichtbare pagina: zegt je schema dat je op zaterdag open bent en de pagina niet, dan heb je twee versies van één feit. Geen verzonnen velden om een score op te poetsen: een beoordeling zonder reviews, een dienst die je niet levert, een FAQPage voor vragen die nergens staan. Een claim die de pagina niet waarmaakt is erger dan geen claim.
Contactgegevens moeten tekens zijn
Het rapport dat ik draai scoort bereikbaarheid als eigen categorie, los van leesbaarheid: een pagina kan leesbaar zijn en een machine nog steeds niet vertellen hoe je het bedrijf bereikt.
Hou je formulier gerust. Een formulier is een plek om te typen, geen feit om te lezen. Wordt een assistent gevraagd hoe iemand jou bereikt en staat er alleen een verzendknop, dan is het eerlijke antwoord dat hij je gegevens niet kon vinden. Schrijf telefoonnummer, mailadres en adres als tekst, en laat de tel- en mailto-links om tekst heen staan die er toch al staat.
llms.txt, in twee zinnen
llms.txt is een plat tekstbestand in de root van je domein dat in je eigen woorden beschrijft wat het bedrijf is en wijst naar de pagina's die het lezen waard zijn. Het is een afspraak en geen vastgestelde standaard, het gaat niet boven robots.txt, en de gids van The Answer Report over wat llms.txt is en of je er een nodig hebt behandelt de rest.
Zo zie je wat een crawler binnenkrijgt
Voor de eerste controle heb je geen tool nodig. Haal de pagina op met een gewone HTTP-client en lees wat er terugkomt.
curl -sL https://voorbeeld.nl/ | lessDat komt dicht bij wat een crawler zonder renderstap binnenkrijgt. Zoek erin naar wat een klant zou vragen: je plaats, je telefoonnummer, je belangrijkste dienst, de zin die zegt wat je doet. Vind je ze daar niet, dan vindt een assistent ze ook niet.
Ik heb deze agents over sites die ik bouwde zien lopen. Ze vragen robots.txt op, ze vragen pagina's op, ze nemen de tekst die terugkwam en ze zijn weer weg. Dat deel is in elk toegangslog te zien.
Wat dit niet is
Dit is geen klassieke SEO onder een nieuwe naam, en geen trucje om hoger te komen. Het is leesbaarheid: zorgen dat wat waar is over je bedrijf bestaat in een vorm die een machine kan oppakken en doorvertellen. Een site kan mooi zijn, snel, goed geschreven, en nog steeds onleesbaar voor het ding waar je klant het aan vroeg.
Het is ook een andere vraag dan waarom een assistent je niet noemt. Leesbaarheid is nodig en niet genoeg; The Answer Report meet die kant in het Nederlands in zijn gids over waarom ChatGPT een installatiebedrijf niet noemt.
Wil je de machineweergave van je eigen site zien, dan haalt de gratis check van The Answer Report je homepage op zoals deze crawlers dat doen en laat zien wat er terugkwam.
Bronnen
- OpenAI: crawlers en user agents (GPTBot, OAI-SearchBot, ChatGPT-User, OAI-AdsBot)
- Anthropic: crawlt Anthropic het web, en hoe houden site-eigenaren het tegen (ClaudeBot, Claude-User, Claude-SearchBot)
- Perplexity: crawlers (PerplexityBot, Perplexity-User)
- Google Search Central: de basis van JavaScript-SEO (crawlen, renderen, indexeren)
- Google: veelvoorkomende crawlers en fetchers, inclusief het stuurtoken Google-Extended
- Vercel en MERJ: de opkomst van de AI-crawler (analyse van serverlogs)
- Dan Petrovic, DEJAN: hoe GPT het web ziet (sliding window)
- SEO.AI: leest ChatGPT JavaScript
- The Answer Report: methodology
- The Answer Report: wat llms.txt is en of je er een nodig hebt
- The Answer Report: waarom ChatGPT jouw bedrijf niet aanraadt
- The Answer Report, Nederlands: waarom ChatGPT jouw installatiebedrijf niet noemt
- Schema.org: het type LocalBusiness
Veelgestelde vragen
Schaadt het blokkeren van AI-crawlers mijn positie in Google?
Niet rechtstreeks. Het token Google-Extended bepaalt of je materiaal toekomstige Gemini-modellen mag trainen en of het de antwoorden van Gemini mag onderbouwen, wat Google grounding noemt. Google schrijft erbij dat het de opname in Google Zoeken niet raakt en geen rankingsignaal is, dus blokkeren kan je zichtbaarheid binnen Gemini kosten en laat Zoeken met rust. Googlebot zelf blokkeren is een heel andere beslissing en haalt je wel uit Zoeken.
Mijn website is gebouwd in React. Is hij onzichtbaar voor AI-assistenten?
Dat hangt af van waar de HTML gemaakt wordt, niet van het framework. Rendert je opzet de pagina's op de server of bouwt hij ze vooraf, dan staat de tekst al in het antwoord en leest een crawler die niet rendert hem prima. Stuurt de pagina een lege schil die pas in de browser gevuld wordt, dan staat die tekst niet in het document dat de crawler kreeg. Haal de pagina op met een gewone HTTP-client en je ziet welke van de twee je hebt.
Mijn tekst staat wel in de HTML, maar het belangrijkste staat ver onderaan de pagina. Is dat een probleem?
Dat kan het zijn. Het ophaalpatroon dat voor de websearch van ChatGPT is gedocumenteerd geeft het model eerst een kort fragment en haalt daarna grotere stukken van diezelfde pagina op, in plaats van de pagina van boven naar beneden te lezen, dus een feit dat een paar schermen lager staat wordt misschien nooit opgevraagd. Zet de gewone zin over wat je doet, voor wie en waar je werkt hoog op de pagina. Houd de details eronder voor de mensen die doorscrollen.
Leest een AI-assistent een pdf of een afbeelding van mijn dienstenlijst?
Reken er niet op. Wat een machine betrouwbaar uit een afbeelding haalt is de alt-tekst die jij schreef, en een gescand document is ook gewoon een afbeelding. Doet een feit ertoe voor een klant, publiceer het dan als tekst in de HTML van een pagina en houd het bestand als download voor de mensen die het willen.
Hoe controleer ik of een AI-crawler mijn site echt heeft bezocht?
Kijk in de toegangslogs van je server of je CDN naar de gedocumenteerde user-agenttokens: GPTBot, OAI-SearchBot en ChatGPT-User voor OpenAI, ClaudeBot, Claude-SearchBot en Claude-User voor Anthropic, PerplexityBot en Perplexity-User voor Perplexity. Elk van die aanbieders publiceert ook de IP-reeksen waarvandaan zijn agents ophalen, zodat je kunt bevestigen dat een bezoek echt was en geen vervalste user-agentregel.