<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Egor</title>
    <description>The latest articles on DEV Community by Egor (@virt92).</description>
    <link>https://dev.to/virt92</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4005766%2F26264d03-211c-453e-aeb0-46012356df2d.png</url>
      <title>DEV Community: Egor</title>
      <link>https://dev.to/virt92</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/virt92"/>
    <language>en</language>
    <item>
      <title>llms-pay.md: a discovery layer for AI shopping agents</title>
      <dc:creator>Egor</dc:creator>
      <pubDate>Mon, 13 Jul 2026 07:09:19 +0000</pubDate>
      <link>https://dev.to/virt92/llms-paymd-a-discovery-layer-for-ai-shopping-agents-1mfa</link>
      <guid>https://dev.to/virt92/llms-paymd-a-discovery-layer-for-ai-shopping-agents-1mfa</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; AI shopping agents can read your marketing page just fine. What they cannot do is buy. There is no standard way for an agent to discover your products, pick a plan, and hit the right checkout endpoint. We shipped a two-file discovery layer, live at &lt;a href="https://agentfix.pro/llms-pay.md" rel="noopener noreferrer"&gt;agentfix.pro/llms-pay.md&lt;/a&gt; and &lt;a href="https://agentfix.pro/.well-known/agent-checkout.json" rel="noopener noreferrer"&gt;agentfix.pro/.well-known/agent-checkout.json&lt;/a&gt;. Draft spec v0.1, open for critique.&lt;/p&gt;




&lt;h2&gt;
  
  
  Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The problem: agents can read, agents cannot buy&lt;/li&gt;
&lt;li&gt;Why llms.txt was the right template&lt;/li&gt;
&lt;li&gt;The spec in 90 seconds: llms-pay.md + agent-checkout.json&lt;/li&gt;
&lt;li&gt;Discovery flow, step by step&lt;/li&gt;
&lt;li&gt;Why two files, not one&lt;/li&gt;
&lt;li&gt;What is deliberately out of scope for v0.1&lt;/li&gt;
&lt;li&gt;See it live and what we want feedback on&lt;/li&gt;
&lt;li&gt;Key takeaways&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. The problem: agents can read, agents cannot buy
&lt;/h2&gt;

&lt;p&gt;Put an autonomous agent in front of your pricing page. It parses the copy. It renders the marketing DOM. It probably understands your tiers. Then it stops.&lt;/p&gt;

&lt;p&gt;Because it does not know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which endpoint to POST to&lt;/li&gt;
&lt;li&gt;What body shape you expect&lt;/li&gt;
&lt;li&gt;Whether there is a pre-check step (a scan, a quote, an eligibility call)&lt;/li&gt;
&lt;li&gt;How to test the flow without a real card&lt;/li&gt;
&lt;li&gt;What terminal status means "the pack is ready, go download"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Human buyers solve this with visual clicks. Agents cannot click their way through a Stripe modal without the seller building a first-class programmatic checkout. And most sellers have not.&lt;/p&gt;

&lt;p&gt;Result: your site is agent-readable but not agent-buyable. That gap is a real revenue leak once shopping agents ship at scale, which is happening this year.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Why llms.txt was the right template
&lt;/h2&gt;

&lt;p&gt;You have probably seen &lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt;. It is a small Markdown file at the root of a site that tells language models what matters, in one canonical place. Cheap to write, cheap to parse, no server changes, immediate value for retrieval.&lt;/p&gt;

&lt;p&gt;The pattern is worth copying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Human-readable Markdown&lt;/strong&gt; at a predictable path&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discoverable without a crawl&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companion machine-readable JSON&lt;/strong&gt; for the parts that need strict types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;llms-pay.md follows the same shape, aimed at commerce instead of retrieval. It is not competing with llms.txt. It sits next to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The spec in 90 seconds
&lt;/h2&gt;

&lt;p&gt;Two files. Same site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File one: &lt;code&gt;/llms-pay.md&lt;/code&gt;&lt;/strong&gt; - human-friendly Markdown that explains what you sell, how to purchase programmatically, how to test, which providers you support, and how to reach a human. An agent reads this to build a mental model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File two: &lt;code&gt;/.well-known/agent-checkout.json&lt;/code&gt;&lt;/strong&gt; - strict JSON with the exact endpoint shapes, body schemas, prereq steps, terminal statuses, and provider metadata. An agent reads this to execute.&lt;/p&gt;

&lt;p&gt;Every field in the JSON has one job: remove ambiguity. &lt;code&gt;checkout_flow.method&lt;/code&gt; is &lt;code&gt;"POST"&lt;/code&gt;. &lt;code&gt;body_schema&lt;/code&gt; names the fields. &lt;code&gt;fulfillment.poll_endpoint&lt;/code&gt; says where to poll. &lt;code&gt;fulfillment.terminal_status&lt;/code&gt; says what to wait for. &lt;code&gt;test_mode.supported: true&lt;/code&gt; says you can smoke-test the whole flow without a card.&lt;/p&gt;

&lt;p&gt;Here is a trimmed slice of the live schema so you can see the shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://agentfix.pro/schemas/agent-checkout-v0.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agent_ready_pack_basic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"recurrence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"one_time"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"checkout_flow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://agentfix.pro/api/checkout"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"prereq"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"step"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"scan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://agentfix.pro/api/scan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"returns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"scan_id"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"body_schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scan_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fulfillment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"poll_endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://agentfix.pro/api/orders/by-scan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"terminal_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"delivered"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full file: &lt;a href="https://agentfix.pro/.well-known/agent-checkout.json" rel="noopener noreferrer"&gt;agent-checkout.json&lt;/a&gt;. Draft schema: &lt;code&gt;agent-checkout-v0.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Discovery flow, step by step
&lt;/h2&gt;

&lt;p&gt;From cold visit to delivered artifact:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent lands on &lt;code&gt;example.com&lt;/code&gt;. Fetches &lt;code&gt;/llms-pay.md&lt;/code&gt;. Reads the human summary.&lt;/li&gt;
&lt;li&gt;Fetches &lt;code&gt;/.well-known/agent-checkout.json&lt;/code&gt;. Picks the product by &lt;code&gt;id&lt;/code&gt; or &lt;code&gt;name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Runs the prereq step (in our case, &lt;code&gt;POST /api/scan&lt;/code&gt; with the target URL).&lt;/li&gt;
&lt;li&gt;Polls the scan until it is done, extracts &lt;code&gt;scan_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /api/checkout&lt;/code&gt; with &lt;code&gt;scan_id&lt;/code&gt; and buyer email. Receives &lt;code&gt;checkout_url&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Directs the buyer to &lt;code&gt;checkout_url&lt;/code&gt;. Provider handles card auth, 3DS, receipt.&lt;/li&gt;
&lt;li&gt;Polls &lt;code&gt;fulfillment.poll_endpoint&lt;/code&gt; until &lt;code&gt;terminal_status: "delivered"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Downloads the artifact from the signed URL in the response.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole flow is idempotent on the client side. Every step is a standard REST call with a documented body.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Why two files, not one
&lt;/h2&gt;

&lt;p&gt;Because they answer different questions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Markdown answers "what and why". It handles nuance: refund policy, sandbox instructions, which providers are primary vs fallback, what is not supported yet. Humans read it too, so it is written in prose.&lt;/li&gt;
&lt;li&gt;The JSON answers "how". It has to be machine-strict. No prose. No maybe. Every URL is a full URL, every schema is named.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could stuff both into one YAML with a &lt;code&gt;human_notes&lt;/code&gt; field, but then agents have to parse prose for edge cases and humans have to read schemas for policy. Splitting them keeps each file good at its job.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What is deliberately out of scope for v0.1
&lt;/h2&gt;

&lt;p&gt;Being an open draft, we cut ruthlessly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No crypto rails.&lt;/strong&gt; No x402, no L402, no on-chain settlement. Cards only. If enough teams need x402, v0.2 adds it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No auth beyond email.&lt;/strong&gt; No OAuth handshake for the buyer. The provider handles PCI. We hand the agent a &lt;code&gt;checkout_url&lt;/code&gt; and step aside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No bulk cart.&lt;/strong&gt; One product, one checkout. Bulk purchase agents are not the 2026 shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No delivery negotiation.&lt;/strong&gt; Terminal status is boolean-ish: &lt;code&gt;delivered&lt;/code&gt; or &lt;code&gt;pending&lt;/code&gt;. No fractional progress states.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point of v0.1 is "does the shape work end to end for a real product". Anything that is not necessary to test the discovery pattern is deferred.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. See it live and what we want feedback on
&lt;/h2&gt;

&lt;p&gt;Live: &lt;a href="https://agentfix.pro/llms-pay.md" rel="noopener noreferrer"&gt;agentfix.pro/llms-pay.md&lt;/a&gt; and &lt;a href="https://agentfix.pro/.well-known/agent-checkout.json" rel="noopener noreferrer"&gt;/.well-known/agent-checkout.json&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Please break it. Specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are field names ergonomic? &lt;code&gt;prereq&lt;/code&gt; vs &lt;code&gt;precondition&lt;/code&gt; vs &lt;code&gt;pre_step&lt;/code&gt; - which reads best to an agent?&lt;/li&gt;
&lt;li&gt;Is &lt;code&gt;terminal_status&lt;/code&gt; a good name for "when to stop polling"?&lt;/li&gt;
&lt;li&gt;Should the schema live at &lt;code&gt;/.well-known/agent-checkout.json&lt;/code&gt; or at a versioned path like &lt;code&gt;/.well-known/agent-checkout-v0.json&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Do you want a &lt;code&gt;provider.priority&lt;/code&gt; field so agents can pick a preferred rail (e.g. "prefer FastSpring for EU VAT")?&lt;/li&gt;
&lt;li&gt;What is missing for your product's flow?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open an issue, DM me, or comment on the canonical post. Draft status is "v0.1-community-comment", which is the polite way of saying "everything is negotiable".&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI shopping agents will read your site. They cannot buy from it without a spec.&lt;/li&gt;
&lt;li&gt;A tiny two-file discovery layer (llms-pay.md + agent-checkout.json) is enough to close the gap for card-based checkout.&lt;/li&gt;
&lt;li&gt;Draft v0.1 is live at agentfix.pro. Copy the pattern, adapt the shape, tell us what breaks.&lt;/li&gt;
&lt;li&gt;If we get to shared field names across a handful of sellers, agents start to converge. That is how llms.txt worked and how this can too.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Try the scanner.&lt;/strong&gt; If you want to see how agent-ready your own site is (before we get to checkout), scan it free at &lt;a href="https://agentfix.pro" rel="noopener noreferrer"&gt;agentfix.pro&lt;/a&gt;. No signup, no email required. The full 34-signal checklist is documented at &lt;a href="https://agentfix.pro/methodology" rel="noopener noreferrer"&gt;/methodology&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>We ran an AI-agent-readiness scan on 19 AI-native brands. Here is what breaks.</title>
      <dc:creator>Egor</dc:creator>
      <pubDate>Mon, 06 Jul 2026 16:22:33 +0000</pubDate>
      <link>https://dev.to/virt92/we-ran-an-ai-agent-readiness-scan-on-19-ai-native-brands-here-is-what-breaks-jg9</link>
      <guid>https://dev.to/virt92/we-ran-an-ai-agent-readiness-scan-on-19-ai-native-brands-here-is-what-breaks-jg9</guid>
      <description>&lt;p&gt;If any group of companies should have their site ready for AI agents in 2026, it is the ones building AI. So we ran a real scan on 19 of them: Anthropic, OpenAI, Perplexity, Cloudflare, GitHub, Stripe, Vercel, Shopify, Notion, Figma, Linear, Cursor, Supabase, Pinecone, Hugging Face, LangChain, Mistral, Cohere, Groq.&lt;/p&gt;

&lt;p&gt;Result: 0 A grades. 1 B. 7 C. 10 D. 1 F. Average pass rate 54.5% across 34 signals.&lt;/p&gt;

&lt;p&gt;That is not "the internet is behind". That is the vendors whose own agents crawl your site failing their own homework. If you build the web today, this benchmark is a cheat sheet for what to fix first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we actually checked
&lt;/h2&gt;

&lt;p&gt;Our public scanner runs 34 signals grouped in six buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;discoverability&lt;/strong&gt;: &lt;code&gt;robots.txt&lt;/code&gt;, &lt;code&gt;sitemap.xml&lt;/code&gt;, &lt;code&gt;/.well-known/&lt;/code&gt;, &lt;code&gt;llms.txt&lt;/code&gt;, syndication feed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ai_policy&lt;/strong&gt;: explicit rules for GPTBot, ClaudeBot, PerplexityBot, Google-Extended, content-signal declarations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;schema&lt;/strong&gt;: JSON-LD for Organization, WebSite, FAQPage, BreadcrumbList&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;agent_protocols&lt;/strong&gt;: MCP server card, A2A agent card, agent-skills index&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;content&lt;/strong&gt;: image alt coverage, markdown content negotiation, heading structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;browser_ux&lt;/strong&gt;: tap-target size, aria labels (agents also crawl accessibility signals)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every check is a real HTTP request from our infra, not a lint pass on your assumed setup. So &lt;code&gt;agentfix.pro/scan&lt;/code&gt; returns "you claim GPTBot rules but the file 404s".&lt;/p&gt;

&lt;h2&gt;
  
  
  The three signals every AI-native brand failed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. FAQPage / BreadcrumbList JSON-LD (19/19 miss)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a single site had FAQPage or BreadcrumbList schema on the homepage or a common product page. These two schema types are how ChatGPT, Google's AI Overviews and Perplexity build inline answer cards. Without them your content still gets read, but you rarely become the highlighted source. Cost to add: two &lt;code&gt;&amp;lt;script type="application/ld+json"&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. MCP server card at &lt;code&gt;/.well-known/mcp.json&lt;/code&gt; (19/19 miss)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Model Context Protocol is Anthropic's own standard. The discovery convention is a card at &lt;code&gt;/.well-known/mcp.json&lt;/code&gt; describing your MCP server, transport, tools. Anthropic's own site does not publish one. Neither does OpenAI's, or Perplexity's. If your product exposes any programmatic surface (search, docs API, product catalog) this is a two-file win: card + server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Tap-target size (17/17 checked, all fail)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents that render pages penalize dense clickable regions. Mobile-first CSS with 44x44px minimum touch targets is a decade-old accessibility rule that also serves modern agent renderers. Fix in your button component once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Named findings (the fun part)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare (B, 71%)&lt;/strong&gt; was the only B on the list. They actually publish &lt;code&gt;/llms-full.txt&lt;/code&gt; and declare bot rules. Given they sell an AI-agent-readiness product themselves, this is at least self-consistent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perplexity (F, 29%)&lt;/strong&gt; was the worst. Not a single AI-policy declaration, no llms.txt, no schema markup on the homepage. The company literally sells "answers powered by web crawl" and their own site is opaque to crawlers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic (D, 53%)&lt;/strong&gt; publishes MCP as a standard but does not publish an MCP card of their own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub (D, 47%)&lt;/strong&gt; has no &lt;code&gt;llms.txt&lt;/code&gt;, no MCP card, no A2A card. GitHub's search index is what half of every LLM eats and they still ship 47%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe (C, 56%)&lt;/strong&gt; and &lt;strong&gt;Vercel (C, 65%)&lt;/strong&gt; were solid on schema but weak on agent protocols.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase (C, 68%)&lt;/strong&gt; was the second-best, mostly for good sitemap + strong schema coverage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full per-site grades and raw JSON: see the sibling deep-dive at &lt;code&gt;agentfix.pro/blog/we-scanned-10-ai-forward-sites-in-2026&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copy-paste minimum viable fix
&lt;/h2&gt;

&lt;p&gt;If your site is D or below (statistically likely), start with these three files. Two hours of work moves most sites two grades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/llms.txt&lt;/code&gt;&lt;/strong&gt; (Answer.AI convention, becoming de-facto index for LLM crawlers):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# YourProduct

&amp;gt; One-line description an agent should quote.

## Docs
- [Getting started](https://your.site/docs/quickstart)
- [API reference](https://your.site/docs/api)

## Product
- [Pricing](https://your.site/pricing)
- [Changelog](https://your.site/changelog)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;/.well-known/mcp.json&lt;/code&gt;&lt;/strong&gt; (minimal, declares you have an MCP surface):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schemaVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-03-26"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your Product"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What agents can do here."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"server"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your.site/api/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"transport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"streamable-http"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Homepage FAQPage JSON-LD&lt;/strong&gt; (biggest AI-overview lever per hour of effort):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FAQPage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mainEntity&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Question&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What does YourProduct do?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;acceptedAnswer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Answer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;One-sentence answer.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then re-scan and watch the grade jump.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why publish this
&lt;/h2&gt;

&lt;p&gt;Two reasons. First, we run the scanner as a product and this is our transparency: you can hit &lt;code&gt;agentfix.pro/scan&lt;/code&gt; right now and reproduce every number. Second, we plan to re-run the same 19 sites on 2026-10-05 and diff the results. If Cloudflare adds an MCP card, if OpenAI adds A2A, we will show that in an addendum. Snapshot-benchmarks are the closest thing agent-web has to a scoreboard.&lt;/p&gt;

&lt;p&gt;If your site is on the list and something looks wrong, please DM: we ran a raw scan on production, no allow-list, and if a signal misfired we want to fix the scanner not defend the number.&lt;/p&gt;

&lt;p&gt;If you want the raw JSON of all 19 scans, or the per-signal breakdown, the on-blog deep-dive has both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we track next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent-skills index&lt;/strong&gt; (95% fail): a per-skill card that lets agents pick a capability without loading your whole docs site. Emerging spec, but the direction is clear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown content negotiation&lt;/strong&gt; (84% fail): serving &lt;code&gt;text/markdown&lt;/code&gt; on &lt;code&gt;Accept: text/markdown&lt;/code&gt; requests. Cheap on a Next.js/Astro backend, invisible to human users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content-signal declarations&lt;/strong&gt; (84% fail): the emerging "training-yes/training-no/quote-yes" trio that lets you say what you consent to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will benchmark all three in the October re-run.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post was written by the team behind AgentFix, an AI-agent-readiness scanner and one-time fix packs for WordPress, Webflow, Shopify, Tilda. Free scan at agentfix.pro.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>seo</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>llms.txt in 2026: how to write one that actually scores</title>
      <dc:creator>Egor</dc:creator>
      <pubDate>Sun, 05 Jul 2026 02:15:22 +0000</pubDate>
      <link>https://dev.to/virt92/llmstxt-in-2026-how-to-write-one-that-actually-scores-72e</link>
      <guid>https://dev.to/virt92/llmstxt-in-2026-how-to-write-one-that-actually-scores-72e</guid>
      <description>&lt;p&gt;Every scanner in the AI-readiness space checks for llms.txt. Half the sites that fail the check fail it by having the wrong file, not a missing one. A 200 OK response with an llms.txt full of hand-waving does not help an agent, and it does not fool the scoring either. This is what I have learned actually shipping and testing these files across WordPress, Webflow, Shopify, and static sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  What llms.txt actually is
&lt;/h2&gt;

&lt;p&gt;The spec lives at &lt;a href="https://llmstxt.org" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt;. Short version: a markdown file at your site root that gives an LLM a map of your site written for the LLM, not for humans. Not a legal agreement (that is closer to &lt;code&gt;robots.txt&lt;/code&gt; plus &lt;code&gt;agents.txt&lt;/code&gt;). Not a training-data opt-out. It is a discovery and disambiguation aid, the way a hand-drawn map is easier for a stranger than a satellite photo.&lt;/p&gt;

&lt;p&gt;Two files are worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;llms.txt&lt;/code&gt; at the root: index. Short, hand-curated links to canonical pages.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;llms-full.txt&lt;/code&gt; at the root: expanded. Concatenated content of the pages you want the LLM to actually ingest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most sites need only the first. Docs-heavy sites benefit from both.&lt;/p&gt;

&lt;h2&gt;
  
  
  The anatomy of a file that scores
&lt;/h2&gt;

&lt;p&gt;The spec allows more than what agents actually seem to use. In practice, the sections that matter are the ones a scanner or a well-behaved agent can parse deterministically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Site Name&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; One sentence describing what this site is and who it is for.&lt;/span&gt;

Optional short paragraph, up to a few sentences. This is the freeform block.
Keep it factual. Agents will summarize it verbatim.

&lt;span class="gu"&gt;## Docs&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Getting started&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/docs/start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: the fastest path from zero to a running install.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;API reference&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/docs/api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: every endpoint, request and response schemas.

&lt;span class="gu"&gt;## Products&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Basic pack&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/pricing/basic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: one-time $29, covers X, Y, Z.

&lt;span class="gu"&gt;## Optional&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Changelog&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/changelog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/blog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things this example gets right that most sites get wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The H1 is the site name, not the file title.&lt;/strong&gt; A lot of generators produce &lt;code&gt;# llms.txt for Example.com&lt;/code&gt;. That is noise. The H1 is what the LLM will most likely use to name your site when it summarizes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The blockquote is the one-liner.&lt;/strong&gt; Not marketing copy. A single sentence that a person could actually read out loud. If an agent has to pick one line to describe your site, this is the line it picks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links are absolute.&lt;/strong&gt; Relative links break for anyone consuming the file outside its origin, which is the entire point (the file exists to be pulled and processed elsewhere).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Each link has a colon-separated description.&lt;/strong&gt; Agents need to know why to follow a link. &lt;code&gt;- [Getting started](https://example.com/docs/start)&lt;/code&gt; alone is uninformative. Descriptions after the colon give the agent enough context to rank links before fetching them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sections are semantic, not aesthetic.&lt;/strong&gt; &lt;code&gt;## Docs&lt;/code&gt;, &lt;code&gt;## Products&lt;/code&gt;, &lt;code&gt;## API&lt;/code&gt;, &lt;code&gt;## Optional&lt;/code&gt;. Avoid decorative headings like &lt;code&gt;## Everything you need to know&lt;/code&gt;. The scanner splits on &lt;code&gt;##&lt;/code&gt;, and the H2 is metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  What breaks it in practice
&lt;/h2&gt;

&lt;p&gt;Six mistakes I keep seeing when I scan sites for a living:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JavaScript-rendered llms.txt.&lt;/strong&gt; A Next.js or Nuxt route that serves &lt;code&gt;llms.txt&lt;/code&gt; from an API handler with the wrong &lt;code&gt;Content-Type&lt;/code&gt;. Agents fetch with a minimal HTTP client, no JS. Serve the file statically, &lt;code&gt;text/plain; charset=utf-8&lt;/code&gt;. If your framework prevents that, put it in &lt;code&gt;/public&lt;/code&gt; or the CDN.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CDN caching stale versions.&lt;/strong&gt; You updated the file two hours ago, the scanner still sees yesterday. Purge after every edit. Cloudflare users can hit &lt;code&gt;POST /zones/:id/purge_cache&lt;/code&gt; with &lt;code&gt;{ "purge_everything": true }&lt;/code&gt; or purge by URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;robots.txt disagreement.&lt;/strong&gt; llms.txt says "here is my content, come look," robots.txt blocks &lt;code&gt;GPTBot&lt;/code&gt; or &lt;code&gt;ClaudeBot&lt;/code&gt;. Agents that respect robots will not read your llms.txt. Decide once: either you want AI traffic and you allow the crawlers, or you do not. Do not send both signals at once.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;llms-full.txt&lt;/code&gt; bigger than 1 MB and served gzipped only.&lt;/strong&gt; Some agents pull the file with clients that do not accept-encoding. Serve identity-encoded too, keep total size under a few MB, and split into per-topic files if you must go bigger.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No canonical URL match.&lt;/strong&gt; Links in llms.txt should match the URLs the LLM will actually fetch. If your llms.txt links to &lt;code&gt;example.com/docs&lt;/code&gt; but the docs live on &lt;code&gt;docs.example.com&lt;/code&gt;, agents get a redirect and lose context. Match canonicals to what the rest of your site declares.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Marketing copy where facts should be.&lt;/strong&gt; "Best-in-class AI-powered platform for modern teams" is worse than useless in an llms.txt. An LLM ingesting this will either quote it (bad) or ignore it (worse, because now you have no summary). Write plainly. What does the site do, who is it for, what does it cost.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to test that agents actually read it
&lt;/h2&gt;

&lt;p&gt;You can spend an afternoon guessing, or you can check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static check.&lt;/strong&gt; &lt;code&gt;curl -sSI https://yoursite.com/llms.txt&lt;/code&gt; and verify: &lt;code&gt;200&lt;/code&gt;, &lt;code&gt;Content-Type: text/plain&lt;/code&gt;, &lt;code&gt;Content-Length&lt;/code&gt; non-trivial, &lt;code&gt;Last-Modified&lt;/code&gt; recent. Then &lt;code&gt;curl -s https://yoursite.com/llms.txt | head -60&lt;/code&gt; and eyeball it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent check.&lt;/strong&gt; Ask a real agent. Open Claude, ChatGPT with browsing, or Perplexity. Prompt: "Fetch &lt;a href="https://yoursite.com/llms.txt" rel="noopener noreferrer"&gt;https://yoursite.com/llms.txt&lt;/a&gt; and summarize what this site is, in one sentence, based only on that file." If the answer is close to what you wrote in the blockquote, you are good. If the answer is generic or wrong, your file is not doing its job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scanner check.&lt;/strong&gt; Cloudflare's URL Scanner at &lt;a href="https://radar.cloudflare.com/scan" rel="noopener noreferrer"&gt;radar.cloudflare.com/scan&lt;/a&gt; surfaces an Agent Readiness Score that partly hinges on llms.txt. AgentGrade at &lt;a href="https://agentgrade.com" rel="noopener noreferrer"&gt;agentgrade.com&lt;/a&gt; is fully free and gives a letter grade with sub-scores. My own tool at &lt;a href="https://agentfix.pro" rel="noopener noreferrer"&gt;agentfix.pro&lt;/a&gt; runs 33 signals and shows per-signal pass/fail, which is what I built when I got tired of scores that did not tell me what to fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the industry is heading
&lt;/h2&gt;

&lt;p&gt;Two things are worth watching in the next six months.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;agents.txt&lt;/strong&gt; is stabilizing. It complements llms.txt by expressing permission and terms, closer to &lt;code&gt;robots.txt&lt;/code&gt; in spirit but with structured fields for pricing, rate limits, and preferred contact for commercial use. Expect scanners to add it as a signal soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP endpoints alongside llms.txt.&lt;/strong&gt; Some sites already advertise a &lt;code&gt;mcp&lt;/code&gt; link inside llms.txt pointing at a Model Context Protocol server. That is the practical bridge from "an agent can read your site" to "an agent can do things on your site." If you sell anything, this is where the real leverage lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thought
&lt;/h2&gt;

&lt;p&gt;A llms.txt file takes twenty minutes to write and five minutes to serve. Getting it right is worth those twenty-five minutes for anyone whose site an agent might visit, which by 2026 is roughly every site. The interesting question is not whether to write one, but whether the one you have already written is doing what you think it is.&lt;/p&gt;

&lt;p&gt;If you want a second opinion on your own file, the tools above will tell you. If you want the fix as a file you can drop in, that is what I have been building for WordPress, Webflow, Shopify, and Tilda at &lt;a href="https://agentfix.pro" rel="noopener noreferrer"&gt;agentfix.pro&lt;/a&gt;. Either way, do not trust a scanner score without reading your own llms.txt as if you were the agent.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cross-posted from &lt;a href="https://agentfix.pro/blog/llms-txt-deep-dive" rel="noopener noreferrer"&gt;agentfix.pro&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>seo</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AI agents crawl your site now. Here's what they look for (and why fixing it is fragmented)</title>
      <dc:creator>Egor</dc:creator>
      <pubDate>Sun, 05 Jul 2026 00:25:18 +0000</pubDate>
      <link>https://dev.to/virt92/ai-agents-crawl-your-site-now-heres-what-they-look-for-and-why-fixing-it-is-fragmented-40fk</link>
      <guid>https://dev.to/virt92/ai-agents-crawl-your-site-now-heres-what-they-look-for-and-why-fixing-it-is-fragmented-40fk</guid>
      <description>&lt;p&gt;AI agents are crawling the web at a rate the SEO playbook never planned for. GPTBot, PerplexityBot, ClaudeBot, and a growing zoo of MCP-driven agents hit sites daily, and most sites give them a 200 OK page full of divs, JavaScript, and no machine-readable intent. Search bots did fine with that. Agents do not.&lt;/p&gt;

&lt;p&gt;I have been building a tool in this space for a few months and reading every scanner and spec I can find. Here is the short, honest version of what agent-readiness actually means in 2026, why it is worth caring about, and where the real work is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The signals that agents look for
&lt;/h2&gt;

&lt;p&gt;There is no single spec. There is a stack of overlapping conventions, and different scanners weight them differently. The ones that matter today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;llms.txt&lt;/strong&gt; (&lt;a href="https://llmstxt.org" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt;). A markdown index at your site root that tells an LLM what your site is about and which URLs are canonical. Roughly the &lt;code&gt;robots.txt&lt;/code&gt; of the agent era, except it exists for the LLM's benefit, not yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;agents.txt&lt;/strong&gt;. A newer convention that describes which agents you welcome and under what terms. Less standardized than llms.txt, more of a signal than a rule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt;. A protocol for exposing tools to agents. If your site sells anything, an MCP endpoint lets an agent buy without scraping a checkout form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured data&lt;/strong&gt;. Old-school schema.org JSON-LD, but with fresh weight. Agents parse it before they parse your prose. Missing &lt;code&gt;Product&lt;/code&gt;, &lt;code&gt;Offer&lt;/code&gt;, &lt;code&gt;FAQPage&lt;/code&gt;, or &lt;code&gt;Organization&lt;/code&gt; is a quiet way to be invisible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment protocols&lt;/strong&gt;. x402, L402, MPP. Emerging standards for machine-payable resources. Not table-stakes yet, but scanners already grade for them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server signals&lt;/strong&gt;. Reachable canonical URL, no JS-only content, sensible &lt;code&gt;robots.txt&lt;/code&gt;, working sitemap, valid TLS, correct &lt;code&gt;Content-Type&lt;/code&gt;. Boring but decisive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can go check any of this on your own site right now. Cloudflare has a free URL scanner that includes an Agent Readiness Score. AgentGrade at agentgrade.com is fully free and covers protocol coverage in more depth. Agent Checker runs a full audit (paid tier around £19) that actually drives a browser as an agent would.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the scanners will not tell you
&lt;/h2&gt;

&lt;p&gt;The scanners are useful. They give you a score, a list of failed checks, and a screenshot of the problem. What they do not do is fix anything.&lt;/p&gt;

&lt;p&gt;That is the gap I kept walking into. A WordPress owner runs a scan, gets a 42/100, sees "missing llms.txt, missing JSON-LD Product schema, robots.txt blocks GPTBot," and closes the tab. Because the fix is not one file. It is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;editing &lt;code&gt;wp-content/themes/&amp;lt;theme&amp;gt;/functions.php&lt;/code&gt; without breaking updates&lt;/li&gt;
&lt;li&gt;installing a schema plugin, configuring it, dealing with conflicts&lt;/li&gt;
&lt;li&gt;writing an llms.txt that matches your actual sitemap&lt;/li&gt;
&lt;li&gt;adjusting &lt;code&gt;robots.txt&lt;/code&gt; served by a plugin, not the filesystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Multiply that by Webflow (custom code injection, different constraints), Shopify (Liquid, theme layer), and Tilda (built-in SEO tab, closed platform), and the fix surface is very different per CMS. That is why the scanners stop at "here is your score." Actually fixing it is either a $200/hour consulting problem or a weekend of docs-diving.&lt;/p&gt;

&lt;h2&gt;
  
  
  A minimal checklist per platform
&lt;/h2&gt;

&lt;p&gt;If you are doing this by hand, here is where I would start, per CMS. Nothing exotic, just the highest-leverage moves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Serve a static &lt;code&gt;llms.txt&lt;/code&gt; at the root (Yoast can do it, or drop it in the theme root and route via &lt;code&gt;functions.php&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Install a schema plugin (Rank Math, WP SEO Structured Data) and enable at least &lt;code&gt;Organization&lt;/code&gt;, &lt;code&gt;WebSite&lt;/code&gt;, and &lt;code&gt;Product&lt;/code&gt; (if you sell).&lt;/li&gt;
&lt;li&gt;Audit &lt;code&gt;robots.txt&lt;/code&gt;: many SEO plugins silently block &lt;code&gt;GPTBot&lt;/code&gt;. If you want AI traffic, allow it.&lt;/li&gt;
&lt;li&gt;If you sell, add &lt;code&gt;Offer&lt;/code&gt; schema per product. Agents cannot buy from an unlabelled div.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Webflow.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Custom Code -&amp;gt; Head Code: paste JSON-LD for &lt;code&gt;Organization&lt;/code&gt; and &lt;code&gt;WebSite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Publish a static &lt;code&gt;llms.txt&lt;/code&gt; (Assets or Netlify redirect if you host outside Webflow hosting).&lt;/li&gt;
&lt;li&gt;In Project Settings -&amp;gt; SEO, verify &lt;code&gt;robots.txt&lt;/code&gt; allows agent user agents.&lt;/li&gt;
&lt;li&gt;For CMS collections (e.g. products), inject per-item schema via the collection page's embed component.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Shopify.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use a theme that supports &lt;code&gt;application/ld+json&lt;/code&gt; blocks in &lt;code&gt;theme.liquid&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;Product&lt;/code&gt; schema per product page. Most modern themes do this, but many custom ones do not.&lt;/li&gt;
&lt;li&gt;Serve &lt;code&gt;llms.txt&lt;/code&gt; via a page template or app (the storefront root does not accept arbitrary files by default).&lt;/li&gt;
&lt;li&gt;Consider a &lt;code&gt;Merchant&lt;/code&gt; schema for organization identity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Tilda.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use the built-in SEO tab per page, but add JSON-LD via the T123 (HTML) block.&lt;/li&gt;
&lt;li&gt;Tilda does not let you drop a file at root easily. You can host &lt;code&gt;llms.txt&lt;/code&gt; on a subdomain and reference it, or use a redirect on your DNS provider.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this is glamorous. All of it moves the score.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would want as a site owner
&lt;/h2&gt;

&lt;p&gt;Honestly, a scan by itself is not that useful. If I already know I have a problem, I want a package I can drop in. This is the direction I took with &lt;a href="https://agentfix.pro" rel="noopener noreferrer"&gt;AgentFix&lt;/a&gt;: scan for free, and if you want the fix, buy a per-platform pack ($1 to $99) with the exact files, the exact snippets, and the exact settings changes for your CMS. No consulting, no plugin bloat, no weekend of research.&lt;/p&gt;

&lt;p&gt;That is not a pitch, it is the answer to "why does this exist." Nothing about that model is proprietary. If you want to build the same thing for a niche I do not cover, the ingredients are all public: the scanner logic is 33 signals with known rules, and the packs are just Git-managed CMS-specific bundles. The moat is remediation, not diagnosis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Agent-readiness is a real, measurable thing in 2026. Free tools will grade you today.&lt;/li&gt;
&lt;li&gt;The signals are stackable but fragmented. llms.txt + JSON-LD + MCP + payment protocols, ranked in that priority for most sites.&lt;/li&gt;
&lt;li&gt;The scanners tell you the "what." The "how to fix" is CMS-specific and, right now, mostly manual.&lt;/li&gt;
&lt;li&gt;If you own a site and want AI-agent traffic, put 30 minutes into a scan and a checklist before you spend anything on it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you found this useful, and want a shortcut for the fix step, that is what agentfix.pro is for. Otherwise the checklists above are a solid start.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Canonical: &lt;a href="https://agentfix.pro" rel="noopener noreferrer"&gt;agentfix.pro&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>seo</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Most sites speak llms.txt now. Almost none speak x402.</title>
      <dc:creator>Egor</dc:creator>
      <pubDate>Sun, 28 Jun 2026 15:17:28 +0000</pubDate>
      <link>https://dev.to/virt92/most-sites-speak-llmstxt-now-almost-none-speak-x402-3enm</link>
      <guid>https://dev.to/virt92/most-sites-speak-llmstxt-now-almost-none-speak-x402-3enm</guid>
      <description>&lt;p&gt;A friend in the agent-infra space (DDG Agent Services, 16k followers, they build this for a living) replied to one of my posts this week with a take that landed hard:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;right that discovery moved to machine-readable files. but llms.txt only makes you findable — it doesn't make endpoints callable or payable. next layer is a per-tool contract (identity, price, cap, receipt) so 'found' becomes 'callable with authority.' discovery isn't execution.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He's right. So we shipped Pack v3.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/llms.txt&lt;/code&gt;, &lt;code&gt;schema.org&lt;/code&gt; JSON-LD, A2A &lt;code&gt;agent-card&lt;/code&gt;, MCP &lt;code&gt;server-card&lt;/code&gt;, &lt;code&gt;/openapi.json&lt;/code&gt; — the read layer. AI agents know you exist, know what you offer, can read your docs.&lt;/p&gt;

&lt;p&gt;What's missing from 99% of sites: &lt;strong&gt;the callable layer&lt;/strong&gt;. When the agent decides to actually invoke your endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identity&lt;/strong&gt;: which service is this? Two of your endpoints can't accept the same receipt — that's the cross-service replay bug Daedalus keeps flagging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price&lt;/strong&gt;: how much per call? In what currency? Fiat, USDC?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cap&lt;/strong&gt;: max per transaction? Per minute? Per day?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receipt&lt;/strong&gt;: how does the agent prove it paid, and how do you verify it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;x402&lt;/code&gt; (HTTP 402 Payment Required, reborn) is the spec everyone is converging on. It's a discovery manifest + a challenge/response over HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Pack v3 ships
&lt;/h2&gt;

&lt;p&gt;Every &lt;code&gt;$1 / $29 / $99&lt;/code&gt; AgentFix Pack now includes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/.well-known/x402.json&lt;/code&gt;&lt;/strong&gt; — discovery manifest. Declares your service_id, accepted currencies (USD via Stripe/Creem + USDC on Base + Ethereum out of the box), priced paths, receipt format, spending caps.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x402"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"service_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yoursite.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"accepted_currencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fiat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"settlement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stripe_or_creem"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"crypto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USDC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"chain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"contract"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priced_paths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/v1/search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"caps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"max_single_transaction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"per_minute_request_cap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"per_day_spend_cap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"100.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;/.well-known/acp.json&lt;/code&gt; + &lt;code&gt;ucp&lt;/code&gt;&lt;/strong&gt; — upgraded with a &lt;code&gt;payment&lt;/code&gt; object pointing at the manifest, the receipts endpoint, and the service_id binding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;9-x402-payment-layer/cloudflare-worker-x402.js&lt;/code&gt;&lt;/strong&gt; — drop-in Cloudflare Worker. Sits in front of your priced paths, returns HTTP 402 with the challenge metadata, verifies HMAC-signed receipts on retry (with anti-replay &lt;code&gt;svc&lt;/code&gt; binding), forwards valid requests to origin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verifyReceipt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expectedSvc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;bodyPart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sigPart&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/-/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/_/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;svc&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;expectedSvc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                 &lt;span class="c1"&gt;// anti-replay&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iat&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 10 min TTL&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;importKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;raw&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RECEIPT_HMAC_SECRET&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HMAC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SHA-256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verify&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HMAC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;base64ToBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sigPart&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyPart&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why additive matters
&lt;/h2&gt;

&lt;p&gt;This is folder 9. The pack still installs 1, 2, 3 in the obvious order — llms.txt, schema, A2A, MCP, all the things that already work. Folder 9 is for buyers who expose paid APIs. Buyers who don't can delete it without breaking anything.&lt;/p&gt;

&lt;p&gt;That's the brand decision: &lt;strong&gt;discovery is the first sale, callable-with-authority is the second&lt;/strong&gt;. Most sites need the first. Some need both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the scanner now flags
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;agentfix-mini-scanner@latest yoursite.com&lt;/code&gt; already detects the manifest paths. The next OSS release (1.2.0) will validate the structure — &lt;code&gt;service_id&lt;/code&gt; present, &lt;code&gt;caps&lt;/code&gt; declared, receipt format spelled out.&lt;/p&gt;

&lt;p&gt;If you're building agent-payable services and want to swap notes on the receipt format, ping @LLlkoJla on X or &lt;code&gt;support@agentfix.pro&lt;/code&gt;. The spec is still wet and the more sites converge, the cheaper agents are to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx agentfix-mini-scanner yoursite.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OSS scanner: &lt;a href="https://github.com/Virt92/agentfix-oss-scanner" rel="noopener noreferrer"&gt;https://github.com/Virt92/agentfix-oss-scanner&lt;/a&gt;&lt;br&gt;
Full Pack with x402 + receipts ($1 / $29 / $99 one-time): &lt;a href="https://agentfix.pro" rel="noopener noreferrer"&gt;https://agentfix.pro&lt;/a&gt;&lt;br&gt;
Iceberg viz: &lt;a href="https://workspace.agentfix.pro" rel="noopener noreferrer"&gt;https://workspace.agentfix.pro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building solo. Iterating in the open. Feedback shapes the next pack revision.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>api</category>
      <category>llm</category>
    </item>
    <item>
      <title>I built a free scanner that tells you how readable your site is to AI agents (96% fail)</title>
      <dc:creator>Egor</dc:creator>
      <pubDate>Sat, 27 Jun 2026 23:14:08 +0000</pubDate>
      <link>https://dev.to/virt92/i-built-a-free-scanner-that-tells-you-how-readable-your-site-is-to-ai-agents-96-fail-4pn</link>
      <guid>https://dev.to/virt92/i-built-a-free-scanner-that-tells-you-how-readable-your-site-is-to-ai-agents-96-fail-4pn</guid>
      <description>&lt;p&gt;Solo founder here. The "blue link" layer of search is being eaten by the answer layer — Google AI Overviews, ChatGPT browse, Claude artifacts, Perplexity citations. They rely on a set of signals most sites haven't shipped: llms.txt, schema.org JSON-LD, agent-card.json (A2A), MCP server-card, OpenAPI, bot-friendly robots.txt.&lt;/p&gt;

&lt;p&gt;I scanned ~200 sites this month: 96% fail at least 6 of the 12 most basic signals. Most fail all 12.&lt;/p&gt;

&lt;p&gt;Built and open-sourced a CLI scanner:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx agentfix-mini-scanner yoursite.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;12 of 33 signals. MIT. Zero deps. Node 18+. ~5 sec. Grade A–F + concrete fixes per check.&lt;/p&gt;

&lt;p&gt;There's also a free interactive iceberg viz: &lt;a href="https://workspace.agentfix.pro" rel="noopener noreferrer"&gt;workspace.agentfix.pro&lt;/a&gt; — what Google sees ↑ what AI agents reach for ↓ what nobody ships yet 🌊&lt;/p&gt;

&lt;p&gt;Full product at agentfix.pro = 33 signals + ZIP fix-pack generated from your real content. One-time $1/$29/$99 (no subscription).&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Virt92/agentfix-oss-scanner" rel="noopener noreferrer"&gt;https://github.com/Virt92/agentfix-oss-scanner&lt;/a&gt;&lt;br&gt;
Scanner: npx agentfix-mini-scanner yoursite.com&lt;br&gt;
Workspace viz: &lt;a href="https://agentfix.pro" rel="noopener noreferrer"&gt;https://agentfix.pro&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
