BlogFindings

Do AI crawlers read accordion content? 429 of 2,982 named panels were not in the HTML

Lantad requested robots.txt and then the home page of all 1,419 hostnames in this repository's two committed corpus seed files on 4 November 2026, as LantadBot/1.0 with redirects followed and no JavaScript executed. 1,109 answered HTTP 200 with HTML. 622 of them carried at least one element with aria-expanded set to false, 7,000 such elements in all. 4,061 of the 7,000 named no panel at all. The 2,939 that did named 2,982 id references, and 429 of those pointed at an element that was not in the delivered bytes.

19 min read Lantad

This run counted both. Lantad requested the robots.txt of all 1,419 hostnames in this repository's two committed corpus seed files on 4 November 2026, then the home page of each, every request sent as its own declared crawler user agent with redirects followed and a twenty second timeout, from one network location, with no JavaScript executed and no stylesheet fetched. 1,103 robots.txt files answered HTTP 200. 13 of the 1,419 disallowed this scanner at the site root and were dropped rather than read. 15 home pages failed to connect or timed out. 1,109 answered HTTP 200 with an HTML content type, carrying 1,327,457 words of body text between them, and an HTML parser was run over all of them looking for two things.

In short

  • Do AI crawlers read accordion content is two questions, not one, and Lantad separated them on 1,109 home pages on 4 November 2026: text inside a native details element is always in the delivered bytes, while text inside a scripted disclosure panel is in the bytes only if the panel is there, and 429 of the 2,982 panels named by a collapsed toggle were not.
  • 7,000 elements across 622 of the 1,109 pages carried aria-expanded set to false on 4 November 2026, and 4,061 of those 7,000 carried no aria-controls attribute, so the markup never said which element the toggle was hiding and no reader of the bytes can check whether its contents arrived.
  • 359 of the 429 unresolved references sat inside a nav, header or footer element or a navigation, banner, contentinfo, menubar or menu role, so most of the missing panels are menu flyouts rather than prose, and the remaining 70 sat outside that chrome on 29 pages.
  • spekit.com carried 12 elements naming aria-controls equal to accordion-panel and no element anywhere on the page carried that id, with 9 of the 12 collapsed toggles labelled as questions including What is Spekit and How does Spekit use AI, so the answers to its own frequently asked questions were absent from the home page a crawler received on 4 November 2026.
  • The templated platforms made none of these mistakes: the wix-squarespace stratum resolved all 115 of its id references and the wordpress-smb stratum all 79, against 83 of 246 unresolved in the ecommerce stratum and 17 of 65 in the spa-startups stratum, measured by Lantad on 4 November 2026.
StageCountWhat it means
Hostnames requested1,419The committed corpus, an editorial frame rather than a random draw
robots.txt answered 2001,103The file resolved and was parsed
Disallowed this scanner at the root13Dropped before the home page was requested
Home page connection failed15Connection reset, TLS failure or a timeout at twenty seconds
Home pages read as HTML1,109HTTP 200 with an HTML content type, the denominator below
Words of body text1,327,457Counted outside script, style, noscript, template and svg
Pages with a collapsed ARIA toggle622At least one element with aria-expanded set to false
Pages with a native details element83The other mechanism, and much the rarer one
One GET of https://<host>/robots.txt and one of https://<host>/ for each hostname, sent as LantadBot/1.0 (+https://lantad.co/bot) with redirects followed and a twenty second timeout, from one network location, with no JavaScript executed and no stylesheet fetched. Where the apex did not answer with HTML the www subdomain was tried once, which accounted for 42 of the pages read. Measured by Lantad on 4 November 2026 across the 1,419 hostnames in worker/seeds/corpus-seeds-platform.json and worker/seeds/corpus-seeds-industry.json.

Two ways to build an accordion, and only one keeps the text in the markup

The first mechanism is an HTML element. The details element represents, in the words of the WHATWG HTML Standard at html.spec.whatwg.org, a disclosure widget from which the user can obtain additional information or controls. Its open attribute is a boolean, and the standard is explicit about what it governs: if present, it indicates that both the summary and the additional information is to be shown to the user, and if the attribute is absent, only the summary is to be shown. Showing is a rendering instruction. The parser builds the element's children either way, so the text of a closed details element is in the delivered document, and a client with no viewport and no CSS engine never applies the instruction that would have hidden it.

The second mechanism is a script and two attributes. The aria-expanded state, as the WAI-ARIA 1.2 specification published as a W3C Recommendation on 06 June 2023 defines it, indicates whether a grouping element owned or controlled by this element is expanded or collapsed, and is applied to a focusable, interactive element that toggles visibility of content in another element. That other element is named by the aria-controls property, which identifies the element or elements whose contents or presence are controlled by the current element, and whose value the specification types as an ID reference list.

The phrase worth stopping on is contents or presence. The specification contemplates a control whose target may not be there yet, because that is how a great deal of modern interface code works: the panel is created when the button is pressed. Nothing about that is a defect in the authoring. It is simply a different arrangement from the details element, and it has a consequence the first mechanism does not have. A toggle can name a panel that the delivered HTML does not contain, and a fetch-only client then receives the question and no answer. Lantad has counted the details element in this corpus before, on a much smaller sample, and found 31 disclosure widgets across five captured pages, none of them holding an FAQ. What follows is the larger half of the picture, and the half where something can go missing.

Native details elementScripted ARIA disclosure
What marks itdetails, with an optional open attributearia-expanded on the toggle, aria-controls naming the panel
Where the text livesIn the parsed document, open or closedWherever the script puts it, which may be nowhere yet
What collapsing isA rendering instruction the UA stylesheet appliesA state the author asserts and a script enforces
What a fetch-only client getsThe full contentsThe panel if it is in the bytes, otherwise nothing
Can it be checked from the bytesYes, the element contains its textOnly when aria-controls names an id that exists
Pages using it here83 of 1,109622 of 1,109
The two mechanisms as their specifications define them. The HTML Standard text is quoted from the details element definition and the ARIA text from WAI-ARIA 1.2, a W3C Recommendation of 06 June 2023, both read at source on 4 November 2026. This is a reading of two specifications, not a measurement.

Do AI crawlers read accordion content? What the 1,109 pages actually delivered

Across the 1,109 readable home pages, 7,000 elements carried aria-expanded set to false. A further 258 carried it set to true and 5 carried some other value, which is a useful reminder that the attribute describes a current state rather than a capability. The 7,000 collapsed toggles were spread across 622 pages, so a little over half the corpus ships at least one piece of interface whose job is to keep something out of view until asked.

Of those 7,000, only 2,939 carried an aria-controls attribute. The other 4,061 named nothing. That is not necessarily an accessibility failure, because the specification's requirement is conditional: an author SHOULD identify the controlling relationship with aria-controls when the collapsible container is not owned by the element carrying aria-expanded, and a toggle whose panel is its own descendant needs no reference. It is, however, a measurement failure, and the distinction matters for anyone trying to audit a page from the outside. When a toggle does not say what it controls, no reader of the delivered bytes can establish whether the thing being hidden arrived or not. On 210 of the 622 pages, every single collapsed toggle was in this state.

The 2,939 toggles that did name a target produced 2,982 id references, since the attribute takes a list and a few toggles named more than one element. 2,553 of those references resolved to an element present in the delivered HTML. 429 did not. That is the headline, and it needs one immediate qualification before it is read as a loss of 429 answers: a resolved panel is not automatically a full one, and 149 of the 2,553 resolved panels held zero words of text. The panels that did hold text held a great deal of it. Counting only outermost panels, so that a panel nested inside another is not counted twice, 1,655 distinct regions carried 101,865 words, of which 27,925 sat outside any navigation chrome. That is the content this mechanism delivers successfully, and it is most of it. The rest of this post is about the 429 that did not arrive, and about why the honest reading of that number is smaller than it first looks. Lantad's own scoring treats this question as a threshold rather than a score, which is what prose parity measures and why the method page states what the scanner does and does not execute.

  • Collapsed toggles naming no panel 4061 No aria-controls, so unauditable from the bytes
  • Collapsed toggles naming a panel 2939 Produced 2,982 id references between them
  • References that resolved 2553 The named element was in the delivered HTML
  • References that resolved but held no text 149 Present and empty, which is normal for a search listbox
  • References that resolved to nothing 429 No element on the page carried that id
The 7,000 elements carrying aria-expanded set to false, split by what they said about the panel they hide, and the fate of the 2,982 id references the naming ones produced. Measured by Lantad on 4 November 2026 across 1,109 home pages read as HTML.

The 429 references that pointed at nothing, and which of them cost prose

A missing panel is not automatically missing content, and the first cut to make is where the toggle sits. 359 of the 429 unresolved references came from a toggle inside a nav, header or footer element, or inside an element carrying a navigation, banner, contentinfo, menubar or menu role. These are mega menu flyouts, and a menu flyout built on click costs a crawler a list of links it can usually find elsewhere in the document. 70 of the 429 sat outside that chrome, on 29 pages, and those are the ones where a reader would expect prose.

Reading all 70 by hand separates them again into two groups that deserve opposite verdicts. 11 of the 70 name a search or suggestion container: ids such as search-results on affirm.com, results-listbox on homedepot.com, predictive-search-results on breda.com and nisolo.com, and medscape-ai-typeahead-listbox on medscape.com. A typeahead listbox is supposed to be empty until somebody types. Its absence from a home page served to a crawler is correct behaviour, not a loss, and counting it as one would overstate the finding.

The other group is the one that matters. 13 of the 70 came from a toggle whose own label contains a question mark, which is the cheap test for an FAQ. spekit.com is the clearest case in the corpus. 12 elements on its home page carry aria-controls set to accordion-panel, no element anywhere in the document carries id equal to accordion-panel, and the same id is named 12 times over, which is its own problem given that an id is meant to be unique. All 12 carry aria-expanded set to false. Three of them are navigation toggles labelled Platform, Solutions and Resources. The other nine are labelled with real questions: What is Spekit, What does Rep Acceleration mean, How is Spekit different from other enablement platforms, How does Spekit use AI, How long does it take to implement Spekit, Who is Spekit built for, Does Spekit replace Seismic, Highspot, or Mindtickle, Is Spekit an LMS, and What tools does Spekit integrate with. The answers to all nine were absent from the bytes. mentraglass.com is the same shape with the intent written into the markup: 5 toggles name ids of the form faq-answer followed by a section name and an index, exactly one of those ids exists in the document, and the other 4 do not. A page can hardly be clearer about what it meant to deliver. Several more of the 70 are React component ids of the generated kind, radix and similar, which is the signature of a panel that exists only after hydration, and whether a crawler runs that hydration is a separate question Lantad has measured elsewhere and found two of nine vendors documenting that they render JavaScript. The practical guidance for that stack is on the React fix page.

HostUnresolved outside navWhat the toggle namedWhat its label said
spekit.com9accordion-panel, named 12 times, no such idWhat is Spekit, How does Spekit use AI
mentraglass.com4faq-answer ids 1 to 4, only id 0 presentFour questions about enterprise and pilots
dcu.org8A phrase, parsed as 8 separate id referencesA dropdown button menu
japan.go.jp5videoArea and topics_videoAreaOpen dialog for video, four times
ama-assn.org4ui-id-2, named four timesCME from AMA Ed Hub, Guides, Member Benefits
brex.com4Two hashed content ids, each twiceSeatGeek, Lemonade
homedepot.com1results-listboxA search listbox, correctly empty
medscape.com1medscape-ai-typeahead-listboxA typeahead, correctly empty
The count is each host's unresolved references that sat outside navigation chrome, which is why spekit.com reads 9 here against 12 unresolved in total: its other 3 are navigation toggles. Every reference quoted was read from the delivered HTML of that host's home page on 4 November 2026 and the absence of each id confirmed by searching the same document. The labels are the toggle's own text content.

Most collapsed toggles never say what they control

The 4,061 toggles with no aria-controls attribute are the larger finding and the quieter one, because nothing is demonstrably broken about them. 5,952 of the 7,000 collapsed toggles sat inside navigation chrome, and a navigation disclosure whose submenu is a child of the button that opens it is a perfectly ordinary construction that needs no reference and loses no text.

What the pattern costs is checkability. Lantad can state with confidence that 429 named panels were absent, because naming them is what made the check possible. It cannot state anything at all about the 4,061, in either direction. Some of them certainly wrap their panels, in which case the text is in the bytes. Others certainly build the panel on click, in which case it is not, and there is no way to tell which from the outside. The concentration is severe at the top of the distribution: nab.com.au carried 211 collapsed toggles and every one of them named nothing, hdfcbank.com carried 134 with 128 unnamed, and regeringen.se carried 130 with 122 unnamed. These are large navigation trees, and the reasonable assumption is that most of that text is menu labels rather than prose, which is the pattern Lantad found when it measured how much of a page's text sits in navigation at all and reported that half the text blocks on the captured pages were navigation.

The reason to prefer a named panel anyway is not accessibility theatre. It is that a named panel is a testable claim about the document, and an unnamed one is not. The same argument applies to section ids, which is why a page that gives its headings stable ids can be deep linked, something Lantad counted when it found 55 of 245 headings carried an id. Markup that says what it is doing can be verified by anybody, including the crawler's owner, and markup that stays silent has to be taken on trust.

  • nab.com.au, 211 unnamed of 211 211 toggles
  • hdfcbank.com, 128 unnamed of 134 134 toggles
  • regeringen.se, 122 unnamed of 130 130 toggles
  • costco.com, 97 unnamed of 97 97 toggles
  • motel-one.com, 96 unnamed of 96 96 toggles
  • bundesbank.de, 95 unnamed of 95 95 toggles
Collapsed toggles per page on the six pages carrying the most, with how many of them named no panel. Measured by Lantad on 4 November 2026 from the delivered HTML of each home page, with no JavaScript executed.

The templated platforms got this right and the hand built ones did not

The corpus is stratified by the platform a site is built on, which exists precisely so that findings like this one can be attributed. The unresolved rate divides along a clean line, and the direction is the one this site keeps finding.

Two strata made no mistakes at all. The wix-squarespace stratum produced 115 id references across its 54 readable pages and every one resolved. The wordpress-smb stratum produced 79 across 38 pages and every one resolved. Zero of 194 between them. At the other end, the ecommerce stratum left 83 of its 246 references unresolved, 33.7 percent, the saas-marketing stratum 17 of 62, and the spa-startups stratum 17 of 65. The saas stratum produced by far the most references, 584, and left 95 of them unresolved.

The explanation is not that one group of developers is better than the other. It is that a templated platform emits the accordion from a component that was written once, tested once, and renders the panel into the markup on the server, while a hand assembled React page composes the toggle and the panel separately and leaves the panel to the client. That is the same mechanism behind the gap Lantad measured when it looked at custom elements and found 3,291 of 7,124 arriving with no text inside them. It is also why the per stack guidance differs so much: the Shopify page and the Next.js page are addressing genuinely different failure modes, and the second one is where this particular failure lives.

StratumPagesId referencesUnresolvedShare
ecommerce682468333.7 percent
saas-marketing38621727.4 percent
spa-startups45651726.2 percent
news59771418.2 percent
saas1175849516.3 percent
travel812533614.2 percent
shopify-dtc341261713.5 percent
education1033464412.7 percent
finance1025116011.7 percent
government96203125.9 percent
healthcare102225135.8 percent
wix-squarespace5411500.0 percent
wordpress-smb387900.0 percent
Unresolved aria-controls references by corpus stratum, for the 13 strata that produced at least 40 id references. Measured by Lantad on 4 November 2026 across the 1,109 home pages read as HTML. The strata are the sampling frames committed in worker/seeds/corpus-seeds-platform.json and worker/seeds/corpus-seeds-industry.json.

How to check your own accordions without guessing

This is one of the few AI visibility questions that can be settled in a minute without a tool, because the whole test is whether a string is in a document.

Fetch your page the way a crawler does, with a plain HTTP client and no JavaScript, and save the bytes. Then search those bytes for a sentence that only appears inside a collapsed panel, picking a distinctive phrase from the middle of an answer rather than from its first few words. If the phrase is there, the panel is server rendered and the matter is closed. If it is not, the panel is built on click and a fetch-only client never sees it. That test needs no knowledge of which mechanism the page used, which is its advantage over inspecting the markup, and what GPTBot sees performs the same fetch if you would rather not run one. The AI crawlers reference lists which tokens are worth testing against.

If the answer is that your panels are missing, the fix is a rendering decision rather than a markup one. Server render the panel and let the collapsed state be a style, which is what the details element does natively and what every templated platform in the corpus above does by default. The structured data route is a separate and weaker remedy: marking the same questions up as FAQPage puts the text in a place a parser reads, but the markup has to agree with the page, and Lantad found 298 of 1,277 FAQ answers were not on the page they described. An answer that exists only in the markup is a different problem wearing the same clothes. For what each engine does with a page once it can read it, the ChatGPT citation guide is the nearest thing to a practical summary.

The check as a sequence, which decides the question for one panel on one page. It needs a plain HTTP client and a text search, and it does not depend on knowing which of the two mechanisms built the accordion.

What this run did not measure

No crawler was observed. Every figure here describes what 1,109 origins delivered to one declared client on one day, and nothing about what GPTBot, ClaudeBot or any other crawler does with a collapsed panel once it has the bytes. None of their operators publishes an extractor specification, so the behaviour on the far side of the fetch is not a thing this corpus can reach. Lantad has no measurement showing that a missing accordion panel changes any AI answer, and makes no such claim here.

One page was read per host, always the home page, which is the wrong page for this subject on most sites: an FAQ usually lives at its own URL, so the 13 question labelled toggles found here are a floor on the corpus rather than an estimate of how often this happens on the pages that carry real FAQs. The home page was chosen because it is the one page every host has, which keeps the denominator honest at the cost of understating the effect.

Three method limits are worth stating plainly. 63 of the 1,109 pages yielded zero words of body text, either because they are client rendered shells or because the document carries no literal body element, and they contribute nothing to either side of the word counts. One of the 429 unresolved references is an artefact of a single authoring mistake rather than a missing panel: dcu.org carries one aria-controls attribute whose value is the phrase I am looking for a dropdown button menu, and because the specification types that attribute as an ID reference list, it parses as 8 separate references to ids that were never meant to exist. Removing it leaves 421. And no stylesheet was fetched, so a panel hidden by CSS alone with no ARIA state and no details element was not counted at all, which is the gap the hidden text run covers from the other direction. What the corpus can and cannot support is set out on the research page, and what the score does with findings like this is on the AI visibility page.

  • Panel absent from the bytes Measured 429 of 2,982 named id references resolved to no element, 421 excluding one malformed attribute
  • Where the missing panels sat Measured 359 inside navigation chrome, 70 outside it on 29 pages
  • Unnamed toggles Unknowable from bytes 4,061 of 7,000 named no panel, so neither presence nor absence can be established
  • What a crawler extracts Not measured No crawler was observed and no operator publishes an extractor specification
  • Effect on an AI answer Not measured Lantad has run no test linking a missing panel to any answer or citation
  • FAQ pages proper Out of scope One page per host, always the home page, so FAQ URLs were not read
What this run establishes and what it does not. Measured by Lantad on 4 November 2026 across 1,109 home pages; the unmeasured rows are stated so the finding is not read as more than it is.

Written by

Lantad

Published .

An accordion is a promise about where text lives. A visitor sees a row of closed questions and understands that the answers are one click away, somewhere, held back until asked for. That promise is about the screen. It says nothing about the bytes, and the bytes are the only thing an AI crawler that runs no JavaScript ever sees. So the question of whether collapsed content reaches such a client is not a question about accordions in general. It is a question about which of two completely different mechanisms a given page used to build one.

Common questions

Do AI crawlers read text inside a collapsed details element?

The text is in the document they receive. The HTML Standard makes the open attribute a rendering instruction, so the parser builds a closed details element's children regardless, and a client that executes no JavaScript and fetches no stylesheet has no mechanism that would hide them. What any given crawler's extractor then does with that text is not published by any operator Lantad tracks, so the honest answer stops at the bytes.

Why would an accordion panel be missing from the HTML at all?

Because the panel is created by a script when the toggle is pressed. WAI-ARIA types aria-controls as a reference to an element whose contents or presence the control governs, which explicitly allows for a target that does not exist yet. On 4 November 2026, 429 of the 2,982 references Lantad resolved across 1,109 home pages pointed at an id that no element in the delivered document carried.

Is a missing aria-controls target always a problem?

No, and 11 of the 70 found outside navigation chrome were not. A search typeahead or suggestion listbox is supposed to be empty until a visitor types, so its absence from a page served to a crawler is correct. The cases that cost content are the ones where the toggle's own label is a question, which was true of 13 of those 70.

How do I test my own page in one step?

Fetch the page with a plain HTTP client that runs no JavaScript, save the response, and search it for a distinctive phrase taken from the middle of a collapsed answer. If the phrase is in the bytes the panel is server rendered. If it is not, the panel is assembled in the browser and a fetch-only client receives the question without the answer.

See what AI can read on your site

Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.