BlogFindings
AI visibility score: 972 of 1,419 corpus sites were graded, and parity took 60.7 percent of every point they lost
Lantad ran its shipped scanner, browser and all, over every hostname in this repository's two committed corpus seed files on 13 October 2026. 972 of the 1,419 produced a composite score and a grade. Across those 972 the four sub-scores gave up 24,177 points between them, and prose parity accounted for 14,674 of them. Access, weighted at a quarter of the scale, accounted for 1,501.
The point was not to publish a leaderboard. It was to find out which part of the score does the work. A weight is a decision somebody made, and a decision can be wrong in a way that only shows up against real sites: a component can carry a quarter of the scale and still never move, because the thing it measures is something almost every site already gets right. That is what happened here, and it is worth saying plainly before the funnel.
In short
- Lantad produced an AI visibility score for 972 of the 1,419 hostnames in this repository's two committed corpus seed files on 13 October 2026, running the shipped pipeline with a real browser for the rendered view. Of the rest, 287 refused a plain fetch, 35 blocked the browser, 35 timed out, 21 never resolved in DNS and 12 carried almost no text either way.
- Prose parity is set at 50 of the 100 composite points in the scoring config, and it accounted for 14,674 of the 24,177 points the 972 graded sites lost on 13 October 2026, which is 60.7 percent of every point lost.
- Access is set at 25 points and gave up 1,501 of the 24,300 it had available across those 972 sites, 6.2 percent of its own budget, because 650 of the 972 scored it perfectly. Almost nothing in this corpus blocks the crawlers the access sub-score asks about.
- Schema carries the smallest weight at 10 points and gave up the largest share of its own budget on 13 October 2026, 5,195 of 9,720 or 53.4 percent, with 377 of the 972 sites scoring exactly zero and 334 scoring exactly one.
- Two sites scored zero on schema and still graded A at exactly 90.0, matchmediagroup.com and crinkles.dev, because a perfect parity, access and structure reading comes to 90 points before any markup is read at all.
Flow: 1,419 corpus hostnames (57 hit this run's cap) to 1,362 returned a verdict; 1,362 returned a verdict to 972 carried a grade; 1,362 returned a verdict to 287 refused a fetch; 1,362 returned a verdict to 35 blocked the browser; 1,362 returned a verdict to 68 failed or were refused.
What is an AI visibility score actually made of?
Four numbers and a weighted sum. SCORE_WEIGHTS in core/src/config.ts sets parity at 50 points, access at 25, structure at 15 and schema at 10, and the grade bands put A at 90 and above, B at 75, C at 60 and D at 40. Those are settings rather than findings, and this blog has been strict about the difference before: nobody measured that parity is worth half of anything, somebody chose it. What can be measured is what real sites do against those weights, which is the whole of this post.
Prose parity compares the text in the raw response with the text a browser produces after running the page, so it answers whether a crawler that executes nothing receives what a visitor receives. Access reads robots.txt and the response status and asks whether an AI crawler is allowed in at all, following RFC 9309 on a file it cannot get: the standard, published in September 2022, says a crawler MAY access any resources on the server when robots.txt is unavailable on a 4xx, and MUST assume complete disallow when a 5xx makes it unreachable. Structure is a checklist of seven weighted items. Schema reads the entity signals in the page's JSON-LD. A fifth number, retrievability, is computed on every scan and carries no weight in the composite, which an earlier post made the point of when two fixtures scored an identical 34.4 while differing only on it.
The structure sub-score is worth a note because its shape surprised this run. STRUCTURE_CHECK_WEIGHTS gives six checks a weight of 1 each, being a title, a meta description, exactly one h1, a canonical, heading coverage and no oversized block, and gives llmsTxtPresent a weight of 0.5. The denominator is therefore 6.5, so the sub-score can only land on multiples of a half step. Across the 972 graded sites it took exactly ten distinct values, from 0.3077 up to 1, and one step is worth about 1.15 points of the composite. A reader who moves one check moves the grade by about a point, which is the kind of thing a score should say out loud.
Every figure below comes from one scan of one URL per hostname on 13 October 2026, sent from a single network location as LantadBot, with redirects followed and the rendered view taken from a headless Chromium on the same machine. Reconstructing each composite from its four sub-scores and the configured weights agreed with the scanner's own figure to within 0.05 points on all 972, so the arithmetic in this post is checkable against the published weights.
| Sub-score | Weight | What it reads | Median across 972 |
|---|---|---|---|
| Prose parity | 50 | Raw response text against rendered text | 0.85 |
| Access | 25 | robots.txt rules and the response status | 1.00 |
| Structure | 15 | Seven weighted on-page checks | 0.85 |
| Schema | 10 | Entity signals in the page's JSON-LD | 0.40 |
| Retrievability | 0 | Computed on every scan, unweighted | 0.85 |
Why 447 of the 1,419 sites got no score at all
The scanner returned a verdict for 1,362 hostnames. The other 57 were cut off by this run's own 150 second cap rather than by anything the product did, and they are named as a limit rather than a finding: redis.io, bestbuy.com, costco.com, flipkart.com and 53 others were still working when the harness stopped waiting. Of the 1,362 real verdicts, 972 carried a grade and 390 did not.
The largest single reason is a refusal to serve. 287 hostnames ended in the access_fatal state, which the scanner uses when the plain fetch comes back with a status that makes everything downstream meaningless, and a second plain request to those hosts later the same day answered 403 on 231 of them, 503 on 35, 429 on seven, 404 on five and 401, 406, 500 and 498 on the remainder. bild.de, lemonde.fr, cambridge.org, spglobal.com, staples.com, nationwide.com, currys.co.uk and afr.com all answered 403. This blog has measured the same wall from the other side, finding that 103 of 1,089 sites served an unknown bot and refused GPTBot and that 79 of 115 refused a crawler their own robots.txt allows. A 403 to an identified crawler is a policy, and it is not one the scoring scale can score.
A further 35 served the plain fetch and blocked the browser, which the scanner reports as partial_no_render: trendyol.com, teamviewer.com, usaa.com, pnc.com and johnlewis.com are in that group, and 34 of the 35 answered 200 to a plain request afterwards. 21 never resolved in DNS at all, including gov.cn, bankofchina.com, boj.or.jp and kenya.go.ke, and the scanner refuses those before sending anything. 35 timed out, 22 on the first fetch and ten while reading the body, and two exceeded five redirects. Twelve returned almost no text in either view.
None of those 390 got a number, and that is the designed behaviour rather than a gap. Withholding the grade is the position this product took in its first week, because a composite assembled from a missing parity reading is a guess with a lab coat on. The cost of that position is now measured: on this corpus, on one day, it is 28.6 percent of the hostnames asked. A tool that always prints a number would have printed 390 numbers here, and every one of them would have been built on a component it never managed to read.
| Outcome | Hostnames | What a later plain request answered |
|---|---|---|
| access_fatal, the fetch was refused | 287 | 403 on 231, 503 on 35, 429 on 7, 404 on 5 |
| Cut off by this run's 150 second cap | 57 | 200 on 70 of the 113 in this group |
| partial_no_render, the browser was blocked | 35 | 200 on 34 of 35 |
| Fetch or body read failed | 35 | 22 fetch timeouts, 10 body timeouts, 2 redirect loops |
| Refused before any request, DNS | 21 | Did not resolve |
| unreadable, almost no text either view | 12 | 200 on 10 of 12 |
| Graded | 972 | 68.5 percent of the 1,419 asked |
The distribution: a median of 81.7 and 92 outright failures
The 972 graded sites ran from 17.5 to a clean 100. The median is 81.7, the quartiles 65.65 and 89.23, and the mean 75.12, so the scale is skewed toward the top end with a long tail rather than clustered in the middle. 231 graded A, 380 B, 159 C, 110 D and 92 F. More than half the corpus is a B or better, which either says the web is in reasonable shape for crawlers or says the scale is generous, and the component breakdown in the next section is how to tell those apart.
Six sites scored exactly 100 with a perfect reading on all four sub-scores: zeroentropy.dev, blacksheepbikes.com, youshift.com, busy.in, snyk.io and sentry.io. Five of the six are software products, three in the SaaS stratum and two single page app startups, and the sixth sells bicycles on a hosted site builder. That is roughly the pattern a parity weighted score predicts, since a marketing page assembled server side hands its prose over in the first response. The bottom of the table is more instructive. amazon.com scored 17.6 and graded F on a parity of 0.02, stuff.co.nz 17.5, thehill.com 17.8 and derstandard.at 22.8. Those are not small or neglected properties. They are large sites whose home pages hand a non-rendering client almost nothing, which is the finding 11 of 271 pages returning no words pointed at on a smaller sample.
By stratum the spread is wide and it tracks what the platform does with text rather than what the business is. The ecommerce stratum has the lowest median at 54.35 and the lowest graded rate, 46 of its 130 hostnames, because storefronts both refuse crawlers and render late. The wordpress-smb stratum has the highest median at 91.6, with wix-squarespace and media-local tied at 89.7, and the saas stratum at 87.35. News sits at 69.65 with only 46 of 128 graded. A scale that ranks a small business on WordPress above amazon.com is reporting something real about machine readability, and it is also reporting how little of what a buyer cares about commercially the score can see.
One number deserves to be stated against the product rather than for it. 101 of the 972 sites scored exactly zero on parity, meaning the raw response carried effectively none of the rendered text, and 80 of those graded F while 21 graded D with a median composite of 34.2. A site in that group has the single worst possible reading on the component weighted highest, and it still arrives at a third of the scale, because access, structure and the remaining weights pay out anyway.
The 25 point component took 6.2 percent of the points sites lost
This is the finding, and the cleanest way to see it is to give each sub-score a budget. Across 972 sites, parity had 48,600 points to give up, access 24,300, structure 14,580 and schema 9,720. The sites lost 24,177 points in total, and the split is nothing like the weights.
Parity gave up 14,674 points, which is 60.7 percent of everything lost and 30.2 percent of its own budget. Schema gave up 5,195, which is 21.5 percent of everything lost but 53.4 percent of its own budget. Structure gave up 2,807, or 19.3 percent of its budget. Access gave up 1,501, which is 6.2 percent of all points lost and 6.2 percent of the budget it carries. A quarter of the scale moved almost not at all, because 650 of the 972 sites scored access perfectly and 922 of them scored 0.9 or better. Of the 322 that lost anything on access, 272 lost the same small amount, landing on 0.9.
Read as a buyer would read it, an AI visibility score of this design is mostly a measurement of whether your prose survives without JavaScript, with a markup check attached. That is defensible, and Google's own JavaScript documentation, last updated 2026-03-04 UTC, describes why: a headless Chromium renders the page only once Google's resources allow, from a queue a page may sit in for a few seconds or longer. Rendering is deferred even at the one crawler everybody knows renders at all. What is not defensible is leaving 25 points on a check that 650 of 972 sites pass outright, because those points cannot separate anyone. They are a quarter of the scale spent on a question the corpus has already answered yes to.
The access weight is not wasted so much as misread, and the honest version of the complaint is narrower than it first looks. When access does fire it is decisive: 16 graded sites scored zero on it and still landed between 17.8 and 69.5, eight of them taking a C, five a D and three an F. rappler.com reached 69.1 and a C while refusing both the search and the assistant crawler groups. That is the arithmetic an earlier post set out when it found that a robots.txt blocking every citation crawler still grades B, and the live corpus has now produced the same shape at C and D. Losing all 25 access points is survivable by design. Whether it should be is a question about the weights, and the weights are a decision, not a measurement.
| Sub-score | Weight | Points available | Points lost | Of its own budget | Of all points lost |
|---|---|---|---|---|---|
| Prose parity | 50 | 48,600 | 14,674 | 30.2 percent | 60.7 percent |
| Schema | 10 | 9,720 | 5,195 | 53.4 percent | 21.5 percent |
| Structure | 15 | 14,580 | 2,807 | 19.3 percent | 11.6 percent |
| Access | 25 | 24,300 | 1,501 | 6.2 percent | 6.2 percent |
Why the schema sub-score lands on zero or one
Schema is the component with the most spread relative to its size, and the distribution explains why. Of the 972 graded sites, 377 scored exactly zero and 334 scored exactly one, so 711 of them, 73.1 percent, sat at one end or the other. A further 152 landed on 0.4. Almost nothing occupies the middle, which means the sub-score behaves less like a measurement of quality than like a test a page either passes or does not.
The zeros are not a scoring artefact and they are not disputed by the page. 373 of the 377 sites that scored zero also carried the no_schema defect, so in all but four cases the scanner found no structured data it recognised rather than finding some and scoring it at zero. The four exceptions are worth naming because they are the more interesting failure: langhamhotels.com, unrivaledsportsco.com, danskebank.dk and bokksu.com each emitted JSON-LD that parsed and each carried the unrecognized_schema defect instead, so the markup is there and says nothing the entity reader counts. That matches what this blog has counted directly: 141 of 382 home pages carried no JSON-LD in the raw HTML on an earlier pass, and 27 of 404 pages with none in the HTML gained some once a browser ran, so a share of the zeros here belong to markup that exists and arrives too late to count for a crawler that does not render.
The reason the sub-score has so little middle ground is the shape of ENTITY_SIGNAL_WEIGHTS, which allocates 35 of 100 to identity, 25 to sameAs, 15 to a stable identifier, 15 to a logo and 10 to a category. Identity is a dependency gate: every other signal is a statement about the identity node, so when no Organization family node qualifies, the four downstream signals cannot be true and the sub-score collapses to zero. A page can emit a great deal of valid JSON-LD and still score nothing here if none of it says who the site is, which is the same two-readings problem an earlier post set out when the same markup produced a perfect score and a zero at once.
The consequence at the grade boundary is worth naming because it is uncomfortable. matchmediagroup.com and crinkles.dev both scored zero on schema and both graded A, at exactly 90.0, because a perfect parity, access and structure reading pays 50 plus 25 plus 15 and lands precisely on the A threshold. Two sites in this corpus carry the top grade from a tool that sells entity confidence while declaring no entity at all. That is what a 10 point weight buys, and a reader deciding whether this score is the one they want should weigh that against the 193 sites which scored zero on schema and still graded B.
What this run did not measure
One page per hostname, which is the home page, on one day, from one network location. A site whose home page is a thin shell over a bundle and whose article pages ship clean server rendered prose scores here as the shell, and the reverse is just as possible. Nothing in this run followed a link, so the corpus-wide figures describe 1,419 front doors and not 1,419 sites. Earlier passes that did go a level deeper found the two can diverge sharply, which is why heading structure on 704 article pages and the main landmark on 1,066 home pages were counted separately rather than assumed to match.
The rendered half of every parity reading came from a headless Chromium on a datacenter address. 35 sites blocked it outright and are reported as ungraded, but a subtler version of the same effect cannot be ruled out: a site that serves a reduced page to an unfamiliar automated browser produces a rendered view that understates what a human visitor sees, which would push its parity up rather than down. The access figures carry the mirror of that problem. 287 hostnames refused the plain fetch entirely, and those are exactly the hosts most likely to have restrictive robots.txt rules, so the access sub-score was computed only on the 972 that let a crawler in. The population that would have dragged access down is the population missing from it.
The corpus itself is an editorial sampling frame, assembled for coverage across platforms and industries rather than drawn at random from the web, so every proportion here describes these 1,419 hostnames and nothing wider. The scan order was a seeded shuffle so that a run cut short would still yield an unbiased sample, but the run completed, so all 1,419 are in. The crawlability study is where the site publishes what it can say about the wider population.
Two things the score does not attempt at all, stated so nobody infers them. It does not measure whether any AI engine cited any of these sites, and nothing in this run asked an engine anything, so a high score is a readability claim and not a visibility outcome. And it gives llms.txt a weight of 0.5 inside a 6.5 point structure checklist, worth a little over one point of the composite, which is close to the position the evidence supports: the file's measured effect on citation is not detectable, and 709 of the 972 graded sites did not publish one. If you want to see the parity comparison on a single URL rather than take the distribution on trust, what GPTBot sees renders both views side by side, and the GEO glossary entry covers the vocabulary this post assumes.
-
One URL per hostHome page only No link was followed, so these are 1,419 front doors rather than 1,419 sites. -
Rendered viewHeadless, datacenter IP A site serving an automated browser less would read as higher parity, not lower. -
Access denominator972 of 1,419 Computed only on hosts that let a crawler in, which omits the most restrictive. -
Harness cap57 hostnames Cut off at 150 seconds by this run, not by the scanner. -
CorpusEditorial frame Assembled for platform and industry coverage, not drawn at random. -
Citation outcomesNot measured No engine was asked anything. A score is a readability claim, not a visibility result.
Lantad
Published .
Every tool in this category prints a number, and a buyer comparing them has no way to tell what the number is made of until it is pointed at their own site. Lantad's AI visibility score is a composite of four measured sub-scores with weights fixed in the scoring config, published on the methodology page. This run turned the scanner on a population rather than a page: every hostname in the committed corpus, scored by the shipped pipeline, with a real browser doing the rendered half of the comparison.
Common questions
What is a good AI visibility score?
Against this corpus, 90 and above puts a page in the top 231 of 972 graded sites and 81.7 is the median, measured on 13 October 2026. The more useful answer is which component the points came from: a site at 80 with parity at 1.0 and schema at 0 has a markup problem that takes an afternoon, and a site at 80 with parity at 0.6 has a rendering problem that takes a rebuild.
Why did my site get no score?
On this run, 447 of 1,419 hostnames produced no grade and the commonest cause by a distance was the site refusing the fetch: 231 answered HTTP 403 to an identified crawler and 35 answered 503. A further 35 served the page and blocked the browser, so parity could not be computed. The scanner withholds the composite rather than estimating the missing part.
Does blocking AI crawlers tank the score?
Less than most people expect, and that is a property of the weights rather than a claim about what blocking costs you. Access carries 25 of the 100 points, so 16 sites in this corpus scored zero on it and still graded between 17.8 and 69.5, eight of them taking a C, with rappler.com at 69.1 refusing both the search and assistant crawler groups.
Is the schema weight of 10 points too low or too high?
This measurement cannot settle it, because the weight is a configured decision and nothing here tested what markup earns on any engine. What it can report is the consequence: schema gave up 53.4 percent of its available points, the largest share of any component, and two sites scored zero on it and still graded A at exactly 90.0.
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.