Primafonte

How the Citability Index is calculated

The Citability Index is a score from 0 to 100 that measures whether a website can be read, understood and cited by a generative model.

The Citability Index is calculated from 33 checks grouped into four weighted layers. This page documents every one of them: what it checks, how it is checked, what threshold counts as a pass, what weight it carries and why it matters to a model.

Which version is this, and what does that mean?

Version 0.15.0 · provisional thresholds, published on 2026-09-05. Methodology changes are logged below and previous scores are not recalculated: every report states which version generated it.

How are the 100 points split?

The index splits 100 points across four layers, and not evenly. What stops a model reading you at all weighs more than what merely shades how it describes you: accessibility and structure take 30 points each, discoverability 25 and entity authority 15. Next to each layer is how many checks it groups.

Discoverability
25 · 7
Content accessibility
30 · 7
Semantic structure
30 · 12
Entity authority
15 · 7

What do the 33 checks look at?

Every check is documented the same way: what it looks at, how it looks at it, the threshold it has to clear, how much it weighs and why it matters to a generative model. That last part is what separates this methodology from classic SEO, and a check that cannot explain it is redundant and gets withdrawn.

Discoverability

robots.txt reachable and parseable

robots_exists

What it checks
Checks that /robots.txt exists, returns 200 and contains recognizable directives.
How it is checked
https://yourdomain/robots.txt is requested and parsed for lines in field: value form. A 200 that returns HTML does not count as a robots.txt.
Passing threshold
Passes with 200 and at least one valid directive. A 404, a server error or HTML served with 200 all fail.
Weight
2 (Discoverability)
Why it matters to a model
robots.txt is the first file any crawler requests. Without it, each agent decides on its own what to do with the site, and whoever publishes the site does not control that decision.

A declared stance towards the crawlers that cite you

robots_ai_rules

What it checks
Checks whether robots.txt declares its own rule for each answer crawler: OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot and Perplexity-User.
How it is checked
A User-agent block is looked up for each agent. Allowing and denying both count: what is measured is that a decision has been declared, not which one. Rules for training crawlers are not required — there are many and they change often.
Passing threshold
Passes with all six declared. Partial with one or more but not all. Fails with none, and also when there is no robots.txt, since then no rule is declared. Inconclusive only when the file cannot be downloaded.
Weight
3 (Discoverability)
Why it matters to a model
An explicit Allow communicates intent to each crawler; a missing rule communicates neglect. Several operators of these models treat sites that name their agents differently, because naming them shows somebody thought about them instead of inheriting a file.

The crawlers that cite you are not blocked

robots_not_blocking

What it checks
Checks that no answer crawler — the ones that fetch the page while composing an answer and cite it — is disallowed from the site root.
How it is checked
robots.txt is evaluated for OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot and Perplexity-User, using the standard rule: the longest pattern wins and Allow wins ties. Training crawlers (GPTBot, ClaudeBot, CCBot, Google-Extended, Bytespider) are NOT considered here: blocking them does not stop anyone citing you.
Passing threshold
Passes if no answer crawler is blocked from /, and also when there is no robots.txt at all, since then nobody is blocked. Blocking all of them is partial; blocking only some fails. Inconclusive only when the file cannot be downloaded.
Weight
3 (Discoverability)
Why it matters to a model
A model cannot cite what it cannot retrieve at answer time. This is the distinction most often confused: closing the door to training while leaving it open to answering is a perfectly coherent policy, and only the second half affects whether you get cited.

Training crawlers: your policy, one by one

training_crawlers

What it checks
Shows, for each crawler that collects content to train models, whether your robots.txt allows or blocks it. Informational: it adds no points and takes none away.
How it is checked
robots.txt is evaluated for GPTBot, ClaudeBot, CCBot, Google-Extended, Bytespider, Applebot-Extended and meta-externalagent, and the state of each one is listed.
Passing threshold
No threshold, and it neither passes nor fails: all 7 training crawlers are listed with their state, and allowing or blocking them does not move the Citability Index by a single point. With no robots.txt, it reports that none are blocked.
Weight
0 (Discoverability)
Why it matters to a model
Blocking training does not stop a model citing you: they are different things handled by different agents. It is a decision about how your work is used, legitimate either way, so it is reported without being judged. If keeping your content out of model training matters to you, this is where you check that your policy says what you think it says.

Sitemap declared and reachable

sitemap_declared

What it checks
Checks that a valid XML sitemap exists and that robots.txt announces it.
How it is checked
The Sitemap directive in robots.txt is read and, failing that, /sitemap.xml is tried. The file must return 200 and contain a urlset or a sitemapindex.
Passing threshold
Passes if the sitemap is valid and declared in robots.txt. Partial if reachable but unannounced. Fails if missing or not valid XML.
Weight
2 (Discoverability)
Why it matters to a model
The sitemap is the full list of what a site considers important. Without it, a crawler only finds what is linked from wherever it entered, and deep pages may never be discovered.

Modification dates in the sitemap

sitemap_fresh

What it checks
Checks what share of the sitemap's URLs declares a recent lastmod date.
How it is checked
loc tags and parseable lastmod tags are counted, and the percentage carrying a date within the last twelve months is calculated.
Passing threshold
Passes above 50% of URLs with a recent lastmod. Partial with some. Fails with no dates at all.
Weight
1 (Discoverability)
Why it matters to a model
A crawler on a budget uses lastmod to decide what to re-read. A sitemap without dates forces it to treat everything alike, so what changed yesterday gets re-read whenever, not when it matters.

llms.txt file

llms_txt

What it checks
Checks whether a /llms.txt exists in Markdown with a heading and links.
How it is checked
https://yourdomain/llms.txt is requested and checked for not being HTML, having at least one Markdown H1 and at least one link.
Passing threshold
Passes with H1 and links. Partial with only one of the two. Fails if missing or returning an HTML page.
Weight
2 (Discoverability)
Why it matters to a model
llms.txt is a Markdown index meant to let an agent understand what the site is about and where to start, without inferring it from the navigation menu. It is cheap to maintain and still uncommon.

Link discovery headers

link_headers

What it checks
Checks whether the home page sends an HTTP Link header with rel canonical or alternate.
How it is checked
The Link header of the home page response is inspected for rel="canonical" or rel="alternate".
Passing threshold
Passes with either present. Fails with no Link header.
Weight
1 (Discoverability)
Why it matters to a model
A crawler that only reads headers, without parsing HTML, gets the canonical and the alternate versions of the page before downloading the body. For an agent walking thousands of URLs, that signal resolves duplicates without spending an extra request.

Content accessibility

Render ratio

render_ratio

What it checks
Measures what share of the visible text already exists in the initial HTML, before JavaScript runs.
How it is checked
Text is extracted from the raw HTML and from the page after loading it in a real browser until networkidle, both normalized by stripping whitespace, and then divided.
Passing threshold
Passes at a ratio of 0.80 or above. Partial between 0.50 and 0.79. Fails below 0.50.
Weight
4 (Content accessibility)
Why it matters to a model
Most AI crawlers do not run JavaScript. They see the page as it leaves the server, and if the content is injected afterwards they find a nearly empty document and have nothing to cite. This is the check most websites fail.

Main content without JavaScript

main_content_in_html

What it checks
Checks that the H1 and a substantive paragraph exist in the raw HTML.
How it is checked
The downloaded HTML is searched, without executing anything, for an H1 with text and at least one paragraph of twelve words or more.
Passing threshold
Passes with H1 and paragraph. Partial with an H1 but no paragraph. Fails with no H1.
Weight
3 (Content accessibility)
Why it matters to a model
The H1 and the first paragraph are what a model uses to decide what the page is about. If they arrive empty, the rest of the content is irrelevant: the page does not enter the answer because nobody knows what it discusses.

Markdown content negotiation

markdown_negotiation

What it checks
Checks whether the server returns Markdown when the client asks for it.
How it is checked
The home page is requested with the header Accept: text/markdown and the response is checked for 200 with content-type text/markdown.
Passing threshold
Passes with 200 and content-type text/markdown. Fails otherwise.
Weight
1 (Content accessibility)
Why it matters to a model
An agent that receives Markdown skips parsing HTML and does not drag menus, footers or cookie notices into the passage it cites. It is a cheap advantage and still rare.

Clean redirect chain

status_and_redirects

What it checks
Checks that reaching the home page does not require several hops and that the final destination is https.
How it is checked
Redirects are followed one by one, recording every URL, and loops are detected by comparing the chain travelled.
Passing threshold
Passes with one hop or none and an https destination. Partial with two hops. Fails with more than two, with a loop, or if the destination is not https.
Weight
2 (Content accessibility)
Why it matters to a model
Every hop is one more request and one more chance to lose headers, cookies or the crawler itself. Some clients stop following the chain before the end, and for them the site simply does not respond.

Time to first byte

ttfb

What it checks
Measures how long the server takes to start responding.
How it is checked
Timed from opening the request to the arrival of the first response headers of the home page.
Passing threshold
Passes below 800 ms. Partial between 800 and 1600 ms. Fails above 1600 ms.
Weight
1 (Content accessibility)
Why it matters to a model
Response time shapes how many pages an agent crawls per visit. A slow server does not prevent a page from being cited, but it reduces how many pages get read at all.

Same content for bots and for people

bot_parity

What it checks
Compares the text served to a browser with the text served to a crawler.
How it is checked
The home page is requested twice, once with a browser user-agent and once with PrimafonteBot's, and the length of the visible text extracted from each response is compared.
Passing threshold
Passes below 10% difference. Partial below 30%. Fails above that.
Weight
3 (Content accessibility)
Why it matters to a model
Serving a bot a different version of the page is cloaking, whether or not whoever configured the cache knows it. The model indexes what it receives, not what a person sees, and the gap turns into wrong citations or none.

The crawler is not blocked

waf_block

What it checks
Checks that the site does not answer a bot user-agent with a block or a captcha.
How it is checked
The home page is requested with PrimafonteBot's user-agent and the status code and response text are inspected for browser-verification notices.
Passing threshold
Passes with 200 and no captcha. Partial with another non-blocking code. Fails with 401, 403, 429, or a captcha served with 200.
Weight
3 (Content accessibility)
Why it matters to a model
A firewall that blocks bots by default also shuts out AI crawlers. A 200 that serves a captcha blocks just as effectively as a 403, and it additionally fools anyone who only looks at the status code.

Semantic structure

Structured data present and valid

jsonld_present

What it checks
Checks that there is JSON-LD structured data and that it works: that the JSON parses and that each type carries the fields schema.org marks as required.
How it is checked
Declared blocks and successfully parsed blocks are counted. Required fields are then checked on each parsed type.
Passing threshold
Passes with valid and complete structured data. Partial with one or two required fields missing. Fails with no structured data, a block that does not parse, or more than two missing fields.
Weight
4 (Semantic structure)
Why it matters to a model
Structured data is how a model confirms who you are without having to infer it from prose. Not having it leaves that inference to chance, and having it broken is worse than not having it: to a model the block does not exist, while whoever wrote it believes it does.

Entity and business types declared

jsonld_entity_types

What it checks
Checks that the site declares who publishes it and what it offers.
How it is checked
The declared types are searched for an entity type such as Organization or Person, and for one describing the offering such as SoftwareApplication, Product, Service or Article.
Passing threshold
Passes with both present. Partial with only one. Fails with neither.
Weight
2 (Semantic structure)
Why it matters to a model
A model needs to resolve two separate questions: who these people are and what they sell. Declaring only one leaves half the answer open to interpretation, and that is where wrong descriptions come from.

Heading hierarchy

heading_hierarchy

What it checks
Checks that there is a single H1 and that no level is skipped.
How it is checked
All headings are extracted in document order, H1s are counted, and skips are detected, such as going from H2 to H4 with no H3.
Passing threshold
Passes with exactly one H1 and no skips. Partial with two H1s or up to two skips. Fails with no H1, more than two, or several skips.
Weight
2 (Semantic structure)
Why it matters to a model
Headings are the document's outline. A skipped level leaves a block hanging off nothing, and the chunking a model performs in order to cite passages leans on exactly that structure.

Direct answers after each heading

direct_answers

What it checks
Checks whether the first paragraph following each H2 answers that heading. It is measured on an inner content page — an article, a guide, the documentation — and not on the homepage.
How it is checked
An inner page is chosen from the sitemap or the homepage links, always the same one for a given site. For each H2 the first following paragraph is taken and scored: the 40 to 80 word band scores one point, the 25 to 120 range scores half, and starting with a connector that depends on the previous paragraph scores zero. If the site has no readable inner page, the homepage is measured instead and the report says so.
Passing threshold
Passes at an average score of 60% or above. Partial from 30%. Fails below that.
Weight
3 (Semantic structure)
Why it matters to a model
A model does not cite pages, it cites passages. A heading followed by a paragraph that answers it produces a fragment that stands on its own; followed by a transition or an image, it produces nothing citable. The homepage of a commercial site is a shop window of five-to-ten-word lines: it measures how well it sells, not how well it can be cited.

Question-shaped headings

question_headings

What it checks
Checks what share of the H2 and H3 headings is written as a question.
How it is checked
Measured on the same inner page as direct answers. A heading counts as a question when it ends in a question mark, opens with the inverted mark, or starts with an interrogative — how, what, why, when, where, which, who, or their accented Spanish equivalents.
Passing threshold
Passes at 30% or more question-shaped headings. Partial with at least two. Fails below that.
Weight
2 (Semantic structure)
Why it matters to a model
A model retrieves passages by looking for the one that answers the query it was given, and that query usually takes the shape of a question. A heading written as the question someone actually types, followed by an answer that stands on its own, produces the complete pair these systems prefer: the heading works as an index and the paragraph as content. A heading like "Our services" looks like no query at all.

Paragraphs that stand outside their context

chunk_independence

What it checks
Checks what share of the paragraphs makes sense without having read the previous one.
How it is checked
Paragraphs of twenty words or more are taken and their first sentence is searched for a pronoun or deictic with no antecedent, such as it, this, here or the above.
Passing threshold
Passes with 50% or more independent paragraphs. Partial from 25%. Fails below that.
Weight
3 (Semantic structure)
Why it matters to a model
A passage is citable only if it makes sense on its own. A paragraph opening with that is fixed by forces the model to drag in the previous paragraph, and as soon as the fragment is trimmed it loses meaning and stops working as a source.

Title and meta description length

title_meta

What it checks
Checks that the title and meta description fit the space they are given.
How it is checked
The character length of the home page title and of the meta description content attribute are measured.
Passing threshold
Passes with a title of 30 to 60 characters and a description of 110 to 160. Partial if only one is in range. Fails if neither is, or if they are missing.
Weight
2 (Semantic structure)
Why it matters to a model
The title and meta description are the summary a site writes about itself, and both search engines and models reuse them verbatim when presenting it. A truncated title or an absent description hand that summary to whoever reads it.

Structured frequently asked questions

faq_markup

What it checks
Checks whether there is a question-and-answer block marked up as FAQPage.
How it is checked
A JSON-LD FAQPage block is looked for. Question-shaped headings and mentions of frequently asked questions are also detected, to tell apart a site that has the content but has not marked it up from one that does not have it at all.
Passing threshold
Passes with a FAQPage block. Partial when there are visible questions left unmarked. Fails when there is neither.
Weight
2 (Semantic structure)
Why it matters to a model
The FAQ block is the most cited part of a website, because every question is already a self-contained fragment with its answer beside it. Not having one is not neutral: it leaves out the format models quote most readily. This is measured from the point of view of models and agents, not of classic search rankings.

Descriptive anchor text

internal_links

What it checks
Checks what share of the internal links uses text that says nothing about the destination.
How it is checked
Internal links on the home page are collected and their text compared against a list of generic anchors such as read more, here or click here.
Passing threshold
Passes below 10% generic anchors. Partial below 25%. Fails above that. With fewer than five internal links it does not score.
Weight
2 (Semantic structure)
Why it matters to a model
Anchor text is one of the signals a model uses to understand what the destination page covers before visiting it. A read more contributes none, and wastes the link as a signal.

Links to external sources

external_sources

What it checks
Checks how many outside domains the content links to.
How it is checked
Distinct domains linked from the inner content page are counted, excluding links in the footer and navigation, links to the site itself or its subdomains, and social media profiles, which are identity rather than backing.
Passing threshold
Passes at three or more distinct domains. Partial with one or two. Fails with none.
Weight
3 (Semantic structure)
Why it matters to a model
This is one of the few things with a measured effect: the original study on generative engine optimization found that citing sources, adding quotations and supplying data can raise visibility in answers by up to 40%. Content that links to what it claims gives the model something to check against, and a model will sooner cite what it can verify than what it can only take on trust.

Data in the content

data_points

What it checks
Checks what share of the paragraphs carries a concrete figure.
How it is checked
Paragraphs of twenty words or more on the inner content page are examined for a percentage, an amount, a magnitude with a unit — including time — or a large figure with thousand separators. Bare one or two digit numbers do not count: on a website they are usually sizes, steps or list numbering.
Passing threshold
Passes at 25% or more of paragraphs carrying a figure. Partial with at least one. Fails with none.
Weight
2 (Semantic structure)
Why it matters to a model
This is one of the few things with a measured effect: the original study on generative engine optimization found that supplying data, along with citing sources and adding quotations, can raise visibility in answers by up to 40%. A claim with a figure inside it is easier to retrieve and to attribute than one without, because the figure anchors the passage to something checkable.

Lists and tables

scannable_formats

What it checks
Checks whether the content uses lists and tables rather than running prose alone.
How it is checked
Lists of three or more items and tables on the inner content page are counted. A table counts as two lists. Those in the footer and navigation are excluded, although that exclusion relies on the site using semantic tags: a menu built out of divs cannot be told apart from a content list.
Passing threshold
Passes at three points, counting each list as one and each table as two. Partial with at least one. Fails with none.
Weight
2 (Semantic structure)
Why it matters to a model
A list and a table come pre-chunked: each item stands on its own and a model can retrieve one without dragging the rest along. A paragraph with the same six things separated by commas says as much and cannot be extracted in parts. A table adds its own headers, which is context that travels with the row.

Entity authority

Brand name consistency

name_consistency

What it checks
Checks that the brand is written the same way in JSON-LD, in Open Graph and in the title.
How it is checked
The name declared in JSON-LD is taken as the reference and compared with og:site_name and with the title's segments, ignoring case, accents and punctuation.
Passing threshold
Passes if every available source agrees. Partial if one disagrees. Fails if all disagree. With a single source it does not score.
Weight
3 (Entity authority)
Why it matters to a model
A model has to resolve the brand to one entity. Three variants of the name on the same page produce three candidates, and the authority that should accumulate on one gets split across all three.

Description consistency

description_consistency

What it checks
Checks that the meta description, the Open Graph one and the JSON-LD one say the same thing.
How it is checked
They are compared pairwise using the Dice coefficient over words, ignoring case and accents, and the worst-scoring pair decides.
Passing threshold
Passes at a similarity of 0.80 or above. Partial from 0.50. Fails below that. With a single description it does not score.
Weight
3 (Entity authority)
Why it matters to a model
The description is the sentence a model will use to introduce the site when it cites it. Two different versions force a choice, and the one chosen is not always the one the publisher wanted.

Identifiable company or author page

about_page

What it checks
Checks that a page exists explaining who is behind the site.
How it is checked
Links whose target or text points at an about, about us, company or team page are looked for, failing which an entity declared in JSON-LD with url or @id.
Passing threshold
Passes with a link to the page. Partial with only an entity declared in JSON-LD. Fails with neither.
Weight
2 (Entity authority)
Why it matters to a model
The about page is where a model confirms there is a real entity behind the site. Its absence does not prevent citation, but it lowers confidence in content that cannot be attributed to anyone.

Readable contact details

contact_verifiable

What it checks
Checks that there is an email or a phone number a machine can read.
How it is checked
An email or phone number is looked for in the visible text and in mailto and tel links, failing which in the email and telephone fields of the JSON-LD.
Passing threshold
Passes with contact details in the visible text or in a link. Partial if only declared in JSON-LD, or if the phone appears without a link. Fails with neither.
Weight
2 (Entity authority)
Why it matters to a model
A model does not fill in forms. Contact details that only exist behind a form, inside an image or obfuscated in JavaScript cannot be cited or verified, and they are one of the signals that mark out a real business.

External profiles declared with sameAs

sameas_links

What it checks
Checks how many external profiles the site declares through the sameAs property.
How it is checked
All sameAs values across the JSON-LD blocks are collected. If there are none, the HTML is checked for links to known profiles.
Passing threshold
Passes with two or more sameAs entries. Partial with one, or with two profiles linked but undeclared. Fails with none.
Weight
3 (Entity authority)
Why it matters to a model
sameAs is what lets a model tie the site to every other trace of the same entity: LinkedIn, GitHub, a company register. Without that link, each trace resolves as a separate entity and none accumulates enough signal to get cited.

Publication and revision date

content_freshness

What it checks
Checks whether the content states when it was written or last revised.
How it is checked
datePublished and dateModified are looked for in the structured data of the inner content page, taking the most recent. Only declared dates are used: recognising visible ones across two languages and twenty formats is fragile, and a check that gets it wrong subtracts more than it adds.
Passing threshold
Passes with a date under twelve months old. Partial up to thirty-six. Fails if older, or if there is none.
Weight
2 (Entity authority)
Why it matters to a model
A model answering about something changeable prefers the source it can date. With no declared date there is no way to know whether the content still holds, and in doubt what can be placed in time gets cited first. The threshold is deliberately generous: some content does not expire, and penalising it for not being touched would reward cosmetic edits.

Declared authorship

author_declared

What it checks
Checks whether the content states who wrote it.
How it is checked
The author field is looked for in the structured data of the inner content page, and it must carry a name. An empty author, or one without a name, counts as decorative markup.
Passing threshold
Passes with a named author. Partial with the field present but unnamed. Fails with no author.
Weight
1 (Entity authority)
Why it matters to a model
Without a byline a model has nobody to attribute what it cites to, and attribution is part of citing. The evidence that this affects citations comes from observed cases rather than measurement, so this check carries little weight: it is plausible and cheap to fix, but not demonstrated the way data and sources are.

What does this index not measure?

The Citability Index does not measure the quality of your content, your reputation, your inbound links or whether a model mentions you today. It measures whether the technical and structural possibility of being cited exists at all.

What are its limitations?

Publishing the limits of a measurement looks like it costs you and does the opposite: it is what separates a methodology from a brochure. These five are the ones we know about, and they are written so anyone can decide how much weight to give a particular number in their own case.

  • Generative engines do not publish the internal weights they use to select sources. The Citability Index measures observable, reasoned signals, not a formula reproduced from any specific model.
  • Results vary between engines. A site can be perfectly readable to one crawler and still fall outside another's answers, on selection criteria that are not technical.
  • Several of the standards being checked are still being defined. The clearest case is llms.txt: there is a de facto convention, not a settled specification, and its weight may change.
  • Checks run against the home page and the resources it declares. A site may have internal sections that behave differently from its front page.
  • The render ratio is measured with a browser that does execute JavaScript, while each AI crawler decides on its own whether and how far to execute it. The ratio indicates risk, not the exact behaviour of any specific engine.
  • The content checks do not treat every language equally. Words are counted correctly in any script, including those that do not separate them with spaces, but the lists of connectors and deictics used to spot a paragraph that does not stand on its own exist only in Spanish and English. In other languages those markers go unrecognised and the paragraph passes. The bias always runs the same way: in case of doubt, nothing is penalised.

What is the methodology built on?

The checks do not come from an opinion about how the web ought to be. Each one implements a published standard or a measured finding, and these are the four references the engine applies literally, not recommended reading.

  • GEO: Generative Engine Optimization

    The study that measured the effect of citing sources, supplying data and adding quotations: up to 40% more visibility in answers. The weight of the two content checks comes from it.

  • schema.org

    The vocabulary structured data is validated against: which types exist and which fields each one marks as required. Both JSON-LD checks apply it.

  • RFC 9309

    The standard that settles how a robots.txt is read, including the rule that the longest pattern wins and that Allow wins a tie. The three crawler checks apply it.

  • llms.txt

    The proposed Markdown index file for agents. It is a de facto convention rather than a settled specification, which is why its weight in the index may change.

What has changed, and when?

Every version states what moved and why, almost always with the figure that prompted it up front. Old scores are never recalculated: a report describes how that website stood on the day it was measured, under that day’s criteria, which is why each one carries its version printed on it.

  1. 0.15.0 · 2026-09-05

    The engine confused two things that are not alike: not having been able to read a file, and having read it and found nothing there. A 404 is a fact you can reason from —if there is no robots.txt, nobody is being blocked— and there the check must decide. A 401, a 403 or a 429 say the opposite: the file exists and we are not allowed to see it. That case sat next to the 404 because of a comparison against two hundred that swallowed the difference, and it produced both lies at once. A site behind a web application firewall was told it has no readable robots.txt, that its sitemap is not declared, that it publishes no llms.txt and that it does not answer Markdown negotiation: four claims about files that exist and work. And at the same time it was passed on its robots.txt not blocking any answer crawler, which is a pass on a file that was never read. In the calibration sample this happens to fifty of two hundred and ninety-nine sites, one in six. From this version those three codes leave the five affected checks inconclusive, and the block is still reported by the check that exists for it. The redirect chain title is fixed too: it always talked about hops, so a blocked site read «reaching the home page takes 0 redirect hops», the optimum presented as a defect. The branches that are not about hops —the response status and a destination ending on http— now carry their own wording. Previous scores are not recalculated.

  2. 0.14.0 · 2026-08-19

    Two checks stop penalising Chinese, Japanese and Korean for writing more densely. The first: headings written as questions went unrecognised, because those languages close with «?», the full-width mark, and only the Latin keyboard one was being looked for. On our own Chinese methodology page they scored zero out of forty-one, with every section heading written as a question. The second: the length bands for the title and the description are calibrated on the Latin alphabet, thirty to sixty characters and one hundred and ten to one hundred and sixty, and they exist because search engines truncate by width. A Chinese character takes twice the space of a Latin letter and says considerably more: the title of that same page is twenty-two characters and conveys what fifty do in Spanish, so it failed for saying it in less room. In those scripts the bands are halved. Outside them nothing changes at all, and the calibration across the sample of 299 European and American domains was run precisely to confirm that. Previous scores are not recalculated.

  3. 0.13.0 · 2026-08-18

    Two fixes to the choice of inner page, on which five checks depend at once. The first: «www.example.com» and «example.com» are the same site, and the engine treated them as separate origins. On ruanyifeng.com, a Chinese technical blog, the eighteen article links on its own index point at «http://www.ruanyifeng.com/blog/...»; scanning the domain without «www» threw all eighteen away, left no article among the candidates, and the content checks ended up measuring a list of headlines. The second: where the chosen page turns out to be a section index, the engine now descends once to its first article. One hop and not several, because that download is sequential and comes out of the same time budget as the rest of the scan; if the hop brings back nothing better, the index is kept, because measuring something worse beats measuring nothing. The choice stays deterministic: the same site always yields the same page, or the score would stop being reproducible. Still unresolved is the case where the chosen page is in a different language from the rest of the site. Previous scores are not recalculated.

  4. 0.12.0 · 2026-08-18

    The check for paragraphs that stand outside their context was failing almost every Spanish-language website. It detected whether a paragraph depends on the previous one by looking for pronouns and deictics, but the list included «la», «los» and «las», which are articles rather than deictics, and it searched anywhere in the first sentence instead of at its start. With that, «Los umbrales se calibraron midiendo una muestra propia» came out marked as dependent. A deictic in mid-sentence usually has its antecedent inside that same sentence, so it is bound; the one that leaves a paragraph hanging is the one that opens it. Only the opening now counts, and only unambiguously pronominal forms: «esto», «eso», «ello», «it», «lo anterior» and explicit anaphors. «Este» and «this» are left out on purpose, because they work as pronoun and as determiner alike and cannot be told apart without morphological analysis: in case of doubt, nothing is penalised, which is this layer’s stated rule. The published fix already described this behaviour; the code did not. Previous scores are not recalculated, so this check’s figure in the calibration study reflects the old criterion.

  5. 0.11.0 · 2026-08-18

    The engine now counts words properly in Chinese, Japanese and Korean. Those languages do not separate words with spaces, and the engine was counting by splitting on whitespace: across five real articles from a Chinese technical blog, of 1,579 paragraphs exactly 2 passed the twenty-word filter. Counted properly, 560. That left any Chinese, Japanese or Korean website with nothing to measure in the paragraphs that stand outside their context and in the data in the content, and with direct answers failing even where they answered the heading perfectly. The module’s own header stated that the language bias always runs the same way, never penalising in case of doubt, and there it ran exactly the other way. Counting now uses the platform word segmenter, which genuinely segments those languages, rather than an invented conversion constant. Outside those scripts the count is identical to before, character for character: the score of a website in Spanish, English, German, French, Italian or Portuguese does not move by a single point, and a test checks that against every published string on the site. Previous scores are not recalculated.

  6. 0.10.0 · 2026-08-06

    Five new checks and a change in which page gets measured. Two of the five come from the only thing rigorously measured in this field: the original study on generative engine optimization found that citing sources, supplying data and adding quotations can raise visibility in answers by up to 40%. Hence links to external sources, counting how many outside domains the content links to, and data in the content, looking at what share of paragraphs carries a concrete figure. The other three come from published recommendations: lists and tables, which are fragments that arrive pre-chunked; the publication and revision date declared in structured data; and authorship, which carries little weight on purpose because its evidence comes from observed cases rather than measurement. The choice of inner page also changes: an article now takes precedence over an institutional page. That came from finding that on Xataka we were measuring the team page, made of biographies, where the content checks scored zero across sixty-nine paragraphs. Xataka was not writing badly; we were looking at the wrong page. Scoring checks go from 28 to 33. Previous scores are not recalculated.

  7. 0.9.0 · 2026-08-06

    The description-consistency check no longer compares the publisher's description against the page's. An Organization describes the publisher by schema.org definition, and at a company with several lines of business it need not resemble the page at all: comparing them forced a false description into one of the two, either the company described as if it were the product or the other way round. It is now compared against the description of the entity that states what the site offers — SoftwareApplication, Product, Service, Article and their kin — falling back to the publisher's only when there is none, which is the case of a company site with no product, where the company description genuinely is the page description. The fix is not an amnesty: a product description that contradicts the page still fails, and so do two meta descriptions that diverge from each other, which was the case the check already caught well. Previous scores are not recalculated.

  8. 0.8.0 · 2026-08-05

    One new check: whether headings are written as questions. It was already checked that each heading was followed by a 40 to 80 word answer standing on its own, but not that the heading itself looked like something a person would type. The unit these retrieval systems prefer is the complete pair — a recognisable question above, a self-contained answer below — and only half of that pair was being measured. It is measured on the same inner page as direct answers, because measuring them on different pages would describe two places and no pair at all. A heading counts as a question when it carries a question mark and also when it opens with an accented interrogative, because in Spanish the accent is precisely what separates the interrogative from the relative. Thresholds are a starting point and will be revised against the calibration sample. Scoring checks go from 27 to 28. Previous scores are not recalculated.

  9. 0.7.0 · 2026-08-04

    Headings inside the footer, the navigation and sidebars are no longer counted as content. Measuring a sample of real websites showed that 43% of headings lived inside <footer> or <nav> — 81% at HubSpot, 53% at Mailchimp — and every one of them was counted. An <h2>Services</h2> in a footer carries no paragraph beneath it because it should not, so its presence made any site with an ordinary footer fail the direct-answers check: only 5% passed, and the cause was not how people write but how we were counting. It affects direct answers, heading hierarchy and FAQ detection, and all three gain accuracy. The H1 in the header still counts: many sites place it there. Previous scores are not recalculated.

  10. 0.6.0 · 2026-08-04

    First version calibrated against a large sample: 299 websites from Spain, the United Kingdom, the United States and the rest of Europe, spanning brands, services and mid-sized companies. Three changes come out of that data. The two structured-data checks are merged into one: the validity check passed 95% of those who reached it and did not apply to the remaining 26%, because JSON-LD is almost never written by hand and what a plugin generates is rarely broken; a single check now tells apart not having it, having it broken and having it right, at the same weight. Paragraphs that stand on their own are now measured on an inner page, as direct answers already were: the homepage did not have three twenty-word paragraphs in 78 of the 215 fully measured websites, and with no readable page carrying content the check now fails rather than staying silent. And the downloadable badge drops from 80 points to 70: at 80 it was reached by 6 of 215 websites, and a badge almost nobody can put on their site does not circulate. Scoring checks go from 28 to 27. Previous scores are not recalculated.

  11. 0.5.0 · 2026-08-04

    Two checks stop declaring themselves unable to decide when in fact they can. Having no question-and-answer block marked up as FAQPage now FAILS rather than not applying: it is what generative models quote most, so a site without one is worse prepared to be cited than a site with one, and redistributing its weight across the others asserted the opposite. Having the questions on screen without marking them up scores partial, because that is a ten-minute fix and writing them from scratch is not. And a site with no reachable sitemap now fails the freshness check instead of coming back inconclusive — including the case of a server answering /sitemap.xml with 200 and the homepage in HTML, which is what single-page frameworks do. Inconclusive is kept only where it is genuinely unknown: a network failure, or a server that exists and will not let us look. Across a sample of 24 websites these two did not score in 67% and 42% of cases. The draft suffix moves out of the version identifier and into the text, translated per language. Previous scores are not recalculated.

  12. 0.4.0 · 2026-08-04

    Direct answers are measured on an inner content page, not on the homepage. A calibration across 24 real websites found that all 24 failed it, Stripe and Cloudflare included: the homepage of a commercial site is a shop window, and the paragraphs following its headings run between five and seventeen words, because they are written to be taken in at a glance rather than to be quoted. A check that everyone fails distinguishes nobody, however true it may be. An inner page is now chosen from the sitemap or the homepage links — always the same one for a given site, so the score stays reproducible — and measured there; if the site has no readable inner page the homepage is used instead, and the report states which one was measured. Previous scores are not recalculated.

  13. 0.3.0 · 2026-08-03

    Checks that depend on robots.txt no longer declare themselves unable to decide when the file does not exist. A site having no robots.txt is not ignorance, it is a fact with consequences: if there is no file, nobody is blocked, so the blocking check now PASSES and the declared-rules check now FAILS because there are none. Previously both were inconclusive alongside the informational training check, and those three alone pushed any site without a robots.txt towards the partial-report threshold, leaving it out of the statistics. Inconclusive is kept only when the file cannot be downloaded, where we genuinely do not know. Earlier scores are not recalculated.

  14. 0.2.0 · 2026-08-03

    AI crawlers are split into two families. Blocking the training ones (GPTBot, ClaudeBot, CCBot, Google-Extended, Bytespider) no longer costs points: it is a legitimate decision about how your work is used and it does not stop a model citing you. Only blocking the answer crawlers (OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot, Perplexity-User) is penalised, since those are the ones that fetch the page while answering. They used to be counted together, which failed as a critical error the most defensible policy available today. Earlier scores are not recalculated.

  15. 0.1.0 · 2026-08-02

    First public version of the methodology. Thresholds are provisional and will be frozen in version 1.0, after calibration against a sample of 200 websites. Until then, scores may vary between scans.

Citability Index methodology — Primafonte