{"openapi":"3.1.0","info":{"title":"Yellow Balloon Shop Storefront API","version":"1.1.0","summary":"Read-only catalogue and agent-discovery endpoints for Yellow Balloon Shop, an Australian store selling children's mental-health and emotional-literacy resources.","description":"Yellow Balloon Shop publishes this API so an AI agent can answer questions about the catalogue without crawling HTML.\n\nWhen to use it: use /api/v1/products for bounded, cursor-paginated search with rate limits, and /api/v1/products/{handle} for one product. /api/products.json is a complete product feed generated live from the shop database on every request, for agents that prefer one full download over pagination. Fetch /llms.txt or /agents.md to orient and /.well-known/ucp to learn how this domain participates in agentic commerce.\n\nNo authentication is required and every documented operation is read-only. All prices are in AUD and are sent as decimal strings, not numbers.\n\nThis API offers no ordering, cart, or payment operation. Programmatic checkout is not available on this domain, so an agent cannot place an order here; send the shopper to the product page instead.\n\nEndpoints that exist but are deliberately undocumented: /api/cart (cookie-scoped and blocked cross-origin), /api/stripe/webhook (Stripe signature required), /api/revalidate (shared secret), /api/assistant/* and /api/concierge/* (session bootstrap and bot mitigation), /api/announcement (UI cookie state), and /downloads/{token} (token-gated digital delivery). Calling them from an agent will not succeed.","contact":{"name":"Yellow Balloon Shop support","email":"info@yellowbt.com.au","url":"https://shop.yellowballoontherapy.com.au/contact"}},"servers":[{"url":"https://shop.yellowballoontherapy.com.au","description":"Production storefront"}],"tags":[{"name":"catalog","description":"Product catalogue data."},{"name":"discovery","description":"Documents that tell an agent or crawler what this site offers."},{"name":"documentation","description":"Human- and agent-readable documentation pages."}],"paths":{"/api/v1/products":{"get":{"description":"Read compact product summaries using forward cursor pagination (24 by default, maximum 100). Unknown parameters and repeated scalar parameters are rejected. Repeat tag for exact AND filters (five distinct normalized tags maximum). All substring terms must match with match=all; match=any uses the existing WebMCP ASCII token score (title 3, tags 2, description 1). The default order is relevance for non-empty q, otherwise created_desc; relevance without q is invalid. Price filters use the minimum price across all variants, including unavailable variants. Currency is AUD. Every order ends in a stable ID tie-breaker; price nulls sort last. The 30-minute cursor binds filters, sort and page size and is a live continuation, not a historical snapshot. Responses are no-store observations, never inventory reservations. HEAD has identical status/headers with no body; OPTIONS advertises the permitted methods.","operationId":"listCatalogueProducts","parameters":[{"in":"query","name":"available","required":false,"schema":{"type":"boolean"}},{"in":"query","name":"collection","required":false,"schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s/?#]+$"}},{"in":"query","name":"cursor","required":false,"schema":{"type":"string","minLength":1,"maxLength":2048}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":24}},{"in":"query","name":"match","required":false,"schema":{"type":"string","enum":["all","any"],"default":"all"}},{"in":"query","name":"max_price_minor","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000000}},{"in":"query","name":"q","required":false,"schema":{"type":"string","maxLength":120,"default":""}},{"in":"query","name":"sort","required":false,"schema":{"type":"string","enum":["created_desc","updated_desc","title_asc","title_desc","price_asc","price_desc","relevance"]}},{"in":"query","name":"tag","required":false,"schema":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"maxItems":5,"default":[]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueListResponse"}}},"description":"A bounded page; page_info.returned equals data length and the cursor is null exactly when no following page exists.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"INVALID_QUERY, INVALID_CURSOR or CURSOR_EXPIRED. Unknown and repeated scalar parameters are rejected; restart invalid or expired cursors.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"PRODUCT_NOT_FOUND or NOT_FOUND. Visibility is checked on every read.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"405":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"METHOD_NOT_ALLOWED. Only GET, HEAD and OPTIONS are accepted.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Allow":{"schema":{"enum":["GET, HEAD, OPTIONS"],"type":"string"}}}},"414":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"URI_TOO_LONG. Raw URL exceeds 8192 UTF-8 bytes.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"RATE_LIMITED. Anonymous catalogue traffic exceeded its admission budget.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Retry-After":{"schema":{"enum":["60"],"type":"string"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"INTERNAL_ERROR. Invalid source projections and unexpected failures never expose internal details.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"CATALOGUE_UNAVAILABLE or QUERY_TIMEOUT. Fresh source reads or admission are unavailable.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Retry-After":{"schema":{"enum":["5"],"type":"string"}}}}},"summary":"Browse or search the public catalogue","tags":["catalog"]}},"/api/v1/products/{handle}":{"get":{"description":"Read descriptive facts and fresh commercial state for one visible product. The result contains at most 12 gallery images and 50 initial variants, with explicit truncation and variant continuation metadata. Representative variant IDs are display references and do not select purchase options. No query parameters are accepted. A missing, hidden, draft or deleted product returns the same PRODUCT_NOT_FOUND error. HEAD and OPTIONS use the same public CORS and no-store policy.","operationId":"getCatalogueProduct","parameters":[{"description":"Public product handle; hidden, draft and deleted products return the same 404 as missing products.","in":"path","name":"handle","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s/?#]+$","description":"Public product handle; hidden, draft and deleted products return the same 404 as missing products."}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueDetailResponse"}}},"description":"One product with bounded image and variant associations.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"INVALID_QUERY, INVALID_CURSOR or CURSOR_EXPIRED. Unknown and repeated scalar parameters are rejected; restart invalid or expired cursors.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"PRODUCT_NOT_FOUND or NOT_FOUND. Visibility is checked on every read.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"405":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"METHOD_NOT_ALLOWED. Only GET, HEAD and OPTIONS are accepted.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Allow":{"schema":{"enum":["GET, HEAD, OPTIONS"],"type":"string"}}}},"414":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"URI_TOO_LONG. Raw URL exceeds 8192 UTF-8 bytes.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"RATE_LIMITED. Anonymous catalogue traffic exceeded its admission budget.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Retry-After":{"schema":{"enum":["60"],"type":"string"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"INTERNAL_ERROR. Invalid source projections and unexpected failures never expose internal details.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"CATALOGUE_UNAVAILABLE or QUERY_TIMEOUT. Fresh source reads or admission are unavailable.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Retry-After":{"schema":{"enum":["5"],"type":"string"}}}}},"summary":"Read an individual public product","tags":["catalog"]}},"/api/v1/products/{handle}/variants":{"get":{"description":"Read a forward variant page for a currently visible product, ordered by position then ID. The default page size is 50 and maximum is 100. Cursors bind route, product handle, page size and position and expire 30 minutes from the initial observation. Prices and eligibility are fresh observations; unavailable data is never replaced with an older affirmative ordering claim. HEAD and OPTIONS follow the same CORS and no-store policy.","operationId":"listCatalogueProductVariants","parameters":[{"description":"Public product handle; hidden, draft and deleted products return the same 404 as missing products.","in":"path","name":"handle","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s/?#]+$","description":"Public product handle; hidden, draft and deleted products return the same 404 as missing products."}},{"in":"query","name":"cursor","required":false,"schema":{"type":"string","minLength":1,"maxLength":2048}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueVariantsResponse"}}},"description":"A bounded variant page with an explicit next cursor.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"INVALID_QUERY, INVALID_CURSOR or CURSOR_EXPIRED. Unknown and repeated scalar parameters are rejected; restart invalid or expired cursors.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"PRODUCT_NOT_FOUND or NOT_FOUND. Visibility is checked on every read.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"405":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"METHOD_NOT_ALLOWED. Only GET, HEAD and OPTIONS are accepted.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Allow":{"schema":{"enum":["GET, HEAD, OPTIONS"],"type":"string"}}}},"414":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"URI_TOO_LONG. Raw URL exceeds 8192 UTF-8 bytes.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"RATE_LIMITED. Anonymous catalogue traffic exceeded its admission budget.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Retry-After":{"schema":{"enum":["60"],"type":"string"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"INTERNAL_ERROR. Invalid source projections and unexpected failures never expose internal details.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"CATALOGUE_UNAVAILABLE or QUERY_TIMEOUT. Fresh source reads or admission are unavailable.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Retry-After":{"schema":{"enum":["5"],"type":"string"}}}}},"summary":"Continue a product's variant list","tags":["catalog"]}},"/api/v1/products/{handle}/related":{"get":{"description":"Read related resources using the shared deterministic recommendation rules evaluated before limiting results. The default limit is 6 and maximum is 20; the reference product is excluded. Products carry stable handles and IDs rather than indices into a complete catalogue. Recommendations and eligibility are current observations, with no stale response fallback. Unknown query parameters are rejected. HEAD and OPTIONS follow the same CORS and no-store policy.","operationId":"getRelatedCatalogueProducts","parameters":[{"description":"Public product handle; hidden, draft and deleted products return the same 404 as missing products.","in":"path","name":"handle","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s/?#]+$","description":"Public product handle; hidden, draft and deleted products return the same 404 as missing products."}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":20,"default":6}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueRelatedResponse"}}},"description":"A bounded ranked set of related product summaries.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"INVALID_QUERY, INVALID_CURSOR or CURSOR_EXPIRED. Unknown and repeated scalar parameters are rejected; restart invalid or expired cursors.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"PRODUCT_NOT_FOUND or NOT_FOUND. Visibility is checked on every read.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"405":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"METHOD_NOT_ALLOWED. Only GET, HEAD and OPTIONS are accepted.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Allow":{"schema":{"enum":["GET, HEAD, OPTIONS"],"type":"string"}}}},"414":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"URI_TOO_LONG. Raw URL exceeds 8192 UTF-8 bytes.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"RATE_LIMITED. Anonymous catalogue traffic exceeded its admission budget.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Retry-After":{"schema":{"enum":["60"],"type":"string"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"INTERNAL_ERROR. Invalid source projections and unexpected failures never expose internal details.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueError"}}},"description":"CATALOGUE_UNAVAILABLE or QUERY_TIMEOUT. Fresh source reads or admission are unavailable.","headers":{"Access-Control-Allow-Origin":{"description":"Public reads allow cross-origin access without credentials.","schema":{"enum":["*"],"type":"string"}},"Cache-Control":{"description":"Mixed commerce responses are never cached.","schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Server-generated correlation ID; never taken from an untrusted client header.","schema":{"type":"string"}},"Retry-After":{"schema":{"enum":["5"],"type":"string"}}}}},"summary":"Read related public products","tags":["catalog"]}},"/api":{"get":{"operationId":"getApiIndex","summary":"List the machine-readable endpoints","description":"A compact JSON index of every documented endpoint, plus links to this OpenAPI document, the developer page, /llms.txt, and /agents.md. Call it first when you have only the domain and want to know what is available. Cached for one hour.","tags":["discovery"],"responses":{"200":{"description":"The endpoint index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"No documented resource exists at this path. Returned as JSON for any unmatched path under /api."},"405":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"description":"The HTTP method is not supported. This path is read-only; use GET or HEAD. The Allow header lists the accepted methods."}}}},"/api/products.json":{"get":{"operationId":"getProductFeed","summary":"Get the full product catalogue as JSON","description":"Returns the complete list of publicly listed products, with pricing in AUD, tags, images and every variant, generated live from the shop database on every request. Use /api/v1/products for bounded, cursor-paginated search with rate limits instead when an agent only needs a page at a time. Prices and eligibility describe the moment of the request and are not reservations or current ordering guarantees. Prices are decimal strings. No authentication.","tags":["catalog"],"responses":{"200":{"description":"The full catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductFeed"}}}}}}},"/.well-known/ucp":{"get":{"operationId":"getUcpProfile","summary":"Get the Universal Commerce Protocol discovery profile","description":"Discovery-only UCP profile describing the merchant, currency, country, and where the machine-readable catalogue lives. Call it to decide whether this domain supports agentic commerce before attempting anything else. spec_status is \"provisional\" because the field names track a specification still being finalised. This store declares no payment handlers and no in-protocol cart or checkout: checkout.type is always \"unavailable\".","tags":["discovery"],"responses":{"200":{"description":"The UCP discovery profile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UcpProfile"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiDocument","summary":"Get this OpenAPI description","description":"Returns this document. Schemas are JSON Schema 2020-12, so they can be handed directly to a function-calling runtime. Call it to learn the exact response shape of any endpoint before parsing one.","tags":["documentation"],"responses":{"200":{"description":"The OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object","description":"An OpenAPI 3.1 document."}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","summary":"Get the llmstxt.org link index for this store","description":"A condensed plain-text link index following the llmstxt.org convention: a store summary, then linked sections for collections, products, pages, and agent resources. Start here to orient before fetching the JSON feed.","tags":["discovery"],"responses":{"200":{"description":"The llms.txt link index.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/agents.md":{"get":{"operationId":"getAgentsMd","summary":"Get the agent guide for this store","description":"A Markdown guide for AI shopping agents: what the store sells, where the machine-readable resources are, the in-browser tools each page registers, an honest description of how to buy, and the browsable collection, product, and policy lists. Read it when the JSON feed alone does not answer a question about how to act on this site.","tags":["discovery"],"responses":{"200":{"description":"The agent guide.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/sitemap.xml":{"get":{"operationId":"getSitemap","summary":"Get the XML sitemap","description":"Returns a standard sitemaps.org urlset generated live from the shop database on every request, listing home, collection, product and content URLs. No authentication.","tags":["discovery"],"responses":{"200":{"description":"The sitemap.","content":{"application/xml":{"schema":{"type":"string"}}}}}}},"/robots.txt":{"get":{"operationId":"getRobotsTxt","summary":"Get the crawl policy","description":"The crawl policy for this storefront. The whole storefront is allowed; only /downloads/ (token-gated digital delivery) is disallowed. It also declares the Host and the Sitemap location. Read it before crawling.","tags":["discovery"],"responses":{"200":{"description":"The robots.txt policy.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/developers":{"get":{"operationId":"getDeveloperPortal","summary":"Get the developer and agent documentation page","description":"The written guide to these endpoints: what each one returns, the shared error envelope, and the caching rules. Served as HTML by default and as Markdown when the Accept header asks for text/markdown, so an agent can read the same page without parsing markup. Every HTML page on this site answers Accept: text/markdown the same way.","tags":["documentation"],"parameters":[{"name":"Accept","in":"header","required":false,"description":"Content negotiation. Send one of text/html, text/markdown. Omitting the header returns HTML.","schema":{"type":"string","examples":["text/html","text/markdown"]}}],"responses":{"200":{"description":"The developer page, as HTML or Markdown depending on Accept.","content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"ProductFeed":{"type":"object","properties":{"as_of":{"type":"string","format":"date-time"},"complete":{"type":"boolean","enum":[true]},"count":{"type":"integer","minimum":0},"expires_at":{"type":"string","format":"date-time"},"freshness_note":{"type":"string"},"generated_at":{"type":"string"},"products":{"type":"array","items":{"$ref":"#/components/schemas/ProductFeedItem"}},"snapshot_id":{"type":"string"},"store":{"type":"object","properties":{"currency":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"}},"required":["currency","name","url"]}},"required":["count","generated_at","products","store"]},"ProductFeedItem":{"type":"object","properties":{"alternatives":{"type":"array","items":{"type":"integer","minimum":0}},"availability":{"type":"string","enum":["orderable","out_of_stock","checkout_closed","awaiting_file","not_published"]},"description":{"type":"string"},"handle":{"type":"string"},"id":{"type":"string"},"image":{"type":["string","null"]},"inStock":{"type":"boolean"},"next_step":{"type":"object","properties":{"href":{"type":"string","maxLength":1024,"pattern":"^\\/product\\/[^/]+$"},"kind":{"type":"string","enum":["view_product"]},"label":{"type":"string","enum":["View this product"]}},"required":["href","kind","label"],"additionalProperties":false},"orderable":{"type":"boolean"},"price":{"$ref":"#/components/schemas/ProductPrice"},"reason":{"type":"string","enum":["orderable","out_of_stock","checkout_closed","awaiting_file","not_published"]},"tags":{"type":"array","items":{"type":"string"}},"title":{"type":"string"},"updated_at":{"type":"string"},"url":{"type":"string"},"variants":{"type":"array","items":{"$ref":"#/components/schemas/ProductFeedVariant"}}},"required":["availability","description","handle","id","image","next_step","orderable","price","reason","tags","title","updated_at","url","variants"]},"ProductPrice":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"},"max":{"type":"string"},"min":{"type":"string"}},"required":["amount","currency","max","min"]},"ProductFeedVariant":{"type":"object","properties":{"catalogue_eligible":{"type":"boolean"},"id":{"type":"string"},"orderable":{"type":"boolean"},"price":{"$ref":"#/components/schemas/Money"},"title":{"type":"string"}},"required":["catalogue_eligible","id","orderable","price","title"]},"Money":{"type":"object","properties":{"amount":{"type":"string"},"currency":{"type":"string"}},"required":["amount","currency"]},"CatalogueListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CatalogueProductSummary"},"maxItems":100},"meta":{"type":"object","properties":{"commerce_observed_at":{"type":"string","format":"date-time"}},"required":["commerce_observed_at"],"additionalProperties":false},"page_info":{"type":"object","properties":{"has_next_page":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":100},"next_cursor":{"type":["string","null"],"minLength":1,"maxLength":2048},"returned":{"type":"integer","minimum":0,"maximum":100}},"required":["has_next_page","limit","next_cursor","returned"],"additionalProperties":false}},"required":["data","meta","page_info"],"additionalProperties":false},"CatalogueProductSummary":{"type":"object","properties":{"available_for_sale":{"type":"boolean"},"collections":{"type":"array","items":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s/?#]+$"},"maxItems":20},"collections_truncated":{"type":"boolean"},"content_observed_at":{"type":"string","format":"date-time"},"default_variant_id":{"type":["string","null"],"minLength":1,"maxLength":255},"description":{"type":"string","maxLength":600},"handle":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s/?#]+$"},"id":{"type":"string","minLength":1,"maxLength":255},"image":{"type":["string","null"],"maxLength":2048,"format":"uri"},"next_step":{"type":"object","properties":{"href":{"type":"string","maxLength":1024,"pattern":"^\\/product\\/[^/]+$"},"kind":{"type":"string","enum":["view_product"]},"label":{"type":"string","enum":["View this product"]}},"required":["href","kind","label"],"additionalProperties":false},"orderability":{"type":"object","properties":{"inStock":{"type":"boolean"},"orderable":{"type":"boolean"},"reason":{"type":"string","enum":["orderable","out_of_stock","checkout_closed","awaiting_file","not_published"]}},"required":["inStock","orderable","reason"],"additionalProperties":false},"price_range":{"type":["object","null"],"properties":{"max":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+\\.\\d{2}$"},"currency":{"type":"string","enum":["AUD"]}},"required":["amount","currency"],"additionalProperties":false},"min":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+\\.\\d{2}$"},"currency":{"type":"string","enum":["AUD"]}},"required":["amount","currency"],"additionalProperties":false}},"required":["max","min"],"additionalProperties":false},"representative_variant_id":{"type":["string","null"],"minLength":1,"maxLength":255},"tags":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":30},"tags_truncated":{"type":"boolean"},"title":{"type":"string","minLength":1,"maxLength":512},"updated_at":{"type":"string","format":"date-time"},"url":{"type":"string","maxLength":2048,"format":"uri"},"variant_count":{"type":"integer","minimum":0}},"required":["available_for_sale","collections","collections_truncated","content_observed_at","default_variant_id","description","handle","id","image","next_step","orderability","price_range","representative_variant_id","tags","tags_truncated","title","updated_at","url","variant_count"],"additionalProperties":false},"CatalogueError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_QUERY","INVALID_CURSOR","CURSOR_EXPIRED","PRODUCT_NOT_FOUND","NOT_FOUND","METHOD_NOT_ALLOWED","URI_TOO_LONG","RATE_LIMITED","CATALOGUE_UNAVAILABLE","QUERY_TIMEOUT","FEED_UNAVAILABLE","INTERNAL_ERROR"]},"docs":{"type":"string","enum":["/developers"]},"hint":{"type":"string","maxLength":300},"message":{"type":"string","maxLength":200},"request_id":{"type":"string","minLength":1,"maxLength":128},"status":{"type":"integer"}},"required":["code","docs","hint","message","request_id","status"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"CatalogueDetailResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/CatalogueProductDetail"},"meta":{"type":"object","properties":{"commerce_observed_at":{"type":"string","format":"date-time"}},"required":["commerce_observed_at"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false},"CatalogueProductDetail":{"type":"object","properties":{"available_for_sale":{"type":"boolean"},"collections":{"type":"array","items":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s/?#]+$"},"maxItems":20},"collections_truncated":{"type":"boolean"},"content_observed_at":{"type":"string","format":"date-time"},"default_variant_id":{"type":["string","null"],"minLength":1,"maxLength":255},"description":{"type":"string","maxLength":32768},"handle":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s/?#]+$"},"id":{"type":"string","minLength":1,"maxLength":255},"image":{"type":["string","null"],"maxLength":2048,"format":"uri"},"next_step":{"type":"object","properties":{"href":{"type":"string","maxLength":1024,"pattern":"^\\/product\\/[^/]+$"},"kind":{"type":"string","enum":["view_product"]},"label":{"type":"string","enum":["View this product"]}},"required":["href","kind","label"],"additionalProperties":false},"orderability":{"type":"object","properties":{"inStock":{"type":"boolean"},"orderable":{"type":"boolean"},"reason":{"type":"string","enum":["orderable","out_of_stock","checkout_closed","awaiting_file","not_published"]}},"required":["inStock","orderable","reason"],"additionalProperties":false},"price_range":{"type":["object","null"],"properties":{"max":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+\\.\\d{2}$"},"currency":{"type":"string","enum":["AUD"]}},"required":["amount","currency"],"additionalProperties":false},"min":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+\\.\\d{2}$"},"currency":{"type":"string","enum":["AUD"]}},"required":["amount","currency"],"additionalProperties":false}},"required":["max","min"],"additionalProperties":false},"representative_variant_id":{"type":["string","null"],"minLength":1,"maxLength":255},"tags":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":30},"tags_truncated":{"type":"boolean"},"title":{"type":"string","minLength":1,"maxLength":512},"updated_at":{"type":"string","format":"date-time"},"url":{"type":"string","maxLength":2048,"format":"uri"},"variant_count":{"type":"integer","minimum":0},"description_html":{"type":"string","maxLength":65536},"facts":{"type":"object","properties":{"ageGuide":{"type":"string","maxLength":2048},"helpsWith":{"type":"array","items":{"type":"string","maxLength":2048},"maxItems":50},"howToUse":{"type":"array","items":{"type":"string","maxLength":2048},"maxItems":50},"included":{"type":"array","items":{"type":"string","maxLength":2048},"maxItems":50}},"additionalProperties":false},"facts_coverage":{"type":"object","properties":{"ageGuide":{"type":"string","enum":["published","not_published","lookup_failed"]},"helpsWith":{"type":"string","enum":["published","not_published","lookup_failed"]},"howToUse":{"type":"string","enum":["published","not_published","lookup_failed"]},"included":{"type":"string","enum":["published","not_published","lookup_failed"]}},"required":["ageGuide","helpsWith","howToUse","included"],"additionalProperties":false},"images":{"type":"array","items":{"type":"object","properties":{"alt_text":{"type":"string","maxLength":1024},"height":{"type":"integer","exclusiveMinimum":0},"url":{"type":"string","maxLength":2048,"format":"uri"},"width":{"type":"integer","exclusiveMinimum":0}},"required":["alt_text","height","url","width"],"additionalProperties":false},"maxItems":12},"images_truncated":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":255},"name":{"type":"string","maxLength":255},"values":{"type":"array","items":{"type":"string","maxLength":512},"maxItems":100}},"required":["id","name","values"],"additionalProperties":false},"maxItems":20},"variants":{"type":"array","items":{"$ref":"#/components/schemas/CatalogueVariant"},"maxItems":50},"variants_page_info":{"type":"object","properties":{"has_next_page":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":100},"next_cursor":{"type":["string","null"],"minLength":1,"maxLength":2048},"returned":{"type":"integer","minimum":0,"maximum":100}},"required":["has_next_page","limit","next_cursor","returned"],"additionalProperties":false}},"required":["available_for_sale","collections","collections_truncated","content_observed_at","default_variant_id","description","handle","id","image","next_step","orderability","price_range","representative_variant_id","tags","tags_truncated","title","updated_at","url","variant_count","description_html","facts","facts_coverage","images","images_truncated","options","variants","variants_page_info"],"additionalProperties":false},"CatalogueVariant":{"type":"object","properties":{"available_for_sale":{"type":"boolean"},"compare_at_price":{"type":["object","null"],"properties":{"amount":{"type":"string","pattern":"^\\d+\\.\\d{2}$"},"currency":{"type":"string","enum":["AUD"]}},"required":["amount","currency"],"additionalProperties":false},"has_digital_asset":{"type":"boolean"},"id":{"type":"string","minLength":1,"maxLength":255},"image":{"type":["object","null"],"properties":{"alt_text":{"type":"string","maxLength":1024},"height":{"type":"integer","exclusiveMinimum":0},"url":{"type":"string","maxLength":2048,"format":"uri"},"width":{"type":"integer","exclusiveMinimum":0}},"required":["alt_text","height","url","width"],"additionalProperties":false},"orderability":{"type":"object","properties":{"inStock":{"type":"boolean"},"orderable":{"type":"boolean"},"reason":{"type":"string","enum":["orderable","out_of_stock","checkout_closed","awaiting_file","not_published"]}},"required":["inStock","orderable","reason"],"additionalProperties":false},"price":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+\\.\\d{2}$"},"currency":{"type":"string","enum":["AUD"]}},"required":["amount","currency"],"additionalProperties":false},"requires_shipping":{"type":"boolean"},"selected_options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":255},"value":{"type":"string","maxLength":512}},"required":["name","value"],"additionalProperties":false},"maxItems":20},"title":{"type":"string","maxLength":512}},"required":["available_for_sale","compare_at_price","has_digital_asset","id","image","orderability","price","requires_shipping","selected_options","title"],"additionalProperties":false},"CatalogueVariantsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CatalogueVariant"},"maxItems":100},"meta":{"type":"object","properties":{"commerce_observed_at":{"type":"string","format":"date-time"}},"required":["commerce_observed_at"],"additionalProperties":false},"page_info":{"type":"object","properties":{"has_next_page":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":100},"next_cursor":{"type":["string","null"],"minLength":1,"maxLength":2048},"returned":{"type":"integer","minimum":0,"maximum":100}},"required":["has_next_page","limit","next_cursor","returned"],"additionalProperties":false}},"required":["data","meta","page_info"],"additionalProperties":false},"CatalogueRelatedResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CatalogueProductSummary"},"maxItems":20},"meta":{"type":"object","properties":{"commerce_observed_at":{"type":"string","format":"date-time"}},"required":["commerce_observed_at"],"additionalProperties":false}},"required":["data","meta"],"additionalProperties":false},"ApiError":{"type":"object","description":"The error envelope every documented failure uses.","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint","status","docs"],"properties":{"code":{"type":"string","enum":["not_found","method_not_allowed","bad_request"],"description":"Machine-readable code. Branch on this, not on `message`."},"message":{"type":"string","description":"Short human sentence."},"hint":{"type":"string","description":"What to do instead."},"status":{"type":"integer","description":"Repeats the HTTP status code."},"docs":{"type":"string","format":"uri","description":"Where the supported calls are described."}}}}},"ApiIndex":{"type":"object","description":"A small JSON index pointing at every machine-readable resource.","required":["name","description","openapi","docs","llms","agents","endpoints"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"openapi":{"type":"string","format":"uri"},"docs":{"type":"string","format":"uri"},"llms":{"type":"string","format":"uri"},"agents":{"type":"string","format":"uri"},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/ApiIndexEndpoint"}}}},"ApiIndexEndpoint":{"type":"object","required":["method","path","operationId","summary"],"properties":{"method":{"type":"string","description":"HTTP method, e.g. \"GET\"."},"path":{"type":"string","description":"Root-relative path."},"operationId":{"type":"string","description":"Matches the operationId in /openapi.json."},"summary":{"type":"string","description":"One-line description."}}},"UcpProfile":{"type":"object","description":"Universal Commerce Protocol discovery profile. Discovery only: no payment handlers and no in-protocol checkout are declared.","required":["spec_status","ucp_version","merchant","capabilities","checkout","payment_handlers","generated_by"],"properties":{"spec_status":{"type":"string","const":"provisional","description":"The UCP schema is still being finalised, so these field names are directional."},"ucp_version":{"type":"string","description":"The UCP revision this profile targets."},"merchant":{"type":"object","required":["name","url","country","currency"],"properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"},"country":{"type":"string","description":"ISO 3166-1 alpha-2 country code."},"currency":{"type":"string","description":"ISO 4217 currency code."}}},"capabilities":{"type":"object","required":["discovery"],"properties":{"discovery":{"type":"object","required":["catalog_feed","sitemap","agents_doc","llms_txt","openapi","developer_portal"],"properties":{"catalog_feed":{"type":"string","format":"uri"},"sitemap":{"type":"string","format":"uri"},"agents_doc":{"type":"string","format":"uri"},"llms_txt":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"developer_portal":{"type":"string","format":"uri"}}}}},"checkout":{"type":"object","required":["type","note"],"properties":{"type":{"type":"string","const":"unavailable","description":"This store does not offer in-protocol agentic checkout."},"note":{"type":"string","description":"Plain-language explanation."}}},"payment_handlers":{"type":"array","items":{"type":"string"},"description":"Always empty: no payment handler is declared."},"generated_by":{"type":"string"}}}}}}