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 →
Requirements
| ID | Check | Level | Weight |
|---|---|---|---|
SC-ACCESS-01 | Search and user agents allowed (robots.txt) | MUST | 8 |
SC-ACCESS-02 | Is bot protection open to agents? | MUST | 8 |
SC-ACCESS-03 | Product name and price readable without JavaScript | MUST | 5 |
SC-ACCESS-04 | Sitemap | SHOULD | 2 |
SC-ACCESS-05 | Can the product page be indexed? | SHOULD | 2 |
SC-DATA-01 | Product structured data (schema.org) | MUST | 7 |
SC-DATA-02 | Price, currency, availability and URL | SHOULD | 6 |
SC-DATA-03 | Product identity (GTIN/MPN, brand, SKU) | SHOULD | 5 |
SC-DATA-04 | Images and description | SHOULD | 2 |
SC-DATA-05 | Reviews and rating | SHOULD | 3 |
SC-DATA-06 | Can variants (size, color) be addressed? | SHOULD | 2 |
SC-POLICY-01 | Machine-readable return policy | SHOULD | 5 |
SC-POLICY-02 | Returns page and window | SHOULD | 4 |
SC-POLICY-03 | Machine-readable shipping information | SHOULD | 4 |
SC-POLICY-04 | Shipping cost and time on the page | SHOULD | 3 |
SC-POLICY-05 | Business identity | SHOULD | 2 |
SC-POLICY-06 | Legal pages (distance selling, Türkiye) | SHOULD | 2 |
SC-CONSISTENCY-01 | Price consistency | MUST | 6 |
SC-CONSISTENCY-02 | Stock consistency | SHOULD | 3 |
SC-CONSISTENCY-03 | Currency and language | SHOULD | 2 |
SC-CONSISTENCY-04 | Return window consistency | SHOULD | 2 |
SC-CONSISTENCY-05 | Taxes-included wording | SHOULD | 2 |
SC-CART-02 | Add-to-cart button in the initial HTML | SHOULD | 5 |
SC-CART-03 | Is the cart button accessible? | SHOULD | 3 |
SC-CHECKOUT-01 | Buying without an account | SHOULD | 4 |
SC-CHECKOUT-02 | Order tracking | SHOULD | 2 |
SC-CART-01 | Site search that works by URL | SHOULD | 1 |
SC-HOTEL-01 | Hotel structured data (Hotel / LodgingBusiness) | SHOULD | 18 |
SC-HOTEL-02 | Amenities in structured data | SHOULD | 8 |
SC-HOTEL-03 | Rooms and prices readable | SHOULD | 15 |
SC-HOTEL-04 | Cancellation policy discoverable | SHOULD | 12 |
SC-HOTEL-05 | Booking entry point reachable | SHOULD | 20 |
SC-SERVICE-01 | Business structured data (Organization / ProfessionalService) | SHOULD | 18 |
SC-SERVICE-02 | Services described | SHOULD | 15 |
SC-SERVICE-03 | Pricing or “how it works” discoverable | SHOULD | 10 |
SC-SERVICE-04 | Contact details readable | SHOULD | 12 |
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 ↗ · OpenAI: crawlers and user agents ↗
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 ↗
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 ↗
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 ↗
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 ↗
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 ↗ · Google: merchant listing structured data ↗
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 ↗ · Google: merchant listing structured data ↗
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 ↗ · schema.org/gtin ↗
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 ↗
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 ↗
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 ↗ · Google: product 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 ↗ · Google: merchant listing structured data ↗
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.
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 ↗ · Google: merchant listing structured data ↗
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.
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 ↗
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.
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 ↗
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 ↗
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.
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.
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.
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.
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 ↗
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 ↗
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.
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.
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 ↗ · schema.org/LodgingBusiness ↗
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.
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 ↗ · schema.org/Offer ↗
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.
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.
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 ↗ · schema.org/ProfessionalService ↗
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 ↗
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.
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 ↗
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.
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.
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 · · 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 →
Found a mistake or a rule you disagree with? Write to contact@specoria.com.