{ "openapi": "3.1.0", "info": { "title": "Phoenix Putter Co Storefront API", "summary": "Read-only catalog data and agent-driven commerce for phoenixputterco.com.", "description": "Machine-readable description of the public API surface of the Phoenix Putter Co storefront, a Shopify store. There are two ways for an agent to work with this store. (1) Read-only catalog endpoints: GET /products.json, GET /products/{handle}.json, GET /collections/{handle}/products.json and GET /search/suggest.json. These need no authentication, no credentials and no scopes. (2) Universal Commerce Protocol (UCP) over MCP at POST /api/ucp/mcp, used for catalog search, cart and checkout; capabilities are advertised at GET /.well-known/ucp. Discovery methods on that endpoint are open, but tools/call requires a signed agent JWT and an agent profile URI. Checkout requires contemporaneous human approval: agents must not complete payment autonomously. See https://phoenixputterco.com/agents.md and https://phoenixputterco.com/robots.txt for the full agent policy. Every failure on this API surface is returned as JSON with a machine-readable code, a message and a resolution hint; see x-error-handling and the Error, InvalidParameterError and JsonRpcError schemas.", "version": "2026-08-21", "termsOfService": "https://phoenixputterco.com/policies/terms-of-service", "contact": { "name": "Phoenix Putter Co", "email": "info@phoenixputterco.com", "url": "https://phoenixputterco.com/pages/contact" }, "license": { "name": "Store Terms of Service", "url": "https://phoenixputterco.com/policies/terms-of-service" } }, "externalDocs": { "description": "Agent instructions for this store", "url": "https://phoenixputterco.com/agents.md" }, "servers": [ { "url": "https://phoenixputterco.com", "description": "Primary storefront domain" }, { "url": "https://phoenix-putter-co.myshopify.com", "description": "Canonical Shopify domain" } ], "x-agent-policy": { "checkout_requires_human_approval": true, "automated_payment_prohibited": true, "preferred_transaction_path": "https://phoenixputterco.com/api/ucp/mcp", "agent_instructions": "https://phoenixputterco.com/agents.md", "llms_txt": "https://phoenixputterco.com/llms.txt", "robots_txt": "https://phoenixputterco.com/robots.txt", "rate_limit_policy": "The UCP/MCP endpoint is rate limited per IP. Back off on HTTP 429." }, "x-error-handling": { "summary": "Every machine endpoint on this store answers failures with JSON, never with an HTML error page.", "catalog_endpoints": { "400": "Invalid pagination. Body: {\"errors\": \"Page * Limit exceeds the 25000 limit.\"}", "404": "Unknown product handle. Content-Type application/json with an empty body. Resolve the correct handle from /sitemap.xml or /search/suggest.json.", "422": "Missing or empty required parameter. Body: {\"status\": 422, \"message\": \"Invalid parameter error\", \"description\": \"param is missing or the value is empty: q\"}", "note": "An unknown collection handle on /collections/{handle}/products.json returns HTTP 200 with an empty products array rather than a 404. Check products.length, not the status code." }, "ucp_mcp_endpoint": { "400": "Malformed request body. JSON-RPC error -32600 Invalid Request.", "403": "JSON-RPC error -32000 AuthenticationRequired. data carries the resolution hint, including the URL of the agent authentication documentation.", "422": "JSON-RPC error -32001 UCP discovery failed, data.code invalid_profile_url, data.continue_url points at a recoverable entry point." }, "html_pages": { "404": "HTML pages return a real HTTP 404 (never a 200 with an app shell). The 404 body carries a short markdown recovery document in