
{"id":1377,"date":"2026-07-16T06:34:56","date_gmt":"2026-07-16T06:34:56","guid":{"rendered":"https:\/\/maxaeo.ai\/blog\/ai-crawlers-infinite-scroll\/"},"modified":"2026-07-16T06:34:56","modified_gmt":"2026-07-16T06:34:56","slug":"ai-crawlers-infinite-scroll","status":"publish","type":"post","link":"https:\/\/maxaeo.ai\/blog\/ai-crawlers-infinite-scroll\/","title":{"rendered":"Can AI Crawlers See Infinite Scroll? Pagination Patterns That Keep Evidence Discoverable"},"content":{"rendered":"<p><strong>Can AI crawlers see infinite scroll? In most cases, no.<\/strong> The crawler receives only the first server-rendered batch of items\u2014often 12 to 24\u2014and never discovers the hundreds more that a human unlocks by scrolling. The bots that feed ChatGPT, Perplexity, and Claude do not run JavaScript at all, so the scroll event that loads the rest of your catalog never fires. This guide shows exactly what breaks, how to test your own archives in ten minutes, and which pagination patterns keep every product and post retrievable.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" style=\"max-width:100%;height:auto\" loading=\"lazy\"  src=\"https:\/\/maxaeo.ai\/blog\/wp-content\/uploads\/2026\/07\/1784132991931-2-91933-1.jpg\" alt=\"How AI crawlers handle an infinite scroll product archive versus paginated URLs\"><\/figure>\n<h2>What happens when an AI crawler hits an infinite-scroll page?<\/h2>\n<p><strong>An AI crawler fetches the raw HTML your server returns, extracts the links and text inside it, and leaves. It does not scroll, click, or wait for lazy-loaded batches.<\/strong> So an infinite-scroll archive exposes only its first viewport of content\u2014whatever the server put in the initial response.<\/p>\n<p>That single behavior explains the whole problem. Infinite scroll works by listening for a scroll event, then fetching the next batch over a background request and appending it. A human triggers dozens of those events. A crawler triggers zero. Everything below the first fold lives behind an interaction the bot will never perform\u2014so your deep inventory (old posts, page-40 products, the case study from 2023) is effectively unpublished as far as retrieval is concerned.<\/p>\n<h2>Why infinite scroll fails twice for AI search, but only once for Google<\/h2>\n<p><strong>Infinite scroll is a single problem for Googlebot and a double problem for AI crawlers. Googlebot can render JavaScript but chooses not to scroll; AI crawlers neither render JavaScript nor scroll.<\/strong> That distinction is the most overlooked fact in this topic, and it changes your fix.<\/p>\n<p>Googlebot runs a modern rendering engine. It can execute the JavaScript that builds your page, so a client-rendered layout is at least <em>visible<\/em> to it. What Googlebot won&#39;t do is simulate a user scrolling to fire lazy-load events. So for Google, infinite scroll fails once: rendering works, discovery of deeper batches does not.<\/p>\n<p>AI crawlers fail on both counts. <a href=\"https:\/\/vercel.com\/blog\/the-rise-of-the-ai-crawler\" target=\"_blank\" rel=\"noopener\">Vercel&#39;s analysis of AI crawler traffic<\/a> found GPTBot spent roughly 11.5% of its fetches on JavaScript files and ClaudeBot about 23.84%\u2014yet <strong>neither executed a line of it<\/strong>. In the month Vercel measured, GPTBot alone generated 569 million requests across its network and rendered none of them. So an AI crawler never runs the app <em>and<\/em> never scrolls it. If your first batch is itself injected by client-side JavaScript, the crawler may see an empty shell\u2014which is why understanding whether <a href=\"https:\/\/maxaeo.ai\/blog\/can-ai-crawlers-render-javascript\">AI crawlers render JavaScript at all<\/a> matters before you touch pagination.<\/p>\n<table>\n<thead>\n<tr>\n<th>Crawler<\/th>\n<th>Renders JavaScript?<\/th>\n<th>Fires scroll events?<\/th>\n<th>Sees deep archive on infinite scroll?<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Googlebot<\/td>\n<td>Yes (with a render queue)<\/td>\n<td>No<\/td>\n<td>Only if a crawlable paginated fallback exists<\/td>\n<\/tr>\n<tr>\n<td>GPTBot \/ OAI-SearchBot<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>Only what&#39;s in raw HTML<\/td>\n<\/tr>\n<tr>\n<td>ClaudeBot \/ Claude-SearchBot<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>Only what&#39;s in raw HTML<\/td>\n<\/tr>\n<tr>\n<td>PerplexityBot<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>Only what&#39;s in raw HTML<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The takeaway: <strong>optimizing infinite scroll for Google is not enough for AI search.<\/strong> A pattern that leans on Googlebot&#39;s rendering will still starve the answer engines.<\/p>\n<h2>A repeatable test: can AI crawlers see your archive?<\/h2>\n<p><strong>Measure your exposure in about ten minutes with a terminal and a browser. The method compares what a non-rendering crawler receives (raw HTML) against what a human sees (the rendered DOM). The gap is your invisible inventory.<\/strong> Run it on any product or article archive you care about.<\/p>\n<p>Here is the four-step test, in order:<\/p>\n<ol>\n<li><strong>Fetch the raw HTML a crawler gets.<\/strong> Request the page with a bot user agent and no JavaScript execution:<br \/>\n <code>curl -A &quot;GPTBot&quot; https:\/\/yoursite.com\/blog\/ &gt; raw.html<\/code><\/li>\n<li><strong>Count the items in that raw response.<\/strong> Count your repeating item markup\u2014<code>&lt;article<\/code>, a product-card class, a listing <code>&lt;li&gt;<\/code>\u2014directly: <code>grep -c &#39;&lt;article&#39; raw.html<\/code>. If the archive holds 240 products but the count is 12, a crawler sees 12.<\/li>\n<li><strong>Look for a crawlable next-page link.<\/strong> Grep the same file for an anchor to page two: <code>grep -o &#39;href=&quot;[^&quot;]*page[^&quot;]*&quot;&#39; raw.html<\/code>. A real <code>&lt;a href=&quot;...?page=2&quot;&gt;<\/code> means a discovery path exists. A <code>&lt;button&gt;<\/code> or an <code>onclick<\/code> handler does not.<\/li>\n<li><strong>Compare against the rendered page.<\/strong> Open the archive in a browser, scroll to the bottom, and count the fully loaded items. The difference between the browser count and the <code>raw.html<\/code> count is exactly what AI crawlers cannot reach.<\/li>\n<\/ol>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" style=\"max-width:100%;height:auto\" loading=\"lazy\"  src=\"https:\/\/maxaeo.ai\/blog\/wp-content\/uploads\/2026\/07\/1784132991931-2-91933-2.jpg\" alt=\"Terminal output showing a curl request to an infinite scroll archive returning only the first twelve products\"><\/figure>\n<p>Representative results from running this test on two common setups look like the table below. Treat these as illustrations of the method\u2014your own numbers will differ, which is the point of testing.<\/p>\n<table>\n<thead>\n<tr>\n<th>Archive type<\/th>\n<th>Pattern<\/th>\n<th>Items in raw HTML<\/th>\n<th>Items after scroll<\/th>\n<th>Crawlable <code>&lt;a href&gt;<\/code> to next page?<\/th>\n<th>Crawler-visible share<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Product listing<\/td>\n<td>Infinite scroll, JS-injected<\/td>\n<td>12<\/td>\n<td>240<\/td>\n<td>No<\/td>\n<td>~5%<\/td>\n<\/tr>\n<tr>\n<td>Article archive<\/td>\n<td>&quot;Load more&quot; <code>&lt;button&gt;<\/code><\/td>\n<td>10<\/td>\n<td>130<\/td>\n<td>No<\/td>\n<td>~8%<\/td>\n<\/tr>\n<tr>\n<td>Product listing<\/td>\n<td>Paginated URLs (<code>?page=<\/code>)<\/td>\n<td>24<\/td>\n<td>24 per page<\/td>\n<td>Yes<\/td>\n<td>100%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The pattern is stark: <strong>infinite scroll without a linked fallback exposes single-digit percentages of a large archive to AI crawlers.<\/strong> For a deeper walkthrough of raw-HTML versus rendered-DOM differences, see the comparison of <a href=\"https:\/\/maxaeo.ai\/blog\/ssr-vs-csr-ai-crawlers\">server-side versus client-side rendering for AI visibility<\/a>.<\/p>\n<h2>Four pagination patterns, tested against crawlers<\/h2>\n<p><strong>Not all &quot;modern&quot; pagination is equal. The deciding factor is one question: does the raw HTML contain a real anchor tag pointing to the next set of items at a distinct URL?<\/strong> If yes, crawlers can walk your archive. If no, they stop at batch one. Here is how the four common patterns score.<\/p>\n<table>\n<thead>\n<tr>\n<th>Pattern<\/th>\n<th>Real <code>&lt;a href&gt;<\/code> in raw HTML?<\/th>\n<th>Distinct URL per page?<\/th>\n<th>Googlebot reaches deep pages<\/th>\n<th>AI crawlers reach deep pages<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Pure infinite scroll (scroll event \u2192 fetch)<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td>&quot;Load more&quot; button (JS <code>onclick<\/code>)<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td>&quot;Load more&quot; link (anchor to <code>?page=2<\/code>)<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Numbered paginated URLs<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Two of these patterns look almost identical to users but behave oppositely for machines. A <strong>&quot;load more&quot; button<\/strong> wired as a <code>&lt;button&gt;<\/code> with a JavaScript click handler is invisible to crawlers\u2014the same trap as content buried in tabs and accordions, which we cover in <a href=\"https:\/\/maxaeo.ai\/blog\/can-ai-crawlers-see-hidden-content\">whether AI crawlers see hidden interactive content<\/a>. A <strong>&quot;load more&quot; control implemented as an <code>&lt;a href=&quot;\/blog\/?page=2&quot;&gt;<\/code><\/strong> that JavaScript intercepts for a smooth experience is fully crawlable, because the anchor and its destination URL exist in the HTML before any script runs.<\/p>\n<p><strong>The rule to remember: crawlers follow anchors to URLs, not clicks on widgets.<\/strong> Progressive enhancement\u2014ship the links, then upgrade the interaction\u2014is what separates a discoverable archive from an invisible one.<\/p>\n<h2>The crawlable fallback pattern that actually works<\/h2>\n<p><strong>The reliable pattern is a paginated series of real URLs underneath your scroll experience: every scroll position corresponds to a component page a crawler can request directly. This is Google&#39;s long-standing recommendation, and it happens to be the only pattern AI crawlers can follow.<\/strong> Build the URLs first; layer the scroll on top.<\/p>\n<p>Follow these steps to implement it:<\/p>\n<ol>\n<li><strong>Give every batch its own URL.<\/strong> Expose <code>\/blog\/page\/2\/<\/code>, <code>\/blog\/page\/3\/<\/code>, and so on\u2014each returning that batch&#39;s items in server-rendered HTML, readable without JavaScript.<\/li>\n<li><strong>Put real anchor links in the markup.<\/strong> Include <code>&lt;a href&gt;<\/code> navigation between component pages in the initial HTML, not injected after load.<\/li>\n<li><strong>Keep the scroll as an enhancement.<\/strong> Let JavaScript fetch and append batches for humans, but update the address bar with the History API (<code>pushState<\/code>) so each position maps to a shareable, crawlable URL. Google&#39;s <a href=\"https:\/\/developers.google.com\/search\/blog\/2014\/02\/infinite-scroll-search-friendly\" target=\"_blank\" rel=\"noopener\">infinite scroll search-friendly recommendations<\/a> describe exactly this component-page approach.<\/li>\n<li><strong>Make each component page self-sufficient.<\/strong> It should render its items, a title, and links forward and back\u2014so it stands alone if a crawler lands on it directly.<\/li>\n<li><strong>Don&#39;t rely on <code>rel=&quot;next&quot;<\/code>\/<code>rel=&quot;prev&quot;<\/code> for indexing.<\/strong> Google confirmed in 2019 that it no longer uses those tags as an indexing signal; the crawlable <code>&lt;a href&gt;<\/code> links are what carry discovery now.<\/li>\n<\/ol>\n<p>Do this and Googlebot, GPTBot, ClaudeBot, and PerplexityBot all get the same thing: a chain of static URLs they can crawl to the end. The smooth scroll is a bonus for people, not a dependency for machines.<\/p>\n<h2>Do XML sitemaps fix infinite scroll for AI crawlers?<\/h2>\n<p><strong>A sitemap helps crawlers discover URLs, but it does not create them.<\/strong> If your deep pages have no standalone URL\u2014because infinite scroll injects them client-side\u2014there is nothing to list. Sitemaps supplement crawlable pagination; they never replace it.<\/p>\n<p>Once your component pages have real URLs, list every one in an XML sitemap so crawlers get a second discovery path beyond on-page links. Two caveats matter for AI search: each URL must still return server-rendered content when fetched directly, and AI crawlers lean far more on following in-page links than on parsing sitemaps. Treat the sitemap as a backup to real <code>&lt;a href&gt;<\/code> navigation, not a substitute for it.<\/p>\n<h2>Product archives vs. article archives: different stakes, same fix<\/h2>\n<p><strong>Both archive types break the same way under infinite scroll, but the business cost differs. Product archives lose shortlist inclusion; article archives lose citation coverage. The fix\u2014paginated URLs behind the scroll\u2014is identical.<\/strong> Choose the pattern by the stakes, not the aesthetics.<\/p>\n<p>For a <strong>product archive<\/strong>, invisible deep inventory means AI assistants building a recommendation shortlist only ever &quot;know about&quot; your first dozen SKUs. When a buyer asks an assistant for options in your category, the products stuck on page 40 cannot be recommended because no crawler ever reached them. If you care about showing up in <a href=\"https:\/\/maxaeo.ai\/blog\/high-intent-ai-search-prompts-how-buyers-ask-for-product-recommendations\">the high-intent prompts buyers use to request product recommendations<\/a>, every product needs a crawlable URL, and a numbered paginated series is the cleanest way to guarantee it.<\/p>\n<p>For an <strong>article archive<\/strong>, the loss is evidence. Your best proof points\u2014benchmarks, case studies, technical explainers\u2014are exactly the pages an answer engine wants to cite. If they sit past the first infinite-scroll batch with no linked path, they never enter the retrieval pool, no matter how strong they are. Clean, linked URL patterns are what keep that evidence reachable.<\/p>\n<p><strong>One practical note:<\/strong> if your archive is genuinely a live feed\u2014short social posts, a chat log\u2014where individual items aren&#39;t worth indexing and search isn&#39;t a traffic source, pure infinite scroll is defensible. Everywhere else, it costs you discoverability.<\/p>\n<h2>How infinite scroll caps your AI share of voice<\/h2>\n<p><strong>Pages a crawler can&#39;t reach can&#39;t be cited. So an archive hidden behind infinite scroll quietly caps your ceiling in AI answers\u2014your brand competes for AI-generated shortlists with only a fraction of its real evidence.<\/strong> You won&#39;t spot this in a rankings tool; you spot it in what the engines actually say.<\/p>\n<p>Answer engine optimization and generative engine optimization share one prerequisite: evidence has to be retrievable before it can be quoted. When an archive is trapped behind scroll, your citations skew toward the handful of pages that sat in the first batch, and competitors with deeper, crawlable libraries win the rest. <a href=\"https:\/\/maxaeo.ai\/blog\/best-tools-to-track-brand-visibility-in-ai-search-2026-tested-across-chatgpt-perplexity-gemini-ai-overviews\">Tracking which of your URLs actually get surfaced<\/a> across ChatGPT, Perplexity, Gemini, and Claude turns an invisible technical flaw into a fixable list\u2014and often reveals a whole section of your site going unmentioned because of one crawl gap like this.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" style=\"max-width:100%;height:auto\" loading=\"lazy\"  src=\"https:\/\/maxaeo.ai\/blog\/wp-content\/uploads\/2026\/07\/1784132991931-2-91933-3.jpg\" alt=\"Decision matrix scoring four pagination patterns for AI crawler discoverability\"><\/figure>\n<h2>A quick pre-launch checklist<\/h2>\n<p><strong>Before you ship an archive, confirm a non-rendering crawler can walk it end to end.<\/strong> Run through these five checks:<\/p>\n<ul>\n<li><strong>Raw HTML holds real content<\/strong>, not an empty shell hydrated by JavaScript.<\/li>\n<li><strong>An <code>&lt;a href&gt;<\/code> link to the next page exists<\/strong> in that raw HTML\u2014verified with <code>curl<\/code>, not DevTools.<\/li>\n<li><strong>Each page has a distinct, stable URL<\/strong> you can paste into a browser and load directly.<\/li>\n<li><strong>Component pages are server-rendered<\/strong> and readable with JavaScript disabled.<\/li>\n<li><strong>The scroll or &quot;load more&quot; experience is an enhancement<\/strong> layered over the links, never a replacement for them.<\/li>\n<\/ul>\n<p>If all five pass, both Google and the AI crawlers can reach your full archive. If any fail, you&#39;ve found where your evidence disappears.<\/p>\n<h2>Frequently asked questions<\/h2>\n<h3>Do AI crawlers execute JavaScript to load infinite scroll content?<\/h3>\n<p>No. As of 2026, the major AI crawlers\u2014GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, and PerplexityBot\u2014do not execute JavaScript. Vercel&#39;s data shows they sometimes <em>download<\/em> script files but never run them. Because infinite scroll depends on JavaScript firing on a scroll event, its deeper batches are invisible to these bots. Only content in the raw HTML response is seen.<\/p>\n<h3>Is a &quot;load more&quot; button better than infinite scroll for AI crawlers?<\/h3>\n<p>Only if it&#39;s built as a link. A &quot;load more&quot; <code>&lt;button&gt;<\/code> with a JavaScript click handler is exactly as invisible as infinite scroll, because crawlers don&#39;t click. A &quot;load more&quot; control implemented as an <code>&lt;a href=&quot;\/page\/2\/&quot;&gt;<\/code> that script enhances for a smooth experience is fully crawlable, since the anchor and destination URL exist in the HTML before any script runs.<\/p>\n<h3>Does using paginated URLs hurt the user experience?<\/h3>\n<p>No\u2014you can have both. Ship real paginated URLs for crawlers and layer infinite scroll or a &quot;load more&quot; interaction on top for humans, updating the address bar with the History API as users scroll. Users get the smooth feed; crawlers get a chain of static URLs. This progressive-enhancement approach is Google&#39;s recommended way to keep infinite scroll search-friendly.<\/p>\n<h3>How do I know if my archive is already invisible to AI crawlers?<\/h3>\n<p>Run the raw-HTML test: fetch the page with <code>curl -A &quot;GPTBot&quot;<\/code>, count the items in the response, and compare that to what loads in a browser after scrolling. If the raw count is a small fraction of the rendered count and there&#39;s no <code>&lt;a href&gt;<\/code> to the next page, AI crawlers only see that small fraction. The gap is your invisible inventory.<\/p>\n<h3>Are <code>rel=&quot;next&quot;<\/code> and <code>rel=&quot;prev&quot;<\/code> still needed for pagination?<\/h3>\n<p>They&#39;re optional. Google confirmed in 2019 that it no longer uses <code>rel=&quot;next&quot;<\/code>\/<code>rel=&quot;prev&quot;<\/code> as an indexing signal, and AI crawlers don&#39;t depend on them either. What carries discovery today is crawlable <code>&lt;a href&gt;<\/code> links between distinct, server-rendered component-page URLs. Keep the tags if they serve your other tooling, but don&#39;t rely on them to expose your archive.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"Article\",\n  \"headline\": \"Can AI Crawlers See Infinite Scroll? Pagination Patterns That Keep Evidence Discoverable\",\n  \"description\": \"AI crawlers don't scroll or run JavaScript, so infinite scroll hides your archive. Learn the pagination patterns that keep every product and post crawlable, plus a repeatable test.\",\n  \"image\": \"image-placeholder\",\n  \"author\": {\n    \"@type\": \"Organization\",\n    \"name\": \"MaxAEO\"\n  },\n  \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"MaxAEO\",\n    \"logo\": {\n      \"@type\": \"ImageObject\",\n      \"url\": \"image-placeholder\"\n    }\n  },\n  \"datePublished\": \"\",\n  \"dateModified\": \"\",\n  \"mainEntityOfPage\": {\n    \"@type\": \"WebPage\",\n    \"@id\": \"https:\/\/maxaeo.ai\/blog\/ai-crawlers-infinite-scroll\"\n  }\n}\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>AI crawlers don&#8217;t scroll or run JavaScript, so infinite scroll hides your archive. See the pagination patterns that keep every page crawlable\u2014and test yours.<\/p>\n","protected":false},"author":1,"featured_media":1374,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/posts\/1377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/comments?post=1377"}],"version-history":[{"count":0,"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/posts\/1377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/media\/1374"}],"wp:attachment":[{"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/media?parent=1377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/categories?post=1377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maxaeo.ai\/blog\/wp-json\/wp\/v2\/tags?post=1377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}