scanned 2026-08-18 02:52 UTC · cached · refresh in 0h · rubric 2026.10.4
○Unverified public scan
Needs work
AgentSpeed tests how easily automated agents can discover, understand, and act on demoserum.netlify.app. The score weights five categories of machine-readability; the ticks on the arc are the 36 individual checks behind it.
Send this to whoever edits the site. The link shows the score and grade as a preview card, and it stays current: it re-reads the latest scan rather than freezing today’s number.
Top fixes
Checks tagged “emerging” are 2026 agent-protocol standards most of the web hasn’t adopted yet. Adopting early is an edge, not a defect.
failLink response headers+2 ptsDiscoverability
No HTTP Link: response headers. Emit canonical/alternate/describedby relations so HEAD-only or stream-rendering agents get them without parsing HTML.
Show me exactly what to do
What this means
HTTP responses can carry a Link header: the same canonical and alternate-language information your HTML declares, but delivered in the response envelope itself. Agents that only send a HEAD request, or that decide what to do while the page is still streaming, read the header without parsing any HTML. Yours is missing (or carries none of the relations agents use: canonical, alternate, describedby).
Why it matters
An agent triaging fifty URLs doesn’t want to download and parse fifty pages to learn which are duplicates of which. The Link header answers at the cheapest possible layer. Sites that provide it get correctly de-duplicated and correctly language-routed even by the most minimal fetchers.
Do this
Emit a Link header alongside each page, mirroring what your HTML head already declares. Example: Link: <https://yoursite.com/page>; rel="canonical".
Don’t lose this report
Get it in your inbox now, plus a heads-up whenever demoserum.netlify.app’s agent-readiness score changes. Free, unsubscribe anytime.
Prefer we just watch it for you? Monitor rescans weekly and emails what changed, $29/mo. Start monitoring →
Fix it
Generated, ready-to-ship files for the gaps above. Copy them, or download and drop them into your repo.
This scan graded one page. Your site is more than one page.
Weakest on this scan: discoverability, 46/100 — the signals agents use to find and navigate this site are thin or missing.
This graded your homepage. Your pricing, docs, and checkout live on other pages: the ones assistants actually quote when they recommend you. A 74/100 here means agents are already missing things on the page you polish most. The $29 Deep Scan grades your homepage plus up to 10 more pages we discover, against all 37 checks, then emails a PDF with every failing check and its exact fix, ranked by what costs you the most visibility. One-time, delivered in minutes, no subscription.
Right now, only you know this score. Your buyers ask AI before they buy, and certification is how you show them, and anyone comparing you to a competitor, that assistants can actually read, quote, and use your site.
A public verification URL you can drop into a sales deck, a procurement questionnaire, or a partner review. Anyone can check it, dated and signed.
An embeddable badge for your site, the visible version of a property competitors can’t claim without earning the score.
Weekly re-checks for a full year. A deploy that breaks agent access gets caught before it costs you recommendations, and before the certificate would lapse.
Sites under 70 can’t buy this at any price. That’s what makes displaying it mean something.
Glycolic-Bright Sérum Anti-manchas | LÓreál Presentamos el nuevo L'Oréal Paris Glycolic-Bright Sérum Anti-manchas. Formulado con un 8% de [Melasyl, Ácido Glicólico y Niacinamida]. Producto: Glycolic-Bright Sérum de L’Oréal. Precio: 19490 CLP. Disponibilidad: InStock. Sérum Glycolic Bright: El primer gesto, La luz, La textura, El ritual, El resultado, Tienda Online, Intro Cargando... 0/0 Estaciones Show Room LÓreál Glycolic-Bright Sérum Anti-manchas Presentamos el nuevo L'Oréal Paris Glycolic-Bright Sérum Anti-manchas. Formulado con un 8% de [Melasyl, Ácido Glicólico y Niacinamida]. Iniciar recorrido × Ver Detalles × 0:00 0:00 × × Recorrido Completo Cerrar HostSpots Visitados x Plano L'Oréal Sérum Glycolic Bright
Show your score
Embed this badge on your site. It links back to this live scan and updates on every rescan.
Get this report by email, then a heads-up when demoserum.netlify.app’s agent-readiness actually changes: a check regressing, or the composite dropping.
Two things never trigger an email: a score change caused by us publishing a new rubric, because that is a different instrument rather than a change to your site, and movement explained only by timing-derived checks, which shift run to run on a site nobody touched.
Want it on your own schedule, with Slack or a webhook instead of email? Score-drift monitoring is on every paid plan.
This score says whether an AI agent could read demoserum.netlify.app. AI traffic analytics says whether one actually came, and which pages turned it away.
Full breakdown
18 pass2 warn12 fail4 skip
Discoverability
pass
robots.txt present
A robots.txt is reachable at the site root.
100/100
pass
robots.txt allows AI agents
All 9 answer-time access agents allowed.
100/100
fail
Content-Signal directivesemerging
No Content-Signal directives. Add e.g. `Content-Signal: ai-train=no, ai-summarize=yes` to declare granular AI usage policy beyond binary allow/disallow.
0/100
pass
llms.txt present
Found /llms.txt but missing H1 header and markdown links. Not scored.
100/100
pass
Sitemap present
sitemap.xml reachable and referenced from robots.txt.
100/100
fail
Link response headers
No HTTP Link: response headers. Emit canonical/alternate/describedby relations so HEAD-only or stream-rendering agents get them without parsing HTML.
0/100
warn
Canonical URL
Canonical points elsewhere: https://www.lorealparis.cl/glycolic-bright/serum-rostro-anti-manchas?gad_source=1&gad_campaignid=21818121978&gbraid=0AAAAACrVon-GMRYEWsnvc3oZGYLp2tLWK&gclid=Cj0KCQjw7eXTBhDBARIsAKF-w46PGQlMVxhz5lXMvMpSNlBunkabJnm4UUG5kdPWTRvy5tyev1vpmCsaAr5sEALw_wcB. Verify intent (cross-domain canonicals are valid but unusual).
75/100
fail
MCP server cardemerging
No valid MCP Server Card at /.well-known/mcp/server-card.json. Publish one so agents can discover your tools without HTML scraping.
0/100
fail
OAuth authorization metadataemerging
No RFC 8414 metadata at /.well-known/oauth-authorization-server. Agents that act on behalf of users need this to discover your authorization endpoints.
0/100
fail
OAuth resource metadataemerging
No RFC 9728 metadata at /.well-known/oauth-protected-resource. Publish it so agents can discover required scopes without hand-coded credentials.
0/100
fail
API catalog / OpenAPIemerging
No /.well-known/api-catalog (RFC 9727) and no /openapi.json|yaml. Publish one so agents that integrate with APIs can discover your endpoints.
0/100
fail
Web Bot Authemerging
No Web Bot Auth JWKS at /.well-known/http-message-signatures-directory.json. Publish one to allow trusted agents while keeping a default-deny posture for the rest.
0/100
Readability
fail
Markdown negotiationemerging
Accept: text/markdown returns HTML, not markdown. Serve a markdown variant of primary content when requested; agents summarize and cite it more reliably.
0/100
fail
Text-to-markup ratio
Visible text is 2.9% of HTML weight (746/25705 bytes). 38% of the document is inline script, 59% is markup.
22/100
pass
Content without JavaScript
Primary content is present in the initial HTML — agents without JS can read it. (Measured statically; a rendered comparison was not run because the static reading sufficed.)
90/100
pass
Heading hierarchy
Hierarchy is well-formed (1 H1, no skipped levels, 9 headings total).
100/100
pass
Cookie wall blocks content
No common consent-modal markers detected.
100/100
pass
Declared language
Declared lang="es".
100/100
pass
Page title
A concise <title> is present (51 chars).
100/100
pass
Meta description
A well-sized meta description is present (135 chars).
100/100
Structured data
pass
JSON-LD present
Found 1 JSON-LD block.
100/100
warn
Structured data validates
1 recommended-field warning(s). First: Product recommends "sku" (improves agent comprehension). 2 block(s) skipped: type outside the set we check.
95/100
pass
Schema type coverage
Page intent unclear; no specific schema.org type expected.
100/100
Coherence: do your channels agree?
fail
JSON-LD price matches the visible priceemerging
JSON-LD declares 1 price field(s), none of which hold a recognisable price, but the served HTML shows no price at all. An agent reading the page sees a price humans never see, or the visible price only renders via JavaScript. Either way the two channels disagree.
0/100
pass
JSON-LD name appears on the pageemerging
Declared entity name "Glycolic-Bright Sérum" appears on the visible page.
100/100
skip
Declared language matches the contentemerging
Content language could not be named with confidence: no verdict over a guess.
—
Actionability
pass
Paywall / login wall
No paywall or login-wall detected on the landing URL.
100/100
fail
Agent Skills manifestemerging
No Agent Skills manifest at /.well-known/agent-skills.json. Enumerate the tasks agents can perform (search, add-to-cart, contact-support) so they pick the right one without scraping.
0/100
fail
WebMCP actionsemerging
No WebMCP detected. On pages with first-class actions (cart, support, account), embed a WebMCP server so on-page agents invoke tools directly.
0/100
pass
Primary action reachable
A primary offering and a price or call to action were both identifiable from the served HTML, so an agent can tell what this page sells and what it costs without running scripts.
100/100
pass
Reachability
HTTP 200.
100/100
skip
Primary action is clickableemerging
This page does not ask the reader to do anything, so there is no primary action to check. Informational pages are not penalised here.
—
skip
Filters reachable by URLemerging
This page does not offer to filter or sort a list, so there is nothing to address by URL. Pages without facets are not penalised here.
—
Performance
pass
Time to first byte
TTFB 158ms. Healthy.
100/100
skip
Full render time
Full-render time unavailable (browser pass skipped or failed).
—
pass
Page weight
Initial document is a lean 25 KB.
100/100
Beyond the scan
Running AI agents of your own? AgentSpeed also monitors them in production: every run, its latency, cost, and failures, with alerts when something breaks. Free for 10,000 events a month, no credit card.
Run reports like this for every client: white-label PDFs and weekly monitoring for up to 15 domains, $149/mo. AgentSpeed for Agencies →
Methodology & limitations
This score is a measurement of machine-readability for automated agents under the published rubric 2026.10.4. AgentSpeed does not assess security, legitimacy, privacy, or financial trust.
Most stacks set this in one place: Next.js headers() config, an nginx add_header line, or a CDN response-header rule.
If you serve translations, add rel="alternate" entries with hreflang, matching your HTML.
Paste into Claude Code, Cursor, or any assistant with your repository open. It carries this finding, the steps, and the shortcuts to avoid.
Or copy it written for your tool:
What to check
Run: curl -sI https://yoursite.com | grep -i "^link:" and confirm the relations appear.
Hit Re-scan above: "Link response headers" flips to PASS.
What to avoid
The header must AGREE with the HTML. A Link header pointing one place while the in-page canonical points another gives machines two contradictory answers, which is worse than one missing answer.
Don’t inject the same site-wide canonical on every page via a blanket CDN rule; each page names its own clean URL, exactly as in the HTML tag.
Canonical points elsewhere: https://www.lorealparis.cl/glycolic-bright/serum-rostro-anti-manchas?gad_source=1&gad_campaignid=21818121978&gbraid=0AAAAACrVon-GMRYEWsnvc3oZGYLp2tLWK&gclid=Cj0KCQjw7eXTBhDBARIsAKF-w46PGQlMVxhz5lXMvMpSNlBunkabJnm4UUG5kdPWTRvy5tyev1vpmCsaAr5sEALw_wcB. Verify intent (cross-domain canonicals are valid but unusual).
Show me exactly what to do
What this means
A canonical tag is one line in your page’s HTML head that says "THIS is the official address of this page." Without it, yoursite.com/pricing, yoursite.com/pricing?utm_source=x, and www.yoursite.com/pricing all look like different pages with copied content.
Why it matters
When the same content lives at several addresses, agents split your page’s identity across the copies. They may cite a tracking-parameter URL, or treat the duplicates as a signal of low quality. The canonical tag merges them back into one.
Do this
Add <link rel="canonical" href="https://yoursite.com/this-page"> inside <head> on every page.
Each page points at ITSELF (its clean URL, no tracking parameters), not at the homepage.
On most platforms this is a setting, not code: Next.js Metadata API (alternates.canonical), WordPress via Yoast or Rank Math, Shopify themes have it built in.
→ <head>
Paste into Claude Code, Cursor, or any assistant with your repository open. It carries this finding, the steps, and the shortcuts to avoid.
What to check
View the page source and confirm exactly one canonical tag pointing at the clean URL.
Re-scan: "Canonical URL" flips to PASS.
What to avoid
Don’t point every page’s canonical at the homepage. That tells agents your entire site is one page, and everything else vanishes.
Don’t leave a copied canonical from a template pointing at someone else’s domain. It is a surprisingly common paste error, and it hands them your pages’ identity.
Visible text is 2.9% of HTML weight (746/25705 bytes). 38% of the document is inline script, 59% is markup.
Show me exactly what to do
What this means
Of everything your server sends for this page, very little is actual readable text. The rest is code, styling, and markup wrapper. Agents fetched a lot of bytes and found few words.
Why it matters
Agents work with retrieval budgets. A page that is 2% text either gets skimmed (and mis-summarised) or skipped. More signal per byte means more of your actual message survives into the agent’s summary.
Do this
Confirm your real copy is server-rendered. See the JavaScript check; these two usually fail together.
Cut boilerplate wrappers: deeply nested divs, inline SVG logos repeated per section, base64 images inlined into HTML.
Move large inline styles and scripts into external files.
Check how much of the document is inline script: your report now says. If most of it is, that is your framework serializing state for hydration, often a second copy of text already in the HTML. Send only the props a component cannot recompute, and render statically where a page does not need to hydrate.
Paste into Claude Code, Cursor, or any assistant with your repository open. It carries this finding, the steps, and the shortcuts to avoid.
Or copy it written for your tool:
What to check
Re-scan: "Text-to-markup ratio" improves, and "Page weight" often improves alongside.
What to avoid
Don’t pad the page with keyword text to inflate the ratio. The ratio is a proxy for substance, and stuffing is the opposite of substance.
warnStructured data validates+<1 ptStructured data
1 recommended-field warning(s). First: Product recommends "sku" (improves agent comprehension). 2 block(s) skipped: type outside the set we check.
Show me exactly what to do
What this means
Your page HAS structured data, but it is malformed: broken JSON syntax, or types and fields that don’t exist in the schema.org vocabulary. Machines can see the block but can’t parse it.
Why it matters
Invalid JSON-LD is worse than it looks. The agent spends its attention budget on the block, fails to parse it, and falls back to guessing from prose anyway. You pay the cost of structured data without getting the benefit.
Do this
Paste the failing page into validator.schema.org. It names the exact line and field that breaks.
The most common breaks: a trailing comma (invalid JSON), a typo’d type name, or a price written as "$79" instead of "79" with a separate priceCurrency.
Fix in place, redeploy, revalidate.
Paste into Claude Code, Cursor, or any assistant with your repository open. It carries this finding, the steps, and the shortcuts to avoid.
Or copy it written for your tool:
What to check
validator.schema.org reports zero errors for the page.
Re-scan: "Structured data validates" flips to PASS.
What to avoid
Don’t delete the block to make the error disappear. That trades "invalid" for "absent" and fails the presence check instead; fix it.
Don’t hand-edit generated JSON-LD in the page. Fix the template or plugin that generates it, or the error returns on the next publish.
failJSON-LD price matches the visible priceemerging+3 ptsStructured data
JSON-LD declares 1 price field(s), none of which hold a recognisable price, but the served HTML shows no price at all. An agent reading the page sees a price humans never see, or the visible price only renders via JavaScript. Either way the two channels disagree.
Show me exactly what to do
What this means
Your page declares one price in its machine-readable data (JSON-LD) and shows a different price to human eyes. We extracted both from the same page load and they don’t agree.
Why it matters
An assistant quoting your declared price tells the customer a number that isn’t what they’ll see at checkout. That is the fastest way to lose a sale an agent sent you, and repeated mismatches teach assistants to stop quoting your structured data at all.
Do this
Compare the two price lists in the finding above; both were captured from your live page.
Find where the JSON-LD price is generated (usually a template variable or an SEO plugin) and bind it to the SAME source your visible price renders from.
If a sale price displays, the JSON-LD offers block should carry the sale price, not the original.
Paste into Claude Code, Cursor, or any assistant with your repository open. It carries this finding, the steps, and the shortcuts to avoid.
Or copy it written for your tool:
What to check
Re-scan after deploying: "JSON-LD price matches the visible price" flips to PASS.
Check a page with an active discount too; mismatches usually reappear there first.
What to avoid
Don’t "fix" this by deleting the price from your structured data. You would pass this check by failing the useful one (type coverage). The goal is one true price in both channels.
Don’t hardcode the JSON-LD price. Hardcoded values drift the next time pricing changes, and the mismatch returns silently.
No Content-Signal directives. Add e.g. `Content-Signal: ai-train=no, ai-summarize=yes` to declare granular AI usage policy beyond binary allow/disallow.
Show me exactly what to do
What this means
Content-Signal is a newer robots.txt directive (pushed by Cloudflare) that lets you state a granular AI policy: for example "don’t train on my content, but summarising it in answers is fine". Classic robots.txt only offers all-or-nothing per crawler; this adds the middle ground. We looked for a Content-Signal line in your robots.txt and response headers and found none.
Why it matters
Without a granular signal, crawlers infer your intent from blunt allow/block rules, and sites often block more than they mean to just to avoid training use. A declared signal lets you keep answer visibility (summaries, citations) while opting out of what you object to. This is an emerging standard: honoring is voluntary and adoption is early, which is why it is flagged as emerging and weighs little.
Do this
Decide your actual policy first: are you fine with AI training on your content? With summarisation in answers? With search indexing?
Express it as one line in robots.txt, for example: Content-Signal: ai-train=no, ai-summarize=yes.
Keep your existing User-agent rules; the signal adds nuance on top, it doesn’t replace them.
Paste into Claude Code, Cursor, or any assistant with your repository open. It carries this finding, the steps, and the shortcuts to avoid.
Or copy it written for your tool:
What to check
Open yoursite.com/robots.txt and confirm the Content-Signal line is live.
Hit Re-scan above: "Content-Signal directives" flips to PASS.
What to avoid
Don’t declare signals that contradict your User-agent rules, such as ai-summarize=yes while blocking every AI crawler; conflicting instructions get you treated as unreliable.
Don’t add the line just for the score. It is a public policy statement; say what you mean, because compliant crawlers will act on it.