Skip to content

Search & AI

Do AI crawlers execute JavaScript?

I logged every bot that hit a JavaScript test page for 27 days. Five AI crawlers, zero executions. Only Googlebot, the control, ran the script.

7 min read

On this page
  1. How I tested this
  2. How I verified the bots were real
  3. The control: Googlebot did execute the JavaScript
  4. What this means for your site
  5. The test is still running

AI crawlers don't execute JavaScript. I set up a test page that loads its content with a script, logged every bot that visited the page, and checked each one against its vendor's published IP ranges where they exist. Five AI crawlers hit the page: GPTBot, ChatGPT-User, ClaudeBot, Meta's crawler, and Amazonbot. None of them ran the script. Only Googlebot, my control, did. If your content arrives through client-side rendering, these crawlers see a page with that content missing.

BotOwnerTypeRequests to test pageRequest verifiedExecuted JS
meta-externalagentMetaTraining crawler9Unverifiable (Meta publishes no IP ranges)No (0 of 9)
AmazonbotAmazonTraining crawler3Not checked (Amazon's ranges added to my check on 14 Oct)No (0 of 3)
GPTBotOpenAITraining crawler1Yes, inside OpenAI's published rangesNo (0 of 1)
ClaudeBotAnthropicTraining crawler1Not checked (visit predates the range check)No (0 of 1)
ChatGPT-UserOpenAIUser-triggered fetcher1Yes, inside OpenAI's published rangesNo (0 of 1)
Googlebot (control)GoogleSearch crawler1Network-level match only (predates the range check)Yes (2 executions)

Before going any further: if you want to know what these crawlers see when they open your site, I built a checker for that. Paste a URL here and it reads the page the way GPTBot, ClaudeBot and PerplexityBot do, with JavaScript switched off, and tells you how much of your text is still there. It takes about ten seconds and stores nothing.

How I tested this

Any request that visits the AI crawler rendering test page gets tracked, and if the user-agent matches a known bot, the request is stored with the name of the bot that visited.

The page itself has two blocks of text. The first is static HTML, which is always visible to an AI crawler or any scraper of any sort. The second is rendered dynamically, so it only exists if the visitor runs JavaScript.

Block A is a plain sentence written straight into the page. Nothing to prove here as every bot that opens the page gets it. For most AI crawlers, Block A is the whole page. That is exactly the view the visibility checker gives you of your own site: the page as it arrives, before any script has run.

Block B is empty in the HTML. When the page loads, a small script makes a request to my server, and the text that comes back is dynamically filled into the block. That is the whole test. The request can only be made if the script was run, and every request is recorded on my side. So if a bot ran the JavaScript, I have a record of it. If it didn't, I have nothing but the original page visit, which means it read the HTML and skipped the script.

The page went live on 18 September 2026. The results above are everything that reached it up to 14 October. The log is public at the bottom of the page, and you can open the live crawler log directly if you want to watch bots arrive.

How I verified the bots were real

There is a catch with any log like this. A bot identifies itself with a user agent, a name it sends along with its request, and nothing stops anyone from sending any name they like. A scraper running from a rented server can call itself GPTBot, and most logs would take its word for it.

So the user agent alone is not enough. The good news is that some AI companies publish the IP addresses their crawlers use. OpenAI publishes them for GPTBot and ChatGPT-User, Anthropic for ClaudeBot, Google for Googlebot, and since 8 September 2026, Amazon for Amazonbot. Every time a bot visits my page, its address is checked against the published list for the name it gave, right as it arrives.

That check can end in one of three ways:

  • Verified: the address is on the published list. This is the real bot.
  • Not verified: the bot gave a known name but came from somewhere else. I treat these as fake.
  • Unverifiable: the company publishes no list, so there is nothing to compare against. This means I could not check, not that the bot is fake.

That is what the "Request verified" column in the table is telling you. GPTBot and ChatGPT-User came from inside OpenAI's published addresses. Meta publishes no list, so its bot is unverifiable, and I report what it did without being able to vouch for who it was. Amazonbot's three visits came before I added Amazon's new list to the check, and the address is compared and then thrown away, so I cannot go back and check them. Future visits will be checked. ClaudeBot and Googlebot both visited on 18 September, the day before the address check went live. Googlebot's visit came from Google's own network, a weaker match than the published list, so its row says network-level match. ClaudeBot's visit had no such match available, so its row says not checked.

The control: Googlebot did execute the JavaScript

A test like this needs one bot that is known to run JavaScript. Without it, a column of zeros could mean the AI crawlers skipped the script, or it could mean my page was broken and nobody could have triggered Block B at all. Googlebot is the obvious choice. It is not an AI crawler, but it is the crawler whose rendering is best documented, so it is in the table as the control.

It did what it was supposed to. Googlebot fetched the page once, on 18 September at 07:52:15 UTC. Four seconds later, at 07:52:19, the script ran and the request from Block B arrived on my server. Then at 12:38:55, almost five hours on, the script ran again from that same visit. One page request, two executions. That matches what Google has said about how it works: the page is fetched first and rendered later, from a queue, and a page can be rendered more than once.

It also matters for the AI question itself. Google says its AI features, AI Overviews and AI Mode, draw from the same Search index that Googlebot builds. So content that only exists after JavaScript runs can still reach Google's AI answers, with a delay and no guarantee of when. In this test it did not reach GPTBot, ClaudeBot, Meta's crawler or Amazonbot at all, because for them the content was never there.

One visit is a small sample, so take this as proof that Googlebot can render the page, not as a measure of how often or how fast it does so on other sites.

What this means for your site

Optimizing for AI has now grown to become very relevant for a lot of good reasons. During training of their newer models, AI companies repeatedly crawl the internet, and if your website heavily relies on client side rendering, the crawlers would see a page with the content missing.

To make sure that your website is visible to AI retrieval systems, server side rendering is no longer optional - it is now essential.

The first step is to find out whether this applies to you, and you do not need a developer for it. Open the AI visibility checker, paste the page you most need AI to read, and look for one line in the result. "Readable without JavaScript" means your text is in the page itself and the crawlers above can see it. "The content depends on JavaScript" means your page is Block B: it looks fine in a browser and is close to empty for GPTBot, ClaudeBot and the rest. The same check also tells you if your robots.txt or your firewall is turning AI crawlers away at the door, which is a different problem with the same result.

If someone else looks after your site, send them the result instead of a vague question. Put your address on the end of the link, like https://www.dexcripter.me/lab/ai-visibility?url=yoursite.com, and the check runs the moment they open it. The question to ask comes with it: can this page's content arrive in the HTML, before any script runs? That is server-side rendering, in one sentence.

The test is still running

The table above is a snapshot, not a verdict. The page is still up, bots are still arriving, and some of the ones I most want to see have not turned up yet: PerplexityBot, OpenAI's search crawler OAI-SearchBot, Claude-User, Applebot and Bingbot. The moment one of them visits, it gets a row in the log and in this table. If one of them ever runs the script, the short answer at the top gets rewritten.

I'll update this post as the data grows, and the date at the bottom will tell you when it last changed. If you would rather not wait for me, the log is public and live. Open it and you'll see the latest visits as they happen, verified or not, before I've had a chance to write about them.

Keep reading