---
title: "Specoria Commerce Readiness Specification 1.0"
description: "What a store, hotel or service site needs so AI shopping agents can reach, read and act on it: every scored check with a stable ID, test and weight."
source_url: "https://specoria.com/spec/"
lang: "en"
---

SPECIFICATION Version 1.0 · score model v2.4 · published October 8, 2026

# Specoria Commerce Readiness Specification 1.0

What an online store, hotel or service site needs so that AI shopping agents can reach it, read it and act on it: every scored check of the Specoria free test with a stable ID, a requirement, the exact test and its weight.

### Who wrote it and who scores it
Conflict of interest: Specoria wrote this specification and Specoria also scores stores against it, in its own free test and in its paid product. Nobody else reviews or certifies the scores. Read it as the published rule book of one vendor’s test, not as an independent standard. Every rule, weight and test is public so anyone can check our work; corrections are welcome at contact@specoria.com.

## How to read it

- Every scored check has a stable ID of the form SC-AREA-NN, for example SC-ACCESS-01. An ID is never reused; a removed check’s ID is retired and listed here.
- MUST: a critical blocker in the score model. A failure that counts as a blocker caps the score no matter how well the rest does; the test text says which failures count (for SC-ACCESS-01, only blocking OAI-SearchBot or Googlebot). SHOULD: if it fails, it costs only its own weight.
- Weight: points out of 100 in score model v2.4. Store checks add up to 100. On hotel and service sites the common access checks plus that site type’s checks add up to 100; store-only checks don’t apply there.
- The requirement is the target we score against; the test says exactly what the free test reads and when the check passes, is partial or fails. Each ID links to the check’s own page with fix code and how to verify it yourself.

## Scoring in one paragraph

The score is the weighted share of passed checks, 0-100. A partial result earns partial credit. A check that couldn’t be verified (for example the page didn’t open) or doesn’t apply to the site type leaves both the numerator and the denominator; it never counts as passed or as zero.

One critical blocker (a MUST failure that counts as a blocker) caps the score at 59; two or more cap it at 39.

“Agent-ready” needs at least 80 points, no critical blocker and a simulated agent that recommends the store. Below 40 the store is “hard to read”.

## What the test requests

- Only public pages on the site’s own domain, GET requests only, within a 20-second budget: robots.txt, the homepage, llms.txt, /.well-known/ucp and the sitemap (the one declared in robots.txt, otherwise /sitemap.xml).
- Up to two product page candidates (from the address entered, the product sitemap or homepage links), then the returns and shipping pages and the policy pages linked from the homepage. Hotel and service sites skip product, returns and shipping pages.
- Protocol discovery files, only if the homepage opened: /.well-known/mcp.json, /.well-known/mcp, /.well-known/agent-card.json, /.well-known/ai-catalog.json, /.well-known/api-catalog, /.well-known/http-message-signatures-directory, /checkout_sessions. They are information rows and don’t change the score.
- One request identifies itself as “Mozilla/5.0 (compatible; SpecoriaBot/1.0; AI agent readiness check; +https://specoria.com/bot/)” to see how bot protection treats a declared bot; all other requests carry ordinary browser headers.
- If rule-based reading can’t find the return window, return fees, free-shipping threshold or delivery time, one small AI model call may read them from the page text; the returned values are checked against the page and the scoring rules don’t depend on it. The same address is not re-fetched for 6 hours.

[The full, current list of requests is on our crawler page →](https://specoria.com/bot/)

## Requirements

| ID | Check | Level | Weight |
| --- | --- | --- | --- |
| [SC-ACCESS-01](https://specoria.com/spec/#sc-access-01) | Search and user agents allowed (robots.txt) | MUST | 8 |
| [SC-ACCESS-02](https://specoria.com/spec/#sc-access-02) | Is bot protection open to agents? | MUST | 8 |
| [SC-ACCESS-03](https://specoria.com/spec/#sc-access-03) | Product name and price readable without JavaScript | MUST | 5 |
| [SC-ACCESS-04](https://specoria.com/spec/#sc-access-04) | Sitemap | SHOULD | 2 |
| [SC-ACCESS-05](https://specoria.com/spec/#sc-access-05) | Can the product page be indexed? | SHOULD | 2 |
| [SC-DATA-01](https://specoria.com/spec/#sc-data-01) | Product structured data (schema.org) | MUST | 7 |
| [SC-DATA-02](https://specoria.com/spec/#sc-data-02) | Price, currency, availability and URL | SHOULD | 6 |
| [SC-DATA-03](https://specoria.com/spec/#sc-data-03) | Product identity (GTIN/MPN, brand, SKU) | SHOULD | 5 |
| [SC-DATA-04](https://specoria.com/spec/#sc-data-04) | Images and description | SHOULD | 2 |
| [SC-DATA-05](https://specoria.com/spec/#sc-data-05) | Reviews and rating | SHOULD | 3 |
| [SC-DATA-06](https://specoria.com/spec/#sc-data-06) | Can variants (size, color) be addressed? | SHOULD | 2 |
| [SC-POLICY-01](https://specoria.com/spec/#sc-policy-01) | Machine-readable return policy | SHOULD | 5 |
| [SC-POLICY-02](https://specoria.com/spec/#sc-policy-02) | Returns page and window | SHOULD | 4 |
| [SC-POLICY-03](https://specoria.com/spec/#sc-policy-03) | Machine-readable shipping information | SHOULD | 4 |
| [SC-POLICY-04](https://specoria.com/spec/#sc-policy-04) | Shipping cost and time on the page | SHOULD | 3 |
| [SC-POLICY-05](https://specoria.com/spec/#sc-policy-05) | Business identity | SHOULD | 2 |
| [SC-POLICY-06](https://specoria.com/spec/#sc-policy-06) | Legal pages (distance selling, Türkiye) | SHOULD | 2 |
| [SC-CONSISTENCY-01](https://specoria.com/spec/#sc-consistency-01) | Price consistency | MUST | 6 |
| [SC-CONSISTENCY-02](https://specoria.com/spec/#sc-consistency-02) | Stock consistency | SHOULD | 3 |
| [SC-CONSISTENCY-03](https://specoria.com/spec/#sc-consistency-03) | Currency and language | SHOULD | 2 |
| [SC-CONSISTENCY-04](https://specoria.com/spec/#sc-consistency-04) | Return window consistency | SHOULD | 2 |
| [SC-CONSISTENCY-05](https://specoria.com/spec/#sc-consistency-05) | Taxes-included wording | SHOULD | 2 |
| [SC-CART-02](https://specoria.com/spec/#sc-cart-02) | Add-to-cart button in the initial HTML | SHOULD | 5 |
| [SC-CART-03](https://specoria.com/spec/#sc-cart-03) | Is the cart button accessible? | SHOULD | 3 |
| [SC-CHECKOUT-01](https://specoria.com/spec/#sc-checkout-01) | Buying without an account | SHOULD | 4 |
| [SC-CHECKOUT-02](https://specoria.com/spec/#sc-checkout-02) | Order tracking | SHOULD | 2 |
| [SC-CART-01](https://specoria.com/spec/#sc-cart-01) | Site search that works by URL | SHOULD | 1 |
| [SC-HOTEL-01](https://specoria.com/spec/#sc-hotel-01) | Hotel structured data (Hotel / LodgingBusiness) | SHOULD | 18 |
| [SC-HOTEL-02](https://specoria.com/spec/#sc-hotel-02) | Amenities in structured data | SHOULD | 8 |
| [SC-HOTEL-03](https://specoria.com/spec/#sc-hotel-03) | Rooms and prices readable | SHOULD | 15 |
| [SC-HOTEL-04](https://specoria.com/spec/#sc-hotel-04) | Cancellation policy discoverable | SHOULD | 12 |
| [SC-HOTEL-05](https://specoria.com/spec/#sc-hotel-05) | Booking entry point reachable | SHOULD | 20 |
| [SC-SERVICE-01](https://specoria.com/spec/#sc-service-01) | Business structured data (Organization / ProfessionalService) | SHOULD | 18 |
| [SC-SERVICE-02](https://specoria.com/spec/#sc-service-02) | Services described | SHOULD | 15 |
| [SC-SERVICE-03](https://specoria.com/spec/#sc-service-03) | Pricing or “how it works” discoverable | SHOULD | 10 |
| [SC-SERVICE-04](https://specoria.com/spec/#sc-service-04) | Contact details readable | SHOULD | 12 |
| [SC-SERVICE-05](https://specoria.com/spec/#sc-service-05) | Contact or quote form within one click | SHOULD | 18 |

## Access `SC-ACCESS`

### `SC-ACCESS-01` Search and user agents allowed (robots.txt)

**Level**
MUST

**Weight**
8 of 100

**Applies to**
Online stores · Hotels and lodging · Service businesses

**Test check**
bots_search

**Requirement (MUST):** Search and user agents are explicitly allowed. You can still block training bots (GPTBot, ClaudeBot, Google-Extended); that doesn’t cut visibility.

**How it’s tested:** We read robots.txt and test the root and the product page’s path for search bots (OAI-SearchBot, Claude-SearchBot, PerplexityBot, Googlebot, Bingbot, Applebot) and user agents (ChatGPT-User, Claude-User, Perplexity-User, Google-Agent). Blocking any of them fails the check; blocking OAI-SearchBot or Googlebot is a critical blocker. No robots.txt passes; an unreadable one (server error, timeout) is not verifiable. Training bots (GPTBot, ClaudeBot, Google-Extended, CCBot) and other AI bots (Applebot-Extended, Meta-ExternalAgent, Amazonbot, MistralAI-User, Bytespider) don’t count and are shown as information rows; so are agent-specific groups that override the general (*) rules and any Content-Signal declaration.

**Based on:** [RFC 9309: Robots Exclusion Protocol ↗](https://www.rfc-editor.org/rfc/rfc9309) · [OpenAI: crawlers and user agents ↗](https://platform.openai.com/docs/bots)

[Check page, fix code and self-check →](https://specoria.com/method/checks/bots-search/)

### `SC-ACCESS-02` Is bot protection open to agents?

**Level**
MUST

**Weight**
8 of 100

**Applies to**
Online stores · Hotels and lodging · Service businesses

**Test check**
waf_access

**Requirement (MUST):** Bot protection stops only malicious traffic; verified search and user agents get the normal page (HTTP 200). Risk-based checks and rate limits (HTTP 429 + Retry-After) replace a CAPTCHA at every step.

**How it’s tested:** We request the homepage and the product page with ordinary browser headers. A hard refusal (e.g. HTTP 403) fails the check and is a critical blocker. A challenge page or CAPTCHA is a “possible block”: a partial pass, not a critical blocker, since we can’t see from outside what verified agents get. A rate limit (HTTP 429) isn’t counted as a block: we retry after the Retry-After wait; if the page opens it passes, if it’s still limited the check is not verifiable and doesn’t count. If the homepage is blocked from Cloudflare’s network but opens from a second network, it’s a partial pass. If only the one request that identifies itself as SpecoriaBot is refused, that’s also a “possible block” (partial pass): we can’t send requests from verified bot IPs.

**Based on:** [OpenAI: crawlers and user agents ↗](https://platform.openai.com/docs/bots)

[Check page, fix code and self-check →](https://specoria.com/method/checks/waf-access/)

### `SC-ACCESS-03` Product name and price readable without JavaScript

**Level**
MUST

**Weight**
5 of 100

**Applies to**
Online stores · Hotels and lodging · Service businesses

**Test check**
no_js

**Requirement (MUST):** Product name, price, currency and stock are in the initial HTML (server-side rendering or static generation).

**On hotel and service sites (measured on the homepage):** The business name, headings and main content are in the initial HTML (server-side rendering or static generation).

**How it’s tested:** We read the product page’s initial HTML, without running JavaScript: are the product name (structured data, og:title or h1) and the price in it? If either is missing the check fails and is a critical blocker. On hotel and service sites we look for the business name and at least 200 characters of readable text on the homepage.

**Based on:** [Google: JavaScript SEO basics ↗](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

[Check page, fix code and self-check →](https://specoria.com/method/checks/no-js/)

### `SC-ACCESS-04` Sitemap

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores · Hotels and lodging · Service businesses

**Test check**
sitemap

**Requirement (SHOULD):** An up-to-date sitemap lists your product pages and is referenced from robots.txt.

**On hotel and service sites (measured on the homepage):** An up-to-date sitemap lists your important pages and is referenced from robots.txt.

**How it’s tested:** We look for a “Sitemap:” line in robots.txt or for /sitemap.xml. Found passes, neither fails; if the file can’t be read, it’s not verifiable.

**Based on:** [sitemaps.org protocol ↗](https://www.sitemaps.org/protocol.html)

[Check page, fix code and self-check →](https://specoria.com/method/checks/sitemap/)

### `SC-ACCESS-05` Can the product page be indexed?

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores · Hotels and lodging · Service businesses

**Test check**
indexable

**Requirement (SHOULD):** Product pages are indexable and their canonical points to themselves.

**On hotel and service sites (measured on the homepage):** The homepage and important pages are indexable and each canonical points to the page itself.

**How it’s tested:** On the product page (or the homepage if there’s none) we look for “noindex” in meta robots and the X-Robots-Tag header; if present the check fails. A canonical URL pointing to another domain is a partial pass.

**Based on:** [Google: block indexing with noindex ↗](https://developers.google.com/search/docs/crawling-indexing/block-indexing)

[Check page, fix code and self-check →](https://specoria.com/method/checks/indexable/)

## Product data `SC-DATA`

### `SC-DATA-01` Product structured data (schema.org)

**Level**
MUST

**Weight**
7 of 100

**Applies to**
Online stores

**Test check**
product_schema

**Requirement (MUST):** Every product page carries Product data as JSON-LD; products with variants use ProductGroup + hasVariant.

**How it’s tested:** We look for JSON-LD Product (or ProductGroup) on the product page. Only microdata or Open Graph product tags is a partial pass; none fails and is a critical blocker.

**Based on:** [schema.org/Product ↗](https://schema.org/Product) · [Google: merchant listing structured data ↗](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing)

[Check page, fix code and self-check →](https://specoria.com/method/checks/product-schema/)

### `SC-DATA-02` Price, currency, availability and URL

**Level**
SHOULD

**Weight**
6 of 100

**Applies to**
Online stores

**Test check**
offer_complete

**Requirement (SHOULD):** The offer carries price, an ISO currency code, availability and the product URL together.

**How it’s tested:** We count four fields in the product’s offer: price, a valid ISO 4217 currency, availability and the offer URL. All four pass, none fails; anything in between earns points in proportion.

**Based on:** [schema.org/Offer ↗](https://schema.org/Offer) · [Google: merchant listing structured data ↗](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing)

[Check page, fix code and self-check →](https://specoria.com/method/checks/offer-complete/)

### `SC-DATA-03` Product identity (GTIN/MPN, brand, SKU)

**Level**
SHOULD

**Weight**
5 of 100

**Applies to**
Online stores

**Test check**
product_identity

**Requirement (SHOULD):** Brand and a valid GTIN (barcode) or MPN are defined; the SKU is there too.

**How it’s tested:** We read product identity from structured data: a valid GTIN (correct check digit) or an MPN, the brand and the SKU. An identifier plus the brand passes; none fails; partial credit weighs the identifier 50%, the brand 35% and the SKU 15%. The result also states identity confidence (no effect on score): a valid GTIN is “strong”, an MPN with the brand and no GTIN is “medium”, the product name alone is “weak”.

**Based on:** [GS1: GTIN ↗](https://www.gs1.org/standards/id-keys/gtin) · [schema.org/gtin ↗](https://schema.org/gtin)

[Check page, fix code and self-check →](https://specoria.com/method/checks/product-identity/)

### `SC-DATA-04` Images and description

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores

**Test check**
product_media

**Requirement (SHOULD):** JSON-LD carries a stable https image URL and an original description; og:image is set as well.

**How it’s tested:** We read the product image (structured data or og:image) and the description in the product’s structured data. A description of at least 20 words or 120 characters is enough; 10-19 words is short; fewer doesn’t count as a description. An image plus an adequate description passes; an image with a short description is a mostly partial pass; only one of the two is a half partial pass; neither fails.

**Based on:** [schema.org/Product ↗](https://schema.org/Product)

[Check page, fix code and self-check →](https://specoria.com/method/checks/product-media/)

### `SC-DATA-05` Reviews and rating

**Level**
SHOULD

**Weight**
3 of 100

**Applies to**
Online stores

**Test check**
reviews

**Requirement (SHOULD):** The stars and review count on the page are marked up as AggregateRating too.

**How it’s tested:** We look for a rating (AggregateRating) in the product’s structured data. A rating above zero with a review or rating count above zero passes; only individual reviews (Review), or a missing or zero count, is a partial pass; nothing fails.

**Based on:** [schema.org/AggregateRating ↗](https://schema.org/AggregateRating)

[Check page, fix code and self-check →](https://specoria.com/method/checks/reviews/)

### `SC-DATA-06` Can variants (size, color) be addressed?

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores

**Test check**
variants

**Requirement (SHOULD):** Every variant opens at its own URL; structured data uses ProductGroup + hasVariant and variesBy.

**How it’s tested:** Variants described as ProductGroup + hasVariant in structured data pass; if there are at least two colour variants, each colour needs its own distinct image, otherwise it’s a partial pass (size-only variants aren’t checked for images). If the page has a size/colour selector but no such data: options with their own URLs are a partial pass, options without fail. Products without a selector are not applicable.

**Based on:** [schema.org/ProductGroup ↗](https://schema.org/ProductGroup) · [Google: product variants ↗](https://developers.google.com/search/docs/appearance/structured-data/product-variants)

[Check page, fix code and self-check →](https://specoria.com/method/checks/variants/)

## Policies and trust `SC-POLICY`

### `SC-POLICY-01` Machine-readable return policy

**Level**
SHOULD

**Weight**
5 of 100

**Applies to**
Online stores

**Test check**
returns_machine

**Requirement (SHOULD):** The return policy is defined once at organization level (OnlineStore → hasMerchantReturnPolicy) or on the product offer, with the same values as your returns page.

**How it’s tested:** We look for a machine-readable return policy (MerchantReturnPolicy) at product, offer or Organization level, resolving @id references. We check three fields: the window type (returnPolicyCategory), a whole number of days for a finite window (merchantReturnDays; “30 days” or 14.5 don’t count) and the country (applicableCountry). All complete passes; a policy with missing fields is a partial pass (one missing 0.75, two 0.6, all three 0.5 points); no policy fails.

**Based on:** [schema.org/MerchantReturnPolicy ↗](https://schema.org/MerchantReturnPolicy) · [Google: merchant listing structured data ↗](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing)

[Check page, fix code and self-check →](https://specoria.com/method/checks/returns-machine/)

### `SC-POLICY-02` Returns page and window

**Level**
SHOULD

**Weight**
4 of 100

**Applies to**
Online stores

**Test check**
returns_human

**Requirement (SHOULD):** The homepage links to an HTML returns page that states the window, fees and method clearly.

**How it’s tested:** We find the returns page from links on the homepage and product page, open it and look for the return window (days). Days found passes; a page without days, or a PDF-only policy, is a partial pass; no page fails.

[Check page, fix code and self-check →](https://specoria.com/method/checks/returns-human/)

### `SC-POLICY-03` Machine-readable shipping information

**Level**
SHOULD

**Weight**
4 of 100

**Applies to**
Online stores

**Test check**
shipping_machine

**Requirement (SHOULD):** Shipping rate, handling and transit times are defined with OfferShippingDetails.

**How it’s tested:** We look for machine-readable shipping details (OfferShippingDetails or ShippingService) in the offer or at Organization level and count four fields: shipping cost (shippingRate), delivery region (shippingDestination), handling time (handlingTime) and transit time (transitTime); the times may sit under deliveryTime or shippingConditions. All four pass; a definition with missing fields is a partial pass (one missing 0.75, two 0.6, more 0.5 points); no definition fails.

**Based on:** [schema.org/OfferShippingDetails ↗](https://schema.org/OfferShippingDetails) · [Google: merchant listing structured data ↗](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing)

[Check page, fix code and self-check →](https://specoria.com/method/checks/shipping-machine/)

### `SC-POLICY-04` Shipping cost and time on the page

**Level**
SHOULD

**Weight**
3 of 100

**Applies to**
Online stores

**Test check**
shipping_human

**Requirement (SHOULD):** The product page shows shipping cost, the free-shipping threshold and delivery time before the cart.

**How it’s tested:** We look for a free-shipping threshold or a delivery time in the product page, the shipping page and the homepage text. Either found passes; a vague mention of shipping is a partial pass; nothing fails.

[Check page, fix code and self-check →](https://specoria.com/method/checks/shipping-human/)

### `SC-POLICY-05` Business identity

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores

**Test check**
org_identity

**Requirement (SHOULD):** The homepage carries OnlineStore data with name, address, contact details and social profiles.

**How it’s tested:** We look for the business (Organization) in the structured data of the pages we read: contact details and social profile links (sameAs). Both pass, one missing is a partial pass, no business data fails.

**Based on:** [schema.org/Organization ↗](https://schema.org/Organization)

[Check page, fix code and self-check →](https://specoria.com/method/checks/org-identity/)

### `SC-POLICY-06` Legal pages (distance selling, Türkiye)

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores

**Test check**
legal_pages

**Requirement (SHOULD):** The footer links to the distance sales contract, the pre-information form and the privacy notice.

**How it’s tested:** Measured only for the Turkish market: we look for a distance sales contract, a pre-information form and a privacy notice among the homepage and product page links. All three pass, none fails, anything in between is scored in proportion. Not applicable in other markets.

[Check page, fix code and self-check →](https://specoria.com/method/checks/legal-pages/)

## Consistency `SC-CONSISTENCY`

### `SC-CONSISTENCY-01` Price consistency

**Level**
MUST

**Weight**
6 of 100

**Applies to**
Online stores

**Test check**
price_match

**Requirement (MUST):** Visible price = structured-data price = feed price (taxes included, same currency).

**How it’s tested:** We compare the structured-data price with the product price meta tag and the visible page text. A meta tag with a different price fails the check and is a critical blocker; a price that isn’t visible on the page is a partial pass.

**Based on:** [schema.org/Offer ↗](https://schema.org/Offer)

[Check page, fix code and self-check →](https://specoria.com/method/checks/price-match/)

### `SC-CONSISTENCY-02` Stock consistency

**Level**
SHOULD

**Weight**
3 of 100

**Applies to**
Online stores

**Test check**
stock_match

**Requirement (SHOULD):** Availability is real-time and machine-readable (InStock, OutOfStock, PreOrder).

**How it’s tested:** We compare the structured-data availability with the page: data saying “in stock” while the page says “sold out” with no add-to-cart fails; data saying “out of stock” while the page is buyable is a partial pass.

**Based on:** [schema.org/ItemAvailability ↗](https://schema.org/ItemAvailability)

[Check page, fix code and self-check →](https://specoria.com/method/checks/stock-match/)

### `SC-CONSISTENCY-03` Currency and language

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores · Hotels and lodging · Service businesses

**Test check**
market_match

**Requirement (SHOULD):** priceCurrency is an ISO 4217 code (e.g. USD) and <html lang> matches the page language.

**On hotel and service sites (measured on the homepage):** <html lang> matches the page language; where prices are shown, the currency is an ISO 4217 code (e.g. USD).

**How it’s tested:** We compare the price currency with the domain’s market (e.g. .com.tr → TRY) and the page language (<html lang>) with the market’s language. A mismatched currency fails; a missing or different language tag is a partial pass.

[Check page, fix code and self-check →](https://specoria.com/method/checks/market-match/)

### `SC-CONSISTENCY-04` Return window consistency

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores

**Test check**
policy_match

**Requirement (SHOULD):** The return window in structured data equals the one on the returns page.

**How it’s tested:** We compare the return window in structured data with the one on the returns page. Equal passes, different fails; if either is missing there’s nothing to compare and it isn’t counted.

[Check page, fix code and self-check →](https://specoria.com/method/checks/policy-match/)

### `SC-CONSISTENCY-05` Taxes-included wording

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores

**Test check**
price_transparency

**Requirement (SHOULD):** The price states that taxes are included, and shipping cost is visible before the cart.

**How it’s tested:** For Türkiye, EU countries, the UK, Switzerland, Australia and New Zealand we look for a “VAT included” style phrase in the product page and homepage text. Present passes, absent fails; other markets are not applicable.

[Check page, fix code and self-check →](https://specoria.com/method/checks/price-transparency/)

## Search and cart `SC-CART`

### `SC-CART-02` Add-to-cart button in the initial HTML

**Level**
SHOULD

**Weight**
5 of 100

**Applies to**
Online stores

**Test check**
add_to_cart

**Requirement (SHOULD):** Add to cart is a real <button> or form in the initial HTML.

**How it’s tested:** We look for an add-to-cart signal in the product page’s initial HTML: a cart form, cart attributes or “Add to cart” text. Present passes, absent fails.

[Check page, fix code and self-check →](https://specoria.com/method/checks/add-to-cart/)

### `SC-CART-03` Is the cart button accessible?

**Level**
SHOULD

**Weight**
3 of 100

**Applies to**
Online stores

**Test check**
cart_accessible

**Requirement (SHOULD):** The button is a <button> or form submit with visible text or an aria-label.

**How it’s tested:** If add-to-cart was found, we check whether it’s a real button or form and whether it has a readable name (text or aria-label). Both pass, one is a partial pass, neither fails.

**Based on:** [WAI-ARIA: button pattern ↗](https://www.w3.org/WAI/ARIA/apg/patterns/button/)

[Check page, fix code and self-check →](https://specoria.com/method/checks/cart-accessible/)

### `SC-CART-01` Site search that works by URL

**Level**
SHOULD

**Weight**
1 of 100

**Applies to**
Online stores

**Test check**
site_search

**Requirement (SHOULD):** Search submits a GET form to a URL parameter; WebSite data declares a SearchAction.

**How it’s tested:** We look for search that works through a URL parameter on the homepage: a SearchAction in structured data or a search form sent with GET (q, s, search…). A script-only search box is a partial pass; no search fails.

**Based on:** [schema.org/SearchAction ↗](https://schema.org/SearchAction)

[Check page, fix code and self-check →](https://specoria.com/method/checks/site-search/)

## Checkout and orders `SC-CHECKOUT`

### `SC-CHECKOUT-01` Buying without an account

**Level**
SHOULD

**Weight**
4 of 100

**Applies to**
Online stores

**Test check**
guest_checkout

**Requirement (SHOULD):** Guest checkout is on; few steps, no pop-ups or forced newsletter sign-ups.

**How it’s tested:** Guest checkout can’t be seen from outside without a browser; in the free test it’s always not verifiable and doesn’t count. The deep audit report measures it with a real browser.

[Check page, fix code and self-check →](https://specoria.com/method/checks/guest-checkout/)

### `SC-CHECKOUT-02` Order tracking

**Level**
SHOULD

**Weight**
2 of 100

**Applies to**
Online stores

**Test check**
order_tracking

**Requirement (SHOULD):** A guest order tracking page (order number + email) and a carrier tracking link are available.

**How it’s tested:** We look for an order-tracking link that works without signing in (e.g. “Track order”) among the homepage and product page links. Present passes, absent fails.

[Check page, fix code and self-check →](https://specoria.com/method/checks/order-tracking/)

## Hotels and lodging `SC-HOTEL`

### `SC-HOTEL-01` Hotel structured data (Hotel / LodgingBusiness)

**Level**
SHOULD

**Weight**
18 of 100 (with the common checks)

**Applies to**
Hotels and lodging

**Test check**
lodging_schema

**Requirement (SHOULD):** The homepage carries one Hotel (or Resort, BedAndBreakfast…) node with name, address, geo coordinates, phone, star rating and check-in/check-out times.

**How it’s tested:** We look for Hotel / LodgingBusiness structured data on the homepage and count seven fields: name, address, location, phone, star rating, check-in and check-out time. All pass, no data fails, anything in between is scored in proportion.

**Based on:** [schema.org/Hotel ↗](https://schema.org/Hotel) · [schema.org/LodgingBusiness ↗](https://schema.org/LodgingBusiness)

[Check page, fix code and self-check →](https://specoria.com/method/checks/lodging-schema/)

### `SC-HOTEL-02` Amenities in structured data

**Level**
SHOULD

**Weight**
8 of 100 (with the common checks)

**Applies to**
Hotels and lodging

**Test check**
lodging_amenities

**Requirement (SHOULD):** Every amenity a guest might filter on is listed as a LocationFeatureSpecification (name + value: true).

**How it’s tested:** We look for amenities (amenityFeature) in the hotel or room data. Present passes; amenities mentioned only in text (pool, breakfast, parking…) are a partial pass; nothing fails.

**Based on:** [schema.org/LocationFeatureSpecification ↗](https://schema.org/LocationFeatureSpecification)

[Check page, fix code and self-check →](https://specoria.com/method/checks/lodging-amenities/)

### `SC-HOTEL-03` Rooms and prices readable

**Level**
SHOULD

**Weight**
15 of 100 (with the common checks)

**Applies to**
Hotels and lodging

**Test check**
room_offers

**Requirement (SHOULD):** Each room type is a HotelRoom with occupancy and bed details, offered through an Offer with a “from” price and currency.

**How it’s tested:** We look for room types (HotelRoom, Suite…) and priced offers in the homepage structured data. Both pass, one is a partial pass, neither fails.

**Based on:** [schema.org/HotelRoom ↗](https://schema.org/HotelRoom) · [schema.org/Offer ↗](https://schema.org/Offer)

[Check page, fix code and self-check →](https://specoria.com/method/checks/room-offers/)

### `SC-HOTEL-04` Cancellation policy discoverable

**Level**
SHOULD

**Weight**
12 of 100 (with the common checks)

**Applies to**
Hotels and lodging

**Test check**
cancellation_policy

**Requirement (SHOULD):** A plain-text cancellation policy page (deadline, fees, no-show) linked from every page.

**How it’s tested:** We look for a link to the cancellation or booking terms on the homepage; found passes. Terms mentioned only in text are a partial pass, nothing fails. The linked page isn’t opened.

[Check page, fix code and self-check →](https://specoria.com/method/checks/cancellation-policy/)

### `SC-HOTEL-05` Booking entry point reachable

**Level**
SHOULD

**Weight**
20 of 100 (with the common checks)

**Applies to**
Hotels and lodging

**Test check**
booking_entry

**Requirement (SHOULD):** A plain <a href> to the booking engine (with dates as URL parameters if possible) or a GET form with check-in/check-out fields.

**How it’s tested:** We look for a real form with check-in/check-out dates, or a link to booking, on the homepage; found passes. A booking engine that only shows up in scripts is a partial pass; neither fails.

[Check page, fix code and self-check →](https://specoria.com/method/checks/booking-entry/)

## Service businesses `SC-SERVICE`

### `SC-SERVICE-01` Business structured data (Organization / ProfessionalService)

**Level**
SHOULD

**Weight**
18 of 100 (with the common checks)

**Applies to**
Service businesses

**Test check**
service_org

**Requirement (SHOULD):** One ProfessionalService (or Organization / LocalBusiness) node with name, contact details, address and the area served.

**How it’s tested:** We look for business structured data (Organization, LocalBusiness, ProfessionalService…) on the homepage and count three fields: name, contact (phone or email) and area served (areaServed). All pass, no data fails, anything in between is scored in proportion.

**Based on:** [schema.org/LocalBusiness ↗](https://schema.org/LocalBusiness) · [schema.org/ProfessionalService ↗](https://schema.org/ProfessionalService)

[Check page, fix code and self-check →](https://specoria.com/method/checks/service-org/)

### `SC-SERVICE-02` Services described

**Level**
SHOULD

**Weight**
15 of 100 (with the common checks)

**Applies to**
Service businesses

**Test check**
service_pages

**Requirement (SHOULD):** One page per service, linked from the homepage, each with Service data pointing to your organization.

**How it’s tested:** We look for Service definitions in structured data or links to service pages on the homepage (“Our services”, /services…). Either passes, neither fails.

**Based on:** [schema.org/Service ↗](https://schema.org/Service)

[Check page, fix code and self-check →](https://specoria.com/method/checks/service-pages/)

### `SC-SERVICE-03` Pricing or “how it works” discoverable

**Level**
SHOULD

**Weight**
10 of 100 (with the common checks)

**Applies to**
Service businesses

**Test check**
pricing_info

**Requirement (SHOULD):** A pricing or packages page (starting prices are enough) and a short “how it works” section, both linked from the homepage.

**How it’s tested:** We look for pricing or “how it works” information: a link to a pricing page, a price in structured data or an amount in the homepage text. Any of them passes, none fails.

[Check page, fix code and self-check →](https://specoria.com/method/checks/pricing-info/)

### `SC-SERVICE-04` Contact details readable

**Level**
SHOULD

**Weight**
12 of 100 (with the common checks)

**Applies to**
Service businesses

**Test check**
contact_details

**Requirement (SHOULD):** Email and phone are plain text with mailto:/tel: links in the header or footer of every page.

**How it’s tested:** We look for an email address and a phone number on the homepage (link, text or structured data). Both pass, one is a partial pass, neither fails.

**Based on:** [schema.org/ContactPoint ↗](https://schema.org/ContactPoint)

[Check page, fix code and self-check →](https://specoria.com/method/checks/contact-details/)

### `SC-SERVICE-05` Contact or quote form within one click

**Level**
SHOULD

**Weight**
18 of 100 (with the common checks)

**Applies to**
Service businesses

**Test check**
contact_form

**Requirement (SHOULD):** A plain HTML form (name, email, message) reachable in one click from the homepage, with clearly labelled fields.

**How it’s tested:** We look for a real contact or quote form (with a text area or an email/phone field) or a link to a contact/quote page on the homepage; found passes. Only an email link is a partial pass; nothing fails. Nothing is ever typed into the form.

[Check page, fix code and self-check →](https://specoria.com/method/checks/contact-form/)

## Not in this version

- PROTOCOL is a reserved area. Protocol signals (UCP, MCP, A2A, AI Catalog, Web Bot Auth, WebMCP) appear in the test as information rows and are not scored, so they have no SC ID yet.
- Information rows such as training-bot rules, llms.txt structure, policy link types, payment methods or agent-safety findings are reported but not scored, so they are not requirements here.
- The agent simulator, AI visibility measurement and the paid deep audit are separate products and are not part of this specification.

## Machine-readable version

The same specification as JSON: IDs, levels, weights, requirements and tests in both languages, built from the same source as this page.

[Download sc-1.0.json](https://specoria.com/spec/sc-1.0.json)

## Versioning

- Specification 1.0 equals score model v2.4. When the model changes, the specification gets a new version and a changelog entry, and the version shown here changes with it.
- A changed weight, level or pass rule is a new minor version; adding or retiring checks is a new minor version too; IDs stay stable across versions.

## Changelog

- **1.0** · October 8, 2026 · score model v2.4: First publication. Every scored check of score model v2.4 gets a stable ID: 27 store checks and 10 hotel and service checks. Requirement levels, weights and tests are those of model v2.4; no rule changed for publication.

## Mapping to other check lists

Which SC requirements correspond to AgentReady’s public requirements, and which have no equivalent, with sources and the date we read them. [SC 1.0 and AgentReady →](https://specoria.com/spec/agentready-mapping/)

Found a mistake or a rule you disagree with? Write to contact@specoria.com.
