Agent-readiness report Demo · fictional store

Atlas Ceramics Studio

atlasceramics.example Custom or headless 6 Oct 2026, 09:14 UTC 9 requests

Markdown JSON Re-scan
57 DHard to read

Agents struggle to read this store. Most product facts are lost.

Grade D, hard to read. 4 failing checks, 10 warnings, 9 passed.

  1. 01 Access 87/100

    Can an agent reach your pages at all? 7 pass · 1 warn · 0 fail · 30% weight

  2. 02 Understanding 38/100

    Can it read what you sell without running JavaScript? 0 pass · 5 warn · 2 fail · 30% weight

  3. 03 Trust 61/100

    Can it verify who you are and what the terms are? 1 pass · 3 warn · 0 fail · 20% weight

  4. 04 Transaction 34/100

    Can it start a purchase through a protocol? 1 pass · 1 warn · 2 fail · 20% weight

Fix these first

  1. 1
    Product facts are in the raw HTML

    Render product content on the server.

    Fail Understanding

  2. 2
    UCP business profile

    Publish a UCP profile backed by a working checkout implementation.

    Fail Transaction

  3. 3
    AI search and shopping agents are allowed

    Allow search and user-triggered agents explicitly. Keep blocking training crawlers if you want to.

    Warn Access

01 / Access

Can an agent reach your pages at all?

87/100

Pass Homepage answers an agent HTTP 200.

Why agents care

Every agent starts with an HTTP request. Anything other than a fast 200 with HTML ends the visit before it begins.

What we found

Status
200
Final URL
https://atlasceramics.example/
Redirects
0
Content-Type
text/html; charset=utf-8
Pass No bot wall in front of the store Bots and browsers receive the same page.

Why agents care

Bot-protection that challenges every non-browser client blocks AI agents even when robots.txt welcomes them. Agents cannot solve JavaScript challenges or CAPTCHAs.

What we found

As LegibleBot
HTTP 200
As a browser
HTTP 200
Size difference
0 KB
Pass XML sitemap lists your products Valid sitemap with 3 product URLs.

Why agents care

Crawlers that build AI search indexes discover product URLs from sitemaps far more reliably than from links, especially on large catalogues.

What we found

Location
https://atlasceramics.example/sitemap.xml
Found via
robots.txt
Type
URL set (6 URLs)
Pass Fast first byte Slowest time to first byte: 420 ms.

Why agents care

User-triggered agents fetch pages while someone waits for an answer, with short timeouts. A slow server is a skipped store.

What we found

/
96 ms
/products/ember-stoneware-mug
420 ms
Pass Pages are not marked noindex No noindex directives on the pages scanned.

Why agents care

A noindex meta tag or X-Robots-Tag header tells search agents to drop the page from their index, even when robots.txt allows crawling.

What we found

Homepage
no directive
Product page
no directive
Pass robots.txt is valid robots.txt parses cleanly: 2 groups, 1 sitemap.

Why agents care

RFC 9309 says a robots.txt that errors with 5xx means "crawl nothing", and an HTML page served as robots.txt is noise. A clean file also points agents at your sitemap.

What we found

Groups
2
Sitemap lines
1
Unrecognised lines
none
Pass Lean HTML 119 KB of HTML for /products/ember-stoneware-mug.

Why agents care

Agents download and tokenise your HTML. Megabytes of inline scripts and styles bury product facts and can hit size caps before the content.

What we found

HTML size
119 KB
Inline script
118 KB in 4 tags
Visible words
0
Info Training crawler policy 1 training crawler blocked, 7 allowed.

Why agents care

Training crawlers (GPTBot, ClaudeBot, Google-Extended, CCBot and others) collect content for future models. Blocking them is a legitimate business choice and does not affect AI search visibility. Legible reports your stance but does not score it.

What we found

GPTBot (OpenAI)
Blocked
ClaudeBot (Anthropic)
Allowed
Google-Extended (Google)
Allowed
Applebot-Extended (Apple)
Allowed
Amazonbot (Amazon)
Allowed
meta-externalagent (Meta)
Allowed
CCBot (Common Crawl)
Allowed
Bytespider (ByteDance)
Allowed

02 / Understanding

Can it read what you sell without running JavaScript?

38/100

Fail Product facts are in the raw HTML The product page is a JavaScript shell. Without running scripts an agent sees no product.

Why agents care

Most AI fetchers do not run JavaScript. If the name, price and description only appear after scripts run, the agent sees an empty page and moves on.

What we found

Visible words (no JS)
0
Product name in text
No
Price in text
Not found
Shell signal
Only 0 words of visible text in the raw HTML
Shell signal
Empty Next.js root (#__next)
Shell signal
"Enable JavaScript" notice in the HTML

Fix

Render product content on the server.

  • Server-render (SSR or static generation) the product name, price, availability and description. Hydrate interactivity afterwards.
Fail One clear H1 with the product name The product page has no H1.

Why agents care

Extractors use the heading outline to split a page into sections. One H1 naming the product, then H2s for details and reviews, makes the page easy to chunk.

What we found

H1
none
H2
0

Fix

Mark the product name up as the page's only <h1>.

Warn Complete Product structured data Product schema is 73% complete. Missing: gtin / mpn, shippingDetails, hasMerchantReturnPolicy and aggregateRating.

Why agents care

Schema.org Product and Offer JSON-LD is the most reliable way for agents and shopping indexes to read price, currency, stock, identifiers, shipping and returns without guessing from layout.

What we found

name
Ember Stoneware Mug
image
https://atlasceramics.example/images/ember-mug.jpg
description
A 350 ml hand-thrown stoneware mug in a speckled ember glaze.
offers.price
34
offers.priceCurrency
EUR
offers.availability
https://schema.org/InStock
sku
ATL-MUG-EMB
gtin / mpn
missing
brand
Atlas Ceramics Studio
shippingDetails
missing
hasMerchantReturnPolicy
missing
aggregateRating
missing

Fix

Add the missing Product fields. The template below is pre-filled with what Legible found.

  • Print one Product JSON-LD block per product page, server-side, generated from the same data that renders the visible price.
Product JSON-LD (product template) Download
<!-- Product JSON-LD generated by Legible from this page.
     Replace every REPLACE_… value, then check delivery times, the 14-day
     return window and return fees against your real policy before publishing.
     Add aggregateRating only if the page shows real customer reviews. -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Ember Stoneware Mug",
  "description": "A 350 ml hand-thrown stoneware mug in a speckled ember glaze.",
  "image": [
    "https://atlasceramics.example/images/ember-mug.jpg"
  ],
  "sku": "ATL-MUG-EMB",
  "gtin": "REPLACE_BARCODE_OR_DELETE_THIS_LINE",
  "brand": {
    "@type": "Brand",
    "name": "Atlas Ceramics Studio"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://atlasceramics.example/products/ember-stoneware-mug",
    "price": "34.00",
    "priceCurrency": "EUR",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition",
    "seller": {
      "@type": "Organization",
      "name": "Atlas Ceramics Studio"
    },
    "shippingDetails": {
      "@type": "OfferShippingDetails",
      "shippingRate": {
        "@type": "MonetaryAmount",
        "value": "REPLACE_SHIPPING_COST",
        "currency": "EUR"
      },
      "shippingDestination": {
        "@type": "DefinedRegion",
        "addressCountry": "REPLACE_COUNTRY_CODE"
      },
      "deliveryTime": {
        "@type": "ShippingDeliveryTime",
        "handlingTime": {
          "@type": "QuantitativeValue",
          "minValue": 0,
          "maxValue": 1,
          "unitCode": "DAY"
        },
        "transitTime": {
          "@type": "QuantitativeValue",
          "minValue": 1,
          "maxValue": 3,
          "unitCode": "DAY"
        }
      }
    },
    "hasMerchantReturnPolicy": {
      "@type": "MerchantReturnPolicy",
      "applicableCountry": "REPLACE_COUNTRY_CODE",
      "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
      "merchantReturnDays": 14,
      "returnMethod": "https://schema.org/ReturnByMail",
      "returnFees": "https://schema.org/ReturnShippingFees"
    }
  }
}
</script>
Warn Organization and WebSite schema Organization schema found; WebSite missing.

Why agents care

Organization and WebSite markup tells an agent the store's official name, logo, URL and social profiles, so it can tell your shop apart from resellers and lookalikes.

What we found

Organization
Atlas Ceramics Studio
WebSite
missing
logo
present
sameAs
present

Fix

Add an Organization (or OnlineStore) and WebSite graph to the homepage.

Homepage <head> Download
<!-- Organization and WebSite JSON-LD generated by Legible.
     Replace every REPLACE_… value with your real details before publishing. -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "OnlineStore",
      "@id": "https://atlasceramics.example/#org",
      "name": "Atlas Ceramics Studio",
      "url": "https://atlasceramics.example/",
      "logo": "https://atlasceramics.example/logo.png",
      "email": "studio@atlasceramics.example",
      "telephone": "REPLACE_PHONE",
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "REPLACE_STREET",
        "postalCode": "REPLACE_POSTCODE",
        "addressLocality": "REPLACE_CITY",
        "addressCountry": "REPLACE_COUNTRY_CODE"
      },
      "legalName": "REPLACE_LEGAL_NAME",
      "vatID": "REPLACE_VAT_ID",
      "sameAs": [
        "https://www.instagram.com/atlasceramics.example"
      ]
    },
    {
      "@type": "WebSite",
      "@id": "https://atlasceramics.example/#website",
      "name": "Atlas Ceramics Studio",
      "url": "https://atlasceramics.example/",
      "publisher": {
        "@id": "https://atlasceramics.example/#org"
      }
    }
  ]
}
</script>
Warn OpenGraph product preview Missing og:description and og:url.

Why agents care

Chat interfaces render link previews and many agents fall back to OpenGraph when JSON-LD is missing. og:title, og:image and og:type are the minimum.

What we found

og:title
Ember Stoneware Mug
og:description
missing
og:image
https://atlasceramics.example/images/ember-mug.jpg
og:url
missing
og:type
product

Fix

Add og:description and og:url to the product template.

Warn Canonical URL and language <link rel="canonical"> is missing.

Why agents care

A canonical URL collapses filter and tracking variants into one product, and a lang attribute tells the agent which language and market the price and policies apply to.

What we found

canonical
missing
html lang
en

Fix

Add <link rel="canonical">.

Warn llms.txt guide for agents No llms.txt. The server answers /llms.txt with an HTML page and HTTP 200, so agents get a page instead of a 404.

Why agents care

llms.txt is a proposed markdown index of a site's most useful pages. No major assistant has confirmed it uses the file, so it carries little weight here, but it is cheap and gives agents a clean map of products and policies.

What we found

llms-full.txt
not found

Fix

Publish /llms.txt. This one is generated from the pages Legible found on your site.

  • Serve /llms.txt as text/plain or text/markdown from the site root.
/llms.txt Download
# Atlas Ceramics Studio

> Handmade stoneware from a two-person studio in Split. Mugs, plates, bowls and vases, glazed in small batches.

## Products

- [Ember Stoneware Mug](https://atlasceramics.example/products/ember-stoneware-mug)
- [Tide Dinner Plate](https://atlasceramics.example/products/tide-dinner-plate)
- [Cove Bud Vase](https://atlasceramics.example/products/cove-bud-vase)

## Categories

- [Tableware](https://atlasceramics.example/collections/tableware)
- [Vases](https://atlasceramics.example/collections/vases)

## Policies

- [Shipping](https://atlasceramics.example/help/shipping)
- [Returns](https://atlasceramics.example/help/returns)
- [Privacy](https://atlasceramics.example/privacy)
- [Contact](https://atlasceramics.example/contact)

## Optional

- [Journal](https://atlasceramics.example/journal)

03 / Trust

Can it verify who you are and what the terms are?

61/100

Warn Policy pages are linked Terms not linked.

Why agents care

Before recommending a purchase, assistants look for shipping costs, the return window and who to contact. In the EU, consumers have a 14-day right of withdrawal for most online purchases (Directive 2011/83/EU, Art. 9), so returns terms are a deciding fact.

What we found

Shipping
https://atlasceramics.example/help/shipping
Returns
https://atlasceramics.example/help/returns
Privacy
https://atlasceramics.example/privacy
Terms
no link found
Contact
https://atlasceramics.example/contact

Fix

Link terms from the site footer.

  • Link every policy page from a site-wide footer with plain anchor links agents can follow.
Warn Visible price matches structured data JSON-LD says EUR 34.00, but no price is visible in the raw HTML.

Why agents care

When the price a shopper sees differs from the price in JSON-LD, agents quote the wrong number or distrust both. Google Merchant Center suspends listings for mismatches, and under EU consumer law the price shown must be the price charged.

What we found

JSON-LD price
EUR 34.00
Current prices on page
none found
Microdata price
none
Warn Business identity is machine-readable Organization schema found, but address and legal name or VAT ID are missing.

Why agents care

Agents weigh whether a merchant is real. A legal name, postal address and a contact point in Organization schema are the strongest signals short of a marketplace listing.

What we found

address
missing
email / telephone / contactPoint
present
legalName / vatID
missing

Fix

Add address and legal name or VAT ID to the Organization node.

Pass HTTPS everywhere, with HSTS HTTPS with HSTS, and HTTP redirects to HTTPS.

Why agents care

Agents that hand a shopper off to checkout will not send them to an insecure page. HSTS proves the store never falls back to plain HTTP.

What we found

Final URL scheme
https
http:// redirects to https
yes (308)
Strict-Transport-Security
max-age=63072000; includeSubDomains; preload

04 / Transaction

Can it start a purchase through a protocol?

34/100

Fail UCP business profile UCP profile found with 2 spec errors: Required "transport": one of rest, mcp, a2a, embedded.

Why agents care

The Universal Commerce Protocol (UCP), announced by Google in January 2026, lets agents discover a store's capabilities from /.well-known/ucp and complete checkout through a standard API. It powers buying in Google AI Mode and Gemini. Current spec version: 2026-08-25.

What we found

ucp.version
2026-01-11
Services
dev.ucp.shopping
Transports
none
Capabilities
none
Payment handlers
none
Signing keys
none
$.ucp.version
Version 2026-01-11 is valid but not the latest (2026-08-25). Agents negotiate down, so this still works.
$.ucp.services.dev.ucp.shopping
Service bindings should be an array (one entry per transport).
$.ucp.services.dev.ucp.shopping[0].transport
Required "transport": one of rest, mcp, a2a, embedded.
$.ucp.capabilities
Capabilities must be an object keyed by capability name. An array is not the published form.
$.keys
No signing keys published. Recommended so agents can verify signed responses.

Fix

Publish a UCP profile backed by a working checkout implementation.

  • Implement the UCP REST or MCP binding for checkout, then publish the profile at /.well-known/ucp.
/.well-known/ucp (skeleton) Download
{
  "ucp": {
    "version": "2026-08-25",
    "services": {
      "dev.ucp.shopping": [
        {
          "version": "2026-08-25",
          "spec": "https://ucp.dev/2026-08-25/specification/overview/",
          "transport": "rest",
          "endpoint": "https://atlasceramics.example/ucp/v1",
          "schema": "https://ucp.dev/2026-08-25/services/shopping/rest.openapi.json"
        }
      ]
    },
    "capabilities": {
      "dev.ucp.shopping.checkout": [
        {
          "version": "2026-08-25",
          "spec": "https://ucp.dev/2026-08-25/specification/shopping/checkout/",
          "schema": "https://ucp.dev/2026-08-25/schemas/shopping/checkout.json"
        }
      ],
      "dev.ucp.shopping.fulfillment": [
        {
          "version": "2026-08-25",
          "spec": "https://ucp.dev/2026-08-25/specification/shopping/extensions/fulfillment/",
          "schema": "https://ucp.dev/2026-08-25/schemas/shopping/fulfillment.json",
          "extends": "dev.ucp.shopping.checkout"
        }
      ]
    },
    "payment_handlers": {}
  },
  "keys": []
}
Fail Add-to-cart works without scripts No add-to-cart control in the server HTML.

Why agents care

Browser-driving agents (ChatGPT agent, Gemini in Chrome and similar) click through your real checkout. A plain form or link for add-to-cart in the server HTML is the most robust path when no protocol is available.

What we found

Cart form in HTML
no
Add-to-cart link
no
Add-to-cart button
no

Fix

Render a real form that posts to your cart endpoint and works before scripts load; let JavaScript enhance it.

  • Server-render (SSR or static generation) the product name, price, availability and description. Hydrate interactivity afterwards.
Product template Download
<form method="post" action="/cart/add">
  <input type="hidden" name="sku" value="SKU">
  <input type="number" name="quantity" value="1" min="1">
  <button type="submit">Add to cart</button>
</form>
Warn Machine-readable catalogue One catalogue signal: Product URLs in the sitemap (3).

Why agents care

Agent channels (ChatGPT shopping, Google AI Mode, Copilot) prefer a structured product feed they can refresh over crawling pages. A feed keeps price and stock current between crawls.

What we found

Signal
Product URLs in the sitemap (3)

Fix

Expose a product feed and submit it to agent channels.

  • Expose a product feed (Google Merchant Center format works for most agent channels) and a product sitemap.
Pass Agentic Commerce Protocol readiness (signal) All ACP prerequisites are in place. Enrolment itself happens with OpenAI and cannot be detected from outside.

Why agents care

OpenAI and Stripe's Agentic Commerce Protocol (ACP) launched in September 2025 to let shoppers buy inside ChatGPT. There is no public discovery file: merchants are onboarded through OpenAI and submit a product feed. In March 2026 OpenAI moved checkout back to merchants' own sites, so discovery in ChatGPT now depends on that feed and on crawlable pages. Legible scores the prerequisites, not enrolment.

What we found

OAI-SearchBot allowed
yes
Product structured data
yes
Feed source available
yes
Info Platform and remediation path Detected Custom or headless (medium confidence).

Why agents care

What you can fix, and how fast, depends on the platform. Shopify merchants can switch most of this on; WooCommerce, Magento and custom stores need it built or configured.

What we found

Signal
Next.js application
Signal
x-powered-by: Next.js

Fix

Fix order for Custom or headless:

  • Serve robots.txt as text/plain from the site root and append the agent groups below.
  • Print one Product JSON-LD block per product page, server-side, generated from the same data that renders the visible price.
  • Implement the UCP REST or MCP binding for checkout, then publish the profile at /.well-known/ucp.

This is what an AI agent gets from https://atlasceramics.example/products/ember-stoneware-mug when it fetches the page without running JavaScript: the raw HTML on the left, the text it extracts on the right.

Raw HTML · what the server sent

119 KB
<div id="__next">
<div class="app-loading" aria-busy="true">
</div>
</div>
<noscript>You need to enable JavaScript to run this app.</noscript>
<script>/* 117 KB */</script>
<script type="application/json">/* 503 B */</script>

Agent's-eye view · extracted markdown

~0 tokens

0 words

Without JavaScript this page has no readable text. An agent gets nothing to quote, compare or recommend.

Only structured data survived

  • Product name Ember Stoneware Mug
  • Price EUR 34.00
  • Availability InStock
  • Brand Atlas Ceramics Studio

Facts an agent looks for

4 of 8 found

FactWhat the agent getsSource
Product nameEmber Stoneware MugJSON-LD
PriceEUR 34.00JSON-LD
AvailabilityInStockJSON-LD
BrandAtlas Ceramics StudioJSON-LD
GTIN / EANNot found in the raw HTML or structured dataMissing
ShippingNot found in the raw HTML or structured dataMissing
ReturnsNot found in the raw HTML or structured dataMissing
RatingNot found in the raw HTML or structured dataMissing

Extracted from https://atlasceramics.example/products/ember-stoneware-mug without running JavaScript, the way most AI fetchers read a page.

Every request Legible made, as LegibleBot/1.0 unless noted. Capped at 15 per scan, 8 seconds and 2.5 MB each.

StatusURLPurposeTimeSize
200https://atlasceramics.example/Homepage (as LegibleBot)116 ms2.8 KB
200https://atlasceramics.example/Homepage (as a browser, for bot-wall comparison)116 ms2.8 KB
200https://atlasceramics.example/robots.txtrobots.txt60 ms0.2 KB
308http://atlasceramics.example/HTTP to HTTPS redirect probe42 ms0.0 KB
200https://atlasceramics.example/llms.txtllms.txt80 ms0.7 KB
200https://atlasceramics.example/llms-full.txtllms-full.txt80 ms0.7 KB
200https://atlasceramics.example/.well-known/ucpUCP business profile95 ms0.3 KB
200https://atlasceramics.example/sitemap.xmlXML sitemap90 ms0.5 KB
200https://atlasceramics.example/products/ember-stoneware-mugProduct page (as LegibleBot)440 ms119.3 KB

Done for you

Want these fixed instead of listed?

Digital Age implements Legible's fixes on custom and headless stacks: robots and bot rules, complete product schema, policy pages, llms.txt and a UCP profile. Fixed scope, re-scanned before handover.

Ask for a fixed quote