SearchLift

Technical

Do AI crawlers execute JavaScript? What GPTBot and ClaudeBot actually see

If your content arrives via JavaScript, the assistant quoting your competitor may simply never have seen yours. Here is how to test what each crawler receives, in ten minutes, without a tool.

Published
September 11, 2026
Updated
September 12, 2026
Reading time
8 min read
Left, a product page as a browser renders it: a title, a price of $1,249, an in-stock badge, specifications and reviews. Right, the raw HTML a non-rendering fetcher receives for the same URL: a head with a script tag and a body containing only an empty div with the id root.
The same URL, fetched two ways. Everything an assistant would want to quote is on the left, and none of it is on the right.

Why this is not the same question as “is my site indexed?”

Googlebot: fetch HTML, then a render queue that runs JavaScript when resources allow, then index the rendered page. AI search crawlers as documented by OpenAI, Anthropic and Perplexity: fetch HTML, no documented render step, index what the response contained.
Google documents a second pass. Nothing in the OpenAI, Anthropic or Perplexity crawler documentation promises one; Applebot is the documented exception.

Test it yourself in ten minutes

  1. 01Pick one URL that matters commercially: a product page, a pricing page, or the article you most want cited.
  2. 02Fetch it with a documented AI crawler user agent and save the response: curl -A "GPTBot/1.2 (+https://openai.com/gptbot)" -s https://example.com/page > raw.html. Repeat for ClaudeBot and PerplexityBot using the exact strings in each vendor’s docs.
  3. 03Strip the tags and count the words: sed -e "s/<[^>]*>//g" raw.html | tr -s "[:space:]" "\n" | grep -c .. This is roughly what a non-rendering fetcher has to work with.
  4. 04Open the same URL in a browser, view the fully rendered DOM, and count the words the reader actually sees.
  5. 05Compare the two numbers. If raw is within about 80% of rendered, you are fine. If raw is a tenth of rendered, your content does not exist for anything that does not run JavaScript.
  6. 06Repeat for one page per template (a product page, a listing page, an article), because frameworks often render one route type on the server and another on the client.

What the numbers usually mean

Raw vs rendered word countWhat it meansWhat to do
The fourth row catches more sites than the third. A bot-management rule you did not write can return 403 to an agent you meant to welcome.
A scale from 0% to 100% of raw words as a share of rendered words. Under 20%: a client-rendered shell, where non-rendering crawlers get navigation and nothing else. 50 to 80%: the core is server-rendered but tabs, reviews or specs hydrate client-side. About 100%: fine. A separate case: the raw fetch is an error page, meaning the CDN or WAF is blocking the agent.
The table as a scale. The dashed case at the bottom is the one that catches more sites than the red band.

What to do if the answer is bad

  • Server-render the commercially important routes first. You rarely need to convert the whole application. The pages that answer buyer questions are the ones that need to exist in raw HTML.
  • Put the facts in the first response, not in a lazy-loaded panel. Prices, specifications, hours and availability are exactly what an assistant is asked for, and exactly what tends to hydrate late.
  • Do not solve it with a JSON-LD block alone. Google’s guidance is that structured data should match the visible page. Markup describing content a non-rendering fetcher cannot see is a mismatch waiting to be caught.
  • Re-test after you ship. The word count is the metric. If raw did not move, the fix did not work, whatever the framework docs promised.
searchlift · console
The SearchLift SEO audit screen: a banner reading Some AI engines cannot crawl your site with an Allow AI crawlers button, an SEO score of 61 out of 100, and a list of pages and products each with a score, the issues found on it and a Fix with Sam button.
Every page is fetched the way a non-rendering crawler fetches it, and scored on what came back. Demonstration workspace.

Common questions

01Do AI crawlers execute JavaScript?
02My React site is indexed by Google. Am I fine?
03How do I check what an AI crawler sees on my page?
04Does server-side rendering help AI search visibility?
05Will adding schema markup fix a client-rendered page?
Sourcesdevelopers.openai.comdevelopers.google.comsupport.apple.com