docs.stripe.com — llms.txt & GEO score
Built for machines, not just declared
docs.stripe.com publishes an unusually large llms.txt: 453 links across 26 sections, 90 KB in all. Past roughly fifty entries a model has to read the whole file before it can choose, so breadth starts working against precision.
452 of those links (100%) point at clean .md copies rather than HTML pages. That is the strongest single signal here and the one most sites skip: a model reads the content instead of the navigation, cookie banner and footer around it.
The clearest gap is publishes llms-full.txt. Right now: No llms-full.txt alongside the index. Closing it is worth 3 points.
Scored out of 92 of a possible 100 points: 6 checks could not be measured on this site, so they were left out of the total rather than failed.
What it does well
- Enough links carry a description 417 of 453 described (92%) — for a map-shaped file the bar is 60%, not every line
- Descriptions say something concrete Average 71 characters across 417 described links
- Descriptions add to the title No description merely repeats its title
- Points at clean markdown copies 452 of 453 end in .md or .txt (100%, detected by file extension)
What is missing
- Publishes llms-full.txt +3 No llms-full.txt alongside the index
- The index is kept current +2 Cannot be confirmed — the server sends no Last-Modified header
- No duplicate links +1 5 duplicate URLs — wasted context
- Server reports when it last changed +1 No Last-Modified header — clients cannot tell when this changed
Among the 22 sites measured here so far, docs.stripe.com ranks 2nd, against a median of 71. That comparison moves as new sites are scanned — it is a snapshot of this list, not of the web.
What docs.stripe.com tells an assistant
Stripe Documentation
Content & links
Can a model pick the right page, first time?
10 of 11 checks pass. What is left: no duplicate links.
-
Enough links carry a description 417 of 453 described (92%) — for a map-shaped file the bar is 60%, not every line10/10
-
Descriptions say something concrete Average 71 characters across 417 described links7/7
-
Descriptions add to the title No description merely repeats its title4/4
-
Points at clean markdown copies 452 of 453 end in .md or .txt (100%, detected by file extension)10/10
-
Link titles are descriptive 7 weak titles (bare URLs, “here”, one-word labels)4/4
-
A workable number of links 453 links, nearly all pointing at machine-readable copies — an exhaustive map rather than a short guide, which is a legitimate shape for a documentation site4/4
-
Skippable links marked Optional An ## Optional section is present3/3
-
No duplicate links 5 duplicate URLs — wasted context1/2
-
List items are markdown links 5 of 458 list items are plain text, not links4/4
-
Grouped so the map stays navigable Median heading group holds 7 links across 38 groups (15 sub-headings)3/3
-
Links are absolute URLs All 453 links are absolute URLs1/1
Structure
Does it follow the llms.txt shape?
5 of 7 checks pass. What is left: summary directly under the title and summary is a usable length.
-
Exactly one H1 project title “Stripe Documentation”3/3
-
Summary directly under the title An opening paragraph is there, but not as a "> " blockquote — clients that look for the quoted summary will miss it2/3
-
Summary is a usable length 410 characters (from the opening paragraph) — too long2/3
-
Concrete language, not marketing filler No marketing filler detected3/3
-
Grouped into balanced sections 26 H2 sections and 15 sub-headings, largest group holds 40 of 453 links4/4
-
Conforms to the published grammar Markdown only, headings used as the spec defines them2/2
-
Section names say what is inside 1 of 26 headings are generic2/2
Discovery & access
Can an assistant reach it, and is it allowed to?
All 5 checks pass in this group.
-
At the root of the domain you typed Found at the standard /llms.txt path2/2
-
Sent as plain text Content-Type: text/markdown; charset=utf-81/1
-
robots.txt exists 174 B of crawler rules1/1
-
AI crawlers are not blocked No AI user-agent is disallowed at the root6/6
-
robots.txt points at a sitemap A Sitemap: line is declared1/1
Search-engine basics
What a crawler reads from your homepage today
The homepage did not answer our request, so these checks were not scored — a failed measurement is not a failing site.
Depth & upkeep
Is there more than the index, and is it current?
1 of 5 checks pass. What is left: publishes llms-full.txt, the index points at the full file, server reports when it last changed and the index is kept current.
-
Publishes llms-full.txt No llms-full.txt alongside the index0/3
-
The index points at the full file No llms-full.txt exists to link to0/1
-
Index is a sensible size 90 KB2/2
-
Server reports when it last changed No Last-Modified header — clients cannot tell when this changed0/1
-
The index is kept current Cannot be confirmed — the server sends no Last-Modified header0/2
What docs.stripe.com should fix next
Ordered by what each one is worth. Open a row for the steps.
-
Right now: No llms-full.txt alongside the index
Generate an llms-full.txt that inlines every linked page. Community convention rather than spec, but assistants with a large context window take the whole thing in one request.
Where: Your docs build, output at /llms-full.txt
- Concatenate the markdown of every page listed in llms.txt into one file.
- Keep the heading structure: a client uses those headings to navigate a multi-megabyte file.
- Regenerate it in the same build step that publishes the docs, so it cannot drift.
- Note that llms-full.txt is a community convention, not part of the proposal — useful, but optional.
-
Right now: Cannot be confirmed — the server sends no Last-Modified header
Regenerate llms.txt when the docs change. A year-old index quietly points models at pages that have moved.
Where: Your build pipeline
- Regenerate llms.txt in the same step that publishes content, so it cannot go stale silently.
- Treat it as a build artifact, not a hand-edited file — hand-edited indexes drift within a quarter.
- An llms.txt with discontinued products is worse than none: a model will repeat the wrong facts confidently.
-
Right now: 5 duplicate URLs — wasted context
Remove repeated URLs. Every duplicate costs context the model could have spent elsewhere.
Where: The link lists in llms.txt
- Remove repeated URLs, including the same page listed under two sections.
- Every duplicate costs context the model could have spent on a page it has not seen.
-
Right now: No Last-Modified header — clients cannot tell when this changed
Let the server send Last-Modified on llms.txt. Without it a client has to re-download the whole file to notice a change.
Where: Your web server configuration
- Serve llms.txt as a real file on disk so the server can derive Last-Modified from its mtime.
- If it is generated by an application route, set the header yourself from the generation time.
- Without it a client has to re-download the whole file to notice a change, and cannot answer "is this current?".
Instead ofHTTP/1.1 200 OK\nContent-Type: text/plain
Do thisHTTP/1.1 200 OK\nContent-Type: text/plain\nLast-Modified: Wed, 10 Sep 2026 08:14:00 GMT
-
Right now: An opening paragraph is there, but not as a "> " blockquote — clients that look for the quoted summary will miss it
Put the opening line in a > blockquote. The spec calls it optional, but it is the first thing a model reads and often the only thing it quotes back.
Where: The line directly under the H1
- Add a single line starting with "> ".
- Answer three things in it: what you do, for whom, and what makes it specific.
- This is the sentence a model is most likely to quote back, so write it last, after the rest of the file.
Instead of> We are an innovative company delivering world-class solutions.
Do this> Industrial spare parts for food processing lines, shipped across Europe with same-week dispatch.
-
Right now: 410 characters (from the opening paragraph) — too long
Aim for 80–350 characters: one or two sentences that make sense read aloud on their own.
Where: The "> " line in llms.txt
- Aim for 80–350 characters: one or two sentences that stand on their own when read aloud.
- Under 80 and it says nothing specific; over 350 and a model summarises your summary.
- Cut adjectives first — they are the part that carries no information.
-
Right now: No llms-full.txt exists to link to
Mention llms-full.txt inside llms.txt. Guessing the filename works often enough to be tempting and not often enough to rely on.
Where: Inside llms.txt
- Mention the full file in llms.txt itself, as a link or a line of context.
- Guessing the filename works often enough to be tempting and not often enough to rely on.
Do thisFull inlined text: https://acme.example/llms-full.txt
This score is Devsly’s own heuristic, not an official standard — llms.txt has no scoring body. It measures how well a file serves an AI assistant, and it does not predict whether any assistant will cite the site. The reading is a snapshot from 19 September 2026; run it again for the current state, or check a different site.
Other recently scored sites
Every scan that finds an llms.txt gets a score card. Cards link back to the full report here, not out to the site.