{"slug":"ritual-9r3hta","companyName":"Ritual","domain":"ritual.com","url":"https://ritual.com","headline":"A Shopify storefront with agent checkout capability but no API documentation for programmatic product discovery.","compositeScore":69,"humanScore":73,"agentScore":65,"doorGap":8,"humanMeasured":4,"agentMeasured":6,"percentile":null,"humanPercentile":null,"agentPercentile":null,"isPartial":false,"depth":"free","siteClass":"ecommerce","scannerVersion":12,"scannedAt":"2026-09-08T14:32:26.448Z","unlocked":false,"mission":{"steps":[{"url":"https://ritual.com","outcome":"ok","purpose":"reach the site at all"},{"url":"https://ritual.com/robots.txt","outcome":"ok","purpose":"find out whether machines are welcome"},{"url":"https://ritual.com","outcome":"ok","purpose":"ask whether the door opens for requests carrying the AI crawlers' names"},{"url":"https://ritual.com/llms.txt","outcome":"ok","purpose":"read the site's own guide for language models"},{"url":"https://ritual.com/sitemap.xml","outcome":"ok","purpose":"find out what pages exist"},{"url":"https://ritual.com/.well-known/security.txt","outcome":"missing","purpose":"find a contact route for machines"},{"url":"https://ritual.com","outcome":"missing","purpose":"find a published agent interface"},{"url":"https://ritual.com/.well-known/ai-plugin.json","outcome":"missing","purpose":"find an agent plugin manifest"},{"url":"https://ritual.com","outcome":"missing","purpose":"find out whether verified agents are recognised"},{"url":"https://ritual.com","outcome":"ok","purpose":"read the homepage as data rather than as a page"},{"url":"https://ritual.com","outcome":"missing","purpose":"find a machine readable API spec"},{"url":"https://ritual.com","outcome":"missing","purpose":"read the developer documentation"},{"url":"https://ritual.com","outcome":"ok","purpose":"read the prices without running JavaScript"},{"url":"https://ritual.com","outcome":"ok","purpose":"read the product catalogue as data"},{"url":"https://ritual.com","outcome":"ok","purpose":"read a product page as data"},{"url":"https://ritual.com","outcome":"ok","purpose":"read the returns and shipping terms"},{"url":"https://ritual.com","outcome":"ok","purpose":"walk the way a visitor would, to a signup form or a product"}],"verdict":"The agent got through 11 of 17 requests, but could not find a contact route for machines. It came up empty on 5 other checks too."},"observations":null,"dimensions":[{"key":"machine_discoverability","audience":"agent","score":100,"summary":"No AI crawler is blocked by robots.txt or user agent rules; llms.txt is published; the catalogue answers as data at /products.json with 12 products; the sitemap lists 33 URLs including product pages; 3 schema.org types on the homepage; a.","evidence":{"locked":true,"count":4}},{"key":"programmatic_onboarding","audience":"agent","score":10,"summary":"No API documentation is linked from the homepage or discoverable at standard paths. The site publishes a UCP manifest for agent checkout but offers no developer guide to programmatic product access, leaving an agent to reverse-engineer the.","evidence":{"locked":true,"count":3}},{"key":"pricing_legibility","audience":"agent","score":83,"summary":"31 prices appear in the homepage HTML; 42 prices across 3 product pages without JavaScript; Product structured data carries price in USD and currency; availability is published; a GTIN identifies each product.","evidence":{"locked":true,"count":2}},{"key":"agent_aware_instrumentation","audience":"agent","score":57,"summary":"A Universal Commerce Protocol manifest at version 2026-08-25 declares 8 capabilities and 3 payment handlers; a storefront MCP endpoint answers agent calls; the catalogue answers as data at /products.json.","evidence":{"locked":true,"count":4}},{"key":"machine_fetchable_trust","audience":"agent","score":55,"summary":"No security.txt is published at /.well-known/security.txt. The returns policy reads as text with a 30-day window at /policies/refund-policy. The shipping policy was not found at usual paths.","evidence":{"locked":true,"count":3}},{"key":"commercial_rails","audience":"agent","score":87,"summary":"Product markup carries price, currency, GTIN and brand; the catalogue answers as data at /products.json, which a feed can be built from; a Shopify store with GTIN and brand on its products, which Shopify Catalog syndicates; an aggregate.","evidence":{"locked":true,"count":4}},{"key":"steps_to_first_value","audience":"human","score":95,"summary":"A product with its price ($26.40) and an add-to-cart control is two steps from the homepage. No variant choosers block the path. The product page renders its structured data with price, currency and availability.","evidence":{"locked":true,"count":1}},{"key":"required_fields","audience":"human","score":80,"summary":"Nothing on the product page demands an account before buying. The entry path walk found 6 inputs on the form with 1 carrying a validation constraint. PayPal wallet skips the form entirely. No sign-in requirement appears before checkout.","evidence":{"locked":true,"count":1}},{"key":"verification_walls","audience":"human","score":75,"summary":"No sign-in requirement appears on the product page or the entry path. The add-to-cart control is immediately available. A guest checkout path exists, though the walk did not complete the transaction to confirm what verification steps.","evidence":{"locked":true,"count":1}},{"key":"error_recovery","audience":"human","score":43,"summary":"1 of 6 inputs on the product page carry validation rules. 15 inline error containers are present in the markup, and 18 live regions support screen readers, but the walk did not trigger validation errors to observe recovery behaviour.","evidence":{"locked":true,"count":1}}],"issues":[{"rank":1,"title":"The visible product price on the storefront differs from the structured price in the product markup, creating ambiguity about which price applies at checkout.","dimensionKey":"pricing_legibility","evidence":{"locked":true,"count":3},"fix":null},{"rank":2,"title":"No developer documentation is linked from the homepage, in raw HTML or the rendered page, so integration starts with a search engine.","dimensionKey":"programmatic_onboarding","evidence":{"locked":true,"count":1},"fix":null},{"rank":3,"title":"No API documentation is published, forcing agents to discover the /products.json endpoint by reverse-engineering or prior knowledge rather than following a documented interface.","dimensionKey":"programmatic_onboarding","evidence":{"locked":true,"count":3},"fix":null}],"fixArtifacts":{"locked":true,"count":12,"summaries":[{"id":"product_jsonld:products-essential-for-women-multivitamin","kind":"product_jsonld","title":"Product markup for Women’s Multivitamin 18+","path":"/products/essential-for-women-multivitamin","effort":{"minutes":30,"role":"developer"},"outcome":{"dimension":"pricing_legibility","external":["Assistants read price, availability and identifiers from every sampled product page."]}},{"id":"product_jsonld:products-essential-multivitamin-for-men","kind":"product_jsonld","title":"Product markup for Men’s Multivitamin 18+","path":"/products/essential-multivitamin-for-men","effort":{"minutes":30,"role":"developer"},"outcome":{"dimension":"pricing_legibility","external":["Assistants read price, availability and identifiers from every sampled product page."]}},{"id":"product_jsonld:products-synbiotic-plus-for-gut-health","kind":"product_jsonld","title":"Product markup for Synbiotic+","path":"/products/synbiotic-plus-for-gut-health","effort":{"minutes":30,"role":"developer"},"outcome":{"dimension":"pricing_legibility","external":["Assistants read price, availability and identifiers from every sampled product page."]}},{"id":"product_jsonld_liquid:snippets-seconddoor-product-jsonld-liquid","kind":"product_jsonld_liquid","title":"Product markup snippet for every product page","path":"snippets/seconddoor-product-jsonld.liquid","effort":{"minutes":30,"role":"developer"},"outcome":{"dimension":"pricing_legibility","external":["Every Shopify product page carries complete Product markup, not only the sampled ones."]}},{"id":"review_schema_vendor:notes","kind":"review_schema_vendor","title":"Put Okendo reviews in the page","path":"notes","effort":{"minutes":10,"role":"owner"},"outcome":{"dimension":"machine_discoverability","external":["Review text and ratings reach crawlers that do not run the review widget's script."]}},{"id":"robots_search_bots:robots-txt","kind":"robots_search_bots","title":"robots.txt rules for AI crawlers","path":"/robots.txt","effort":{"minutes":10,"role":"owner"},"outcome":{"dimension":"machine_discoverability","external":["The assistants' search crawlers read and cite the site to buyers; training stays the owner's decision."]}},{"id":"merchant_policy_jsonld:product-page","kind":"merchant_policy_jsonld","title":"Return policy and shipping structured data","path":"product page","effort":{"minutes":30,"role":"developer"},"outcome":{"dimension":"machine_fetchable_trust","external":["Assistants read the return window and shipping terms from structured data."]}},{"id":"policy_pages_text:notes","kind":"policy_pages_text","title":"Link the policy pages from the product page","path":"notes","effort":{"minutes":30,"role":"owner"},"outcome":{"dimension":"machine_fetchable_trust","external":["Returns and shipping pages read as text and are linked from every product page."]}},{"id":"policy_pages_text:policies-shipping-policy","kind":"policy_pages_text","title":"Shipping and delivery page","path":"/policies/shipping-policy","effort":{"minutes":30,"role":"owner"},"outcome":{"dimension":"machine_fetchable_trust","external":["Returns and shipping pages read as text and are linked from every product page."]}},{"id":"catalog_identifiers:catalog-identifiers-csv","kind":"catalog_identifiers","title":"Variants missing a GTIN or a brand","path":"catalog-identifiers.csv","effort":{"minutes":5,"role":"owner"},"outcome":{"dimension":"machine_discoverability","external":["Feed listings stop being rejected for a missing brand or GTIN."]}},{"id":"security_txt:well-known-security-txt","kind":"security_txt","title":"security.txt","path":"/.well-known/security.txt","effort":{"minutes":10,"role":"owner"},"outcome":{"dimension":"machine_fetchable_trust","external":["Researchers and automated scanners find a disclosure address instead of guessing one."]}},{"id":"interfaces_note:notes","kind":"interfaces_note","title":"Machine interfaces: where you stand","path":"notes","effort":{"minutes":10,"role":"owner"},"outcome":{"dimension":"agent_aware_instrumentation","external":["The developer surface is built in an order where every published pointer answers."]}}]},"feedback":{"endpoint":"/api/feedback","mcpTool":"rate_fix","targets":[{"type":"report","key":"report"},{"type":"dimension","dimensionKey":"machine_discoverability","key":"dimension:machine_discoverability"},{"type":"dimension","dimensionKey":"programmatic_onboarding","key":"dimension:programmatic_onboarding"},{"type":"dimension","dimensionKey":"pricing_legibility","key":"dimension:pricing_legibility"},{"type":"dimension","dimensionKey":"agent_aware_instrumentation","key":"dimension:agent_aware_instrumentation"},{"type":"dimension","dimensionKey":"machine_fetchable_trust","key":"dimension:machine_fetchable_trust"},{"type":"dimension","dimensionKey":"commercial_rails","key":"dimension:commercial_rails"},{"type":"dimension","dimensionKey":"steps_to_first_value","key":"dimension:steps_to_first_value"},{"type":"dimension","dimensionKey":"required_fields","key":"dimension:required_fields"},{"type":"dimension","dimensionKey":"verification_walls","key":"dimension:verification_walls"},{"type":"dimension","dimensionKey":"error_recovery","key":"dimension:error_recovery"},{"type":"issue","dimensionKey":"pricing_legibility","checkId":"product_pages","key":"issue:pricing_legibility:product_pages"},{"type":"issue","dimensionKey":"programmatic_onboarding","checkId":"api_surface","key":"issue:programmatic_onboarding:api_surface"},{"type":"issue","dimensionKey":"programmatic_onboarding","checkId":null,"key":"issue:programmatic_onboarding:-"}]}}