Do AI crawlers render JavaScript? What GPTBot and ClaudeBot see
Most AI crawlers do not run JavaScript: GPTBot, ClaudeBot and PerplexityBot read raw HTML only. One curl command shows what they see on your page.
LLaunchScaler·Published ·8 min read
Most AI crawlers do not render JavaScript: Vercel's study of AI crawler traffic found that GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot and PerplexityBot read only the HTML your server sends, and only Gemini (through Googlebot) and Applebot render pages. If your content appears only after JavaScript runs, those crawlers see an empty page, and one curl command tells you whether that is your site.
That matters because the crawlers that do not render are the ones behind ChatGPT, Claude and Perplexity answers. A page that looks complete in a browser can be blank to all three.
Which AI crawlers render JavaScript?
Vercel measured it on its own network and found that "none of the major AI crawlers currently render JavaScript," naming OpenAI's, Anthropic's, Meta's, ByteDance's and Perplexity's crawlers. Two crawlers render: Gemini, which uses Googlebot's infrastructure, and Applebot, which renders through a browser-based crawler. The table lists each crawler you are likely to care about.
Crawler
Feeds
Renders JavaScript
Source
GPTBot
OpenAI training
No
Vercel
OAI-SearchBot
ChatGPT search
No
Vercel
ChatGPT-User
Questions, answered
What people ask about this
01
Do AI crawlers render JavaScript?
Most do not. Vercel's study of AI crawler traffic found none of the major AI crawlers render JavaScript, naming OpenAI's, Anthropic's, Meta's, ByteDance's and Perplexity's. The exceptions are Gemini, which uses Googlebot's rendering, and Applebot, which renders with a browser-based crawler.
The non-rendering crawlers do download scripts; they just never run them. Vercel found ChatGPT's crawler spent 11.50% of its fetches on JavaScript files and Claude's 23.84%, while ChatGPT's single largest share, 57.70%, went to HTML. The scripts arrive and sit unexecuted, so the content they would have built never exists for the crawler.
Vercel published this in December 2024, and neither OpenAI, Anthropic nor Perplexity documents rendering support on its crawler pages as of September 2026. Test your own pages rather than relying on any list.
What does an AI crawler see on a React or Vite single-page app?
It sees the HTML shell and nothing else. The default React template from Vite serves a body that holds one empty element and one script tag, and a crawler that does not run the script reads a page with no words on it. Every heading, price and paragraph your app renders is added later, by code the crawler never runs.
This is the whole index.html of Vite's React TypeScript template:
To GPTBot or ClaudeBot, that page's title is "Vite + React + TS" and its content is an empty <div id="root"></div>. Setting the title from JavaScript after load does not help, because the crawler has already read the one in the file. The same applies to Vue's template, which ships an empty <div id="app"></div>, and to any app built by an AI builder that outputs a client-rendered single-page app. The guide to client-side rendering and SEO covers the pattern across frameworks.
How do you test what an AI crawler sees?
Fetch the page without running JavaScript and search the result for a sentence you can see in the browser. If the sentence is there, the crawlers can read it. If the count is zero, the sentence is built by JavaScript and non-rendering crawlers never see it. The test takes one command per page.
Pick a sentence from the body of the page, such as a line from your pricing table.
Run: curl -s https://yoursite.com/pricing | grep -c "per seat per month". A result of 1 or more means the sentence is in the raw HTML; 0 means it is not.
Repeat with an AI crawler's user agent, in case your server or CDN serves bots something different: curl -s -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" https://yoursite.com/pricing | grep -c "per seat per month".
Check the page's metadata the same way: curl -s https://yoursite.com/pricing | grep -iE "<title>|name=\"description\"|application/ld\+json".
Compare View Source with the browser's element inspector. View Source shows what the server sent; the inspector shows what JavaScript built. Anything only in the inspector is invisible to non-rendering crawlers.
Run it on the pages you most want cited: home, pricing, features, comparisons and documentation. Logged-in app screens do not matter here.
Which parts of the page must be in the raw HTML?
Everything an AI answer might quote or use to describe the page. Vercel's advice for being crawled is to server-render "main content (articles, product information, documentation), meta information (titles, descriptions, categories), and navigation structures." Structured data belongs in the same list, since a crawler that does not run scripts never sees JSON-LD injected by one.
Element
Why a crawler needs it in the first response
How to check
<title>
Names the page in citations and search results
curl -s URL | grep -i "<title>"
Meta description
Summary engines can use when describing the page
grep -i 'name="description"'
Canonical and robots meta
Tells crawlers which URL to use and whether to index it
grep -iE 'rel="canonical"|name="robots"'
Main body copy
The passages an answer quotes
grep -c "a sentence from the page"
Navigation links as <a href>
How crawlers find your other pages
grep -o '<a href="[^"]*"' | head
JSON-LD structured data
Typed facts such as organisation, product and price
grep -c "application/ld+json"
Open Graph tags
The preview when your link is shared
grep -i 'property="og:'
Links deserve a special mention. If your navigation is built by JavaScript, a non-rendering crawler that lands on your home page cannot find your pricing or docs at all, even if those pages are server-rendered.
How do you fix a client-rendered site for AI crawlers?
Send the content in the first HTML response. Three approaches do that: render each page on the server per request, generate pages as static HTML at build time, or prerender specific routes to HTML while the rest of the app stays client-side. For most product sites, prerendering the public marketing routes is the smallest change.
Fix
What it does
Fits
Server-side rendering
The server builds each page's HTML per request; JavaScript hydrates it afterwards
Pages whose content changes per request or often
Static generation
Pages are built to HTML at build time and served as files
Marketing pages, docs, blog posts
Prerendering selected routes
A build step renders chosen routes of a single-page app to HTML
An existing React or Vite app whose public pages are few
Whichever you pick, run the curl test again after deploying. Frameworks that support server rendering can still ship a page whose main content sits inside a component that only renders in the browser, and the raw HTML is the only honest check. If your site came from an AI app builder, the guide to Lovable SEO and the guide to an AI-built app that isn't indexed cover the builder-specific steps.
What else do AI crawlers struggle with?
Broken URLs and redirects, by a wide margin. The same Vercel study found ChatGPT's crawler spent 34.82% of its fetches on pages that returned 404, and Claude's 34.16%, against 8.22% for Googlebot. ChatGPT's crawler also spent 14.36% of its fetches following redirects. Every wasted fetch is one that did not reach a page you want quoted.
Three fixes cut that waste, and they are the same ones that help Google:
Point internal links at the final URL, not at an address that redirects to it.
Remove dead and redirected URLs from your XML sitemap, so it lists only pages that return 200.
Return a real 404 or 410 for pages that are gone, instead of a 200 page that says "not found," so crawlers can drop them.
Single-page apps are prone to the third problem. A client-side router can serve the same 200 shell for every path, including paths that do not exist, and the "not found" message appears only after JavaScript runs, which a non-rendering crawler never sees.
Does Google's rendering mean you can skip this?
No. Google does render JavaScript, but it is one engine among several, and Google itself recommends not relying on it. Googlebot queues pages for rendering in a headless Chromium after crawling, so content built by JavaScript can be indexed later than content in the HTML, and none of that helps ChatGPT, Claude or Perplexity.
Google's JavaScript guide says "server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript." Gemini is the one AI assistant that benefits from Google's rendering, because it retrieves through Google's index. For every other assistant, only the raw HTML counts. The guide to optimizing for AI search covers what to put in that HTML once it is there.
Check your raw HTML the way AI crawlers read it
Running curl on every page takes time, and a deploy can quietly move content back into the browser. Run the free scan on LaunchScaler: it takes a URL, needs no account and runs 156 checks across 6 of its 7 categories at no cost. It flags primary content that is missing from the raw HTML and only appears after JavaScript runs, for both search engines and AI crawlers, and it requests your page as ChatGPT-User and Claude-User to catch an empty client-rendered shell. Its search checks also read the title, meta description, canonical and structured data your server sends.
Vercel's research lists OAI-SearchBot, ChatGPT-User and GPTBot among the crawlers that do not render JavaScript. ChatGPT's crawler did fetch JavaScript files, 11.50% of its requests, but did not execute them.
03
How can I see what an AI crawler sees on my page?
Fetch the raw HTML and search it for a sentence from the page: curl -s https://yoursite.com | grep -c 'a sentence from your page'. A count of 0 means the sentence only exists after JavaScript runs, so AI crawlers that read raw HTML cannot see it.
04
Is a React single-page app invisible to AI crawlers?
A client-rendered one is. The default Vite and React template serves an empty div with the id root and a script tag, so a crawler that does not run the script reads a page with no content. Server rendering or prerendering fixes it.
05
Does Google render JavaScript for AI Overviews?
Googlebot renders pages in a headless Chromium before indexing, and AI Overviews draw on Google's index. Google still recommends server-side or pre-rendering because it is faster and not all bots can run JavaScript.
Google stopped showing FAQ rich results on May 7, 2026, after limiting them in 2023. FAQPage is still valid schema.org. What to keep, remove and write.