ssrchecker
HomeLearnAI crawlers and JavaScript

Do AI crawlers render JavaScript?

Short answer
Almost none of them do. As of 2026, the major AI crawlers — GPTBot, ClaudeBot, PerplexityBot and the rest — fetch your raw HTML and stop, without executing JavaScript. There is no second rendering pass. The one notable exception is Google's Gemini, which uses Googlebot's rendering infrastructure. For everyone else, client-rendered content is invisible.

This is the shift that has changed JavaScript SEO more than anything in years. For a long time the reassurance was "Google renders JavaScript fine, so we're covered". That was always about one unusually capable crawler — and as more discovery moves to AI assistants and answer engines, it stops being enough, because those crawlers behave nothing like Googlebot.

Why AI crawlers don't render

Rendering JavaScript means running a headless browser for every page — an expensive, slow operation at web scale. Google built and operates that infrastructure over many years. The companies behind AI crawlers, for the most part, have not: their crawlers issue a single HTTP request, take whatever HTML comes back, extract the text, and move on.

A useful detail that makes the behaviour concrete: these bots sometimes download JavaScript without ever running it. Public crawl-data analysis has reported GPTBot fetching JavaScript files in roughly one in nine requests and ClaudeBot in roughly a quarter of requests, while executing none of it. Fetching is not rendering. The script arrives and is never run, so anything it would have produced never exists for that crawler.

AI crawlers are not one thing

Most explanations treat "AI crawlers" as a single category. They are not, and the distinction matters for both configuration and strategy. There are three broad types, and a single company often runs one of each.

01
Training crawlers
Collect content to train the underlying models — GPTBot, ClaudeBot, Meta-ExternalAgent, Bytespider. They crawl at high volume and don't send traffic back to you. Blocking them affects whether your content trains future models, not whether you're cited today.
02
Retrieval / search-index crawlers
Build the index an assistant searches at answer time — OAI-SearchBot, Claude-SearchBot, PerplexityBot. These are the ones that decide whether you can be cited in an AI answer. Blocking them typically removes you from that engine's results entirely.
03
Live user-fetch agents
Fetch a specific URL in real time when a user references it — ChatGPT-User and similar. Triggered by a person, not a crawl schedule, and they read the same raw HTML as the rest.

The one thing they share is the constraint that matters here: with the Gemini exception below, none of them run your JavaScript. Whatever their purpose, they all read the raw HTML and nothing more.

Crawler by crawler

The major crawlers as of 2026, grouped by what each is for. This is a fast-moving area — vendors add crawlers and occasionally change behaviour — so treat this as a snapshot and verify against current data for anything load-bearing.

CrawlerOperatorTypeRenders JS?Notes
GPTBotOpenAITrainingNoCollects training data for OpenAI models. Reads raw HTML.
OAI-SearchBotOpenAISearch indexNoBuilds the index behind ChatGPT search. Blocking it removes you from ChatGPT search results.
ChatGPT-UserOpenAILive fetchNoFetches a URL live when a user references it in a conversation.
ClaudeBotAnthropicTrainingNoCollects training data. Downloads some JS but does not execute it.
Claude-SearchBotAnthropicSearch indexNoIntroduced early 2026. Builds the index for Claude's search.
PerplexityBotPerplexitySearch indexNoBuilds Perplexity's search index. Used for retrieval, not model training.
Google-ExtendedGoogleTraining controlA robots.txt token governing Gemini training use — not a separate renderer.
Gemini (via Googlebot/WRS)GoogleSearch + AIYesThe exception. Uses Googlebot's Web Rendering Service, so it executes JavaScript.
Meta-ExternalAgentMetaTrainingNoCollects data for Meta's AI. Reads raw HTML.
BytespiderByteDanceTrainingNoHigh-volume training crawler. Reads raw HTML.
CCBotCommon CrawlOpen datasetNoFeeds Common Crawl, which many training and retrieval pipelines draw from.

The Gemini exception

"AI crawlers don't render JavaScript" is very nearly true, and the nearly is important. Google's Gemini is the one major AI system that doesexecute JavaScript, because it inherits Googlebot's Web Rendering Service rather than using a separate crawler. It carries the same caveats that apply to Googlebot — the render queue, timeouts, the delay — but it can see client-rendered content that the others cannot.

This produces a genuinely confusing situation that sends people looking for answers: a client-rendered single-page app can rank on Google and show up in Gemini, while being completely invisible to ChatGPT, Claude and Perplexity. The same page, four AI engines, two entirely different outcomes — decided purely by which ones run JavaScript. If your content appears in one AI answer engine but not the others, this is usually why.

What client rendering actually costs you here

The cost is not a delay, the way it is with Googlebot. It is absence. There is no second pass to eventually catch up, so client-rendered content is not seen late — it is not seen at all.

01
Your content is never read
If your main copy, product details or documentation only appear after JavaScript, an AI crawler samples an empty shell every time it visits, and builds its understanding of your brand from nothing.
02
Your internal links don't exist
Links generated client-side aren't in the raw HTML, so AI crawlers see none of them. A page you designed with fifty internal links looks like a page with zero, and your topic structure is invisible to the systems mapping it.
03
Your metadata and schema may still count
One piece of good news: content in the initial HTML as inline JSON, structured-data markup or a server-rendered payload is readable, even if it isn't visible prose. What's lost is specifically what the browser builds after load.

The strategic rule that falls out of this is simple: optimise for the weakest reader, not the strongest. If you build for the crawlers that render JavaScript, you concede every crawler that doesn't — and because different engines cite different sources, conceding even one is a real loss of reach.

How to be visible to all of them

There is nothing AI-crawler-specific about the fix, which is the reassuring part. Everything that makes your content readable by a first-pass Google crawl makes it readable by AI crawlers too, because both come down to the same thing: is the content in the initial HTML?

Serve your real content through server-side rendering, static generation or incremental regeneration, so the main content, links and metadata are in the first response. Keep the crawlers unblocked in robots.txt — these bots honour it reliably, which means they honour your mistakes too, so an accidental disallow silently removes you. Beyond that, there is no special configuration and no per-bot workaround worth maintaining. Complete HTML serves everyone at once.

This is also why dynamic rendering is a poor answer for AI visibility: it keys off a user-agent allowlist that often doesn't include AI crawlers, so it leaves exactly these bots seeing the empty app. Server rendering needs no allowlist and covers all of them.

Where llms.txt fits

You may have seen llms.txt proposed as part of the answer. It is worth understanding precisely, because it solves a different problem than the rendering one. llms.txt is a file at your site root that points AI systems at your most important content in clean, structured form — a curated map, in the spirit of a sitemap for language models.

It is a genuine early-mover advantage and cheap to add. But it complements server rendering rather than replacing it: it helps well-formed content get found and understood, and does nothing for content that isn't in the HTML to begin with. Fix the rendering first so there is real content to point at, then add llms.txt to help the right crawlers make the most of it.

See exactly what an AI crawler sees

An AI crawler's view of your page is, almost exactly, the raw HTML your server returns before any JavaScript runs — which is precisely the first of the two fetches this tool makes. Run any URL and the raw pane is, for practical purposes, what GPTBot, ClaudeBot and PerplexityBot receive. If your content is there, they can read it. If the pane is an empty shell, they can't.

See what an AI crawler receives from your page
https://

AI crawlers and JavaScript FAQ

As of 2026, almost none do. The major AI crawlers — including GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Meta-ExternalAgent and Bytespider — fetch the raw HTML and do not execute JavaScript, with no second rendering pass. The main exception is Google's Gemini, which uses Googlebot's rendering infrastructure and can run JavaScript.