Microsoft's own webmaster guidelines are 125 kilobytes of HTML containing fifteen visible words. The rest needs JavaScript.
The document that cannot read itself
Start with a page that proves the chapter.
Bing publishes webmaster guidelines. They exist to tell you how to be crawlable. We fetched them on 20 August 2026. Browser user agent, no JavaScript engine.
The response was 125,562 bytes.
Strip the tags and the script blocks. Count what is left: fifteen words. Here they are, complete.
Bing Webmaster Tools - Help Documentation
You need to enable JavaScript to run this app.
That is the entire readable content of Microsoft's advice on being readable. Sit with that for a second.
Which is not a gotcha. It is the most common failure on the web, published by people who know exactly how it works. Read that again.
Your page probably has two bodies. One your server ships. One a browser builds after running your code. Most machines reading you only ever get the first. Which one is yours?
So this chapter is about the gap between those two bodies. Three questions: who sees which one, what the evidence for that actually is, and what it costs you to close. Three earlier chapters sent debts here.
We are paying all three.
What ten vendors actually say
Chapter 3 made a flat claim. ChatGPT executes no JavaScript, so content that requires rendering is invisible to it. That claim needs its evidence shown. And the first thing to show you is what is not evidence.
OpenAI has never said it.
Its crawler documentation, fetched 20 August 2026, runs 629 words. It documents four bots: GPTBot, OAI-SearchBot, OAI-AdsBot and ChatGPT-User. The word JavaScript appears zero times. So do render, DOM, headless and timeout.
Anthropic's crawler page, last updated 7 April 2026: zero.
Amazon: zero. Meta: zero.
Perplexity's: zero. Its documentation site does say render and DOM in its page source. Every occurrence is site furniture: stylesheet comments, script handlers, a cookie variable name.
ByteDance does publish something, on its Toutiao search webmaster platform. That page is client-side rendered too. So its position is unknown here.
So five of the largest crawler operators on the web have never addressed it in writing. Not denied it. Never raised it. Would you build a roadmap on that?
| Operator | Bots documented | What the documentation says about JavaScript | Renders? |
|---|---|---|---|
| Googlebot, Google-Extended | "a headless Chromium renders the page and executes the JavaScript" | Yes, stated | |
| Microsoft | bingbot | "bingbot is generally able to render JavaScript," October 2018. Edge as the render engine, October 2019. The current guidelines page cannot be read without JavaScript | Yes, as of 2019 |
| Apple | Applebot | "Applebot may render the content of your website within a browser" | Hedged |
| Common Crawl | CCBot | "Currently, JavaScript is not executed and Cookies are not used" | No, stated |
| OpenAI | GPTBot, OAI-SearchBot, OAI-AdsBot, ChatGPT-User | Silent. Its crawler documentation contains none of JavaScript, render, DOM or timeout | Never says |
| Anthropic | ClaudeBot, Claude-User, Claude-SearchBot | Silent. Covers crawl rate, robots.txt and anti-circumvention only | Never says |
| Perplexity | PerplexityBot, Perplexity-User | Silent | Never says |
| Amazon | Amazonbot, Amzn-SearchBot, Amzn-User | Silent | Never says |
| Meta | facebookexternalhit, Meta-WebIndexer, Meta-ExternalAgent and two others | Silent | Never says |
| ByteDance | Bytespider | A Toutiao webmaster page exists. Its body needs JavaScript to read, so we cannot say | Unreadable |
Four operators do address it, and only one says no.
Google states it plainly. Every page returning a 200 goes into a queue. Then "a headless Chromium renders the page and executes the JavaScript."
Microsoft said the same in October 2018. Then again in October 2019, moving bingbot onto Edge.
Its current webmaster guidelines carry a JavaScript section too. Nobody here can tell you what it says.
That page is the one this chapter opened with. Fifteen words. A request to enable JavaScript.
Apple hedges. Applebot "may render the content of your website within a browser."
Common Crawl is the only operator that states the negative. Nine words, in its FAQ: "Currently, JavaScript is not executed and Cookies are not used."
No hedge. No qualifier.
That one matters out of proportion to its size. Common Crawl is not answering anybody's question. It is the corpus these models were built on. Not the one answering your question today. The one that formed what they already believe about you.
So the honest form of Chapter 3's claim is narrower than Chapter 3 stated it. OpenAI does not say it fails to render. OpenAI says nothing at all. Somebody else went and measured.
So where does the claim come from
One study. You should know its shape before you build a roadmap on it.
In December 2024 Vercel published a network log study run with MERJ. The sample: its own network, plus two job board sites on different stacks, over a few months.
The method is the part worth knowing. They did not infer execution from server logs, which cannot tell you.
Their earlier Googlebot study used a client-side beacon. Code that only fires if JavaScript actually runs. Fires means executed. Silence means fetched and ignored.
The finding, in their words: "The results consistently show that none of the major AI crawlers currently render JavaScript."
The named list is specific. OAI-SearchBot, ChatGPT-User and GPTBot. ClaudeBot. Meta-ExternalAgent. Bytespider. PerplexityBot.
Then the sentence everybody skips.
"The data indicates that while ChatGPT and Claude crawlers do fetch JavaScript files (ChatGPT: 11.50%, Claude: 23.84% of requests), they don't execute them. They can't read client-side rendered content."
Read that twice. They download your JavaScript. They never run it. Why would they?
Which is why your access logs are misleading. You will see these bots pulling bundle.js all day long. A fetch is not an execution. Most rendering audits we have been shown confuse the two.
Now the part that should make you hold this loosely.
That study is dated 17 December 2024. Today is 20 August 2026. Twenty months, and it is still the only measurement of its kind at network scale.
Two smaller tests point the same way. A German consultancy built a page in October 2025 with prices hidden in eight different places. Then it asked five AI systems what the products cost. The JavaScript-rendered price was found by Gemini. And by nobody else.
An independent consultant ran a black box version in August 2025. ChatGPT and Claude both refused on a client-side rendered page. They said they could not read it.
Neither is strong on its own. The first is one page, one vendor, five queries per system. And Claude found none of the eight prices in it, including the plain visible control. Which means Claude's row tells you nothing about JavaScript at all.
What is missing is anything on the other side. We looked hard.
No 2026 replication. No vendor announcement that rendering has started. No academic paper. Cloudflare publishes crawler volumes, robots.txt compliance and crawl-to-click ratios, and nothing at all about rendering.
So here is the whole evidence base. One network-scale study from 2024. Two small tests from 2025. Zero contradictions, and five vendors who have never addressed it.
That is thinner than the confidence with which the field repeats it. We believe it. But we would re-test before spending a quarter of engineering budget on it. So should you.
The exception nobody mentions
Gemini renders, and the same study says so.
Their wording: Gemini runs on Google's infrastructure, which gives it "the same rendering capabilities" they measured for Googlebot, "allowing it to process modern web applications fully."
Which follows from how Google works. Every 200 goes to the render queue, JavaScript on the page or not. And the index is built from the rendered HTML. Not from the raw response.
How long the queue actually is
Rendering is not instant, and the folklore around that is worse than the numbers.
The same team matched 37,000 pages against their render times. The median wait was ten seconds. Three quarters were done inside twenty-six seconds.
So for most pages the queue is not a problem at all.
The tail is where it hurts. At the ninetieth percentile the wait is about three hours. At the ninety-fifth, six. At the ninety-ninth, eighteen hours.
Which matters for one thing only: content with a short shelf life. A price that changes daily. A stock level. A live event. Is that you?
If your content is stable for a week, ignore this. If it is stale in six hours, the raw HTML is the only version anybody can trust.
So one of the largest AI surfaces on the web reads your second body. Does that carry to AI Overviews?
Google has never said.
Four documents were checked for this chapter: the AI features page, the AI optimization guide, How Search Works, and the most detailed crawler post Google has published in years. None of them connects the two.
The closest Google gets is eligibility. To appear in AI Overviews or AI Mode, "a page must be indexed and eligible to be shown in Google Search with a snippet, fulfilling the Search technical requirements." Then it adds: "There are no additional technical requirements."
Put those beside each other and the inference is strong. AI Overviews draw from the index. The index is built from rendered HTML. Therefore rendered content is reachable.
We think that inference is correct. It is still an inference. Google has never written the sentence, and a strong inference is not a citation.
One trap worth naming, because it is easy to fall into. Google's AI optimization guide does use the word DOM. It sits in a passage about "browser agents" that inspect "the DOM structure." Those are third-party agents visiting your site. Not Google describing its own AI surfaces. Anybody quoting it that way has misread the page.
The two megabyte wall
On 31 March 2026 Google published the most detailed account of its crawler in years. It contains a limit most people have never read.
"Googlebot currently fetches up to 2MB for any individual URL (excluding PDFs). This means it crawls only the first 2MB of a resource, including the HTTP header. For PDF files, the limit is 64MB."
"Any bytes that exist after that 2MB threshold are entirely ignored. They aren't fetched, they aren't rendered, and they aren't indexed."
"However, remember that the WRS can only execute the code that the crawler actually retrieved."
Read the third sentence against the first.
The cap applies per resource. Your JavaScript bundle is a resource. So ship three megabytes of it, and the renderer receives the first two. Then tries to run that.
Which fails in the way truncated code always fails. Silently, and not on your machine.
The same post adds something else. Google's renderer "operates statelessly," and "it clears local storage and session data between requests."
So anything that only appears on a visitor's second view does not appear. No accumulated state, no remembered preference, no progressive reveal.
| Limit | Who publishes a number | The number | Everyone else |
|---|---|---|---|
| Bytes fetched per URL | 2MB, or 64MB for PDFs. Bytes past it are never fetched | No published figure | |
| Redirect hops followed | Google, Common Crawl | 10 for Googlebot. 4 for CCBot, 5 for robots.txt | No published figure |
| Render or fetch timeout | Nobody | Google confirms one exists and declines to name it: "The timeout is user agent dependent" | Silent |
| Crawl delay between requests | Anthropic, Common Crawl, Apple | Crawl-delay honored. Apple adjusts automatically on errors | Amazon states it does not support crawl-delay |
The debt from Chapter 7
Chapter 7 said markup injected by JavaScript has an address, and this is the address.
Google supports it explicitly. It even documents Google Tag Manager as one way to do it. The sentence in its structured data guidance is short, and the conditional in it is the whole thing.
"Google Search can understand and process structured data that's available in the DOM when it renders the page."
When it renders. Google Search can. That sentence is about Google, and Google is the operator that renders.
How much of the web does this? Two percent.
The 2025 Web Almanac measured it directly across roughly 16 million sites. Their finding: "just 2% of mobile and desktop crawls have structured data added via JavaScript," unchanged from 2024. So the blast radius is small. And if you are in that two percent, you probably know it.
Has anyone measured whether the non-rendering crawlers see it? Once, and the answer looks damning until you read the control.
That October 2025 test included a price published only as JSON-LD injected by JavaScript. No AI system found it. Seven configurations, zero hits.
Now the control, which is the part that keeps this honest. The same page also served plain JSON-LD in the HTML. No JavaScript involved. That was invisible to all seven too.
So the failure is over-determined. You cannot blame JavaScript when the version without JavaScript failed identically. The tester says so himself. He adds that his test covers direct fetching, not the indexed path that Google and Bing surfaces use.
Which leaves a plain recommendation and a warning.
The recommendation: put your JSON-LD in the HTML your server ships. One template change. It costs nothing at runtime and removes a dependency for free.
The warning: nobody should sell you a schema-into-tag-manager migration as an AI visibility project. No measurement supports the upside. And Chapter 7 already priced what structured data does and does not do.
What belongs in the first body
The advice usually stops at server-render everything. Which is right and not very useful, because it does not tell you what to check.
Four things, in this order.
Your main content, obviously. The h1, the body copy, the answer to whatever question the page exists to answer. If a sentence matters for citation, it belongs in the response your server sends.
Your links. A crawler that does not execute code cannot follow a route it never saw. Client-side routing with no anchor tags in the HTML means whole sections of your site are unreachable to anything except a renderer.
Your metadata. Title, description, canonical. The 2025 Web Almanac found the canonical injected by JavaScript on about 2% of pages, which is the same small share as the structured data problem and the same easy fix.
Your structured data, per the section above. That is the whole list.
Now the reassuring part, because the picture across the web is better than the panic suggests.
That Almanac measured raw and rendered word counts across roughly 16 million sites. The median home page shows about 18% more words after rendering on desktop, 16% on mobile.
An eighteen percent gap is normal. It is the usual furniture: menus, widgets, cookie notices and the odd late-loading module.
The Almanac also notes that some of that gap is not client-side rendering at all. It is content that sits in the HTML and gets hidden by a mobile breakpoint, inside an accordion or a tab. Which a non-rendering crawler reads perfectly well.
So most sites are fine. The ones in trouble are not near the median, and they are not subtle. They are the ones where the raw response is a nearly empty shell.
Like the one this chapter opened with.
The failures that have nothing to do with JavaScript
Rendering gets the attention. These five are cheaper to fix, and more likely to be broken.
They are spending a third of their visits on nothing
The same Vercel data measured where AI crawlers actually land. ChatGPT spent 34.82% of its fetches on 404 pages. Claude, 34.16%. Googlebot, 8.22%.
So a third of what these bots spend on you may be going nowhere. To URLs that do not exist. Have you checked?
Which is a sitemap and redirect problem, not a rendering problem. Check your logs by user agent before you touch your framework.
Tabs and accordions are safe, but only for one reader
Google is explicit that hiding content behind tabs is fine. It goes further and recommends it: "consider moving content into accordions or tabs to save space."
That guarantee is Google's alone.
It holds because Google renders and then reads the DOM, hidden or not.
No other operator has made the same promise. But the mechanics are kinder than they sound. If the content is in your HTML, a non-rendering crawler gets it, click or no click. If it loads on click, nobody gets it.
So the test is not visible versus hidden. It is present versus fetched-later.
Lazy loading, and the line it crosses
Google's rule is one line: lazy loading must trigger on the viewport, never on an interaction. Their words: "To ensure that Google sees all content on your page, make sure that your lazy-loading implementation loads all relevant content whenever it is visible in the viewport."
A crawler does not click. It does not scroll in the way you think either.
Infinite scroll has a documented fix, and it is unglamorous. Every chunk needs its own persistent URL. Google suggests "absolute page numbers in the URL, for example by using ?page=12 as a query parameter."
The single page app that returns 200 for everything
Client-side routing means your server answers 200 to URLs that do not exist. Google calls the result a soft 404. It names two remedies: redirect to a URL that really does return 404, or inject a noindex robots tag onto the error view.
Neither remedy helps the crawlers that do not run your JavaScript. For those, the first option is the only one that works.
Blocking your own scripts
The oldest mistake on this list. Disallow your JavaScript or CSS in robots.txt and the renderers that would have read you cannot.
Google is blunt: "Google Search won't render JavaScript from blocked files or on blocked pages." Apple says the same for Applebot. It names XHR, JS and CSS specifically.
Open your robots.txt. Look for a Disallow line covering /static, /assets, /_next or /dist. It is a two-minute check and we still find it.
Traced to source
Five claims you will hear about rendering. Here is where each one actually comes from.
| The claim you hear | Where it actually comes from | Holds up? |
|---|---|---|
| "AI crawlers do not execute JavaScript" | Vercel and MERJ, 17 December 2024, using a beacon that fires only when code runs | Yes, for the six bots they named |
| "OpenAI says GPTBot cannot render" | Nowhere. OpenAI's crawler documentation does not contain the word | No. Misattributed |
| "69% of AI crawlers can't execute JavaScript" | A vendor page compiling Vercel, Cloudflare and a bot directory. Not an original measurement | Derivative |
| "Two-wave indexing means Google sees your JavaScript days late" | Measured across 37,000 pages: median ten seconds, three quarters inside twenty-six | No, except in the tail |
| "Structured data in a tag manager is fine for AI" | Tested once, October 2025. Invisible to all seven systems. So was static JSON-LD in the same test | Untested at scale |
Row two is the one to watch for in a pitch deck.
It is the difference between a vendor saying something and a researcher measuring it. Both can be right. Only one of them can be quoted back at the vendor later.
Perplexity publishes a blog post on the difference between agents and bots. We tried to read it for this chapter.
What came back was nine words, and the last seven were these: "Enable JavaScript and cookies to continue."
Which is a bot challenge, not a rendering failure. A different problem with the same result, and worth separating, because this chapter is about separating them.
What to do about it
Four real options, and one that Google has retired.
| Approach | What the raw response contains | Cost to adopt | Use when |
|---|---|---|---|
| Static generation | The full content, as HTML | Low, if content changes slowly | Marketing pages, docs, anything you rebuild on publish |
| Server-side rendering | The full content, as HTML | Moderate. Real server cost per request | Content that changes per request or per user |
| Hydration on top of either | The full content, then interactivity | Moderate. Usually a framework flag | The default for most modern stacks. Ship this |
| Prerendered snapshots | The full content, from a cache | Low to adopt, ongoing to maintain | A stopgap on a stack you cannot change yet |
| Dynamic rendering | Depends who is asking, which is the problem | Google: "a workaround and not a long-term solution" | Not recommended. See below |
Dynamic rendering means detecting the crawler and serving it a pre-built page. Google used to recommend it. Google now writes about it in the past tense.
"Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines."
Google still says it does not treat it as cloaking, so long as the content matches. Bing said the same in 2018, and more generously than that.
So who is the risk here? Not the search engines.
No AI vendor publishes a policy on serving different content to its crawler. Not OpenAI. Not Anthropic. Not Perplexity. The crawler documentation and the publisher FAQs were checked for this chapter, and there is nothing there.
Which does not mean there is no rule. It means there is no rule you can read.
Then August 2026. Perplexity de-indexed a major magazine for serving markdown-formatted ads to AI agents. It called the practice deceptive and warned that publishers doing it risk their trust score. And it cited no published policy, because there is not one.
That is the live risk with dynamic rendering in 2026. Not a search penalty. An unwritten rule, enforced by a company that never wrote it down. Against a site with no notice and no appeal. How would you argue that one?
So serve everyone the same HTML. It is simpler. It is cheaper to reason about, and it is the only position that cannot be reinterpreted later.
The ten-minute test
Before you scope any of that, find out whether you have a problem at all. Most teams assume they do. About half of them are wrong.
- Pick three URLs, not one. Your home page, your highest-value product or service page, and one deep article. They often behave differently, and the deep page is usually the one that matters for citation.
- Fetch each one with no JavaScript engine. Any plain HTTP client will do. Use a normal browser user agent string, because some sites and some CDNs behave differently for unknown agents and you want the page, not a challenge screen.
- Strip tags and script blocks, then count the words. That number is your first body: everything a non-rendering crawler gets. Do the same in a browser on the rendered page. The gap between the two counts is the entire question.
- Search the raw response for three things. Your h1 text. A distinctive sentence from the middle of the page. The opening of your JSON-LD block. If any of the three is missing from the raw HTML, you have found the problem and you can stop looking.
- Open your robots.txt and read every Disallow line. Anything covering scripts, styles or your build output directory blocks the renderers that would otherwise have read you. This takes two minutes and is the highest-yield line on the list.
- Confirm with Google, because it is the only operator that will show you. URL Inspection in Search Console renders the page live and gives you a screenshot, the loaded resources and the JavaScript output. It answers the Google half definitively.
Nobody will show you what they saw
Step 6 of that artifact only covers Google. There is a reason, and it is not an oversight.
Google renders your page back to you on request. Search Console shows a screenshot, the loaded resources and the JavaScript output. It is the most generous tool any operator offers, by a distance.
Bing has a URL inspection tool with a live check. Its documentation promises "the option to see a HTML format and HTTP response details of the same." It never says rendered.
Then the rest. OpenAI, nothing. Anthropic, nothing. Perplexity, nothing.
No fetch-as-our-bot. No render preview. No log of what their crawler took away from your site.
So of the ten operators in Table 10.1, exactly one will show you what it rendered. You cannot check the rest. You can only control the input, and assume the worst about the processing.
Which is the argument for the boring fix, stated one more time. If everything important is in the HTML your server sends, you do not need a tool to tell you it arrived.
What this costs
Less than the meeting about it usually costs. Three cases.
If you are on a modern framework, server rendering is a configuration change and a redeploy. Half a day, including the arguing.
If you are on an older single page app, this is real engineering. Weeks, not days. And the honest way to scope it is to fix your highest-value templates first, rather than the whole site at once.
If you are on a hosted platform, you already have server-rendered HTML. This chapter is then a ten-minute check that confirms it.
The recurring cost is close to zero. Static generation and hydration add nothing at runtime. Server rendering adds compute per request. A real line item at scale, a rounding error below it.
The cost of the alternative is the part nobody prices. Ship an empty first body, and every non-rendering crawler that visits takes nothing away with it. There is no partial credit here. Nothing is what it gets.
And it will keep visiting.
If you are already doing it
Some teams will run the test and pass. Good. Two things still worth ten minutes.
Check your bundle sizes against the two megabyte cap. Any single resource over it is truncated for Google before rendering begins.
Then check the 404 rate by user agent in your access logs. Are your AI crawlers burning a third of their fetches on missing URLs? That is crawl budget you did not know you had.
Then one more, and it is the one teams skip.
Re-run the diff after your next major release. Rendering regressions do not announce themselves. A component gets moved client-side, a library changes its default, and the raw response quietly empties out.
Nothing in your monitoring will catch that. Your page still loads. Your users still see it. Your uptime is fine.
Two word counts, once a quarter. Put it in the release checklist and forget about it.
None of these is a rendering fix. All of them fit on the same afternoon's ticket.
The objections this chapter has to answer
"You built a whole chapter on one study from 2024."
Correct, and this chapter said so twice before you got here. It is the only network-scale measurement anyone has published. It has two smaller corroborations, and nothing contradicts it. And if that is too thin for your risk appetite, note that the mitigation is cheap anyway.
"Server rendering everything is expensive and you are hand-waving it."
Fair for legacy stacks. Wrong for modern ones. That is why Table 10.5 separates them, and why the artifact tells you to test before you scope.
"If ChatGPT cannot render, how did it read my client-side page last week?"
Two likely answers, and neither one is rendering.
First: content in the initial response that is not HTML still travels. Vercel notes that JSON payloads and server component data "may still be indexed since AI models can interpret non-HTML content." Your framework may already be saving you.
Second: it read a cached copy from a search index, and never fetched you at all.
Neither means your page is safe. Both mean the diagnosis is different.
A fourth, which cuts at us. "You sell the fix."
We do. Rendering audits are a small line for us and framework migrations are a large one, so we have an interest in you finding a problem here. Which is exactly why Artifact 10.6 is six steps you run yourself, in ten minutes, without calling anybody.
Run it before you take a quote. From us or from anyone.
What would change our mind
Three things, and the first one is overdue.
A 2026 replication at network scale. The current evidence is twenty months old and the crawlers have shipped a lot since.
Any vendor documenting rendering. One sentence from OpenAI or Anthropic would settle more than any third-party test.
Google connecting its own two statements. It says AI Overviews come from the index. It says the index is built from rendered HTML. If it ever writes the sentence joining them, we can stop calling that an inference.
What is left
So the ledger for this chapter, in four lines:
Two operators document that they render. One documents that it does not. Six have never said.
The measurement everyone cites is real, careful about the fetch and execute distinction, and old.
The fix is a configuration change on a modern stack and a project on an old one. Either way you should test before you scope, and the test is ten minutes.
Which closes Part III, and closes the last of the debts. You now know what the machines read, where they read it, and whether they can read you at all.
Which leaves the question every chapter so far has quietly deferred. If you do all of this, how would you know it worked?
That is Chapter 11, and it is the hardest chapter in the book, because the honest answer starts with what cannot be measured.
- Run the two-body diff first. Fetch three pages without JavaScript, count the words, compare with the rendered page. Ten minutes, and half of teams find nothing wrong.
- Read your robots.txt for blocked scripts. A Disallow line covering assets or build output stops the crawlers that do render. Cheapest fix here, and we still find it.
- Ship the same HTML to everyone. Dynamic rendering is retired guidance at Google, and no AI vendor publishes any rule about serving crawlers different content.
- Put JSON-LD in the server response. Only 2% of sites inject it with JavaScript, and leaving that 2% is one template change with no runtime cost.
- Check bundles against the two megabyte cap. Google fetches the first 2MB of a resource and ignores the rest, and its renderer runs only what arrived.
- Look at your 404 rate by user agent. AI crawlers were measured spending a third of their fetches on missing URLs, against 8% for Googlebot. Sitemaps, not rendering.
- Bing Webmaster Tools help documentation, webmaster guidelines page, fetched 20 August 2026 with a desktop Chrome user agent and no JavaScript engine. The response was 125,562 bytes. After removing tags, script blocks and style blocks, the visible text was fifteen words in full: "Bing Webmaster Tools - Help Documentation You need to enable JavaScript to run this app." The second sentence also appears inside a noscript element. https://www.bing.com/webmasters/help/webmaster-guidelines-30fba23a
- OpenAI, crawler documentation, fetched 20 August 2026, 629 words. Documents GPTBot, OAI-SearchBot, OAI-AdsBot and ChatGPT-User. Zero occurrences of JavaScript, render, DOM, headless, timeout or cloak. No last-updated date is published. https://developers.openai.com/api/docs/bots
- Anthropic, "Does Anthropic crawl data from the web," page states 7 April 2026. Documents ClaudeBot, Claude-User and Claude-SearchBot. Zero occurrences of JavaScript or render. Covers crawl rate, robots.txt and anti-circumvention: "Anthropic's Bots respect anti-circumvention technologies (e.g., we will not attempt to bypass CAPTCHAs for the sites we crawl.)" https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler
- Perplexity, bot documentation, fetched 20 August 2026. Documents PerplexityBot and Perplexity-User. Zero occurrences of JavaScript in the documented content. The words render and DOM do appear in the page source, in stylesheet comments, script handlers, a cookie domain variable and sidebar links to unrelated pages, but never in a statement about the crawler. https://docs.perplexity.ai/guides/bots
- Amazon, Amazonbot documentation, fetched 20 August 2026. Documents Amazonbot, Amzn-SearchBot and Amzn-User. Silent on JavaScript. States that crawl-delay is not supported. https://developer.amazon.com/amazonbot
- Meta, web crawlers documentation, fetched 20 August 2026. Documents facebookexternalhit, Meta-WebIndexer, Meta-ExternalAds, Meta-ExternalAgent and Meta-ExternalFetcher. Silent on JavaScript. https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers
- ByteDance, Toutiao Search webmaster platform, Bytespider page, checked 20 August 2026. The page exists on a ByteDance-operated domain and returns HTTP 200 with roughly 96KB of HTML, titled in Chinese as an introduction to Bytespider. Its body is client-side rendered and could not be read without executing JavaScript, so this chapter makes no claim about what it says. https://zhanzhang.toutiao.com/docs/intro/26899
- Common Crawl, frequently asked questions, fetched 20 August 2026. "Currently, JavaScript is not executed and Cookies are not used." Also: "CCBot follows up to four consecutive HTTP redirects, or up to five when fetching robots.txt in line with RFC 9309," and "We obey the Crawl-delay parameter for robots.txt." https://commoncrawl.org/faq
- Apple, "About Applebot," fetched 20 August 2026. "Applebot may render the content of your website within a browser. If javascript, CSS, and other resources are blocked via robots.txt, it may not be able to render the content properly. This includes XHR, JS, and CSS that the page might require." Also: "Applebot's crawl rate adjusts automatically when a site slows down or returns errors." https://support.apple.com/en-us/119829
- Google, "JavaScript SEO basics," last updated 4 March 2026. "Googlebot queues all pages with a 200 HTTP status code for rendering, unless a robots meta tag or header tells Google not to index the page." / "Once Google's resources allow, a headless Chromium renders the page and executes the JavaScript." / "All pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page." / "Google also uses the rendered HTML to index the page." / "Google Search won't render JavaScript from blocked files or on blocked pages." / "Keep in mind that 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." The phrase "second wave" does not appear in the current version of this page. https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics
- Google Search Central blog, crawler post by Gary Illyes, 31 March 2026. "Googlebot currently fetches up to 2MB for any individual URL (excluding PDFs). This means it crawls only the first 2MB of a resource, including the HTTP header. For PDF files, the limit is 64MB." / "Any bytes that exist after that 2MB threshold are entirely ignored. They aren't fetched, they aren't rendered, and they aren't indexed." / "However, remember that the WRS can only execute the code that the crawler actually retrieved." / "the WRS operates statelessly" and "it clears local storage and session data between requests." This post never mentions AI Overviews or AI Mode. https://developers.google.com/search/blog/2026/03/crawler-blog-post
- Google, AI features and your website, last updated 10 December 2025. "To be eligible to be shown as a supporting link in AI Overviews or AI Mode, a page must be indexed and eligible to be shown in Google Search with a snippet, fulfilling the Search technical requirements. There are no additional technical requirements." https://developers.google.com/search/docs/appearance/ai-features
- Google, AI optimization guide, last updated 10 July 2026. Grounds AI features in "our core Search ranking and quality systems" and in retrieval from "our Search index." On JavaScript it says only that "Google is able to process content within JavaScript as long as it isn't blocked." The single occurrence of the word DOM on this page describes third-party browser agents that may access your site "inspecting the DOM structure," not Google's own AI surfaces. Neither this page nor any other Google document located states whether AI Overviews consume the rendered DOM or the raw HTML. https://developers.google.com/search/docs/fundamentals/ai-optimization-guide
- Microsoft, "bingbot Series: JavaScript, Dynamic Rendering, and Cloaking. Oh My," October 2018. "bingbot is generally able to render JavaScript. However, bingbot does not necessarily support all the same JavaScript frameworks that are supported in the latest version of your favorite modern browser." On cloaking: "as long as you make a good faith effort to return the same content to all visitors, with the only difference being the content is rendered on the server for bots and on the client for real users, this is acceptable and not considered cloaking." https://blogs.bing.com/webmaster/october-2018/bingbot-Series-JavaScript,-Dynamic-Rendering,-and-Cloaking-Oh-My
- Microsoft, "The new evergreen Bingbot," October 2019. "Bing is adopting Microsoft Edge as the Bing engine to run JavaScript and render web pages." These two blog posts are the most recent Microsoft statements on bingbot rendering that this chapter was able to read. Microsoft's current Bing Webmaster Guidelines page is reported by third parties to carry a JavaScript section updated in 2020, but that page could not be read on 20 August 2026 by curl, by an automated fetch tool, or in any form other than the fifteen words quoted above, so its contents are not relied on here. https://blogs.bing.com/webmaster/october-2019/The-new-evergreen-Bingbot-simplifying-SEO-by-leveraging-Microsoft-Edge
- Vercel and MERJ, "The rise of the AI crawler," published 17 December 2024, modified 6 February 2025. "The results consistently show that none of the major AI crawlers currently render JavaScript." The post then lists, as bullets: OpenAI (OAI-SearchBot, ChatGPT-User, GPTBot), Anthropic (ClaudeBot), Meta (Meta-ExternalAgent), ByteDance (Bytespider) and Perplexity (PerplexityBot). / "The data indicates that while ChatGPT and Claude crawlers do fetch JavaScript files (ChatGPT: 11.50%, Claude: 23.84% of requests), they don't execute them. They can't read client-side rendered content." / "Note, however, that content included in the initial HTML response, like JSON data or delayed React Server Components, may still be indexed since AI models can interpret non-HTML content." / On Gemini: "Gemini's use of Google's infrastructure gives it the same rendering capabilities we documented in our Googlebot analysis, allowing it to process modern web applications fully." / Volumes over one month: "Googlebot: 4.5 billion fetches across Gemini and Search / GPTBot (ChatGPT): 569 million fetches / Claude: 370 million fetches / AppleBot: 314 million fetches / PerplexityBot: 24.4 million fetches." / On 404s: "ChatGPT spends 34.82% of its fetches on 404 pages / Claude shows similar patterns with 34.16% of fetches hitting 404s" against Googlebot at 8.22%. The sample was nextjs.org and the Vercel network over several months, plus Resume Library and CV Library. Microsoft Copilot was excluded for lack of a unique user agent. Vercel sells hosting whose primary product advantage is server rendering, and therefore has a direct commercial interest in this finding. https://vercel.com/blog/the-rise-of-the-ai-crawler
- Vercel and MERJ, "How Google handles JavaScript throughout the indexing process," 31 July 2024. The execution test was a client-side beacon, not a log inference: "we conducted a study using Vercel's infrastructure and MERJ's Web Rendering Monitor (WRM) technology." Render delay across more than 37,000 matched pairs: "50th percentile (median): 10 seconds. 75th percentile: 26 seconds / 90th percentile: ~3 hours / 95th percentile: ~6 hours / 99th percentile: ~18 hours." https://vercel.com/blog/how-google-handles-javascript-throughout-the-indexing-process
- searchVIU, "Schema markup and AI in 2025," test run 30 October 2025, published 2 December 2025. A single test page carried eight product prices in eight different formats. Each system was queried five times with an identical question. Test 2, a price rendered by JavaScript, was found by Gemini and by Perplexity and Google AI Mode only after indexing, and not by ChatGPT or Claude. Test 4, JSON-LD injected by JavaScript, was found by none of the seven configurations. Test 3, static JSON-LD served in the HTML, was also found by none of the seven, which makes the Test 4 result over-determined. Claude found none of the eight prices, including the plain visible HTML control, so its row carries no information about JavaScript. The author's own caveat: "Our tests primarily show Phase 4 (Direct Fetch). Schema Markup could very well be used in Phases 1-3, especially by Google AI Overviews and Bing Copilot, which have access to search indexes." searchVIU sells SEO monitoring software. https://www.searchviu.com/en/schema-markup-and-ai-in-2025-what-chatgpt-claude-perplexity-gemini-really-see/
- searchVIU, "AI crawlers and JavaScript rendering," created 12 November 2025, updated 17 November 2025. Source of the widely repeated figure "69% of AI crawlers can't execute JavaScript." This is a compilation of Vercel, Cloudflare and a third-party bot directory rather than an original measurement, and the post lists those sources itself. Fetched 20 August 2026 without a JavaScript engine: the page body renders 2,186 visible words, but its crawler comparison table returns the text "No crawlers found." https://www.searchviu.com/en/ai-crawlers-javascript-rendering/
- Glenn Gabe, GSQI, 11 August 2025. An independent black-box test in which ChatGPT reported it "could not read the content of the page because it relied on JavaScript-based rendering" and Claude "wasn't able to retrieve the content from the page." This method asks the assistant rather than instrumenting the server, and is weaker evidence than the beacon studies above. https://www.gsqi.com/marketing-blog/ai-search-javascript-rendering/
- Cloudflare. Its two flagship AI-crawler posts and its Radar AI insights cover request volume, robots.txt compliance and crawl-to-click ratios. Neither contains substantive data on JavaScript execution or rendering. Checked 20 August 2026. https://blog.cloudflare.com/from-googlebot-to-gptbot-whos-crawling-your-site-in-2025/ and https://blog.cloudflare.com/expanded-ai-insights-on-cloudflare-radar/
- HTTP Archive, Web Almanac 2025, SEO chapter. All figures from the July 2025 crawl of 16,213,084 websites. "The majority of sites provide structured data in raw HTML, while just 2% of mobile and desktop crawls have structured data added via JavaScript (which has not changed compared to 2024)." / "When the rendered and raw word counts are compared on the home page, the discrepancy is small, with the median showing a difference of 18% on desktop versus 16% on mobile." / "only in around 2% of cases is there a canonical missing in the raw HTML but present in the rendered DOM" / on the mobile gap: "likely due to reliance on content existing in the HTML but hidden on mobile breakpoints, such as within accordions and tabbed layouts." The 2025 edition has no JavaScript chapter; the 2024 edition did, and the rendering statistics moved into the SEO chapter. There is no 2026 edition. https://almanac.httparchive.org/en/2025/seo
- Google, generate structured data with JavaScript, last updated 10 December 2025. "Google Search can understand and process structured data that's available in the DOM when it renders the page." Google Tag Manager is documented as a supported injection method with step-by-step instructions. Also: "We recommend that you use the URL input instead of the code input because there are JavaScript limitations when using the code input (for example, CORS restrictions)." https://developers.google.com/search/docs/appearance/structured-data/generate-structured-data-with-javascript
- Google, dynamic rendering as a workaround, last updated 10 December 2025. "Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines. Instead, we recommend that you use server-side rendering, static rendering, or hydration as a solution." / "Other search engines may choose to ignore JavaScript and won't see JavaScript-generated content." / "Googlebot generally doesn't consider dynamic rendering as cloaking. As long as your dynamic rendering produces similar content, Googlebot won't view dynamic rendering as cloaking." The date on which Google first deprecated the recommendation could not be established from a Google primary source, so no date is printed in this chapter. https://developers.google.com/search/docs/crawling-indexing/javascript/dynamic-rendering
- Google, lazy loading and infinite scroll, last updated 10 December 2025. "make sure that your lazy-loading implementation loads all relevant content whenever it is visible in the viewport." / "Give each chunk its own persistent, unique URL." / "One way this can be done is to use absolute page numbers in the URL, for example by using ?page=12 as a query parameter." https://developers.google.com/search/docs/crawling-indexing/javascript/lazy-loading
- Google, mobile-first indexing guidance, last updated 10 December 2025. "Instead of removing content, consider moving content into accordions or tabs to save space." https://developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing
- Google, HTTP and network errors reference, fetched 20 August 2026. "Google waits for the content for a limited time, then passes on whatever it received to the next processing step (which is product specific). The timeout is user agent dependent, for example Googlebot Smartphone may have a different timeout than Googlebot Image." / "By default, Google's crawlers follow up to 10 redirect hops." No crawler operator located publishes a numeric render or fetch timeout. https://developers.google.com/search/docs/crawling-indexing/http-network-errors
- Google, URL Inspection tool documentation, fetched 20 August 2026. "View a rendered version of the page: See a screenshot of how the Google-InspectionTool sees the page." / "View loaded resources, JavaScript output, and other information: To see a list of resources, page code, and more information, click View crawled page." / "A screenshot of the rendered page is available only in a live test." https://support.google.com/webmasters/answer/9012289
- Microsoft, Bing Webmaster Tools URL Inspection tool, September 2020. Documents a live check and "the option to see a HTML format and HTTP response details of the same." The documentation does not state that it exposes the rendered DOM. https://blogs.bing.com/webmaster/september-2020/Introducing-the-Bing-Webmaster-Tools-URL-Inspection-Tool
- Digiday, 11 August 2026. Perplexity de-indexed TIME over markdown-formatted advertising served to AI agents. Perplexity's chief communications officer said the company works "continuously" to protect users from deceptive practices and warned that publishers deploying "deceptive advertising like markdown ads" risk trust-score consequences in its index. The report notes no published Perplexity policy was cited. https://digiday.com/media/perplexity-blocks-times-ads-served-to-ai-agents-calling-them-deceptive/
- Perplexity, "Agents or bots: making sense of AI on the open web," fetched 20 August 2026 with a desktop Chrome user agent. The response was 5,859 bytes containing nine visible words: "Just a moment... Enable JavaScript and cookies to continue." This is a bot challenge rather than a client-side rendering failure. https://www.perplexity.ai/hub/blog/agents-or-bots-making-sense-of-ai-on-the-open-web