---
title: "Do AI crawlers render JavaScript? Measured vs assumed"
description: "In Vercel and MERJ’s Dec 2024 log study, GPTBot, ClaudeBot and PerplexityBot didn’t run JavaScript; Google and Apple did. What’s measured, what’s assumed, a test."
url: https://katman.pro/do-ai-crawlers-render-javascript
lang: en
updated: 2026-10-19
---

Guide Updated 19 Oct 2026

# Do AI crawlers like GPTBot and ClaudeBot render JavaScript?

> 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”](https://vercel.com/blog/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](https://developers.openai.com/api/docs/bots), 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](https://support.claude.com/en/articles/8896518), article dated 7 Apr 2026 |
| PerplexityBot, Perplexity-User | Vendor-stated; no mention of rendering | [Perplexity](https://docs.perplexity.ai/guides/bots), read 15 Oct 2026 |
| Googlebot renders JS, after a queue | Vendor-stated | [Google](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics), updated 4 Mar 2026 |
| AI Overviews and AI Mode use the normal index | Vendor-stated: “no additional technical requirements” | [Google AI features](https://developers.google.com/search/docs/appearance/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:

```html
<script>
  fetch('/js-canary?p=' + encodeURIComponent(location.pathname), { keepalive: true });
</script>
```

2.  Make `/js-canary` return `204` and log the user agent and IP. Leave it allowed in robots.txt.
3.  After a week, compare page hits with canary hits per bot:

```bash
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](https://katman.pro/react-spa-seo-ai-crawlers), [Vite + React](https://katman.pro/vite-react-seo), [Next.js](https://katman.pro/nextjs-seo-ai-search) and [Astro](https://katman.pro/astro-seo-ai-search). Rendering is one of six common traps; the other five are on [My vibe-coded site is invisible to ChatGPT](https://katman.pro/vibe-coded-site-invisible-to-chatgpt). A crawler that gets a 403 never reaches the rendering question at all: see [Cloudflare blocking AI crawlers](https://katman.pro/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](https://katman.pro/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.

## Related pages

-   [**Is React bad for SEO, or is it my single-page app?** React is fine for SEO; an empty SPA shell is not. Google renders JavaScript in a queue, the crawlers behind ChatGPT and Claude read only raw HTML. Test, then fix.](https://katman.pro/react-spa-seo-ai-crawlers)
-   [**How do I make a Vite + React app readable by Google and AI bots?** Vite builds a client-only SPA by default. Four ways to prerender a Vite + React app, with config verified on 15 Oct 2026, plus the hosting fallback that undoes it.](https://katman.pro/vite-react-seo)
-   [**How do I set up Next.js for AI search, and where does llms.txt go?** Next.js renders HTML on the server, yet AI crawlers can still get a blank page or a title in the body. Metadata, robots.ts, sitemap.ts and llms.txt in Next 16.](https://katman.pro/nextjs-seo-ai-search)
-   [**Is Astro good for SEO and AI search, and what still needs setting up?** Astro ships plain HTML by default, so AI crawlers can read it. Still on you: the sitemap integration, robots.txt, llms.txt, JSON-LD and client:only islands.](https://katman.pro/astro-seo-ai-search)
-   [**I built my site with Lovable, Bolt or Cursor, and ChatGPT never mentions it** Built it with Lovable, Bolt, v0 or Cursor and ChatGPT never mentions it? Six traps hide vibe-coded sites; each has a one-minute test and a fix for your AI tool.](https://katman.pro/vibe-coded-site-invisible-to-chatgpt)
-   [**Is Cloudflare blocking AI crawlers from my site?** robots.txt allows GPTBot but Cloudflare returns 403? The three AI bot types, the settings that block them, the 15 Sep 2026 change, a curl test and the fix.](https://katman.pro/cloudflare-blocking-ai-crawlers)
-   [**Glossary** Plain definitions of the terms behind AI visibility: GEO and AEO, AI crawlers, llms.txt, IndexNow, canonical, soft 404, situation pages and the Katman method.](https://katman.pro/glossary)

Updated 19 October 2026 · Katman
