Slot 1 is open
$20 a month
Free AI crawler checker
See your site's crawler access and machine-readable content. Get a score out of 100, the findings behind it and fix prompts for your coding agent.
Real reports
Home page slots with a dofollow backlink. Featured never changes a website’s score.
How Featured worksA real report · stripe.com · scanned 27 Oct 2026

Stripe
stripe.com
44 of the 50 base points, 31 of the 50 agent-layer points, no penalties.
robots.txt is present and valid. robots.txt is valid, with 3 user-agent groups.
Sitemap is present and parses. Sitemap declared in robots.txt, listing at least 1000 URLs.
Describes itself to machines with schema.org JSON-LD. All 4 pages read pass. The homepage describes itself to machines as WebSite, Organization, Person in valid schema.org JSON-LD.
Content is marked up so a reader can find it. 2 of 4 pages read pass; 1 partly. The page at /en-de/pricing is barely structured: No <main> element and nothing carrying role="main". +5 with its prompt.
Navigation links expose usable destinations. 8 of 8 assessed homepage navigation links expose usable destinations.
Links and buttons have accessible names. 205 of 205 assessed homepage links and buttons have a nonempty accessible name.
Form fields have names and recognizable semantics. 1 of 1 assessed homepage form fields meet the static naming and field-semantics checks.
Controls expose roles, states and relationships. 258 of 259 assessed homepage controls and role declarations meet the static role, state and relationship checks. +1.3 with its prompt in Pro.
Each page declares one usable canonical URL. All 4 pages read pass. The homepage declares itself as its canonical URL.
Section links reach an element on the page. Both pages read pass. The page at /en-de/pricing has 55 section links, and every one reaches an element on the page.
llms.txt is present and well formed. /llms.txt is well formed: 305 links across 31 sections.
llms.txt is descriptive, not a bare link list. /llms.txt is descriptive: a summary plus descriptions on 100% of links.
Serves markdown at its own URL. llms.txt points at 24 markdown versions of pages.
Serves markdown when asked for it. None of the 4 pages read pass. Asking the homepage for markdown still returns text/html. +10 with its prompt.
States a position on AI crawlers. robots.txt names no AI crawlers, so every operator has to guess. +5 with its prompt.
Declares AI usage preferences. No usage declaration found in robots.txt or the final successful homepage response header. +2.5 with its prompt in Pro.
Advertises machine-readable resources with typed links. None of the 4 pages read pass. The homepage's links are all ordinary page furniture; none point an agent anywhere. +1.3 with its prompt in Pro.
Markdown negotiation
None of the 4 pages read pass. Asking the homepage for markdown still returns text/html.
My website stripe.com scored 75/100 on Good for Bots (Good). Good for Bots measures one thing: whether a language model can read a site and cite it. I need you to: serve markdown through content negotiation on all public HTML routes. The check it fails is "Serves markdown when asked for it", worth 10 points. What the scanner saw: None of the 4 pages read pass. Asking the homepage for markdown still returns text/html. The scan checked a sample of 4 pages. It does not establish which other pages have the same issues. Use the findings below to locate the responsible templates, components or configuration, and apply the fix wherever the same issue occurs. Pages in the sample with findings: - https://stripe.com/en-de: Asking the homepage for markdown still returns text/html. - https://stripe.com/en-de/blog/introducing-our-agentic-commerce-solutions: Asking the page at /en-de/blog/introducing-our-agentic-commerce-solutions for markdown still returns text/html. - https://stripe.com/en-de/pricing: Asking the page at /en-de/pricing for markdown still returns text/html. - https://stripe.com/en-de/products: Asking the page at /en-de/products for markdown still returns text/html. Implement content negotiation across all public HTML routes, including page types outside the scan's sample. Put it in the shared response handling or the handlers for each page type, so new pages receive it too. Agents need the content of any page they follow, including pages the report did not name. When a request arrives with `text/markdown` in its `Accept` header, the same URL that serves HTML to a browser should return a markdown rendering of that page's content. Requests without that header must keep getting the HTML exactly as they do now. The response must: - set `Content-Type: text/markdown; charset=utf-8`; - include `Accept` in the `Vary` header, so shared caches never serve the markdown to a browser or the HTML to an agent (RFC 9110 says a server SHOULD send `Vary` whenever the representation depends on a request header); - contain real markdown, not HTML with a different header on it; - drop `ETag` and `Last-Modified` for the converted response, since a conditional request cannot be honoured against a body generated on the fly. Work out how to do this in whatever stack this project uses. If the site is behind Cloudflare on a paid plan, the "Markdown for Agents" zone setting does all of the above and is the least invasive option. Otherwise implement it in the framework: middleware inspecting the `Accept` header, a route handler that returns the markdown source, or whatever fits the architecture here. Strip navigation, headers, footers and cookie banners from the markdown. The point is the content, without the page furniture around it. Verify HTML and Markdown responses for each public page type, including URLs outside the reported sample. Check that each Markdown response contains that page's content and that ordinary browser requests still receive HTML. The whole report, as markdown, is at https://goodforbots.com/r/stripe.com.md?scan=cmvque06j000101rvr6x8jj3t. Read it first: this prompt covers one finding, and the report has everything the scan saw. When you are done, summarise what you changed and how to check it against a running instance. Do not try to run the Good for Bots scan yourself: it only sees what is already deployed, it is rate-limited, and re-running it is the site owner's call once the change ships.
AI crawler rules
robots.txt names no AI crawlers, so every operator has to guess.
My website stripe.com scored 75/100 on Good for Bots (Good). Good for Bots measures one thing: whether a language model can read a site and cite it. I need you to: state a position on AI crawlers in robots.txt. The check it fails is "States a position on AI crawlers", worth 5 points. What the scanner saw: robots.txt names no AI crawlers, so every operator has to guess. A `robots.txt` that says nothing about AI crawlers leaves every operator to guess what this site wants, and they guess differently. The point of this task is to state a position, whichever position that is. The thing most people get wrong: the major operators run **separate crawlers for separate purposes**, and blocking one does not block the others. OpenAI runs GPTBot for training, OAI-SearchBot for search indexing, and ChatGPT-User for pages a user asks about. Anthropic runs ClaudeBot, Claude-SearchBot and Claude-User for the same three jobs. Decide about each job, not about the vendor. A common and reasonable position is to refuse training while staying visible in AI answers: ``` # Training: no User-agent: GPTBot Disallow: / User-agent: ClaudeBot Disallow: / User-agent: Google-Extended Disallow: / User-agent: CCBot Disallow: / # Search and user-requested fetches: yes User-agent: OAI-SearchBot Allow: / User-agent: Claude-SearchBot Allow: / User-agent: PerplexityBot Allow: / User-agent: ChatGPT-User Allow: / User-agent: Claude-User Allow: / ``` Work out what this project wants before copying that. Allowing everything is equally valid and earns exactly as much here; what is being measured is whether there is an explicit answer, not which answer it is. Blocking a documented search or user-fetch control declares a refusal of that route. Some user-triggered fetchers may still retrieve a page; do not promise complete invisibility. Google-Extended also controls grounding, while CCBot publishes a reusable dataset. Their training opt-outs remain neutral in our score. Two things about how this is judged. The list of crawler tokens we recognise is a snapshot of a moving target: operators add crawlers faster than any scanner tracks them. A rule for a token we have not seen yet is a good rule that earns nothing here until we catch up. And a position stated in a vocabulary rather than in rules, such as `Content-Signal`, is a different check; this one is about the `User-agent` groups. Use the operator sources in the report's crawler catalogue. Unconfirmed or retired names do not count; aliases for one control count once. One mixed-use control still counts as one engagement group. The whole report, as markdown, is at https://goodforbots.com/r/stripe.com.md?scan=cmvque06j000101rvr6x8jj3t. Read it first: this prompt covers one finding, and the report has everything the scan saw. When you are done, summarise what you changed and how to check it against a running instance. Do not try to run the Good for Bots scan yourself: it only sees what is already deployed, it is rate-limited, and re-running it is the site owner's call once the change ships.
Semantic HTML
2 of 4 pages read pass; 1 partly. The page at /en-de/pricing is barely structured: No <main> element and nothing carrying role="main".
My website stripe.com scored 75/100 on Good for Bots (Good). Good for Bots measures one thing: whether a language model can read a site and cite it.
I need you to: mark the content up so a parser can find it.
The check it only partly passes is "Content is marked up so a reader can find it", with 5 points of it still on the table. What the scanner saw: 2 of 4 pages read pass; 1 partly. The page at /en-de/pricing is barely structured: No <main> element and nothing carrying role="main".
The scan checked a sample of 4 pages. It does not establish which other pages have the same issues. Use the findings below to locate the responsible templates, components or configuration, and apply the fix wherever the same issue occurs. Pages in the sample with findings:
- https://stripe.com/en-de/blog/introducing-our-agentic-commerce-solutions: The page at /en-de/blog/introducing-our-agentic-commerce-solutions is partly structured: No <main> element and nothing carrying role="main".
- https://stripe.com/en-de/pricing: The page at /en-de/pricing is barely structured: No <main> element and nothing carrying role="main".
Review the site's public page templates and shared layout components. Fix missing
content roots, heading structure and landmarks wherever they occur, including
templates outside the reported sample. Check the server's HTML response from each
page type: a shared layout fix can introduce a second `<main>` on pages that
already have one.
Semantic elements help a reader of raw HTML find the page's content and distinguish
it from navigation and other surrounding material.
Three things, all from the HTML standard. Change the markup; do not change what the page
looks like.
**1. One content root.** Wrap the page's dominant content in a single `<main>`.
```html
<body>
<header>…site header…</header>
<main>…the article, the docs page, the product copy…</main>
<footer>…site footer…</footer>
</body>
```
The standard allows exactly one `<main>` per document that is not marked `hidden`, and
its ancestors may only be `<html>`, `<body>`, `<div>`, an unnamed `<form>` or a custom
element, which makes a `<main>` inside `<section>` or `<article>` invalid. Put the real
content inside it: a `<main>` that holds a sliver of the page while the article sits in a
sibling `<div>` marks nothing. If a framework template makes the element impossible,
`role="main"` on the wrapper is an acceptable substitute.
**2. A heading outline that holds together.** Exactly one idea per level, starting at
`<h1>`, and never skipping a level on the way down.
```html
<h1>What this page is about</h1>
<h2>First section</h2>
<h3>A detail</h3>
<h2>Second section</h2>
```
`<h1>` → `<h3>` is invalid; `<h3>` → `<h2>` on the way back up is fine. Use heading
elements for headings and CSS for size: a `<div class="text-2xl">` is invisible to the
outline. If a heading is an image or an icon, give it real text and hide it visually
rather than leaving the element empty.
**3. Landmarks around the content.** At least two of these, outside `<main>`:
```html
<header> <!-- the site header: becomes the banner landmark -->
<nav> <!-- navigation -->
<footer> <!-- the site footer: becomes contentinfo -->
<aside> <!-- related content -->
<search> <!-- a search form -->
```
Two rules that surprise people. `<header>` and `<footer>` only count as the page's banner
and contentinfo when they are children of `<body>`; inside `<article>` or `<section>` they
are that section's own header and footer and are not landmarks at all. And a `<form>` is
only a landmark when it has an accessible name, so give a search form
`aria-label="Search"`.
Do not add landmarks that describe nothing: five unlabelled `<nav>` elements are worse
than one. And do not wrap the whole body in `<main>`: that puts the header and footer
inside the content root, which removes the landmarks this asks for.
The report's content and navigation breakdown is diagnostic. It measures extracted
text in marked regions, not content quality. Keep useful navigation; do not remove
links or add filler to change a percentage. If much of the text is labelled "other",
check whether the real main content has a meaningful wrapper. The reported start of
main text follows HTML order, which can differ from the visual layout.
The whole report, as markdown, is at https://goodforbots.com/r/stripe.com.md?scan=cmvque06j000101rvr6x8jj3t. Read it first: this prompt covers one finding, and the report has everything the scan saw.
When you are done, summarise what you changed and how to check it against a running instance. Do not try to run the Good for Bots scan yourself: it only sees what is already deployed, it is rate-limited, and re-running it is the site owner's call once the change ships.Pro shows a prompt for every fix and drafts your llms.txt and robots.txt. It never changes the score.
$9 once, per listingSee ProFree shows prompts for the 3 fixes worth the most. Pro shows one for every fix. The score is the same either way.
How it works
Type your address. GoodForBotsBot fetches what an AI crawler fetches: robots.txt, llms.txt, your sitemap and the raw HTML, in the open.
The fixes worth the most come with a prompt for Claude Code, Cursor or Codex, and Pro has one for every fix. Each states the standard and the result; your agent fits it to your stack.
Embed the live badge. Once we find it on your homepage, your listing’s backlink turns dofollow, on the free plan.
Pro · monitoring
A deploy can break robots.txt or remove llms.txt. A later scan can reveal the problem. Pro automatically rescans claimed listings every week, with 30 manual rescans per 30 days, at least 1 hour apart, keeps every scan on a public chart, and emails you when automatic scans detect a score drop or bot access change.
See what Pro addsExample measurements, using the same interactive history as a Pro report.
Selected measurement
55/100
UTC
Hover anywhere along the chart to inspect the nearest measurement. Click or tap to pin it; click it again or press Escape to release. Arrow keys move between scans.
50/100 → 55/100+5 points
22 Aug 2026, 10:00 → 29 Aug 2026, 10:00 UTC
Before
fail · 0 points · v1
robots.txt returned HTTP 404, so it names no AI crawler.
{
"httpStatus": 404
}After
pass · +5 points · v1
robots.txt returned HTTP 200 with rules for six AI crawlers.
{
"httpStatus": 200
}Check contributions: +5 points. Rounding and score limits: 0 points.
| Date (UTC) | Score | Changes |
|---|---|---|
| 55/100 | +5 points · 1 changed checks | |
| 50/100 | -5 points · 1 changed checks | |
| 55/100 | 0 points · 1 changed checks Agent capabilities changed | |
| 55/100 | +10 points · 1 changed checks | |
| 45/100 | First retained measurement |
Pricing
Every plan gets the same score, point for point. You pay for the tools around the number, never for the number.
For every site, for good.
$0forever
Dofollow backlinkOnce we find your badge
For the owner who wants it fixed, and kept fixed.
$9once, per listing
Dofollow backlinkFrom your listing, badge or not
For a place on the home page.
$20a month, per slot
3 of 3 slots open
Dofollow backlinkFrom the home page, while the slot runs
A dofollow backlink is one search engines count toward the site it points to; a nofollow link asks them not to.
The score is never for sale.
Pro adds monitoring and fix tools; Featured buys a home page slot. Payment never changes your score or hides a finding. Removing a listing is free on every plan.
The badge
The badge shows your latest published score. Add it to your homepage; once a scan or a check from your report finds its link, your Free listing earns a dofollow backlink. Image caches can delay score updates.
How the badge works<a href="https://goodforbots.com/r/example.com"><img src="https://goodforbots.com/badge/example.com.svg" alt="Good for Bots score for example.com" width="200" height="54"></a>The directory
Real sites, published findings, one rubric for everyone.
kahrbon.com
knobs.dev
itsroi.com
premarket.nyc
brivoy.com
redhat.com
FAQ
Yes. The scan, the score, the public report and the live badge are free, with no account required. Manual rescans require a claimed listing and are limited by plan.
No. Every plan gets the same score, point for point. Money buys tools and placement, never points, a better band or a hidden report.
No. Pro is a one-time payment of $9 per listing. There is nothing to renew.
A good score does not guarantee a citation. It reflects the access and content signals our crawler found. An assistant's choice of sources also depends on the question and the material it retrieves.
Two halves of 50 points. The readable base covers what a model needs to read the site: semantic HTML, working links, schema.org, a sitemap and robots.txt. The agent layer covers what the site offers language models on purpose: llms.txt, llms-full.txt, Markdown on request, AI crawler rules, content signals and link headers. Every check links the specification it is graded against. See how the score is calculated.
A Markdown file at the root of a site that tells language models what the site is and links its most useful pages. It counts in the agent layer, next to llms-full.txt and Markdown versions. Our llms.txt check explains what we look for. How to write llms.txt includes an example and publishing instructions.
Claimed Free sites are automatically rescanned every month; claimed Pro sites every week. Verified owners get 5 manual rescans per 30 days, at least 24 hours apart on Free, and 30 manual rescans per 30 days, at least 1 hour apart on Pro. Unclaimed listings are rescanned every 90 days. A finished manual scan resets the next automatic scan.
Always. GoodForBotsBot announces itself on every request and reads robots.txt first. If you block it, your report says opted out instead of showing a score. Read how to allow, slow down or stop our crawler.
Yes, for free and without conditions, on any plan. Cancelling a subscription and removing a listing are separate, and neither costs anything.
One of 3 slots at the top of this page and a dofollow backlink from it, for $20 a month. It buys no point of the score.
More questions about scans, the bot, claiming and removal? Read the full FAQ