Skip to content
Tityra
Login
Start for free
HomeAboutPricingWho It's For
  • Publishers & Media
  • Ecommerce & Retail
  • SaaS & Technology
  • Agencies
  • Government & Public Sector
  • Financial Services & Insurance
Blog
info@tityra.com
XLinkedIn
  1. Home
  2. /
  3. Blog
  4. /
  5. Content access

Why AI crawlers may miss
JavaScript-rendered content

Your browser can show a complete page while another client receives only a loading message. Here's how to check where the content appears.

7 min read

Doğu Abaris · 10 November 2026

Read the article
Get your free audit

UNDERSTAND CONTENT DELIVERY

Learn what a tested client receives.

FOLLOW THE EVIDENCE

See how observations become useful findings.

PUT GUIDANCE INTO PRACTICE

Find focused changes your team can investigate.

Read the article

In this article

A page can load without delivering its contentWhat the retrieval tool can actually doRunning JavaScript is only part of loading a pageLook at the response before blaming the frameworkThe same service, delivered in two different waysFollow one important fact through your own pageKeep essential information available from the start
How we audit
Table of Contents
A page can load without delivering its contentWhat the retrieval tool can actually doRunning JavaScript is only part of loading a pageLook at the response before blaming the frameworkThe same service, delivered in two different waysFollow one important fact through your own pageKeep essential information available from the start
How we audit

Copy linkA page can load without delivering its content

When you open a service page in your browser, the description may explain exactly what's included and how to get in touch. An automated client requesting the same URL might receive just the heading and a message saying 'Loading service details...'. Although the request succeeded, the response doesn't contain enough information to explain the service.

When JavaScript supplies the missing details, what an AI system receives depends on how its retrieval tool loads the page. Comparing the original HTML response with the page after its scripts have run helps you find that dependency, and the downloadable example below gives you a small, repeatable way to try it.

Copy linkWhat the retrieval tool can actually do

An HTTP fetch reads the response sent by a server, whereas a browser can also run JavaScript and request the data needed to build the page. If the description only appears during those later steps, a tool reading the original response will miss it. Cloudflare's web fetch documentation gives a useful example of this distinction by directing agents to a browser tool when content requires JavaScript or interaction.

The name of a crawler won't necessarily tell you which of those steps it performs. OpenAI documents OAI-SearchBot for search, GPTBot for model training and ChatGPT-User for user-triggered visits, but its crawler overview doesn't specify their JavaScript capabilities. Even a user-agent string that resembles a browser's is insufficient evidence that scripts will run, so check the documented capabilities and the result of the tool you're interested in.

OpenAI: the roles of its crawlers and user-triggered visits

Copy linkRunning JavaScript is only part of loading a page

Google Search can render JavaScript, and Google's JavaScript crawling guidance explains how it processes those pages and why server-rendered or pre-rendered content can help other clients. That capability still depends on the page's resources loading successfully: a script might fail, or the request supplying its data might return an error, leaving the browser at a loading message even when the HTML request returned HTTP 200.

Some content also depends on what happens after the page opens. A specification may appear only when someone selects a product option, or another part of an article may load after a click on 'Load more'. When checking that content, record the interaction needed to reveal it so you can distinguish what the client received on arrival from what appeared during use.

Copy linkLook at the response before blaming the framework

A site can use React and still send its main content as readable HTML. React's hydration documentation describes how JavaScript attaches to HTML that the server has already generated, adding interactivity to content that's present before the scripts load. Finding React or a large JavaScript bundle on a site therefore tells you little about whether its description is available in the response.

The useful question is whether the particular response contains the information you need. Server rendering can return a loading fallback for some content too, so inspect the words under the relevant heading rather than relying on the framework or rendering method as proof.

React: server rendering and loading fallbacks

Copy linkThe same service, delivered in two different ways

To make the difference visible, a local comparison on 10 November 2026 checked two pages describing a fictional website care plan. The before page adds its details with JavaScript, while the after page includes the same wording directly in its HTML. Both HTML requests returned HTTP 200, although the before response stopped at the heading and loading message and the after response already contained the description, scope exclusions and consultation next step. In the browser, both pages displayed those details once the before page's script had run.

A further check kept the before document unchanged and made its script request return HTTP 503. This time, the browser stayed at 'Loading service details...', showing how a successful HTML request can leave essential content unavailable when another resource fails.

Downloadable HTML delivery example

The html-delivery-v1 files let you inspect the same pages and compare what arrives in the response with what appears in the browser.

Test setup:
two HTML pages and a shared script served locally over HTTP, without accounts, cookies, a consent flow or external data requests.
Inspection:
an ordinary HTTP client read each response, followed by a JavaScript-enabled browser opening the pages without clicks or scrolling.
Failure check:
a temporary local server returned 503 for the before page script to reproduce a failed resource load; that server is not included in the downloads.
Before: details added by JavaScriptbefore.htmlAfter: details in the HTMLafter.htmlService-content scriptservice-content.jsNode verifierverify.mjs
What the fixture shows
CheckBeforeAfter
Service description in the initial main contentAbsentPresent
Scope and exclusions in the initial main contentAbsentPresent
Next step in the initial main contentAbsentPresent
Service details in the browser with normal loadingPresent after the script runsPresent without a script

Repeat the check

Save all four files in one folder and run the Node verifier to check the HTML and script insertion using its minimal document stub. For the browser comparison, serve that folder with Python 3 and open http://127.0.0.1:8000/before.html and /after.html. In the Network panel, inspect each HTML response alongside the displayed page, then block service-content.js and reload before.html to see what remains when its script cannot load.

HTML delivery checkTerminal
$node verify.mjs
$python3 -m http.server 8000 --bind 127.0.0.1

Recommended change

The after page makes the service details available in the HTML response by including them in the document, so reading that information no longer depends on the script running.

This comparison covers the HTTP and browser behaviour of fictional pages marked noindex, so you'd need a separate test to find out how a particular AI crawler retrieves or uses their content.

Copy linkFollow one important fact through your own page

Choose a public page you control and a detail that someone needs from it, such as a service exclusion or a product specification. Open it in a fresh session so saved preferences and previously loaded data don't hide a dependency, then look for that detail in the HTML response and in the rendered page before interacting with it.

Pay attention to where the words appear. Text stored inside a script payload may still need JavaScript to turn it into a readable paragraph or table, so finding the phrase somewhere in the source doesn't establish that it's part of the delivered main content. If it appears only after a script runs or an action is taken, follow that step to the request that supplies it.

Keep the URL, time and client with the observation, together with the response status and any session conditions or actions needed to reproduce it. Those details help the next person investigate the same result and give you a useful starting point for a retest.

  • Present only after scripts run: identify the component or data request supplying the missing content.
  • Absent from both views: check failed requests, access restrictions and whether you opened the expected page state.
  • Visible only after interaction: record the action needed and check whether the client performs it.
  • Present in both views: investigate the actual retrieval result and how the information is interpreted before changing the rendering.

Copy linkKeep essential information available from the start

If important public copy arrives only after client-side JavaScript runs, consider generating it on the server or at build time. The page can retain its filters, forms and other interactions while delivering the essential information under clear headings, with links and table relationships that preserve its meaning.

For content loaded through interaction, a directly addressable URL can provide another way to reach it. Google's lazy-loading guidance recommends persistent, linked URLs for paginated content because Google Search doesn't scroll or click to reveal it. Treat that as guidance for Google Search and check the behaviour of any AI retrieval tool you also want to support.

Once a change is ready, repeat the original checks against the same detail to confirm that it now appears in the delivered main content and still displays correctly after the scripts run. If you also try an AI retrieval tool, save its name, date and output with the evidence so the team can see what changed and whether the fix worked.

Use the website content audit guide to record evidence and plan a retest

Copy linkSources and further reading

  1. Google: JavaScript rendering and crawling
  2. Cloudflare: web fetch and when to use a browser tool
  3. OpenAI: overview of crawlers
  4. React: hydrating server-rendered HTML
  5. React: server rendering and loading fallbacks
  6. Google: lazy-loaded content and paginated loading
Doğu Abaris

About the author

Doğu Abaris

Doğu Abaris is a software and data engineer and a co-founder of Tityra. For more than a decade, he has built maintainable software for production, working across front-end and back-end development. He also contributes to open-source software and web standards.

More about Doğu

See what your website delivers.

Choose an agreed scope and get findings your team can act on.

Get your free audit
Share this article

Share this article

Keep exploring

Agent Experience

How AI agents interact with websites

AI agents can read pages, use browser controls or call tools directly, with each route shaping what they can see and do.

Read article

Announcements

Tityra and Mediazone partner on a case study

Tityra is partnering with Mediazone, a major publishing network in Türkiye, to assess how AI agents access and interpret content on selected sites.

Audit practice

How website content audits can help your team

A detail visible in a browser can be absent from another response. A website content audit documents delivery and structure issues your team can investigate.

Turn findings into
clear next steps.

Get your free audit
BlogAudit methodologyAPI docsMCP docsCLIGitHubContact

TITYRA LTD

120 Main Street
Largs, Scotland, KA30 8JN
info@tityra.com
HomeAboutPricing
Who It's For
  • Publishers & Media
  • Ecommerce & Retail
  • SaaS & Technology
  • Agencies
  • Government & Public Sector
  • Financial Services & Insurance

© 2026 TITYRA LTD. All rights reserved. Registered in Scotland, company SC908253.

PrivacyTerms and ConditionsCookie informationCookie preferences

We value your privacy

By clicking “Accept all cookies”, you agree to the storing of optional analytics cookies on your device to help us understand site usage and improve our website. You may click the customise button to choose which optional cookies you would like to allow.

Strictly necessary (2)

We save your cookie choice in this browser for six months, so you do not have to choose on every visit. This storage is always on.

Show detailsHide details for strictly necessary
  • Name
    tityra_analytics_consent_v1
    Provider
    Tityra (tityra.com)
    Type
    HTML local storage
    Maximum storage duration
    Persistent

    Remembers whether you accepted or rejected analytics. Your choice is valid for 180 days (six months), after which we ask again. The stored record remains until it is replaced or you clear your browser storage.

  • Name
    tityra_analytics_consent_v1_refusal
    Provider
    Tityra (tityra.com)
    Type
    HTML session storage
    Maximum storage duration
    Browser tab session

    Keeps analytics off if your browser cannot save a rejection in local storage. This fallback is only used when needed and is cleared when a subsequent choice is successfully saved.

Google Analytics helps us understand page visits, content engagement, interest in audit packages and account signup link clicks. It only loads after you accept. Advertising features are disabled.

Show detailsHide details for analytics
  • Name
    _ga
    Provider
    Google Analytics (tityra.com)
    Type
    HTTP cookie
    Maximum storage duration
    Up to 180 days (six months)

    Distinguishes visitors to help us understand how the website is used. Set only after you accept analytics; advertising features are disabled.

  • Name
    _ga_*
    Provider
    Google Analytics (tityra.com)
    Type
    HTTP cookie
    Maximum storage duration
    Up to 180 days (six months)

    Maintains analytics session information, such as visits and interactions with the website. Set only after you accept analytics. The asterisk represents the identifier in the cookie name.

You control whether optional analytics runs on this website. We remember your choice for six months, and you can change it at any time using Cookie preferences in the footer.

Rejecting or withdrawing consent stops analytics and removes the Google Analytics cookies this website can access.

The details list the name, provider, purpose, type and storage duration of each entry. Contact details and private account information are not included in website analytics.

Counts describe the entries listed, including the fallback and cookie name pattern, rather than cookies currently stored on your device.

Read our cookie information