GuideAI visibility
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.

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 | ChatGPT fetches for users | No | Vercel |
| ClaudeBot | Anthropic training | No | Vercel |
| Claude-SearchBot, Claude-User | Claude search and user fetches | Not published; assume no | Anthropic documents no rendering |
| PerplexityBot | Perplexity search | No | Vercel |
| Perplexity-User | Perplexity user fetches | Not published; assume no | Perplexity documents no rendering |
| Googlebot (and Gemini through it) | Google Search, AI Overviews, AI Mode, Gemini | Yes, in a headless Chromium | Google, Vercel |
| Applebot | Spotlight, Siri, Safari | Yes | Apple, Vercel |
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:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
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 of1or more means the sentence is in the raw HTML;0means 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
404or410for pages that are gone, instead of a200page 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.
Questions, answered
What people ask about this
01Do 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.
02Does ChatGPT render JavaScript?
- 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.
03How 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.
04Is 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.
05Does 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.
Sources
- Vercel: The rise of the AI crawler (December 2024)vercel.com
- Google Search Central: Understand JavaScript SEO basicsdevelopers.google.com
- Vite: create-vite React TypeScript template (index.html)github.com
- Apple Support: About Applebotsupport.apple.com
- OpenAI: Overview of OpenAI crawlersdevelopers.openai.com
- Perplexity: Perplexity crawlersdocs.perplexity.ai


