Guide Updated

Do AI crawlers like GPTBot and ClaudeBot render JavaScript?

Short answer

Measured: in Vercel and MERJ’s log study, published 17 December 2024, OpenAI’s, Anthropic’s and Perplexity’s crawlers fetched pages without executing JavaScript, while Gemini (through Googlebot) and AppleBot rendered it. Assumed: that this still holds in October 2026, because none of those vendors documents rendering either way. Plan for no rendering, ship your text in the HTML, and test your own logs with a JavaScript canary.

The short answer

Plan as if they don’t. The one large public measurement says OpenAI’s, Anthropic’s and Perplexity’s crawlers didn’t execute JavaScript, and none of those companies documents that they do. If your text appears only after a script runs, those crawlers most likely see an empty page. Google is the exception you can rely on, because it documents its rendering.

What was measured

The source is “The rise of the AI crawler” by Vercel and MERJ, published 17 December 2024 (read 15 Oct 2026). It used traffic on nextjs.org and the Vercel network over “the past few months”, checked against two job board sites on a different stack. In one month it counted 569 million GPTBot fetches, 370 million from Claude, 314 million from AppleBot and 24.4 million from PerplexityBot, next to 4.5 billion from Googlebot.

Its findings on rendering:

  • Did not render: OpenAI (OAI-SearchBot, ChatGPT-User, GPTBot), Anthropic (ClaudeBot), Meta (Meta-ExternalAgent), ByteDance (Bytespider), Perplexity (PerplexityBot).
  • Rendered: Gemini, through Googlebot’s infrastructure, and AppleBot, which uses a browser-based crawler.
  • A possible exception: content already in the initial HTML, such as JSON data or delayed React Server Components payloads, “may still be indexed”. That is a hedge in the study, not a measurement.

Microsoft Copilot wasn’t measured: it has no unique user agent.

Measured vs assumed, as of 15 October 2026

Claim Status Source
OpenAI, Anthropic, Perplexity crawlers don’t execute JS Measured, late 2024, one network Vercel and MERJ
The same is true today Assumed No vendor statement either way
OpenAI’s bots and what each one does Vendor-stated; no mention of rendering OpenAI crawlers, read 15 Oct 2026 (now OAI-SearchBot/1.4, GPTBot/1.4)
ClaudeBot, Claude-SearchBot, Claude-User Vendor-stated purposes; no mention of rendering Anthropic, article dated 7 Apr 2026
PerplexityBot, Perplexity-User Vendor-stated; no mention of rendering Perplexity, read 15 Oct 2026
Googlebot renders JS, after a queue Vendor-stated Google, updated 4 Mar 2026
AI Overviews and AI Mode use the normal index Vendor-stated: “no additional technical requirements” Google AI features, updated 10 Dec 2025
Applebot can render Vendor-stated: it “may render” in a browser Apple support, dated 4 Sep 2026
Copilot, Grok, other assistants Not measured in the study none we could confirm

We also looked for newer independent tests. We found articles describing them, but couldn’t read the primary data, so they aren’t cited here.

Fetching JavaScript isn’t running it

The study separated the two. JavaScript files were 11.50% of ChatGPT’s fetches and 23.84% of Claude’s, yet nothing showed the code being executed. So a .js request from GPTBot in your logs isn’t evidence of rendering.

Another number from the same study matters for single-page apps: 34.82% of ChatGPT’s fetches and 34.16% of Claude’s hit 404 pages, against 8.22% for Googlebot, many of them old files under /static/. Hashed bundle names change on every deploy, so references a crawler stored earlier go stale. One more reason to put the text in the HTML rather than in a bundle.

Test it on your own site

A canary tells you whether a bot ran your JavaScript: a script that requests a URL nothing else links to.

  1. Add this to a page bots already crawl, such as your home page:
<script>
  fetch('/js-canary?p=' + encodeURIComponent(location.pathname), { keepalive: true });
</script>
  1. Make /js-canary return 204 and log the user agent and IP. Leave it allowed in robots.txt.
  2. After a week, compare page hits with canary hits per bot:
for b in GPTBot OAI-SearchBot ChatGPT-User ClaudeBot Claude-SearchBot PerplexityBot Googlebot; do
  printf "%-18s pages %6s  canary %4s\n" "$b" \
    "$(grep "$b" access.log | grep -vc 'js-canary')" "$(grep "$b" access.log | grep -c 'js-canary')"
done

Example of how to read it: Googlebot is your control, since it renders; canary hits from it show the test works. A bot with hundreds of page hits and zero canary hits didn’t run the script. A canary hit is strong evidence only if the IP is in that vendor’s published range (OpenAI publishes openai.com/searchbot.json and openai.com/gptbot.json); user agents are easy to fake.

What to do with the answer

Ship the words in the HTML. That means server rendering, static generation or build-time prerendering for public pages; the framework guides are React SPAs, Vite + React, Next.js and Astro. Rendering is one of six common traps; the other five are on My vibe-coded site is invisible to ChatGPT. A crawler that gets a 403 never reaches the rendering question at all: see Cloudflare blocking AI crawlers.

Where Katman fits, and where it doesn’t

Katman is an MCP server inside your AI coding tool. katman_audit_site fetches your live pages the way non-rendering crawlers do, reports how much text is in the raw HTML and tests each AI bot’s status code; katman_scan_code finds the pages that render only in the browser and katman_prompt hands your coding tool the fix with an acceptance check. It doesn’t edit the site, and it can’t see inside OpenAI or Anthropic: what a crawler does is known only from measurements like the ones above and your own logs. Katman Pro is $99 a month for up to 3 sites, with fix prompts and page briefs uncapped (pricing).

Written by the Katman team, Rnify Limited. Vercel, OpenAI, Anthropic, Perplexity, Google and Apple pages read 15 October 2026.

Who this is not for

  • Pages whose text is already in the raw HTML: rendering doesn’t matter for you.
  • Googlebot questions: Google documents its rendering in detail; read its JavaScript SEO guide.
  • Anyone looking for a way to show bots different content than people see: that is cloaking.

Frequently asked questions

Does GPTBot execute JavaScript?

Not in the large published measurement we could read: Vercel and MERJ saw OpenAI’s crawlers fetch JavaScript files without executing them (December 2024). OpenAI’s crawler page, read 15 October 2026, doesn’t say either way.

Does OAI-SearchBot render JavaScript differently from GPTBot?

The study grouped OAI-SearchBot, ChatGPT-User and GPTBot together as not rendering. OpenAI documents them as separate bots with separate purposes, but says nothing about rendering for any of them.

Why do AI crawlers download my .js files if they don’t run them?

The study doesn’t say why. It counted the requests: JavaScript files made up 11.50% of ChatGPT’s fetches and 23.84% of Claude’s, with no sign the code ran.

Is the Vercel study still valid in 2026?

It is the data we have, not a promise. Vendors can change their crawlers at any time without announcing it, which is why this page shows how to test your own site.

Do Google’s AI Overviews see JavaScript content?

They draw on Google’s index, and Googlebot renders JavaScript. Google says a page must be indexed and eligible for a snippet, with no additional technical requirements.

If an assistant reads my JavaScript site in chat, does that prove its crawler renders?

No. Pasting a link may use a different fetcher, a cached copy or a search index entry. Only your server logs show which bot requested what.