Do AI Crawlers Render JavaScript? What GPTBot, ClaudeBot and Others Actually See

A full breakdown of which AI crawlers execute JavaScript and which only read raw HTML, backed by real crawl-log data, plus what rendering strategy to use instead.

Most AI crawlers do not run your JavaScript. They request the page, read whatever HTML your server hands back in that first response, and move on — no clicking, no scrolling, no waiting for a script to fetch data and paint it onto the screen. If your content depends on client-side rendering to appear, a large share of AI bots never see it at all. There are exceptions, and the exceptions matter, so here’s exactly who renders what, backed by real crawl-log data rather than guesswork.

Does AI render JavaScript — which AI crawlers execute JS and which only read raw HTML

Not sure what AI crawlers actually see on your site?

Get a Free SEO & GEO Audit →

How a Non-Rendering Crawler “Sees” Your Page

A browser does two passes: it downloads the initial HTML, then runs any JavaScript on the page, which can fetch more data and rewrite the DOM before anything meaningful is shown. A crawler that doesn’t execute JavaScript only ever gets the result of the first pass. If your page is server-rendered or static, that first pass already contains your real content, and nothing is lost. If your content is injected after the page loads — a common pattern in client-side-rendered React, Vue, or Angular apps — a non-rendering crawler sees an near-empty shell: a few script tags, a loading spinner, maybe a `<div id=”root”></div>`, and nothing else.

This isn’t a theoretical risk. Vercel’s analysis of over 500 million GPTBot requests across its network found zero evidence of JavaScript execution — GPTBot fetched `.js` files in about 11.5% of requests, but never ran them. The same study found ClaudeBot downloading JavaScript files in roughly 23.8% of requests, also without executing them.

Which AI Crawlers Render JavaScript (And Which Don’t)

Crawler Operator / Purpose Executes JavaScript?
GooglebotGoogle — search index & AI OverviewsYes — full headless Chromium
Google-ExtendedGoogle — Gemini training/grounding opt-out tokenYes — via Googlebot infrastructure
BingbotMicrosoft — Bing Search & CopilotYes
ApplebotApple — Siri, Spotlight, Safari searchYes — browser-based rendering
Applebot-ExtendedApple — AI-training opt-out controlRides on Applebot’s crawl, no independent JS execution confirmed
GPTBotOpenAI — model trainingNo — confirmed on 500M+ requests
OAI-SearchBotOpenAI — ChatGPT Search visibilityNo
ChatGPT-UserOpenAI — live fetch when a user shares a linkNo
ClaudeBotAnthropic — crawling & trainingNo — reads raw HTML only
PerplexityBotPerplexity — search answersMostly no — limited, unreliable partial support reported
CCBotCommon Crawl — open dataset feeding many AI labsNo
BytespiderByteDance — AI trainingNo
Meta-ExternalAgentMeta — Llama trainingNo
AmazonbotAmazon — Alexa & searchNo / unreliable

The pattern is simple: if a company already operated a full-text search engine with its own rendering pipeline — Google, Microsoft, Apple — its AI crawler inherits that infrastructure. Every AI-native crawler built from scratch in the last few years skips rendering entirely, almost certainly because executing JavaScript at crawl scale is expensive, and these bots work under tight timeouts, often just a few seconds per page.

Why OpenAI Alone Has Three Different Bots

A detail that trips a lot of people up: “ChatGPT” doesn’t crawl your site with one bot, it uses three, each with a different job and its own robots.txt rule:

  • GPTBot — crawls content that may be used to train future models.
  • OAI-SearchBot — crawls and indexes pages specifically so they can surface in ChatGPT Search results.
  • ChatGPT-User — fetches a single page on the spot, triggered by a real user action, like pasting a URL into a chat.

None of the three execute JavaScript, but you can block them independently in robots.txt — disallowing GPTBot alone keeps your content out of OpenAI’s training data while leaving ChatGPT Search visibility untouched. Blocking OAI-SearchBot instead removes you from ChatGPT Search results specifically. If you want visibility in one and not the other, don’t assume one `User-agent: *` rule covers all of OpenAI’s traffic.

“

I see this break the same way on almost every client audit: a perfectly good page that renders beautifully in a browser and is functionally invisible to GPTBot, because the actual text only exists inside a JavaScript bundle. The fix is rarely “rewrite the frontend” — it’s usually “make sure the first HTML response already contains the content,” however you get there.

— Mateusz Maslon, SEO/GEO Specialist LinkedIn ↗

CSR vs. SSR vs. SSG vs. Hybrid: What to Actually Use

If most AI crawlers only read the first HTML response, your rendering strategy stops being purely a performance decision and becomes a visibility one.

Strategy What a Non-Rendering Bot Sees Verdict for AI Visibility
Client-Side Rendering (CSR)An almost-empty HTML shell; the real content only exists after JS runs in a browserAvoid for any page you want AI systems to read or cite
Server-Side Rendering (SSR)Fully-rendered HTML on every request, generated on your server before it’s sentGood — content is present in the first response
Static Site Generation (SSG)Pre-built, fully-rendered HTML files served directly, no server-side work per requestGood, often fastest — ideal for content that doesn’t change per visitor
Hybrid (SSR/SSG for content, CSR for interactivity)Full content in the initial HTML; JavaScript only adds interactive behavior on topThe practical 2026 default — render what needs to be read, hydrate what needs to be clicked

Dynamic rendering — serving a prerendered snapshot to known bots while serving the normal CSR app to browsers — still works as a stopgap and is what services like Prerender.io do, but it’s extra infrastructure to maintain. If you’re starting fresh or doing a rebuild, picking a framework that supports SSR or SSG by default (Next.js, Nuxt, Astro, SvelteKit, and similar) avoids needing a separate bot-facing workaround at all.

How to Check What a Non-Rendering Bot Sees on Your Own Site

You don’t need special tools for a first pass — two quick checks tell you most of what you need to know:

  1. View source, not inspect element. In your browser, use “View Page Source” (Ctrl/Cmd+U), not DevTools’ Elements panel — Elements shows the JS-modified DOM, which is exactly what a non-rendering crawler does not see. If your key content and headline are missing from View Source, GPTBot and ClaudeBot don’t see them either.
  2. Fetch the page like a bot would. Run curl -A "GPTBot" https://yoursite.com/page (or any plain HTTP client) and read the raw response. If the body is mostly empty tags and script references with no real text, that’s your answer.

This is also one of the checks worth adding to a broader technical pass — see our GEO Self-Audit Checklist for 15 more, and How to Get Cited by AI Assistants for how crawlability fits into the wider picture of actually getting referenced in AI answers.

Want a real audit instead of running curl yourself?

Get a Free SEO & GEO Audit →

Frequently Asked Questions

Does ChatGPT’s crawler render JavaScript?

No. Analysis of over 500 million GPTBot requests found zero evidence of JavaScript execution. GPTBot, OAI-SearchBot, and ChatGPT-User all read only the raw HTML returned in the first server response.

Which AI crawlers do render JavaScript?

Only the crawlers built on existing search-engine rendering infrastructure: Googlebot and Google-Extended (both use Google’s headless Chromium pipeline), Bingbot (which also powers Copilot), and Applebot. Every AI-native crawler built independently in the last few years — GPTBot, ClaudeBot, PerplexityBot, CCBot, Bytespider, Meta-ExternalAgent — does not.

Does Googlebot render JavaScript for AI Overviews too?

Yes. AI Overviews run on Google’s core Search infrastructure, which has used a Chromium-based rendering pipeline for years, so JavaScript-rendered content that’s visible to regular Google Search is generally visible to AI Overviews as well.

How do I check if my site’s content is visible to non-rendering bots?

Use “View Page Source” in your browser (not DevTools’ Elements panel) or fetch the page with a plain HTTP client like curl. If your main content and headline aren’t present in that raw response, bots that don’t execute JavaScript won’t see them either.

What’s the fix if my site relies on client-side rendering?

Switch critical, SEO/GEO-relevant pages to server-side rendering (SSR) or static site generation (SSG) so the content exists in the first HTML response. A hybrid approach — rendering content server-side while keeping interactive elements client-side — is the practical default for most modern frameworks. Dynamic rendering (serving bots a prerendered snapshot) works as a stopgap if a full rewrite isn’t feasible right now.

Can I block one OpenAI bot without blocking all of them?

Yes. GPTBot, OAI-SearchBot, and ChatGPT-User can each be allowed or disallowed independently in robots.txt, since they serve different purposes (training, search indexing, and live user-triggered fetches respectively).

Rendering strategy isn’t a detail to sort out later — for any page you want an AI assistant to actually read and cite, it’s the first thing worth checking, before content quality or schema markup even enter the conversation.

Share your love
MaslonLabs
MaslonLabs

At Maslon Labs, we are passionate about the Android ecosystem. We noticed that many apps are cluttered with unnecessary features, so we decided to do things differently. Our goal is to deliver the "best-in-class" experience through minimalist design and robust functionality. Every app we release is crafted with care, ensuring that you get the most out of your device without the headache of a steep learning curve.

Articles: 52