{"openapi":"3.1.0","info":{"title":"Northbound Coffee Roasters Agent API","version":"1.0.0","description":"Typed REST access to Cartwright tools. Public browsing is anonymous and rate-limited; private data and actions require scoped Bearer authentication. Stable operations use the /api/v1 major-version prefix. Additive changes may land within v1; breaking changes require a new major version. Deprecations are documented and signaled with RFC 9745 Deprecation and Link headers plus a Sunset date at least 90 days before removal.","license":{"name":"MIT","identifier":"MIT"}},"externalDocs":{"description":"Authentication, scopes, rate limits, errors, versioning and deprecation policy","url":"https://demo.cartwright.app/da/developers"},"servers":[{"url":"https://demo.cartwright.app"}],"x-cartwright-scopes-supported":["analytics:read","audit:read","audit:revert","cart:write","catalog:read","categories:read","categories:write","customer:read","discounts:read","discounts:write","features:read","features:write","marketing:write","orders:read","orders:write","pages:read","pages:write","products:write","settings:read","settings:write"],"paths":{"/api/v1/tools/products.search":{"post":{"operationId":"invoke_products_search","summary":"Search products with free text and filters (category, brand, colors, price range, in-stock). Returns slug, name, brand, price (ore), stock, and whether the product is featured.","description":"Search products with free text and filters (category, brand, colors, price range, in-stock). Returns slug, name, brand, price (ore), stock, and whether the product is featured.","tags":["products"],"security":[],"x-cartwright-required-scope":"catalog:read","x-cartwright-anonymous-read":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"q":{"type":"string"},"categorySlug":{"type":"string"},"brand":{"type":"string"},"frameColor":{"type":"string"},"lensColor":{"type":"string"},"featured":{"type":"boolean"},"inStock":{"type":"boolean"},"minPriceOere":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxPriceOere":{"type":"integer","minimum":0,"maximum":9007199254740991},"limit":{"default":20,"description":"Page size — maximum number of products returned.","type":"integer","minimum":1,"maximum":100},"offset":{"default":0,"description":"Pagination offset — number of matching products to skip before the page starts.","type":"integer","minimum":0,"maximum":10000}}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}]},"priceDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"stock":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"featured":{"type":"boolean"},"frameColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"lensColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"categorySlug":{"type":"string"},"categoryName":{"type":"string"},"firstImage":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","slug","name","brand","priceDkk","stock","featured","frameColor","lensColor","categorySlug","categoryName","firstImage"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/products.get":{"post":{"operationId":"invoke_products_get","summary":"Get a single product by slug. Returns all fields including description, all images, and category.","description":"Get a single product by slug. Returns all fields including description, all images, and category.","tags":["products"],"security":[],"x-cartwright-required-scope":"catalog:read","x-cartwright-anonymous-read":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":1}},"required":["slug"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"type":"string"},"priceDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"stock":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"featured":{"type":"boolean"},"frameColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"lensColor":{"anyOf":[{"type":"string"},{"type":"null"}]},"images":{"type":"array","items":{"type":"string"}},"category":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["slug","name","description"],"additionalProperties":false},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","slug","name","brand","description","priceDkk","stock","featured","frameColor","lensColor","images","category","createdAt"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/products.create":{"post":{"operationId":"invoke_products_create","summary":"Create a new product. Takes price in ore (not kroner). Category can be provided as either categoryId (cuid) or categorySlug ('men'/'women'/etc.). images is a list of URLs.","description":"Create a new product. Takes price in ore (not kroner). Category can be provided as either categoryId (cuid) or categorySlug ('men'/'women'/etc.). images is a list of URLs.","tags":["products"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"products:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":2},"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"description":{"type":"string","minLength":10},"priceDkk":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"stock":{"type":"integer","minimum":0,"maximum":9007199254740991},"frameColor":{"type":"string","minLength":1},"lensColor":{"type":"string","minLength":1},"brand":{"type":"string","minLength":1},"attributes":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"answerSummary":{"type":"string","maxLength":500},"faq":{"type":"array","items":{"type":"object","properties":{"q":{"type":"string","minLength":1},"a":{"type":"string","minLength":1}},"required":["q","a"]}},"useCases":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","minLength":1},"description":{"type":"string","minLength":1}},"required":["title","description"]}},"comparisonFacts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"categoryId":{"type":"string"},"categorySlug":{"type":"string"},"featured":{"default":false,"type":"boolean"},"images":{"default":[],"type":"array","items":{"type":"string","format":"uri"}}},"required":["name","slug","description","priceDkk","stock"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"}},"required":["id","slug"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Create a basic generic product","value":{"name":"Ceramic Mug","slug":"ceramic-mug","description":"A simple handmade stoneware mug. Holds 300ml.","priceDkk":24900,"stock":12,"brand":"Cartwright Ceramics","categorySlug":"products","featured":false,"images":[],"attributes":{"material":"Stoneware","color":"White","capacity":"300 ml"}}}]}},"/api/v1/tools/products.update":{"post":{"operationId":"invoke_products_update","summary":"Partially update a product. Slug identifies the product and CANNOT be changed (create a new one instead if the slug must change). priceDkk is in ore.","description":"Partially update a product. Slug identifies the product and CANNOT be changed (create a new one instead if the slug must change). priceDkk is in ore.","tags":["products"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"products:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":1},"patch":{"type":"object","properties":{"name":{"type":"string","minLength":2},"description":{"type":"string","minLength":10},"priceDkk":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"stock":{"type":"integer","minimum":0,"maximum":9007199254740991},"frameColor":{"type":"string","minLength":1},"lensColor":{"type":"string","minLength":1},"brand":{"type":"string","minLength":1},"attributes":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"answerSummary":{"type":"string","maxLength":500},"faq":{"type":"array","items":{"type":"object","properties":{"q":{"type":"string","minLength":1},"a":{"type":"string","minLength":1}},"required":["q","a"]}},"useCases":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","minLength":1},"description":{"type":"string","minLength":1}},"required":["title","description"]}},"comparisonFacts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"categoryId":{"type":"string"},"categorySlug":{"type":"string"},"featured":{"default":false,"type":"boolean"},"images":{"default":[],"type":"array","items":{"type":"string","format":"uri"}}}}},"required":["slug","patch"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"}},"required":["id","slug"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Update product price and stock","value":{"slug":"ceramic-mug","patch":{"priceDkk":19900,"stock":45}}}]}},"/api/v1/tools/products.delete":{"post":{"operationId":"invoke_products_delete","summary":"Soft-delete a product (sets deletedAt). The product disappears from the catalog but can be restored via audit.revert. Requires confirm: true.","description":"Soft-delete a product (sets deletedAt). The product disappears from the catalog but can be restored via audit.revert. Requires confirm: true.","tags":["products"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"products:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":1},"confirm":{"type":"boolean","const":true}},"required":["slug","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"}},"required":["ok","slug"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/products.attach_image":{"post":{"operationId":"invoke_products_attach_image","summary":"Add an image URL to an existing product. Append-only - does not overwrite. Call this after images.search_unsplash when the admin has chosen an image. Confirmation is NOT required (additive). URL must be https.","description":"Add an image URL to an existing product. Append-only - does not overwrite. Call this after images.search_unsplash when the admin has chosen an image. Confirmation is NOT required (additive). URL must be https.","tags":["products"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"products:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":1},"imageUrl":{"type":"string","format":"uri"},"alt":{"type":"string","maxLength":200},"sourceId":{"type":"string"}},"required":["slug","imageUrl"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"},"alreadyAttached":{"type":"boolean","const":true},"totalImages":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["ok","slug","alreadyAttached","totalImages"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"},"attached":{"type":"string","format":"uri"},"totalImages":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["ok","slug","attached","totalImages"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/services.create":{"post":{"operationId":"invoke_services_create","summary":"Create a service (agency/website-mode offering shown at /services). Auto-slugs from the title when no slug is given. body is the long copy; priceString is freeform display text (e.g. 'from $1,200', 'On request'), not a numeric price. features is a list of short bullet strings. navOrder sorts the /services listing ascending; showInNav is persisted for the admin UI but does not by itself add a header-nav link. status defaults to \"published\"; pass \"draft\" to keep it off the public /services until reviewed (publish later with services.update).","description":"Create a service (agency/website-mode offering shown at /services). Auto-slugs from the title when no slug is given. body is the long copy; priceString is freeform display text (e.g. 'from $1,200', 'On request'), not a numeric price. features is a list of short bullet strings. navOrder sorts the /services listing ascending; showInNav is persisted for the admin UI but does not by itself add a header-nav link. status defaults to \"published\"; pass \"draft\" to keep it off the public /services until reviewed (publish later with services.update).","tags":["services"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":2,"maxLength":200},"body":{"type":"string","minLength":1},"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"shortDescription":{"type":"string","minLength":1,"maxLength":500},"priceString":{"type":"string","minLength":1,"maxLength":100},"heroImage":{"type":"string","format":"uri"},"features":{"type":"array","items":{"type":"string"}},"showInNav":{"type":"boolean"},"navOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","enum":["draft","published"]}},"required":["title","body"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"status":{"type":"string","enum":["draft","published"]},"publicUrl":{"type":"string"}},"required":["id","slug","status","publicUrl"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Create a service","value":{"title":"Brand & identity","body":"## What you get\n\nA complete visual identity — logo, palette, type system.","priceString":"from $4,500","features":["Logo suite","Brand guidelines","Type system"],"navOrder":1}}]}},"/api/v1/tools/services.update":{"post":{"operationId":"invoke_services_update","summary":"Partially update a service (agency offering). Slug identifies the service and cannot be changed. priceString is freeform display text (e.g. 'from $1,200'), not a numeric price.","description":"Partially update a service (agency offering). Slug identifies the service and cannot be changed. priceString is freeform display text (e.g. 'from $1,200'), not a numeric price.","tags":["services"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":1},"patch":{"type":"object","properties":{"title":{"type":"string","minLength":2,"maxLength":200},"shortDescription":{"type":"string","minLength":1,"maxLength":500},"priceString":{"type":"string","minLength":1,"maxLength":100},"body":{"type":"string","minLength":1},"showInNav":{"type":"boolean"},"navOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","enum":["draft","published"]}}}},"required":["slug","patch"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"}},"required":["id","slug"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Update a service price","value":{"slug":"teeth-cleaning","patch":{"priceString":"from $129"}}}]}},"/api/v1/tools/orders.list":{"post":{"operationId":"invoke_orders_list","summary":"List orders with optional filters (status, email, date range). Returns order summaries with items, totals, and status.","description":"List orders with optional filters (status, email, date range). Returns order summaries with items, totals, and status.","tags":["orders"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"orders:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"type":"string","enum":["pending_payment","pending","paid","flagged_review","shipped","cancelled","refunded","partial_refund","disputed","processing","delivered","completed"]},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"fromDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"toDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"limit":{"default":20,"type":"integer","minimum":1,"maximum":100}}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"shippingName":{"type":"string"},"status":{"type":"string"},"subtotalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"discountDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"discountCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"itemCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"items":{"type":"array","items":{"type":"object","properties":{"productName":{"type":"string"},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"unitPriceDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["productName","quantity","unitPriceDkk"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","shippingName","status","subtotalDkk","discountDkk","shippingDkk","totalDkk","discountCode","itemCount","items","createdAt"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"List recent paid orders","value":{"status":"paid","limit":10}}]}},"/api/v1/tools/orders.get":{"post":{"operationId":"invoke_orders_get","summary":"Get one order by ID with full details including customer info, items, and shipping address.","description":"Get one order by ID with full details including customer info, items, and shipping address.","tags":["orders"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"orders:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"orderId":{"type":"string","minLength":1}},"required":["orderId"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"},"status":{"type":"string"},"shippingName":{"type":"string"},"shippingAddress":{"type":"string"},"shippingZip":{"type":"string"},"shippingCity":{"type":"string"},"billingName":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingAddress":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingZip":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingCity":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingCountry":{"anyOf":[{"type":"string"},{"type":"null"}]},"phoneNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"subtotalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"discountDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"vatOere":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"invoiceProvider":{"anyOf":[{"type":"string"},{"type":"null"}]},"invoiceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"invoicePdfUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"discountCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"isAiGenerated":{"type":"boolean"},"aiAgentSource":{"anyOf":[{"type":"string"},{"type":"null"}]},"carrier":{"anyOf":[{"type":"string"},{"type":"null"}]},"trackingNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"trackingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"estDeliveryFrom":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"estDeliveryTo":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"stripePaymentIntentId":{"anyOf":[{"type":"string"},{"type":"null"}]},"paymentMethod":{"anyOf":[{"type":"string"},{"type":"null"}]},"paidAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"currency":{"type":"string"},"fxRate":{"type":"number"},"channel":{"type":"string"},"acpSessionId":{"anyOf":[{"type":"string"},{"type":"null"}]},"confirmationEmailSentAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"refundedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"disputedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"orderId":{"type":"string"},"productId":{"type":"string"},"productName":{"type":"string"},"unitPriceDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"variantId":{"anyOf":[{"type":"string"},{"type":"null"}]},"variantSku":{"anyOf":[{"type":"string"},{"type":"null"}]},"variantAttributes":{"anyOf":[{"$ref":"#/components/schemas/invoke_orders_get_output___schema0"},{"type":"null"}],"description":"Opaque JSON snapshot of the selected product variant attributes."}},"required":["id","orderId","productId","productName","unitPriceDkk","quantity","variantId","variantSku","variantAttributes"],"additionalProperties":false}}},"required":["id","userId","email","status","shippingName","shippingAddress","shippingZip","shippingCity","billingName","billingAddress","billingZip","billingCity","billingCountry","phoneNumber","subtotalDkk","shippingDkk","discountDkk","totalDkk","vatOere","invoiceProvider","invoiceId","invoicePdfUrl","discountCode","isAiGenerated","aiAgentSource","carrier","trackingNumber","trackingUrl","estDeliveryFrom","estDeliveryTo","createdAt","stripePaymentIntentId","paymentMethod","paidAt","currency","fxRate","channel","acpSessionId","confirmationEmailSentAt","refundedAt","disputedAt","items"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Get order details","value":{"orderId":"cuid-12345"}}]}},"/api/v1/tools/orders.update_status":{"post":{"operationId":"invoke_orders_update_status","summary":"Changes the status of an order. Valid statuses: pending_payment, pending, paid, processing, shipped, delivered, completed, cancelled, refunded, partial_refund, flagged_review, disputed. The move must be a legal transition from the order's current status (operator state machine). Logs before state to audit.","description":"Changes the status of an order. Valid statuses: pending_payment, pending, paid, processing, shipped, delivered, completed, cancelled, refunded, partial_refund, flagged_review, disputed. The move must be a legal transition from the order's current status (operator state machine). Logs before state to audit.","tags":["orders"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"orders:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"orderId":{"type":"string","minLength":1},"status":{"type":"string","enum":["pending_payment","pending","paid","flagged_review","shipped","cancelled","refunded","partial_refund","disputed","processing","delivered","completed"]}},"required":["orderId","status"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending_payment","pending","paid","flagged_review","shipped","cancelled","refunded","partial_refund","disputed","processing","delivered","completed"]}},"required":["id","status"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Mark order as shipped","value":{"orderId":"cuid-12345","status":"shipped"}}]}},"/api/v1/tools/discounts.list":{"post":{"operationId":"invoke_discounts_list","summary":"List discount codes, optionally only active ones. Includes usage statistics.","description":"List discount codes, optionally only active ones. Includes usage statistics.","tags":["discounts"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"discounts:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"onlyActive":{"type":"boolean"},"limit":{"default":50,"type":"integer","minimum":1,"maximum":100}}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"type":{"type":"string"},"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"validUntil":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"usageLimit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"usageCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"active":{"type":"boolean"}},"required":["id","code","type","value","validUntil","usageLimit","usageCount","active"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/discounts.create":{"post":{"operationId":"invoke_discounts_create","summary":"Create a discount code. type='percent' takes value 1-100; type='fixed' takes value in ore. The code is case-insensitive (stored uppercase).","description":"Create a discount code. type='percent' takes value 1-100; type='fixed' takes value in ore. The code is case-insensitive (stored uppercase).","tags":["discounts"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"discounts:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string","minLength":3},"type":{"type":"string","enum":["percent","fixed"]},"value":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"validUntil":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"usageLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["code","type","value"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"}},"required":["id","code"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/discounts.toggle":{"post":{"operationId":"invoke_discounts_toggle","summary":"Activate/deactivate a discount code. If 'active' is omitted, the current status is toggled.","description":"Activate/deactivate a discount code. If 'active' is omitted, the current status is toggled.","tags":["discounts"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"discounts:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string","minLength":1},"active":{"type":"boolean"}},"required":["code"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string"},"active":{"type":"boolean"}},"required":["code","active"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/categories.list":{"post":{"operationId":"invoke_categories_list","summary":"List public categories with their non-deleted product count.","description":"List public categories with their non-deleted product count.","tags":["categories"],"security":[],"x-cartwright-required-scope":"categories:read","x-cartwright-anonymous-read":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"includeEmpty":{"description":"Include categories with zero visible products (default true — the historical behaviour).","type":"boolean"}}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"productCount":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["id","slug","name","description","productCount"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"List all categories","value":{}}]}},"/api/v1/tools/categories.upsert":{"post":{"operationId":"invoke_categories_upsert","summary":"Create or update a category by slug. If the slug exists, name + description are updated; otherwise a new category is created.","description":"Create or update a category by slug. If the slug exists, name + description are updated; otherwise a new category is created.","tags":["categories"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"categories:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"name":{"type":"string","minLength":2},"description":{"type":"string"}},"required":["slug","name"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"}},"required":["id","slug","name"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Create or update category","value":{"slug":"coffee-beans","name":"Coffee Beans","description":"Freshly roasted coffee beans"}}]}},"/api/v1/tools/categories.delete":{"post":{"operationId":"invoke_categories_delete","summary":"Delete a category. Fails if the category still has products - move or delete the products first.","description":"Delete a category. Fails if the category still has products - move or delete the products first.","tags":["categories"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"categories:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"confirm":{"type":"boolean","const":true}},"required":["slug","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"}},"required":["ok","slug"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/pages.list":{"post":{"operationId":"invoke_pages_list","summary":"List all CMS pages with slug, title, status (draft|published), and update timestamp.","description":"List all CMS pages with slug, title, status (draft|published), and update timestamp.","tags":["pages"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","published"]},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","slug","title","status","updatedAt"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"List all pages","value":{}}]}},"/api/v1/tools/pages.upsert":{"post":{"operationId":"invoke_pages_upsert","summary":"Create or update an /info/<slug> page. Body supports simple markdown-ish formatting (## headers + paragraphs separated by blank lines). Pass status:\"draft\" to keep a page off the public storefront until reviewed; status:\"published\" makes it live. Omitting status keeps the default (published) on create and leaves an existing page's status unchanged on update.","description":"Create or update an /info/<slug> page. Body supports simple markdown-ish formatting (## headers + paragraphs separated by blank lines). Pass status:\"draft\" to keep a page off the public storefront until reviewed; status:\"published\" makes it live. Omitting status keeps the default (published) on create and leaves an existing page's status unchanged on update.","tags":["pages"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"title":{"type":"string","minLength":2},"body":{"type":"string","minLength":10},"status":{"type":"string","enum":["draft","published"]}},"required":["slug","title","body"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","published"]}},"required":["id","slug","title","status"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Create an About Us page","value":{"slug":"about","title":"About Us","body":"## Our Story\n\nWe are a family-owned business."}},{"name":"Publish a drafted page","value":{"slug":"about","title":"About Us","body":"## Our Story\n\n…","status":"published"}}]}},"/api/v1/tools/pages.delete":{"post":{"operationId":"invoke_pages_delete","summary":"Delete a CMS page. Requires confirm: true.","description":"Delete a CMS page. Requires confirm: true.","tags":["pages"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"confirm":{"type":"boolean","const":true}},"required":["slug","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"}},"required":["ok","slug"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/pages.get_layout":{"post":{"operationId":"invoke_pages_get_layout","summary":"Get a CMS page's Visual Builder section-tree layout (null = page renders from body/vibeHtml).","description":"Get a CMS page's Visual Builder section-tree layout (null = page renders from body/vibeHtml).","tags":["pages"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"}},"required":["slug"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"layout":{"anyOf":[{"type":"object","properties":{"sections":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"key":{"type":"string"},"enabled":{"default":true,"type":"boolean"},"effect":{"type":"string","enum":["fade-up","fade","zoom-in","slide-left","slide-right","parallax","none"]},"props":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","key","enabled"],"additionalProperties":false}}},"required":["sections"],"additionalProperties":false,"description":"Governed Visual Builder tree. Each section's polymorphic props are validated against that section key's registry schema."},{"type":"null"}]}},"required":["layout"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Get the about page layout","value":{"slug":"about"}}]}},"/api/v1/tools/pages.set_layout":{"post":{"operationId":"invoke_pages_set_layout","summary":"Set a CMS page's Visual Builder section-tree layout (sections validated against the section whitelist). Requires confirm: true. Revertible via audit.revert.","description":"Set a CMS page's Visual Builder section-tree layout (sections validated against the section whitelist). Requires confirm: true. Revertible via audit.revert.","tags":["pages"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"confirm":{"type":"boolean","const":true},"layout":{"type":"object","properties":{"sections":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"key":{"type":"string"},"enabled":{"default":true,"type":"boolean"},"effect":{"type":"string","enum":["fade-up","fade","zoom-in","slide-left","slide-right","parallax","none"]},"props":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","key"]}}},"required":["sections"]}},"required":["slug","confirm","layout"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string"},"sections":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["slug","sections"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/site.list_pages":{"post":{"operationId":"invoke_site_list_pages","summary":"List public, published site pages. Drafts and administrative fields are never returned.","description":"List public, published site pages. Drafts and administrative fields are never returned.","tags":["site"],"security":[],"x-cartwright-required-scope":"pages:read","x-cartwright-anonymous-read":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"locale":{"type":"string","minLength":2}}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"metaDescription":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"url":{"type":"string"}},"required":["slug","title","metaDescription","updatedAt","url"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"List public pages","value":{"locale":"en"}}]}},"/api/v1/tools/site.get_page":{"post":{"operationId":"invoke_site_get_page","summary":"Get one public, published page by slug. Returns public content only and never exposes drafts.","description":"Get one public, published page by slug. Returns public content only and never exposes drafts.","tags":["site"],"security":[],"x-cartwright-required-scope":"pages:read","x-cartwright-anonymous-read":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"locale":{"type":"string","minLength":2}},"required":["slug"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"bodyFormat":{"anyOf":[{"type":"string"},{"type":"null"}]},"heroImage":{"anyOf":[{"type":"string"},{"type":"null"}]},"metaTitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"metaDescription":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["slug","title","body","bodyFormat","heroImage","metaTitle","metaDescription","updatedAt"],"additionalProperties":false},{"type":"object","properties":{"found":{"type":"boolean","const":false},"slug":{"type":"string"}},"required":["found","slug"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Read the privacy page","value":{"slug":"privacy","locale":"en"}}]}},"/api/v1/tools/posts.list":{"post":{"operationId":"invoke_posts_list","summary":"List blog posts with slug, title, status (draft|published), and update timestamp.","description":"List blog posts with slug, title, status (draft|published), and update timestamp.","tags":["posts"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["draft","published"]},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","slug","title","status","updatedAt"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"List all posts","value":{}}]}},"/api/v1/tools/posts.create":{"post":{"operationId":"invoke_posts_create","summary":"Create a blog post (lands as a DRAFT). Body is markdown (## headers + blank-line paragraphs). Auto-slugs from the title when no slug is given. Publish separately with posts.publish.","description":"Create a blog post (lands as a DRAFT). Body is markdown (## headers + blank-line paragraphs). Auto-slugs from the title when no slug is given. Publish separately with posts.publish.","tags":["posts"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":2},"body":{"type":"string","minLength":10},"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"excerpt":{"type":"string"},"coverImage":{"type":"string","format":"uri"},"author":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"metaTitle":{"type":"string"},"metaDescription":{"type":"string"}},"required":["title","body"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"status":{"type":"string","enum":["draft","published"]},"publicUrl":{"type":"string"}},"required":["id","slug","status","publicUrl"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Draft a post","value":{"title":"Our spring collection","body":"## Fresh in\n\nThe spring line has landed."}}]}},"/api/v1/tools/posts.update":{"post":{"operationId":"invoke_posts_update","summary":"Update an existing blog post's fields by slug. Does not change publish status (use posts.publish).","description":"Update an existing blog post's fields by slug. Does not change publish status (use posts.publish).","tags":["posts"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"title":{"type":"string","minLength":2},"body":{"type":"string","minLength":10},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}]},"coverImage":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"author":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"metaTitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"metaDescription":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["slug"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"status":{"type":"string","enum":["draft","published"]}},"required":["id","slug","status"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Fix a title","value":{"slug":"our-spring-collection","title":"Our spring 2026 collection"}}]}},"/api/v1/tools/posts.publish":{"post":{"operationId":"invoke_posts_publish","summary":"Publish a draft blog post (or unpublish it back to draft with published:false). Sets publishedAt on first publish. Requires confirm: true.","description":"Publish a draft blog post (or unpublish it back to draft with published:false). Sets publishedAt on first publish. Requires confirm: true.","tags":["posts"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":2,"pattern":"^[a-z0-9-]+$"},"published":{"default":true,"type":"boolean"},"confirm":{"type":"boolean","const":true}},"required":["slug","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string"},"status":{"type":"string","enum":["draft","published"]},"publishedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["slug","status","publishedAt"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Publish a post","value":{"slug":"our-spring-collection","published":true,"confirm":true}}]}},"/api/v1/tools/settings.get":{"post":{"operationId":"invoke_settings_get","summary":"Get a settings singleton (shipping or branding).","description":"Get a settings singleton (shipping or branding).","tags":["settings"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"type":{"type":"string","enum":["shipping","branding"]}},"required":["type"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingFeeOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"freeShippingThresholdOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"type":{"type":"string","const":"shipping"}},"required":["id","shippingFeeOere","freeShippingThresholdOere","updatedAt","type"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"storeName":{"type":"string"},"heroImage":{"type":"string"},"heroImageAssetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"announcement":{"type":"string"},"agenticPolicyJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"setupComplete":{"type":"boolean"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}]},"domain":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailFrom":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailFromName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailSupport":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailAdmin":{"anyOf":[{"type":"string"},{"type":"null"}]},"industryTemplate":{"anyOf":[{"type":"string"},{"type":"null"}]},"designSlug":{"anyOf":[{"type":"string"},{"type":"null"}]},"themeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"layoutJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"ecommerceEnabled":{"type":"boolean"},"websiteHeadline":{"anyOf":[{"type":"string"},{"type":"null"}]},"heroCta":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoMarkPaths":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoMarkViewBox":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoMarkStrokeWidth":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"logoMarkClass":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoTransform":{"anyOf":[{"type":"string"},{"type":"null"}]},"faviconBg":{"anyOf":[{"type":"string"},{"type":"null"}]},"faviconFg":{"anyOf":[{"type":"string"},{"type":"null"}]},"defaultLocale":{"anyOf":[{"type":"string"},{"type":"null"}]},"featureOverridesJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"threeDConfigJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"chromeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"genomeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"seoIndexing":{"anyOf":[{"type":"string"},{"type":"null"}]},"aiCrawlers":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"type":{"type":"string","const":"branding"}},"required":["id","storeName","heroImage","heroImageAssetId","announcement","agenticPolicyJson","setupComplete","tagline","domain","emailFrom","emailFromName","emailSupport","emailAdmin","industryTemplate","designSlug","themeJson","layoutJson","ecommerceEnabled","websiteHeadline","heroCta","logoImageUrl","logoMarkPaths","logoMarkViewBox","logoMarkStrokeWidth","logoMarkClass","logoTransform","faviconBg","faviconFg","defaultLocale","featureOverridesJson","threeDConfigJson","chromeJson","genomeJson","seoIndexing","aiCrawlers","updatedAt","type"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/settings.update_shipping":{"post":{"operationId":"invoke_settings_update_shipping","summary":"Update shipping price (in ore) and free-shipping threshold (in ore). Affects checkout instantly (30s cache).","description":"Update shipping price (in ore) and free-shipping threshold (in ore). Affects checkout instantly (30s cache).","tags":["settings"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"shippingFeeOere":{"type":"integer","minimum":0,"maximum":50000},"freeShippingThresholdOere":{"type":"integer","minimum":0,"maximum":1000000}},"required":["shippingFeeOere","freeShippingThresholdOere"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingFeeOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"freeShippingThresholdOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","shippingFeeOere","freeShippingThresholdOere","updatedAt"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Update shipping pricing","value":{"shippingFeeOere":4900,"freeShippingThresholdOere":49900}}]}},"/api/v1/tools/settings.update_branding":{"post":{"operationId":"invoke_settings_update_branding","summary":"Update branding: shop name, hero image URL, and announcement bar text. Affects the front page instantly.","description":"Update branding: shop name, hero image URL, and announcement bar text. Affects the front page instantly.","tags":["settings"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"storeName":{"type":"string","minLength":1,"maxLength":100},"heroImage":{"type":"string","format":"uri"},"announcement":{"type":"string","maxLength":200}},"required":["storeName","heroImage","announcement"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"storeName":{"type":"string"},"heroImage":{"type":"string"},"heroImageAssetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"announcement":{"type":"string"},"agenticPolicyJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"setupComplete":{"type":"boolean"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}]},"domain":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailFrom":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailFromName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailSupport":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailAdmin":{"anyOf":[{"type":"string"},{"type":"null"}]},"industryTemplate":{"anyOf":[{"type":"string"},{"type":"null"}]},"designSlug":{"anyOf":[{"type":"string"},{"type":"null"}]},"themeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"layoutJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"ecommerceEnabled":{"type":"boolean"},"websiteHeadline":{"anyOf":[{"type":"string"},{"type":"null"}]},"heroCta":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoMarkPaths":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoMarkViewBox":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoMarkStrokeWidth":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"logoMarkClass":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoTransform":{"anyOf":[{"type":"string"},{"type":"null"}]},"faviconBg":{"anyOf":[{"type":"string"},{"type":"null"}]},"faviconFg":{"anyOf":[{"type":"string"},{"type":"null"}]},"defaultLocale":{"anyOf":[{"type":"string"},{"type":"null"}]},"featureOverridesJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"threeDConfigJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"chromeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"genomeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"seoIndexing":{"anyOf":[{"type":"string"},{"type":"null"}]},"aiCrawlers":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"ignored":{"type":"array","items":{"type":"string"}}},"required":["id","storeName","heroImage","heroImageAssetId","announcement","agenticPolicyJson","setupComplete","tagline","domain","emailFrom","emailFromName","emailSupport","emailAdmin","industryTemplate","designSlug","themeJson","layoutJson","ecommerceEnabled","websiteHeadline","heroCta","logoImageUrl","logoMarkPaths","logoMarkViewBox","logoMarkStrokeWidth","logoMarkClass","logoTransform","faviconBg","faviconFg","defaultLocale","featureOverridesJson","threeDConfigJson","chromeJson","genomeJson","seoIndexing","aiCrawlers","updatedAt"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Update store branding","value":{"storeName":"Cartwright Coffee","heroImage":"https://example.com/hero.jpg","announcement":"Free shipping on orders over 499 DKK!"}}]}},"/api/v1/tools/settings.update_copy":{"post":{"operationId":"invoke_settings_update_copy","summary":"Set a single piece of front-page copy: field 'websiteHeadline' (the hero heading) or 'tagline' (the hero sub-line). Touches only that column. Affects the front page instantly. Requires confirm: true.","description":"Set a single piece of front-page copy: field 'websiteHeadline' (the hero heading) or 'tagline' (the hero sub-line). Touches only that column. Affects the front page instantly. Requires confirm: true.","tags":["settings"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"field":{"type":"string","enum":["websiteHeadline","tagline"]},"value":{"type":"string","minLength":1,"maxLength":200},"confirm":{"type":"boolean","const":true}},"required":["field","value","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"storeName":{"type":"string"},"heroImage":{"type":"string"},"heroImageAssetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"announcement":{"type":"string"},"agenticPolicyJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"setupComplete":{"type":"boolean"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}]},"domain":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailFrom":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailFromName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailSupport":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailAdmin":{"anyOf":[{"type":"string"},{"type":"null"}]},"industryTemplate":{"anyOf":[{"type":"string"},{"type":"null"}]},"designSlug":{"anyOf":[{"type":"string"},{"type":"null"}]},"themeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"layoutJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"ecommerceEnabled":{"type":"boolean"},"websiteHeadline":{"anyOf":[{"type":"string"},{"type":"null"}]},"heroCta":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoMarkPaths":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoMarkViewBox":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoMarkStrokeWidth":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"logoMarkClass":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoTransform":{"anyOf":[{"type":"string"},{"type":"null"}]},"faviconBg":{"anyOf":[{"type":"string"},{"type":"null"}]},"faviconFg":{"anyOf":[{"type":"string"},{"type":"null"}]},"defaultLocale":{"anyOf":[{"type":"string"},{"type":"null"}]},"featureOverridesJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"threeDConfigJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"chromeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"genomeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"seoIndexing":{"anyOf":[{"type":"string"},{"type":"null"}]},"aiCrawlers":{"anyOf":[{"type":"string"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","storeName","heroImage","heroImageAssetId","announcement","agenticPolicyJson","setupComplete","tagline","domain","emailFrom","emailFromName","emailSupport","emailAdmin","industryTemplate","designSlug","themeJson","layoutJson","ecommerceEnabled","websiteHeadline","heroCta","logoImageUrl","logoMarkPaths","logoMarkViewBox","logoMarkStrokeWidth","logoMarkClass","logoTransform","faviconBg","faviconFg","defaultLocale","featureOverridesJson","threeDConfigJson","chromeJson","genomeJson","seoIndexing","aiCrawlers","updatedAt"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Update hero headline","value":{"field":"websiteHeadline","value":"Coffee worth slowing down for.","confirm":true}}]}},"/api/v1/tools/features.get":{"post":{"operationId":"invoke_features_get","summary":"List all shop features with their resolved on/off state, tier (runtime/compile-time/identity), whether they can be toggled live, dependency status, and shop identity. Read-only.","description":"List all shop features with their resolved on/off state, tier (runtime/compile-time/identity), whether they can be toggled live, dependency status, and shop identity. Read-only.","tags":["features"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"features:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"features":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["aiStylist","newsletter","cartwrightBadge","welcomeGuide","firstRunWelcome","reviews","breadcrumbs","currencySwitcher","multiCurrency","fxAutoUpdate","sheetsSync","phoneWidget","announcementBar","containerQueries","popoverApi","viewTransitions","threeD","genomeResolve","genomeEntityCopy","verticalPresets","mixerPreviewEnabled","annotateEdit","designSurfaces","sectionLayout","visualBuilderEnabled","designImport","docsImport","seoAutopilot","hoptify","siteImport","sitePack","logoGenerator","v0Generator","githubAuth","googleAuth","googleDrive","blog","stripeTax","subscriptions","shippingZones","wishlist","abandonedCart","marketingAutomations","contactAttachments","orderWorkspace","fulfillmentPdf","returns","orderAi","cartwrightPlus","mcpPublic","webMcp","webshop","acp","a2a","adminAgenticDashboard","voiceShop","consentBanner","analyticsGa4","mediaLibrary","aeoContent","merchantFeed","hreflang","leadAiTriage","altTextAi","tryOn","ucpIdentityLinking","magicBuilder","componentRegistryPublic","lookSharing","componentRegistryShipsSource","registryStats","motionEffects","speculationRules"]},"label":{"type":"string"},"description":{"type":"string"},"group":{"type":"string"},"tier":{"type":"string","enum":["runtime","compile-time","identity"]},"runtimeToggleable":{"type":"boolean"},"dependsOn":{"type":"array","items":{"type":"string","enum":["aiStylist","newsletter","cartwrightBadge","welcomeGuide","firstRunWelcome","reviews","breadcrumbs","currencySwitcher","multiCurrency","fxAutoUpdate","sheetsSync","phoneWidget","announcementBar","containerQueries","popoverApi","viewTransitions","threeD","genomeResolve","genomeEntityCopy","verticalPresets","mixerPreviewEnabled","annotateEdit","designSurfaces","sectionLayout","visualBuilderEnabled","designImport","docsImport","seoAutopilot","hoptify","siteImport","sitePack","logoGenerator","v0Generator","githubAuth","googleAuth","googleDrive","blog","stripeTax","subscriptions","shippingZones","wishlist","abandonedCart","marketingAutomations","contactAttachments","orderWorkspace","fulfillmentPdf","returns","orderAi","cartwrightPlus","mcpPublic","webMcp","webshop","acp","a2a","adminAgenticDashboard","voiceShop","consentBanner","analyticsGa4","mediaLibrary","aeoContent","merchantFeed","hreflang","leadAiTriage","altTextAi","tryOn","ucpIdentityLinking","magicBuilder","componentRegistryPublic","lookSharing","componentRegistryShipsSource","registryStats","motionEffects","speculationRules"]}},"precondition":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"minCurrencies"},"value":{"type":"number"}},"required":["kind","value"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"ecommerce"}},"required":["kind"],"additionalProperties":false}]},"requiresRedeployNote":{"type":"string"},"implemented":{"type":"boolean"},"enabled":{"type":"boolean"},"configDefault":{"type":"boolean"},"overridden":{"type":"boolean"},"blockedReason":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["key","label","description","group","tier","runtimeToggleable","implemented","enabled","configDefault","overridden","blockedReason"],"additionalProperties":false}},"identity":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["mode","ecommerceEnabled","industryTemplate"]},"label":{"type":"string"},"description":{"type":"string"},"value":{"anyOf":[{"type":"string"},{"type":"boolean"}]}},"required":["key","label","description","value"],"additionalProperties":false}}},"required":["features","identity"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/features.set":{"post":{"operationId":"invoke_features_set","summary":"Turn a runtime-toggleable feature on or off. Only features whose tier is 'runtime' can be set (see features.get); compile-time and identity flags cannot be changed here. Dependencies/preconditions are enforced. Requires confirm: true. Revertible via audit.revert.","description":"Turn a runtime-toggleable feature on or off. Only features whose tier is 'runtime' can be set (see features.get); compile-time and identity flags cannot be changed here. Dependencies/preconditions are enforced. Requires confirm: true. Revertible via audit.revert.","tags":["features"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"features:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"key":{"type":"string","enum":["aiStylist","newsletter","cartwrightBadge","welcomeGuide","firstRunWelcome","reviews","breadcrumbs","currencySwitcher","multiCurrency","fxAutoUpdate","sheetsSync","phoneWidget","announcementBar","containerQueries","popoverApi","viewTransitions","threeD","genomeResolve","genomeEntityCopy","verticalPresets","mixerPreviewEnabled","annotateEdit","designSurfaces","sectionLayout","designImport","docsImport","seoAutopilot","hoptify","siteImport","sitePack","logoGenerator","v0Generator","googleDrive","blog","shippingZones","wishlist","abandonedCart","marketingAutomations","contactAttachments","orderWorkspace","fulfillmentPdf","returns","orderAi","cartwrightPlus","mcpPublic","webMcp","aeoContent","merchantFeed","ucpIdentityLinking","componentRegistryPublic","lookSharing","componentRegistryShipsSource","registryStats"]},"enabled":{"type":"boolean"},"confirm":{"type":"boolean","const":true}},"required":["key","enabled","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"key":{"type":"string","enum":["aiStylist","newsletter","cartwrightBadge","welcomeGuide","firstRunWelcome","reviews","breadcrumbs","currencySwitcher","multiCurrency","fxAutoUpdate","sheetsSync","phoneWidget","announcementBar","containerQueries","popoverApi","viewTransitions","threeD","genomeResolve","genomeEntityCopy","verticalPresets","mixerPreviewEnabled","annotateEdit","designSurfaces","sectionLayout","designImport","docsImport","seoAutopilot","hoptify","siteImport","sitePack","logoGenerator","v0Generator","googleDrive","blog","shippingZones","wishlist","abandonedCart","marketingAutomations","contactAttachments","orderWorkspace","fulfillmentPdf","returns","orderAi","cartwrightPlus","mcpPublic","webMcp","aeoContent","merchantFeed","ucpIdentityLinking","componentRegistryPublic","lookSharing","componentRegistryShipsSource","registryStats"]},"enabled":{"type":"boolean"},"reset":{"type":"boolean"}},"required":["ok","key","enabled","reset"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Enable product reviews","value":{"key":"reviews","enabled":true,"confirm":true}}]}},"/api/v1/tools/three.get":{"post":{"operationId":"invoke_three_get","summary":"Get the current Live Canvas 3D config (scene, intensity 0..1, paletteSource) and the list of available scenes with descriptions. Read-only.","description":"Get the current Live Canvas 3D config (scene, intensity 0..1, paletteSource) and the list of available scenes with descriptions. Read-only.","tags":["three"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"config":{"type":"object","properties":{"scene":{"type":"string","enum":["floating-geometry","particles","blob","wireframe","aurora","waves","orb","gridflow","butterflies"]},"intensity":{"type":"number","minimum":0,"maximum":1},"paletteSource":{"type":"string","enum":["theme","custom"]}},"required":["scene","intensity","paletteSource"],"additionalProperties":false},"scenes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["floating-geometry","particles","blob","wireframe","aurora","waves","orb","gridflow","butterflies"]},"label":{"type":"string"},"description":{"type":"string"}},"required":["id","label","description"],"additionalProperties":false}}},"required":["config","scenes"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/three.configure":{"post":{"operationId":"invoke_three_configure","summary":"Configure the Live Canvas 3D hero. scene: floating-geometry | particles | blob | wireframe | aurora. intensity: 0..1 (density/speed). paletteSource: theme | custom. Any subset may be set. Applies instantly (30s cache). Requires confirm: true. Revertible via audit.revert.","description":"Configure the Live Canvas 3D hero. scene: floating-geometry | particles | blob | wireframe | aurora. intensity: 0..1 (density/speed). paletteSource: theme | custom. Any subset may be set. Applies instantly (30s cache). Requires confirm: true. Revertible via audit.revert.","tags":["three"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"scene":{"type":"string","enum":["floating-geometry","particles","blob","wireframe","aurora","waves","orb","gridflow","butterflies"]},"intensity":{"type":"number","minimum":0,"maximum":1},"paletteSource":{"type":"string","enum":["theme","custom"]},"confirm":{"type":"boolean","const":true}},"required":["confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"config":{"type":"object","properties":{"scene":{"type":"string","enum":["floating-geometry","particles","blob","wireframe","aurora","waves","orb","gridflow","butterflies"]},"intensity":{"type":"number","minimum":0,"maximum":1},"paletteSource":{"type":"string","enum":["theme","custom"]}},"required":["scene","intensity","paletteSource"],"additionalProperties":false}},"required":["ok","config"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Calm cosmic vibe","value":{"scene":"particles","intensity":0.4,"confirm":true}}]}},"/api/v1/tools/genome.get":{"post":{"operationId":"invoke_genome_get","summary":"Get the Resolvable Genome snapshot: every registered field with its anchor (config default), current override, last resolved value, what renders now, and status (anchor|override|resolved|stale), plus the active identity deps (tone/audience/formality/vibe). Read-only.","description":"Get the Resolvable Genome snapshot: every registered field with its anchor (config default), current override, last resolved value, what renders now, and status (anchor|override|resolved|stale), plus the active identity deps (tone/audience/formality/vibe). Read-only.","tags":["genome"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deps":{"type":"object","properties":{"tone":{"type":"string"},"audience":{"type":"string"},"formality":{"type":"string"},"vibe":{"type":"string"},"storeName":{"type":"string"}},"required":["tone","audience","formality","vibe","storeName"],"additionalProperties":false},"fields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["footer.tagline","footer.disclaimer","uiLabels.newsletterHeading","uiLabels.newsletterSubtext","home.hero.eyebrow","home.hero.headline","home.hero.tagline","home.hero.cta","home.valueProps.title","home.valueProps.description","home.features.title","home.features.description","home.ctaFooter.title","home.ctaFooter.description","home.ctaFooter.cta","home.valueProps.items","home.features.items","shop.hero.title","shop.hero.subtagline","shop.hero.cta","shop.pitch.title","shop.pitch.body","cart.title","cart.empty","cart.emptyBody","checkout.title","checkout.summaryTitle","account.welcome","order.thanks"]},"label":{"type":"string"},"lock":{"type":"string","enum":["anchored","resolvable"]},"dependsOn":{"type":"array","items":{"type":"string","enum":["tone","audience","formality","vibe"]}},"anchor":{"type":"string"},"override":{"anyOf":[{"type":"string"},{"type":"null"}]},"resolved":{"anyOf":[{"type":"string"},{"type":"null"}]},"current":{"type":"string"},"status":{"type":"string","enum":["anchor","override","resolved","stale"]}},"required":["key","label","lock","dependsOn","anchor","override","resolved","current","status"],"additionalProperties":false}}},"required":["deps","fields"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/genome.set":{"post":{"operationId":"invoke_genome_set","summary":"Set or reset a genome field override. key: one of the registered field keys. value: the exact string to pin (validated against the field schema), or null to reset to anchor/resolver. Applies instantly (30s cache). Requires confirm: true. Revertible via audit.revert.","description":"Set or reset a genome field override. key: one of the registered field keys. value: the exact string to pin (validated against the field schema), or null to reset to anchor/resolver. Applies instantly (30s cache). Requires confirm: true. Revertible via audit.revert.","tags":["genome"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"key":{"type":"string","enum":["footer.tagline","footer.disclaimer","uiLabels.newsletterHeading","uiLabels.newsletterSubtext","home.hero.eyebrow","home.hero.headline","home.hero.tagline","home.hero.cta","home.valueProps.title","home.valueProps.description","home.features.title","home.features.description","home.ctaFooter.title","home.ctaFooter.description","home.ctaFooter.cta","home.valueProps.items","home.features.items","shop.hero.title","shop.hero.subtagline","shop.hero.cta","shop.pitch.title","shop.pitch.body","cart.title","cart.empty","cart.emptyBody","checkout.title","checkout.summaryTitle","account.welcome","order.thanks"]},"value":{"anyOf":[{"type":"string"},{"type":"null"}]},"confirm":{"type":"boolean","const":true}},"required":["key","value","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"key":{"type":"string","enum":["footer.tagline","footer.disclaimer","uiLabels.newsletterHeading","uiLabels.newsletterSubtext","home.hero.eyebrow","home.hero.headline","home.hero.tagline","home.hero.cta","home.valueProps.title","home.valueProps.description","home.features.title","home.features.description","home.ctaFooter.title","home.ctaFooter.description","home.ctaFooter.cta","home.valueProps.items","home.features.items","shop.hero.title","shop.hero.subtagline","shop.hero.cta","shop.pitch.title","shop.pitch.body","cart.title","cart.empty","cart.emptyBody","checkout.title","checkout.summaryTitle","account.welcome","order.thanks"]},"value":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ok","key","value"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Pin footer tagline","value":{"key":"footer.tagline","value":"Coffee worth slowing down for.","confirm":true}},{"name":"Reset footer tagline to anchor","value":{"key":"footer.tagline","value":null,"confirm":true}}]}},"/api/v1/tools/genome.resolve":{"post":{"operationId":"invoke_genome_resolve","summary":"Trigger LLM resolution of a genome field in the current brand voice (identity tone/audience/formality/vibe). Writes the result to the resolved-cache so it renders without further LLM calls. No-op if an override is pinned. Requires confirm: true.","description":"Trigger LLM resolution of a genome field in the current brand voice (identity tone/audience/formality/vibe). Writes the result to the resolved-cache so it renders without further LLM calls. No-op if an override is pinned. Requires confirm: true.","tags":["genome"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"key":{"type":"string","enum":["footer.tagline","footer.disclaimer","uiLabels.newsletterHeading","uiLabels.newsletterSubtext","home.hero.eyebrow","home.hero.headline","home.hero.tagline","home.hero.cta","home.valueProps.title","home.valueProps.description","home.features.title","home.features.description","home.ctaFooter.title","home.ctaFooter.description","home.ctaFooter.cta","home.valueProps.items","home.features.items","shop.hero.title","shop.hero.subtagline","shop.hero.cta","shop.pitch.title","shop.pitch.body","cart.title","cart.empty","cart.emptyBody","checkout.title","checkout.summaryTitle","account.welcome","order.thanks"]},"confirm":{"type":"boolean","const":true}},"required":["key","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"value":{"type":"string"},"cached":{"type":"boolean"}},"required":["ok","value","cached"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Resolve footer tagline","value":{"key":"footer.tagline","confirm":true}}]}},"/api/v1/tools/genome.set_identity":{"post":{"operationId":"invoke_genome_set_identity","summary":"Set a brand identity anchor that resolvable fields harmonize to. key: tone | audience | formality | vibe. tone: professional|playful|luxurious|technical|warm. audience: general|business|consumer|enthusiast. formality: formal|balanced|casual. vibe: free-form 2-40 chars. Fields depending on the changed anchor go stale — call genome.reharmonize to re-resolve them. Requires confirm: true. Revertible.","description":"Set a brand identity anchor that resolvable fields harmonize to. key: tone | audience | formality | vibe. tone: professional|playful|luxurious|technical|warm. audience: general|business|consumer|enthusiast. formality: formal|balanced|casual. vibe: free-form 2-40 chars. Fields depending on the changed anchor go stale — call genome.reharmonize to re-resolve them. Requires confirm: true. Revertible.","tags":["genome"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"key":{"type":"string","enum":["tone","audience","formality","vibe"]},"value":{"type":"string"},"confirm":{"type":"boolean","const":true}},"required":["key","value","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"key":{"type":"string","enum":["tone","audience","formality","vibe"]},"value":{"type":"string"}},"required":["ok","key","value"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Make the voice playful","value":{"key":"tone","value":"playful","confirm":true}}]}},"/api/v1/tools/genome.reharmonize":{"post":{"operationId":"invoke_genome_reharmonize","summary":"Re-resolve every resolvable genome field against the current identity anchors — the self-harmonizing rebrand. Pinned overrides stay; anchored/legal fields are skipped; fresh caches are reused (no redundant LLM calls). Requires confirm: true.","description":"Re-resolve every resolvable genome field against the current identity anchors — the self-harmonizing rebrand. Pinned overrides stay; anchored/legal fields are skipped; fresh caches are reused (no redundant LLM calls). Requires confirm: true.","tags":["genome"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"confirm":{"type":"boolean","const":true}},"required":["confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["footer.tagline","footer.disclaimer","uiLabels.newsletterHeading","uiLabels.newsletterSubtext","home.hero.eyebrow","home.hero.headline","home.hero.tagline","home.hero.cta","home.valueProps.title","home.valueProps.description","home.features.title","home.features.description","home.ctaFooter.title","home.ctaFooter.description","home.ctaFooter.cta","home.valueProps.items","home.features.items","shop.hero.title","shop.hero.subtagline","shop.hero.cta","shop.pitch.title","shop.pitch.body","cart.title","cart.empty","cart.emptyBody","checkout.title","checkout.summaryTitle","account.welcome","order.thanks"]},"result":{"oneOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"value":{"type":"string"},"cached":{"type":"boolean"}},"required":["ok","value","cached"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"}},"required":["ok","error"],"additionalProperties":false}]}},"required":["key","result"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/genome.describe_business":{"post":{"operationId":"invoke_genome_describe_business","summary":"Spawn the brand voice from one sentence: infer the identity anchors (tone/audience/formality/vibe) from a plain-English description of the business, set them, and re-resolve every resolvable field. The 'describe your business → it writes itself' move. Requires confirm: true. Revertible.","description":"Spawn the brand voice from one sentence: infer the identity anchors (tone/audience/formality/vibe) from a plain-English description of the business, set them, and re-resolve every resolvable field. The 'describe your business → it writes itself' move. Requires confirm: true. Revertible.","tags":["genome"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"sentence":{"type":"string","minLength":8},"confirm":{"type":"boolean","const":true}},"required":["sentence","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"identity":{"type":"object","properties":{"tone":{"type":"string","enum":["professional","playful","luxurious","technical","warm"]},"audience":{"type":"string","enum":["general","business","consumer","enthusiast"]},"formality":{"type":"string","enum":["formal","balanced","casual"]},"vibe":{"type":"string"}},"required":["tone","audience","formality","vibe"],"additionalProperties":false},"reharmonized":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["footer.tagline","footer.disclaimer","uiLabels.newsletterHeading","uiLabels.newsletterSubtext","home.hero.eyebrow","home.hero.headline","home.hero.tagline","home.hero.cta","home.valueProps.title","home.valueProps.description","home.features.title","home.features.description","home.ctaFooter.title","home.ctaFooter.description","home.ctaFooter.cta","home.valueProps.items","home.features.items","shop.hero.title","shop.hero.subtagline","shop.hero.cta","shop.pitch.title","shop.pitch.body","cart.title","cart.empty","cart.emptyBody","checkout.title","checkout.summaryTitle","account.welcome","order.thanks"]},"result":{"oneOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"value":{"type":"string"},"cached":{"type":"boolean"}},"required":["ok","value","cached"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"}},"required":["ok","error"],"additionalProperties":false}]}},"required":["key","result"],"additionalProperties":false}}},"required":["ok","identity","reharmonized"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Spawn from a sentence","value":{"sentence":"We roast small-batch single-origin coffee for calm slow mornings.","confirm":true}}]}},"/api/v1/tools/genome.set_entity_copy":{"post":{"operationId":"invoke_genome_set_entity_copy","summary":"Set or clear a per-entity voiced copy override for a product or category description. kind: product | category. id: the entity id. field: description. value: the voiced copy string, or null to clear (fall back to the entity's own text). Rendered on PDP/PLP only when features.genomeEntityCopy is on. Requires confirm: true. Revertible via audit.revert.","description":"Set or clear a per-entity voiced copy override for a product or category description. kind: product | category. id: the entity id. field: description. value: the voiced copy string, or null to clear (fall back to the entity's own text). Rendered on PDP/PLP only when features.genomeEntityCopy is on. Requires confirm: true. Revertible via audit.revert.","tags":["genome"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kind":{"type":"string","enum":["product","category"]},"id":{"type":"string","minLength":1},"field":{"type":"string","enum":["description"]},"value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"confirm":{"type":"boolean","const":true}},"required":["kind","id","field","value","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"key":{"type":"string"},"set":{"type":"boolean"}},"required":["key","set"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Voice a product description","value":{"kind":"product","id":"prod_123","field":"description","value":"Roasted the morning it ships — bright, citrusy, unmistakably ours.","confirm":true}},{"name":"Clear a category override","value":{"kind":"category","id":"cat_42","field":"description","value":null,"confirm":true}}]}},"/api/v1/tools/analytics.summary":{"post":{"operationId":"invoke_analytics_summary","summary":"Realtime ops summary: order count, revenue, product count, low stock, customer count, top-selling products, and the latest 5 orders. Optional date range.","description":"Realtime ops summary: order count, revenue, product count, low stock, customer count, top-selling products, and the latest 5 orders. Optional date range.","tags":["analytics"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"analytics:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"fromDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"toDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"lowStockThreshold":{"default":3,"type":"integer","minimum":0,"maximum":100},"topProductsLimit":{"default":5,"type":"integer","minimum":1,"maximum":20}}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"period":{"type":"object","properties":{"from":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"to":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["from","to"],"additionalProperties":false},"orders":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"maximum":9007199254740991},"revenueOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"discountsGivenOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingCollectedOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count","revenueOere","discountsGivenOere","shippingCollectedOere"],"additionalProperties":false},"catalog":{"type":"object","properties":{"totalProducts":{"type":"integer","minimum":0,"maximum":9007199254740991},"lowStock":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}]},"stock":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["slug","name","brand","stock"],"additionalProperties":false}},"lowStockCount":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["totalProducts","lowStock","lowStockCount"],"additionalProperties":false},"customers":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false},"recentOrders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"status":{"type":"string"},"totalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","status","totalDkk","createdAt"],"additionalProperties":false}},"topProducts":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"totalSold":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["productId","productName","totalSold"],"additionalProperties":false}}},"required":["period","orders","catalog","customers","recentOrders","topProducts"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/marketing.create_campaign":{"post":{"operationId":"invoke_marketing_create_campaign","summary":"Composite PR demo tool: creates a discount code + updates the announcement bar + writes a preview email in one call. Each sub-step is audited separately so audit.revert can roll them back individually. Use for example 'Create a weekend campaign for Sport -20% code SUMMER20'.","description":"Composite PR demo tool: creates a discount code + updates the announcement bar + writes a preview email in one call. Each sub-step is audited separately so audit.revert can roll them back individually. Use for example 'Create a weekend campaign for Sport -20% code SUMMER20'.","tags":["marketing"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"marketing:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"discountCode":{"type":"string","minLength":3},"discountType":{"type":"string","enum":["percent","fixed"]},"discountValue":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"validUntil":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"announcement":{"type":"string","minLength":5,"maxLength":200},"previewEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["discountCode","discountType","discountValue","announcement"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"discount":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"}},"required":["id","code"],"additionalProperties":false},"announcement":{"type":"string"},"previewPath":{"anyOf":[{"type":"string"},{"type":"null"}]},"summary":{"type":"string"}},"required":["ok","discount","announcement","previewPath","summary"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Create a summer sale campaign","value":{"discountCode":"SUMMER20","discountType":"percent","discountValue":20,"announcement":"Summer Sale! Use code SUMMER20 for 20% off all orders."}}]}},"/api/v1/tools/audit.list":{"post":{"operationId":"invoke_audit_list","summary":"List audit entries with pagination + filters (tool prefix, actor prefix, only ok). includePayloads:true also returns args/before/after JSON (larger response).","description":"List audit entries with pagination + filters (tool prefix, actor prefix, only ok). includePayloads:true also returns args/before/after JSON (larger response).","tags":["audit"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"audit:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"limit":{"default":50,"type":"integer","minimum":1,"maximum":200},"cursor":{"type":"string"},"toolPrefix":{"type":"string"},"actorPrefix":{"type":"string"},"onlyOk":{"type":"boolean"},"includePayloads":{"default":false,"type":"boolean"}}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"actor":{"type":"string"},"tool":{"type":"string"},"ok":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"errorMsg":{"anyOf":[{"type":"string"},{"type":"null"}]},"argsJson":{"type":"string"},"beforeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"afterJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"requestId":{"type":"string"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}]},"userAgent":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","actor","tool","ok","createdAt","errorMsg"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/audit.revert":{"post":{"operationId":"invoke_audit_revert","summary":"Roll back a previous destructive operation. Requires audit:revert scope. Only tools marked revertible can be rolled back. Requires confirm: true.","description":"Roll back a previous destructive operation. Requires audit:revert scope. Only tools marked revertible can be rolled back. Requires confirm: true.","tags":["audit"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"audit:revert","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"auditLogId":{"type":"string","minLength":1},"confirm":{"type":"boolean","const":true}},"required":["auditLogId","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"revertedTool":{"type":"string","const":"design.set_layout"},"revertedAuditLogId":{"type":"string"},"restored":{"type":"object","properties":{"layoutJson":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["layoutJson"],"additionalProperties":false}},"required":["ok","revertedTool","revertedAuditLogId","restored"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"revertedTool":{"type":"string","const":"chrome.set"},"revertedAuditLogId":{"type":"string"},"restored":{"type":"object","properties":{"chromeJson":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["chromeJson"],"additionalProperties":false}},"required":["ok","revertedTool","revertedAuditLogId","restored"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"revertedTool":{"type":"string","const":"composition.apply"},"revertedAuditLogId":{"type":"string"},"restored":{"type":"object","properties":{"designSlug":{"anyOf":[{"type":"string"},{"type":"null"}]},"themeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"chromeJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"threeDConfigJson":{"anyOf":[{"type":"string"},{"type":"null"}]},"genomeJson":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["designSlug","themeJson","chromeJson","threeDConfigJson","genomeJson"],"additionalProperties":false}},"required":["ok","revertedTool","revertedAuditLogId","restored"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"revertedTool":{"type":"string","const":"products.delete"},"revertedAuditLogId":{"type":"string"},"restored":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"}},"required":["id","slug","name"],"additionalProperties":false}},"required":["ok","revertedTool","revertedAuditLogId","restored"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/cart.add":{"post":{"operationId":"invoke_cart_add","summary":"Add a product to the cart, or increase quantity if it is already there. Identify the product by slug. Default quantity = 1. If the product has variants, a specific variant can be added with variantSku.","description":"Add a product to the cart, or increase quantity if it is already there. Identify the product by slug. Default quantity = 1. If the product has variants, a specific variant can be added with variantSku.","tags":["cart"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"cart:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":1},"quantity":{"default":1,"type":"integer","minimum":1,"maximum":10},"variantSku":{"type":"string","minLength":1,"maxLength":80}},"required":["slug"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"added":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991},"variantSku":{"type":"string"}},"required":["slug","name","quantity"],"additionalProperties":false}},"required":["ok","added"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Add a product to cart","value":{"slug":"ceramic-mug","quantity":2}}]}},"/api/v1/tools/cart.update_quantity":{"post":{"operationId":"invoke_cart_update_quantity","summary":"Set a product's cart quantity to a specific value. quantity=0 removes it.","description":"Set a product's cart quantity to a specific value. quantity=0 removes it.","tags":["cart"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"cart:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":1},"quantity":{"type":"integer","minimum":0,"maximum":10}},"required":["slug","quantity"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"removed":{"type":"string"}},"required":["ok","removed"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"updated":{"type":"object","properties":{"slug":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["slug","quantity"],"additionalProperties":false}},"required":["ok","updated"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/cart.remove":{"post":{"operationId":"invoke_cart_remove","summary":"Remove a product from the cart.","description":"Remove a product from the cart.","tags":["cart"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"cart:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":1}},"required":["slug"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"removed":{"type":"string"}},"required":["ok","removed"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/cart.get_summary":{"post":{"operationId":"invoke_cart_get_summary","summary":"Get the current cart: items (slug, name, quantity, price), subtotal, shipping, and total. The AI should call this before suggesting checkout or giving price estimates.","description":"Get the current cart: items (slug, name, quantity, price), subtotal, shipping, and total. The AI should call this before suggesting checkout or giving price estimates.","tags":["cart"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"cart:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"empty":{"type":"boolean","const":true},"items":{"minItems":0,"maxItems":0,"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991},"unitPriceDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"lineTotalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"firstImage":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["slug","name","quantity","unitPriceDkk","lineTotalDkk","firstImage"],"additionalProperties":false}},"subtotalDkk":{"type":"number","const":0},"shippingDkk":{"type":"number","const":0},"totalDkk":{"type":"number","const":0},"itemCount":{"type":"number","const":0}},"required":["empty","items","subtotalDkk","shippingDkk","totalDkk","itemCount"],"additionalProperties":false},{"type":"object","properties":{"empty":{"type":"boolean","const":false},"items":{"minItems":1,"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991},"unitPriceDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"lineTotalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"firstImage":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["slug","name","quantity","unitPriceDkk","lineTotalDkk","firstImage"],"additionalProperties":false}},"subtotalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"discountDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"itemCount":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["empty","items","subtotalDkk","discountDkk","shippingDkk","totalDkk","itemCount"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/discounts.try_apply":{"post":{"operationId":"invoke_discounts_try_apply","summary":"Validate a discount code against the current cart without applying it. Returns a new total if the code is valid, or an error message. The AI can use this to show the customer their savings.","description":"Validate a discount code against the current cart without applying it. Returns a new total if the code is valid, or an error message. The AI can use this to show the customer their savings.","tags":["discounts"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"cart:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string","minLength":1}},"required":["code"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":false},"reason":{"type":"string"}},"required":["ok","reason"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"code":{"type":"string"},"savingsOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"newTotalOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingOere":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["ok","code","savingsOere","newTotalOere","shippingOere"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/customer.lookup_by_email":{"post":{"operationId":"invoke_customer_lookup_by_email","summary":"Look up whether the customer has shopped with us before based on email. Returns only anonymized info: {hasOrders, lastShipping?, orderCount, isRegisteredUser}, with no order history or phone number. Use this early in checkout to offer returning customers a saved address.","description":"Look up whether the customer has shopped with us before based on email. Returns only anonymized info: {hasOrders, lastShipping?, orderCount, isRegisteredUser}, with no order history or phone number. Use this early in checkout to offer returning customers a saved address.","tags":["customer"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"customer:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["email"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"error":{"type":"string"},"rateLimited":{"type":"boolean","const":true}},"required":["error","rateLimited"],"additionalProperties":false},{"type":"object","properties":{"hasOrders":{"type":"boolean"},"orderCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"isRegisteredUser":{"type":"boolean"},"lastShipping":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"zip":{"type":"string"},"city":{"type":"string"}},"required":["name","address","zip","city"],"additionalProperties":false},{"type":"null"}]}},"required":["hasOrders","orderCount","isRegisteredUser","lastShipping"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/customer.lookup_by_phone":{"post":{"operationId":"invoke_customer_lookup_by_phone","summary":"Look up whether the customer has shopped with us before based on mobile number. Returns the same shape as customer.lookup_by_email, with no order history. Use when the customer provides a phone number to offer a saved address from their latest purchase. There is no external lookup service; this only works for returning customers.","description":"Look up whether the customer has shopped with us before based on mobile number. Returns the same shape as customer.lookup_by_email, with no order history. Use when the customer provides a phone number to offer a saved address from their latest purchase. There is no external lookup service; this only works for returning customers.","tags":["customer"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"customer:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"phone":{"type":"string","minLength":8,"maxLength":20}},"required":["phone"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"error":{"type":"string"},"rateLimited":{"type":"boolean","const":true}},"required":["error","rateLimited"],"additionalProperties":false},{"type":"object","properties":{"error":{"type":"string"},"invalidFormat":{"type":"boolean","const":true}},"required":["error","invalidFormat"],"additionalProperties":false},{"type":"object","properties":{"hasOrders":{"type":"boolean"},"orderCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"isRegisteredUser":{"type":"boolean"},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"lastShipping":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"zip":{"type":"string"},"city":{"type":"string"}},"required":["name","address","zip","city"],"additionalProperties":false},{"type":"null"}]}},"required":["hasOrders","orderCount","isRegisteredUser","email","lastShipping"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/orders.create":{"post":{"operationId":"invoke_orders_create","summary":"Create an order from the customer's current cart with shipping details. Call only after confirming all fields with the customer in one combined summary. The server always returns requiresConfirmation first; the customer clicks 'Buy now' in the PlanCard. You must never self-confirm. Set rememberAddress: true only if the customer explicitly asked to remember the address for next time; default is false.","description":"Create an order from the customer's current cart with shipping details. Call only after confirming all fields with the customer in one combined summary. The server always returns requiresConfirmation first; the customer clicks 'Buy now' in the PlanCard. You must never self-confirm. Set rememberAddress: true only if the customer explicitly asked to remember the address for next time; default is false.","tags":["orders"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"orders:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"shippingName":{"type":"string","minLength":2},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"shippingAddress":{"type":"string","minLength":3},"shippingZip":{"type":"string","pattern":"^\\d{4}$"},"shippingCity":{"type":"string","minLength":2},"phoneNumber":{"type":"string","pattern":"^(\\+?\\d{1,3})?[\\s\\-()]*\\d{8,12}[\\s\\-()]*$"},"discountCode":{"type":"string"},"rememberAddress":{"default":false,"type":"boolean"}},"required":["shippingName","email","shippingAddress","shippingZip","shippingCity"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"code":{"type":"string","enum":["VALIDATION","EMPTY_CART","OUT_OF_STOCK","INVALID_DISCOUNT","PAYMENT_INIT_FAILED","INTERNAL"]}},"required":["ok","error","code"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"orderId":{"type":"string"},"totalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"paymentMode":{"type":"string","const":"mock"},"rememberAddress":{"type":"boolean"},"shippingSnapshot":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"zip":{"type":"string"},"city":{"type":"string"}},"required":["name","address","zip","city"],"additionalProperties":false},{"type":"null"}]}},"required":["ok","orderId","totalDkk","paymentMode","rememberAddress","shippingSnapshot"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"orderId":{"type":"string"},"totalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"paymentMode":{"type":"string","const":"stripe"},"rememberAddress":{"type":"boolean"},"shippingSnapshot":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"zip":{"type":"string"},"city":{"type":"string"}},"required":["name","address","zip","city"],"additionalProperties":false},{"type":"null"}]},"paymentIntentClientSecret":{"type":"string"},"publishableKey":{"type":"string"}},"required":["ok","orderId","totalDkk","paymentMode","rememberAddress","shippingSnapshot","paymentIntentClientSecret","publishableKey"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Create a checkout session","value":{"email":"test@example.com","phoneNumber":"+4512345678","shippingName":"Test Person","shippingAddress":"Testvej 1","shippingZip":"1000","shippingCity":"København","rememberAddress":false}}]}},"/api/v1/tools/user.get_last_shipping":{"post":{"operationId":"invoke_user_get_last_shipping","summary":"Get the customer's latest delivery address. Returns source='session' if the customer is logged in, source='cookie' if the customer is not logged in but has a remember-address cookie, or source='none' if nothing is saved. Use this at checkout start to avoid asking for the address again.","description":"Get the customer's latest delivery address. Returns source='session' if the customer is logged in, source='cookie' if the customer is not logged in but has a remember-address cookie, or source='none' if nothing is saved. Use this at checkout start to avoid asking for the address again.","tags":["user"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"customer:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"session"},"shipping":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"zip":{"type":"string"},"city":{"type":"string"}},"required":["name","address","zip","city"],"additionalProperties":false}},"required":["source","shipping"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"cookie"},"shipping":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"zip":{"type":"string"},"city":{"type":"string"}},"required":["name","address","zip","city"],"additionalProperties":false},"storedAt":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["source","shipping","storedAt"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"none"}},"required":["source"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/address.autocomplete":{"post":{"operationId":"invoke_address_autocomplete","summary":"Look up Danish addresses via DAWA (Denmark's Address Web API). Use when a customer needs to provide a shipping address - they only need to type the beginning (for example 'Vesterbro 12') to get a structured match with street, postal code, and city. Returns the top 5 most likely candidates.","description":"Look up Danish addresses via DAWA (Denmark's Address Web API). Use when a customer needs to provide a shipping address - they only need to type the beginning (for example 'Vesterbro 12') to get a structured match with street, postal code, and city. Returns the top 5 most likely candidates.","tags":["address"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"catalog:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":100}},"required":["query"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"matches":{"maxItems":5,"type":"array","items":{"type":"object","properties":{"display":{"type":"string"},"address":{"type":"string"},"zip":{"type":"string"},"city":{"type":"string"}},"required":["display","address","zip","city"],"additionalProperties":false}},"count":{"type":"integer","minimum":0,"maximum":5}},"required":["matches","count"],"additionalProperties":false},{"type":"object","properties":{"matches":{"type":"array","prefixItems":[]},"count":{"type":"number","const":0},"error":{"type":"string"}},"required":["matches","count","error"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/images.search_unsplash":{"post":{"operationId":"invoke_images_search_unsplash","summary":"Search product images on Unsplash (free stock photo service). Returns 4 candidates with thumbnails. The AI should call this after products.create to give the admin image choices. Best queries: 'brand model product-type' (for example 'patagonia jacket' or 'kitchenaid mixer') or 'category descriptor' (for example 'leather wallet brown'). If there are 0 hits, try a broader query.","description":"Search product images on Unsplash (free stock photo service). Returns 4 candidates with thumbnails. The AI should call this after products.create to give the admin image choices. Best queries: 'brand model product-type' (for example 'patagonia jacket' or 'kitchenaid mixer') or 'category descriptor' (for example 'leather wallet brown'). If there are 0 hits, try a broader query.","tags":["images"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"catalog:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":100},"count":{"default":4,"type":"integer","minimum":1,"maximum":10}},"required":["query"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"thumbUrl":{"type":"string","format":"uri"},"regularUrl":{"type":"string","format":"uri"},"photographerName":{"type":"string"},"photographerUrl":{"type":"string","format":"uri"}},"required":["id","thumbUrl","regularUrl","photographerName","photographerUrl"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/images.import_from_url":{"post":{"operationId":"invoke_images_import_from_url","summary":"Fetch a remote image (or MP4) by URL and store it in this site's media storage (Vercel Blob), returning a stable URL usable as heroImage/coverImage/product image. Built for the site-import pipeline: pass a scraped asset URL and get back a Cartwright-hosted URL. Only JPEG/PNG/WebP/MP4 (verified by content, not the remote header); 5 MB image / 10 MB video cap. Re-importing the same bytes is idempotent (deduped by checksum). Private/loopback/internal URLs are refused. Requires BLOB_READ_WRITE_TOKEN.","description":"Fetch a remote image (or MP4) by URL and store it in this site's media storage (Vercel Blob), returning a stable URL usable as heroImage/coverImage/product image. Built for the site-import pipeline: pass a scraped asset URL and get back a Cartwright-hosted URL. Only JPEG/PNG/WebP/MP4 (verified by content, not the remote header); 5 MB image / 10 MB video cap. Re-importing the same bytes is idempotent (deduped by checksum). Private/loopback/internal URLs are refused. Requires BLOB_READ_WRITE_TOKEN.","tags":["images"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","format":"uri"},"filename":{"type":"string","maxLength":120}},"required":["url"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","format":"uri"},"assetId":{"anyOf":[{"type":"string"},{"type":"null"}]},"mime":{"type":"string","enum":["image/jpeg","image/png","image/webp","video/mp4"]},"sizeBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"deduped":{"type":"boolean"}},"required":["url","assetId","mime","sizeBytes","deduped"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Import a scraped hero image","value":{"url":"https://example.com/img/hero.jpg","filename":"hero.jpg"}}]}},"/api/v1/tools/scraper.scrape_url":{"post":{"operationId":"invoke_scraper_scrape_url","summary":"Scrape a product page from a URL and extract structured product data (name, description, priceKr, attributes, image URLs) for review. Read-only — does not create the product. Requires FIRECRAWL_API_KEY.","description":"Scrape a product page from a URL and extract structured product data (name, description, priceKr, attributes, image URLs) for review. Read-only — does not create the product. Requires FIRECRAWL_API_KEY.","tags":["scraper"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"products:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":200},"description":{"type":"string","minLength":10,"maxLength":2000},"priceKr":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"null"}]},"attributes":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"],"additionalProperties":false}},"imageUrls":{"maxItems":8,"type":"array","items":{"type":"string"},"description":"Image references returned by Firecrawl. Usually absolute URLs; metadata-provided references can be relative."},"sourceUrl":{"type":"string","format":"uri"}},"required":["name","description","priceKr","attributes","imageUrls","sourceUrl"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/design.import_from_url":{"post":{"operationId":"invoke_design_import_from_url","summary":"Extract a color palette from a URL (Firecrawl + AI) and apply it as the shop theme (themeJson). Design-vibe only, not layout. Requires confirm: true and FIRECRAWL_API_KEY.","description":"Extract a color palette from a URL (Firecrawl + AI) and apply it as the shop theme (themeJson). Design-vibe only, not layout. Requires confirm: true and FIRECRAWL_API_KEY.","tags":["design"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","format":"uri"},"confirm":{"type":"boolean","const":true}},"required":["url","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"applied":{"type":"boolean","const":true},"palette":{"type":"object","properties":{"accent":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"accentDeep":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"cream":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"sand":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"ink":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"muted":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"}},"required":["accent","accentDeep","cream","sand","ink","muted"],"additionalProperties":false}},"required":["applied","palette"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/design.get_layout":{"post":{"operationId":"invoke_design_get_layout","summary":"Get the current section layout override (null = use design defaults).","description":"Get the current section layout override (null = use design defaults).","tags":["design"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"layout":{"anyOf":[{"type":"object","properties":{"sections":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"enabled":{"type":"boolean"}},"required":["key","enabled"],"additionalProperties":false}}},"required":["sections"],"additionalProperties":false},{"type":"null"}]}},"required":["layout"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/design.set_layout":{"post":{"operationId":"invoke_design_set_layout","summary":"Reorder or hide sections of the studio homepage via layoutJson. Requires confirm: true. Revertible via audit.revert.","description":"Reorder or hide sections of the studio homepage via layoutJson. Requires confirm: true. Revertible via audit.revert.","tags":["design"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"confirm":{"type":"boolean","const":true},"layout":{"type":"object","properties":{"sections":{"minItems":1,"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"enabled":{"default":true,"type":"boolean"}},"required":["key"]}}},"required":["sections"]}},"required":["confirm","layout"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"layout":{"type":"object","properties":{"sections":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"enabled":{"type":"boolean"}},"required":["key","enabled"],"additionalProperties":false}}},"required":["sections"],"additionalProperties":false}},"required":["layout"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"reorder","value":{"confirm":true,"layout":{"sections":[{"key":"hero","enabled":true},{"key":"featureGrid","enabled":true},{"key":"valueProps","enabled":true},{"key":"howItWorks","enabled":true},{"key":"stackGrid","enabled":true},{"key":"ctaFooter","enabled":true}]}}},{"name":"hide-non-required-section","value":{"confirm":true,"layout":{"sections":[{"key":"hero","enabled":true},{"key":"valueProps","enabled":false},{"key":"featureGrid","enabled":true},{"key":"howItWorks","enabled":true},{"key":"stackGrid","enabled":true},{"key":"ctaFooter","enabled":true}]}}}]}},"/api/v1/tools/gdpr.export_user":{"post":{"operationId":"invoke_gdpr_export_user","summary":"Export all stored data for one customer (GDPR data-subject access request): profile, orders, guest orders on the same email, reviews, subscriptions, carts, leads, and ACP checkout sessions. Read-only. Provide the userId.","description":"Export all stored data for one customer (GDPR data-subject access request): profile, orders, guest orders on the same email, reviews, subscriptions, carts, leads, and ACP checkout sessions. Read-only. Provide the userId.","tags":["gdpr"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"customer:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"userId":{"type":"string","minLength":1}},"required":["userId"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"exportedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"subject":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"},"phoneNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"shippingName":{"anyOf":[{"type":"string"},{"type":"null"}]},"shippingAddress":{"anyOf":[{"type":"string"},{"type":"null"}]},"shippingZip":{"anyOf":[{"type":"string"},{"type":"null"}]},"shippingCity":{"anyOf":[{"type":"string"},{"type":"null"}]},"role":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","name","phoneNumber","shippingName","shippingAddress","shippingZip","shippingCity","role","createdAt"],"additionalProperties":false},"orders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"},"status":{"type":"string"},"shippingName":{"type":"string"},"shippingAddress":{"type":"string"},"shippingZip":{"type":"string"},"shippingCity":{"type":"string"},"billingName":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingAddress":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingZip":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingCity":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingCountry":{"anyOf":[{"type":"string"},{"type":"null"}]},"phoneNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"subtotalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"discountDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"vatOere":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"invoiceProvider":{"anyOf":[{"type":"string"},{"type":"null"}]},"invoiceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"invoicePdfUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"discountCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"isAiGenerated":{"type":"boolean"},"aiAgentSource":{"anyOf":[{"type":"string"},{"type":"null"}]},"carrier":{"anyOf":[{"type":"string"},{"type":"null"}]},"trackingNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"trackingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"estDeliveryFrom":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"estDeliveryTo":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"stripePaymentIntentId":{"anyOf":[{"type":"string"},{"type":"null"}]},"paymentMethod":{"anyOf":[{"type":"string"},{"type":"null"}]},"paidAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"currency":{"type":"string"},"fxRate":{"type":"number"},"channel":{"type":"string"},"acpSessionId":{"anyOf":[{"type":"string"},{"type":"null"}]},"confirmationEmailSentAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"refundedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"disputedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"orderId":{"type":"string"},"productId":{"type":"string"},"productName":{"type":"string"},"unitPriceDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"variantId":{"anyOf":[{"type":"string"},{"type":"null"}]},"variantSku":{"anyOf":[{"type":"string"},{"type":"null"}]},"variantAttributes":{"description":"Opaque JSON stored by the commerce model and returned verbatim in a GDPR data export.","$ref":"#/components/schemas/invoke_gdpr_export_user_output___schema0"}},"required":["id","orderId","productId","productName","unitPriceDkk","quantity","variantId","variantSku","variantAttributes"],"additionalProperties":false}}},"required":["id","userId","email","status","shippingName","shippingAddress","shippingZip","shippingCity","billingName","billingAddress","billingZip","billingCity","billingCountry","phoneNumber","subtotalDkk","shippingDkk","discountDkk","totalDkk","vatOere","invoiceProvider","invoiceId","invoicePdfUrl","discountCode","isAiGenerated","aiAgentSource","carrier","trackingNumber","trackingUrl","estDeliveryFrom","estDeliveryTo","createdAt","stripePaymentIntentId","paymentMethod","paidAt","currency","fxRate","channel","acpSessionId","confirmationEmailSentAt","refundedAt","disputedAt","items"],"additionalProperties":false}},"guestOrdersSameEmail":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"},"status":{"type":"string"},"shippingName":{"type":"string"},"shippingAddress":{"type":"string"},"shippingZip":{"type":"string"},"shippingCity":{"type":"string"},"billingName":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingAddress":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingZip":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingCity":{"anyOf":[{"type":"string"},{"type":"null"}]},"billingCountry":{"anyOf":[{"type":"string"},{"type":"null"}]},"phoneNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"subtotalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"discountDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"vatOere":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"invoiceProvider":{"anyOf":[{"type":"string"},{"type":"null"}]},"invoiceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"invoicePdfUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"discountCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"isAiGenerated":{"type":"boolean"},"aiAgentSource":{"anyOf":[{"type":"string"},{"type":"null"}]},"carrier":{"anyOf":[{"type":"string"},{"type":"null"}]},"trackingNumber":{"anyOf":[{"type":"string"},{"type":"null"}]},"trackingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"estDeliveryFrom":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"estDeliveryTo":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"stripePaymentIntentId":{"anyOf":[{"type":"string"},{"type":"null"}]},"paymentMethod":{"anyOf":[{"type":"string"},{"type":"null"}]},"paidAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"currency":{"type":"string"},"fxRate":{"type":"number"},"channel":{"type":"string"},"acpSessionId":{"anyOf":[{"type":"string"},{"type":"null"}]},"confirmationEmailSentAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"refundedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"disputedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["id","userId","email","status","shippingName","shippingAddress","shippingZip","shippingCity","billingName","billingAddress","billingZip","billingCity","billingCountry","phoneNumber","subtotalDkk","shippingDkk","discountDkk","totalDkk","vatOere","invoiceProvider","invoiceId","invoicePdfUrl","discountCode","isAiGenerated","aiAgentSource","carrier","trackingNumber","trackingUrl","estDeliveryFrom","estDeliveryTo","createdAt","stripePaymentIntentId","paymentMethod","paidAt","currency","fxRate","channel","acpSessionId","confirmationEmailSentAt","refundedAt","disputedAt"],"additionalProperties":false}},"reviews":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"productId":{"type":"string"},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"orderId":{"anyOf":[{"type":"string"},{"type":"null"}]},"authorName":{"type":"string"},"authorEmail":{"type":"string"},"rating":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"title":{"anyOf":[{"type":"string"},{"type":"null"}]},"body":{"type":"string"},"language":{"type":"string"},"status":{"type":"string"},"moderatorNote":{"anyOf":[{"type":"string"},{"type":"null"}]},"moderatedBy":{"anyOf":[{"type":"string"},{"type":"null"}]},"moderatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"reviewToken":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","productId","userId","orderId","authorName","authorEmail","rating","title","body","language","status","moderatorNote","moderatedBy","moderatedAt","reviewToken","createdAt","updatedAt"],"additionalProperties":false}},"subscriptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"stripeCustomerId":{"type":"string"},"stripeSubId":{"type":"string"},"stripePriceId":{"type":"string"},"status":{"type":"string"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean"},"pauseCollectionBehavior":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","userId","stripeCustomerId","stripeSubId","stripePriceId","status","currentPeriodEnd","cancelAtPeriodEnd","pauseCollectionBehavior","createdAt","updatedAt"],"additionalProperties":false}},"carts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"sessionId":{"anyOf":[{"type":"string"},{"type":"null"}]},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","sessionId","userId","createdAt","updatedAt"],"additionalProperties":false}},"leads":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"company":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}]},"projectType":{"anyOf":[{"type":"string"},{"type":"null"}]},"budget":{"anyOf":[{"type":"string"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string"},"aiPriority":{"anyOf":[{"type":"string"},{"type":"null"}]},"aiSummary":{"anyOf":[{"type":"string"},{"type":"null"}]},"aiSuggestedReply":{"anyOf":[{"type":"string"},{"type":"null"}]},"attachmentUrls":{"description":"Opaque JSON stored by the commerce model and returned verbatim in a GDPR data export.","$ref":"#/components/schemas/invoke_gdpr_export_user_output___schema0"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","name","company","email","phone","projectType","budget","message","status","aiPriority","aiSummary","aiSuggestedReply","attachmentUrls","createdAt","updatedAt"],"additionalProperties":false}},"acpCheckoutSessions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"currency":{"type":"string"},"lineItemsJson":{"type":"string"},"buyerEmail":{"anyOf":[{"type":"string"},{"type":"null"}]},"buyerName":{"anyOf":[{"type":"string"},{"type":"null"}]},"buyerPhone":{"anyOf":[{"type":"string"},{"type":"null"}]},"shippingName":{"anyOf":[{"type":"string"},{"type":"null"}]},"shippingAddress":{"anyOf":[{"type":"string"},{"type":"null"}]},"shippingZip":{"anyOf":[{"type":"string"},{"type":"null"}]},"shippingCity":{"anyOf":[{"type":"string"},{"type":"null"}]},"shippingCountry":{"anyOf":[{"type":"string"},{"type":"null"}]},"fulfillmentOption":{"anyOf":[{"type":"string"},{"type":"null"}]},"discountCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"subtotalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"shippingDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"discountDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"orderId":{"anyOf":[{"type":"string"},{"type":"null"}]},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","status","currency","lineItemsJson","buyerEmail","buyerName","buyerPhone","shippingName","shippingAddress","shippingZip","shippingCity","shippingCountry","fulfillmentOption","discountCode","subtotalDkk","shippingDkk","discountDkk","totalDkk","orderId","expiresAt","createdAt","updatedAt"],"additionalProperties":false}}},"required":["exportedAt","subject","orders","guestOrdersSameEmail","reviews","subscriptions","carts","leads","acpCheckoutSessions"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/gdpr.erase_user":{"post":{"operationId":"invoke_gdpr_erase_user","summary":"Soft-erase (anonymize) a customer for a GDPR right-to-erasure request. Anonymizes PII on the user, their orders (KEEPS amounts + payment refs for bookkeeping), and reviews; deletes leads + ACP sessions; revokes API keys; clears audit IPs. NOT reversible. Logs a DataErasureRequest. Provide the userId and confirm: true.","description":"Soft-erase (anonymize) a customer for a GDPR right-to-erasure request. Anonymizes PII on the user, their orders (KEEPS amounts + payment refs for bookkeeping), and reviews; deletes leads + ACP sessions; revokes API keys; clears audit IPs. NOT reversible. Logs a DataErasureRequest. Provide the userId and confirm: true.","tags":["gdpr"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"userId":{"type":"string","minLength":1},"confirm":{"type":"boolean","const":true}},"required":["userId","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"requestId":{"type":"string"},"summary":{"type":"object","properties":{"ordersAnonymized":{"type":"integer","minimum":0,"maximum":9007199254740991},"reviewsAnonymized":{"type":"integer","minimum":0,"maximum":9007199254740991},"leadsDeleted":{"type":"integer","minimum":0,"maximum":9007199254740991},"acpSessionsDeleted":{"type":"integer","minimum":0,"maximum":9007199254740991},"apiKeysRevoked":{"type":"integer","minimum":0,"maximum":9007199254740991},"auditIpsCleared":{"type":"integer","minimum":0,"maximum":9007199254740991},"userAnonymized":{"type":"number","const":1}},"required":["ordersAnonymized","reviewsAnonymized","leadsDeleted","acpSessionsDeleted","apiKeysRevoked","auditIpsCleared","userAnonymized"],"additionalProperties":false}},"required":["ok","requestId","summary"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/google.connect_status":{"post":{"operationId":"invoke_google_connect_status","summary":"Read the shared Google Workspace OAuth2 connector status for server-side Sheets/Drive/Docs modules. Does not expose tokens or client secrets.","description":"Read the shared Google Workspace OAuth2 connector status for server-side Sheets/Drive/Docs modules. Does not expose tokens or client secrets.","tags":["google"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"configured":{"type":"boolean"},"connected":{"type":"boolean"},"status":{"type":"string"},"accountEmail":{"anyOf":[{"type":"string"},{"type":"null"}]},"grantedScopes":{"type":"array","items":{"type":"string"}},"tokenExpiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"connectedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"lastError":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["configured","connected","status","accountEmail","grantedScopes","tokenExpiresAt","connectedAt","lastError"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/sheets.sync_now":{"post":{"operationId":"invoke_sheets_sync_now","summary":"Run a two-way Google Sheets ↔ product catalog sync now. Pulls sheet rows first, then pushes the normalized catalog back to the sheet.","description":"Run a two-way Google Sheets ↔ product catalog sync now. Pulls sheet rows first, then pushes the normalized catalog back to the sheet.","tags":["sheets"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"products:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean"},"skipped":{"type":"integer","minimum":0,"maximum":9007199254740991},"added":{"type":"integer","minimum":0,"maximum":9007199254740991},"updated":{"type":"integer","minimum":0,"maximum":9007199254740991},"reason":{"type":"string"},"error":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"row":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sku":{"type":"string"},"error":{"type":"string"}},"required":["error"],"additionalProperties":false}},"spreadsheetId":{"type":"string"},"finishedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"mode":{"type":"string","const":"sync"},"pulled":{"type":"object","properties":{"ok":{"type":"boolean"},"skipped":{"type":"integer","minimum":0,"maximum":9007199254740991},"added":{"type":"integer","minimum":0,"maximum":9007199254740991},"updated":{"type":"integer","minimum":0,"maximum":9007199254740991},"reason":{"type":"string"},"error":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"row":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sku":{"type":"string"},"error":{"type":"string"}},"required":["error"],"additionalProperties":false}},"spreadsheetId":{"type":"string"},"finishedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"mode":{"type":"string","const":"pull"}},"required":["ok","skipped","added","updated","errors","finishedAt","mode"],"additionalProperties":false},"pushed":{"type":"object","properties":{"ok":{"type":"boolean"},"skipped":{"type":"integer","minimum":0,"maximum":9007199254740991},"added":{"type":"integer","minimum":0,"maximum":9007199254740991},"updated":{"type":"integer","minimum":0,"maximum":9007199254740991},"reason":{"type":"string"},"error":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"row":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sku":{"type":"string"},"error":{"type":"string"}},"required":["error"],"additionalProperties":false}},"spreadsheetId":{"type":"string"},"finishedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"mode":{"type":"string","const":"push"}},"required":["ok","skipped","added","updated","errors","finishedAt","mode"],"additionalProperties":false}},"required":["ok","skipped","added","updated","errors","finishedAt","mode"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/sheets.pull":{"post":{"operationId":"invoke_sheets_pull","summary":"Pull product rows from the configured Google Sheet into the catalog. Upserts products by SKU.","description":"Pull product rows from the configured Google Sheet into the catalog. Upserts products by SKU.","tags":["sheets"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"products:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean"},"skipped":{"type":"integer","minimum":0,"maximum":9007199254740991},"added":{"type":"integer","minimum":0,"maximum":9007199254740991},"updated":{"type":"integer","minimum":0,"maximum":9007199254740991},"reason":{"type":"string"},"error":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"row":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sku":{"type":"string"},"error":{"type":"string"}},"required":["error"],"additionalProperties":false}},"spreadsheetId":{"type":"string"},"finishedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"mode":{"type":"string","const":"pull"}},"required":["ok","skipped","added","updated","errors","finishedAt","mode"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/sheets.push":{"post":{"operationId":"invoke_sheets_push","summary":"Push the product catalog into the configured Google Sheet using the canonical product row schema.","description":"Push the product catalog into the configured Google Sheet using the canonical product row schema.","tags":["sheets"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"products:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean"},"skipped":{"type":"integer","minimum":0,"maximum":9007199254740991},"added":{"type":"integer","minimum":0,"maximum":9007199254740991},"updated":{"type":"integer","minimum":0,"maximum":9007199254740991},"reason":{"type":"string"},"error":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"row":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sku":{"type":"string"},"error":{"type":"string"}},"required":["error"],"additionalProperties":false}},"spreadsheetId":{"type":"string"},"finishedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"mode":{"type":"string","const":"push"}},"required":["ok","skipped","added","updated","errors","finishedAt","mode"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/drive.import_folder":{"post":{"operationId":"invoke_drive_import_folder","summary":"Import supported images from the configured Google Drive folder into the MediaAsset library via Vercel Blob. No-ops when googleDrive/mediaLibrary is off.","description":"Import supported images from the configured Google Drive folder into the MediaAsset library via Vercel Blob. No-ops when googleDrive/mediaLibrary is off.","tags":["drive"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"folderId":{"type":"string"},"confirm":{"type":"boolean","const":true}},"required":["confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean"},"folderId":{"anyOf":[{"type":"string"},{"type":"null"}]},"scanned":{"type":"integer","minimum":0,"maximum":9007199254740991},"imported":{"type":"integer","minimum":0,"maximum":9007199254740991},"skipped":{"type":"integer","minimum":0,"maximum":9007199254740991},"errors":{"type":"array","items":{"type":"string"}},"assets":{"type":"array","items":{"type":"object","properties":{"driveFileId":{"type":"string"},"assetId":{"type":"string"},"name":{"type":"string"}},"required":["driveFileId","assetId","name"],"additionalProperties":false}}},"required":["ok","folderId","scanned","imported","skipped","errors","assets"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Import configured Drive folder","value":{"confirm":true}}]}},"/api/v1/tools/drive.backup_now":{"post":{"operationId":"invoke_drive_backup_now","summary":"Run the existing logical database backup routine and upload the JSON artifact to Google Drive. No-ops when configuration is missing.","description":"Run the existing logical database backup routine and upload the JSON artifact to Google Drive. No-ops when configuration is missing.","tags":["drive"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"folderId":{"type":"string"},"confirm":{"type":"boolean","const":true}},"required":["confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"file":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"folderId":{"type":"string"},"tableCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"bytes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["ok","file","folderId"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string"},"folderId":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ok","error"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Back up to configured Drive folder","value":{"confirm":true}}]}},"/api/v1/tools/subscriptions.list":{"post":{"operationId":"invoke_subscriptions_list","summary":"List Stripe Billing subscriptions with status, customer, Stripe price, and current period end.","description":"List Stripe Billing subscriptions with status, customer, Stripe price, and current period end.","tags":["subscriptions"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"orders:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"type":"string","minLength":1},"userId":{"type":"string","minLength":1},"limit":{"default":20,"type":"integer","minimum":1,"maximum":100}}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"stripeCustomerId":{"type":"string"},"stripeSubId":{"type":"string"},"stripePriceId":{"type":"string"},"status":{"type":"string"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean"},"pauseCollectionBehavior":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"],"additionalProperties":false}},"required":["id","userId","stripeCustomerId","stripeSubId","stripePriceId","status","currentPeriodEnd","cancelAtPeriodEnd","pauseCollectionBehavior","createdAt","updatedAt","user"],"additionalProperties":false}}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"List active subscriptions","value":{"status":"active","limit":10}}]}},"/api/v1/tools/subscriptions.cancel":{"post":{"operationId":"invoke_subscriptions_cancel","summary":"Cancel a Stripe Billing subscription at period end and sync local subscription state.","description":"Cancel a Stripe Billing subscription at period end and sync local subscription state.","tags":["subscriptions"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"orders:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","minLength":1}},"required":["id"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"stripeCustomerId":{"type":"string"},"stripeSubId":{"type":"string"},"stripePriceId":{"type":"string"},"status":{"type":"string"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean"},"pauseCollectionBehavior":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","userId","stripeCustomerId","stripeSubId","stripePriceId","status","currentPeriodEnd","cancelAtPeriodEnd","pauseCollectionBehavior","createdAt","updatedAt"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Cancel a subscription","value":{"id":"sub-row-id"}}]}},"/api/v1/tools/docs.import":{"post":{"operationId":"invoke_docs_import","summary":"Import a Google Doc into Cartwright content as a draft blog post or public CMS page. Uses the shared Google OAuth connector.","description":"Import a Google Doc into Cartwright content as a draft blog post or public CMS page. Uses the shared Google OAuth connector.","tags":["docs"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"documentId":{"type":"string","minLength":1},"target":{"type":"string","enum":["post","page"]}},"required":["documentId","target"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"target":{"type":"string","const":"page"},"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"adminUrl":{"type":"string"},"publicUrl":{"type":"string"}},"required":["target","id","slug","title","adminUrl","publicUrl"],"additionalProperties":false},{"type":"object","properties":{"target":{"type":"string","const":"post"},"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"adminUrl":{"type":"string"},"publicUrl":{"type":"string"}},"required":["target","id","slug","title","adminUrl","publicUrl"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Import a Google Doc as a page","value":{"documentId":"https://docs.google.com/document/d/1abcDEF456/edit","target":"page"}}]}},"/api/v1/tools/ui.present_products":{"post":{"operationId":"invoke_ui_present_products","summary":"Render an inline product presentation in the chat. Call this AFTER you have found relevant products (e.g. via products.search) to show them with a chosen layout. The customer sees real product cards they can click.","description":"Render an inline product presentation in the chat. Call this AFTER you have found relevant products (e.g. via products.search) to show them with a chosen layout. The customer sees real product cards they can click.","tags":["ui"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"catalog:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"layout":{"type":"string","enum":["grid","spotlight","comparison"],"description":"How to present the products: 'grid' for browsing several, 'spotlight' for highlighting a single recommendation, 'comparison' for comparing 2–4 side by side."},"productSlugs":{"minItems":1,"maxItems":6,"type":"array","items":{"type":"string","minLength":1},"description":"Slugs of the products to present, in the order to display them."},"note":{"description":"Optional short framing line shown above the products.","type":"string","maxLength":280}},"required":["layout","productSlugs"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"layout":{"type":"string","enum":["grid","spotlight","comparison"]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"products":{"maxItems":6,"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"brand":{"type":"string"},"priceDkk":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"stock":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"firstImage":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["slug","name","brand","priceDkk","stock","firstImage"],"additionalProperties":false}}},"required":["layout","note","products"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/tools/magic.plan_page":{"post":{"operationId":"invoke_magic_plan_page","summary":"Plan a whole page as an ordered list of whitelisted section keys (each with a source and a per-section prompt). Read-only: generates and writes NOTHING — returns the plan for review. The model can only plan whitelisted catalog sections.","description":"Plan a whole page as an ordered list of whitelisted section keys (each with a source and a per-section prompt). Read-only: generates and writes NOTHING — returns the plan for review. The model can only plan whitelisted catalog sections.","tags":["magic"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"intent":{"type":"string","minLength":8,"description":"Describe the whole page to plan, e.g. 'a coffee subscription landing page'"}},"required":["intent"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"sections":{"minItems":1,"maxItems":12,"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["hero","heroAurora","splitHero","mediaHero","featureGrid","featureSplit","valueProps","howItWorks","stackGrid","statBand","bento","marquee","configurator","scrollStory","showroom3d","compare","testimonials","quote","pricingTable","faq","logoCloud","galleryGrid","bannerCta","newsletterBlock","ctaFooter","richText","vibe"]},"source":{"type":"string","enum":["catalog","v0"]},"prompt":{"type":"string","minLength":1},"effect":{"type":"string","enum":["fade-up","fade","zoom-in","slide-left","slide-right","parallax","none"]}},"required":["key","source","prompt"],"additionalProperties":false}}},"required":["sections"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Plan a coffee landing page","value":{"intent":"En landingsside for et kafferisteri: hero, værdi-kort, priser, anmeldelser, FAQ og en CTA"}}]}},"/api/v1/tools/magic.generate_page":{"post":{"operationId":"invoke_magic_generate_page","summary":"Plan AND generate a whole page (every section filled on-brand, fail-soft). Read-only: returns the assembled, Zod-valid PageLayout plus per-node statuses (done | skipped-with-reason) WITHOUT writing. To publish, pass the returned layout to pages.set_layout (confirm-gated, audited, revertible) — this tool never self-publishes.","description":"Plan AND generate a whole page (every section filled on-brand, fail-soft). Read-only: returns the assembled, Zod-valid PageLayout plus per-node statuses (done | skipped-with-reason) WITHOUT writing. To publish, pass the returned layout to pages.set_layout (confirm-gated, audited, revertible) — this tool never self-publishes.","tags":["magic"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"pages:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"intent":{"type":"string","minLength":8,"description":"Describe the whole page to build"}},"required":["intent"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"layout":{"type":"object","properties":{"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"key":{"type":"string","enum":["hero","heroAurora","splitHero","mediaHero","featureGrid","featureSplit","valueProps","howItWorks","stackGrid","statBand","bento","marquee","configurator","scrollStory","showroom3d","compare","testimonials","quote","pricingTable","faq","logoCloud","galleryGrid","bannerCta","newsletterBlock","ctaFooter","richText","vibe"]},"enabled":{"type":"boolean","const":true},"props":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/invoke_magic_generate_page_output___schema0"},"description":"Section-specific props. The shape varies by registry key and is validated against that key's concrete registry schema before this tool returns it."},"effect":{"type":"string","enum":["fade-up","fade","zoom-in","slide-left","slide-right","parallax"]}},"required":["id","key","enabled","props"],"additionalProperties":false}}},"required":["sections"],"additionalProperties":false},"statuses":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"state":{"type":"string","const":"done"},"key":{"type":"string","enum":["hero","heroAurora","splitHero","mediaHero","featureGrid","featureSplit","valueProps","howItWorks","stackGrid","statBand","bento","marquee","configurator","scrollStory","showroom3d","compare","testimonials","quote","pricingTable","faq","logoCloud","galleryGrid","bannerCta","newsletterBlock","ctaFooter","richText","vibe"]},"source":{"type":"string","enum":["catalog","v0"]},"section":{"type":"object","properties":{"key":{"type":"string","enum":["hero","heroAurora","splitHero","mediaHero","featureGrid","featureSplit","valueProps","howItWorks","stackGrid","statBand","bento","marquee","configurator","scrollStory","showroom3d","compare","testimonials","quote","pricingTable","faq","logoCloud","galleryGrid","bannerCta","newsletterBlock","ctaFooter","richText","vibe"]},"props":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/invoke_magic_generate_page_output___schema0"},"description":"Section-specific props. The shape varies by registry key and is validated against that key's concrete registry schema before this tool returns it."},"effect":{"type":"string","enum":["fade-up","fade","zoom-in","slide-left","slide-right","parallax"]}},"required":["key","props"],"additionalProperties":false}},"required":["state","key","source","section"],"additionalProperties":false},{"type":"object","properties":{"state":{"type":"string","const":"skipped"},"key":{"type":"string","enum":["hero","heroAurora","splitHero","mediaHero","featureGrid","featureSplit","valueProps","howItWorks","stackGrid","statBand","bento","marquee","configurator","scrollStory","showroom3d","compare","testimonials","quote","pricingTable","faq","logoCloud","galleryGrid","bannerCta","newsletterBlock","ctaFooter","richText","vibe"]},"source":{"type":"string","enum":["catalog","v0"]},"reason":{"type":"string"}},"required":["state","key","source","reason"],"additionalProperties":false}]}},"planned":{"type":"integer","minimum":1,"maximum":12},"generated":{"type":"integer","minimum":0,"maximum":12}},"required":["layout","statuses","planned","generated"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Build a coffee landing page","value":{"intent":"En landingsside for et kafferisteri med hero, priser og anmeldelser"}}]}},"/api/v1/tools/vertical.apply":{"post":{"operationId":"invoke_vertical_apply","summary":"Apply a Vertical / Voice preset to the shop: merges the preset's identity anchors + pre-written, on-voice genome copy (the page re-tones immediately — no LLM), and optionally its suggested Skin + palette + 3D scene when applySkin is true. Requires confirm: true. Revertible via audit.revert.","description":"Apply a Vertical / Voice preset to the shop: merges the preset's identity anchors + pre-written, on-voice genome copy (the page re-tones immediately — no LLM), and optionally its suggested Skin + palette + 3D scene when applySkin is true. Requires confirm: true. Revertible via audit.revert.","tags":["vertical"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":"string","minLength":1,"description":"Vertical/Voice slug, e.g. 'cafe' or 'kindergarten'"},"applySkin":{"description":"Also set the preset's suggested design + palette + 3D scene (default false)","type":"boolean"},"confirm":{"type":"boolean","const":true}},"required":["slug","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"},"appliedSkin":{"anyOf":[{"type":"string"},{"type":"null"}]},"skinSkipped":{"anyOf":[{"type":"string"},{"type":"null"}]},"appliedPalette":{"type":"boolean"},"appliedScene":{"anyOf":[{"type":"string","enum":["floating-geometry","particles","blob","wireframe","aurora","waves","orb","gridflow","butterflies"]},{"type":"null"}]},"fields":{"type":"integer","minimum":0,"maximum":9007199254740991},"identityKeys":{"type":"array","items":{"type":"string","enum":["tone","audience","formality","vibe"]}}},"required":["ok","slug","appliedSkin","skinSkipped","appliedPalette","appliedScene","fields","identityKeys"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Apply the café voice + its skin","value":{"slug":"cafe","applySkin":true,"confirm":true}}]}},"/api/v1/tools/design.set_slug":{"post":{"operationId":"invoke_design_set_slug","summary":"Set the shop's active design (Skin) by slug — writes BrandingSettings.designSlug and busts the theme cache. Pass an empty string to reset to 'Auto' (inferred). Requires confirm: true. Revertible via audit.revert.","description":"Set the shop's active design (Skin) by slug — writes BrandingSettings.designSlug and busts the theme cache. Pass an empty string to reset to 'Auto' (inferred). Requires confirm: true. Revertible via audit.revert.","tags":["design"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"designSlug":{"type":"string","description":"A design slug from the registry, e.g. 'apex' or 'aurora-shop'; empty = Auto"},"confirm":{"type":"boolean","const":true}},"required":["designSlug","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"designSlug":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["designSlug"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Switch to Apex","value":{"designSlug":"apex","confirm":true}}]}},"/api/v1/tools/magic.compose_look":{"post":{"operationId":"invoke_magic_compose_look","summary":"Compose a complete on-brand look in one step: pick a Skin (design) and/or a Voice (vertical) and apply them together. Applying a Voice uses its pre-written on-brand copy + palette + 3D scene — instant, no LLM — so this is the fast way to dress the whole homepage for an industry. Returns a mixer-preview URL to see the result. To then build a bespoke page from a prompt, use magic.generate_page + pages.set_layout. Requires confirm: true. Revertible via audit.revert.","description":"Compose a complete on-brand look in one step: pick a Skin (design) and/or a Voice (vertical) and apply them together. Applying a Voice uses its pre-written on-brand copy + palette + 3D scene — instant, no LLM — so this is the fast way to dress the whole homepage for an industry. Returns a mixer-preview URL to see the result. To then build a bespoke page from a prompt, use magic.generate_page + pages.set_layout. Requires confirm: true. Revertible via audit.revert.","tags":["magic"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"vertical":{"description":"Voice/vertical slug, e.g. 'cafe'","type":"string"},"design":{"description":"Skin/design slug, e.g. 'apex' — overrides the Voice's suggested skin","type":"string"},"applySkin":{"description":"When only a Voice is given, also apply its suggested skin + palette + scene (default true)","type":"boolean"},"confirm":{"type":"boolean","const":true}},"required":["confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"appliedVertical":{"anyOf":[{"type":"string"},{"type":"null"}]},"appliedDesign":{"anyOf":[{"type":"string"},{"type":"null"}]},"voiceDetail":{"anyOf":[{"type":"object","properties":{"ok":{"type":"boolean","const":true},"slug":{"type":"string"},"appliedSkin":{"anyOf":[{"type":"string"},{"type":"null"}]},"skinSkipped":{"anyOf":[{"type":"string"},{"type":"null"}]},"appliedPalette":{"type":"boolean"},"appliedScene":{"anyOf":[{"type":"string","enum":["floating-geometry","particles","blob","wireframe","aurora","waves","orb","gridflow","butterflies"]},{"type":"null"}]},"fields":{"type":"integer","minimum":0,"maximum":9007199254740991},"identityKeys":{"type":"array","items":{"type":"string","enum":["tone","audience","formality","vibe"]}}},"required":["ok","slug","appliedSkin","skinSkipped","appliedPalette","appliedScene","fields","identityKeys"],"additionalProperties":false},{"type":"null"}]},"previewUrl":{"type":"string"}},"required":["appliedVertical","appliedDesign","voiceDetail","previewUrl"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Dress the shop as a café","value":{"vertical":"cafe","confirm":true}},{"name":"Café voice on the Apex flagship","value":{"vertical":"cafe","design":"apex","confirm":true}}]}},"/api/v1/tools/chrome.set":{"post":{"operationId":"invoke_chrome_set","summary":"Select the shop's header and/or footer chrome parts (Mixer 2.0): writes BrandingSettings.chromeJson with validated chrome-registry keys (e.g. 'fable-header', 'mega-footer'). Mixable (cw-* palette-adaptive) chromes work on any design; a locked-theme design chrome only on its own design. Pass an empty string (or omit both) to reset to the active design's default chrome. Requires confirm: true. Revertible via audit.revert.","description":"Select the shop's header and/or footer chrome parts (Mixer 2.0): writes BrandingSettings.chromeJson with validated chrome-registry keys (e.g. 'fable-header', 'mega-footer'). Mixable (cw-* palette-adaptive) chromes work on any design; a locked-theme design chrome only on its own design. Pass an empty string (or omit both) to reset to the active design's default chrome. Requires confirm: true. Revertible via audit.revert.","tags":["chrome"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"headerKey":{"description":"Header chrome key from the registry, e.g. 'minimal-header'; empty/omitted = design default","type":"string"},"footerKey":{"description":"Footer chrome key from the registry, e.g. 'mega-footer'; empty/omitted = design default","type":"string"},"confirm":{"type":"boolean","const":true}},"required":["confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"headerKey":{"anyOf":[{"type":"string"},{"type":"null"}]},"footerKey":{"anyOf":[{"type":"string"},{"type":"null"}]},"previewUrl":{"type":"string"}},"required":["headerKey","footerKey","previewUrl"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Fable header + mega footer","value":{"headerKey":"fable-header","footerKey":"mega-footer","confirm":true}},{"name":"Reset to the design's own chrome","value":{"confirm":true}}]}},"/api/v1/tools/composition.apply":{"post":{"operationId":"invoke_composition_apply","summary":"Install a cartwright-composition-v1 artifact (a complete downloadable look: skin + palette + voice + chrome + 3D scene + optional homepage layout) on this shop in ONE atomic, audited operation. Validates the whole composition up front (registry references, genome allowlist, chrome mixability vs the skin) and rejects it wholesale on any error. Omitted optional parts leave the corresponding shop state untouched. Requires confirm: true. Revertible (best-effort) via audit.revert.","description":"Install a cartwright-composition-v1 artifact (a complete downloadable look: skin + palette + voice + chrome + 3D scene + optional homepage layout) on this shop in ONE atomic, audited operation. Validates the whole composition up front (registry references, genome allowlist, chrome mixability vs the skin) and rejects it wholesale on any error. Omitted optional parts leave the corresponding shop state untouched. Requires confirm: true. Revertible (best-effort) via audit.revert.","tags":["composition"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"composition":{"type":"object","properties":{"schema":{"type":"string","const":"cartwright-composition-v1"},"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":280},"skin":{"type":"string","minLength":1,"maxLength":50},"palette":{"type":"object","properties":{"accent":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"accentDeep":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"cream":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"sand":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"ink":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"muted":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"}},"required":["accent","accentDeep","cream","sand","ink","muted"]},"voice":{"type":"object","properties":{"identity":{"type":"object","properties":{"tone":{"type":"string","minLength":1,"maxLength":40},"audience":{"type":"string","minLength":1,"maxLength":40},"formality":{"type":"string","minLength":1,"maxLength":40},"vibe":{"type":"string","minLength":2,"maxLength":40}},"additionalProperties":false},"genomeOverrides":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"additionalProperties":false},"chrome":{"type":"object","properties":{"headerKey":{"type":"string","minLength":1},"footerKey":{"type":"string","minLength":1}},"additionalProperties":false},"scene":{"type":"string"},"homepageLayout":{"type":"object","properties":{"sections":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"key":{"type":"string"},"enabled":{"default":true,"type":"boolean"},"effect":{"type":"string","enum":["fade-up","fade","zoom-in","slide-left","slide-right","parallax","none"]},"props":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","key"]}}},"required":["sections"]}},"required":["schema","name","skin"],"description":"The parsed cartwright-composition-v1 JSON object (schema: 'cartwright-composition-v1')"},"homepageSlug":{"description":"Page slug the homepageLayout is written to (default 'home')","type":"string"},"confirm":{"type":"boolean","const":true}},"required":["composition","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean","const":true},"name":{"type":"string"},"appliedSkin":{"type":"string"},"appliedPalette":{"type":"boolean"},"appliedChrome":{"anyOf":[{"type":"object","properties":{"headerKey":{"type":"string"},"footerKey":{"type":"string"}},"additionalProperties":false},{"type":"null"}]},"appliedScene":{"anyOf":[{"type":"string","enum":["floating-geometry","particles","blob","wireframe","aurora","waves","orb","gridflow","butterflies"]},{"type":"null"}]},"fields":{"type":"integer","minimum":0,"maximum":9007199254740991},"identityKeys":{"type":"array","items":{"type":"string","enum":["tone","audience","formality","vibe"]}},"appliedHomepage":{"anyOf":[{"type":"string"},{"type":"null"}]},"skipped":{"type":"array","items":{"type":"string","const":"homepageLayout"}},"previewUrl":{"type":"string"}},"required":["ok","name","appliedSkin","appliedPalette","appliedChrome","appliedScene","fields","identityKeys","appliedHomepage","skipped","previewUrl"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Install a minimal composition (skin only)","value":{"composition":{"schema":"cartwright-composition-v1","name":"Apex look","skin":"apex"},"confirm":true}}]}},"/api/v1/tools/composition.export":{"post":{"operationId":"invoke_composition_export","summary":"Export the CURRENT shop state (resolved skin, palette/chrome/scene/voice/homepage-layout overrides) as a cartwright-composition-v1 JSON artifact — the read-only inverse of composition.apply. The result can be saved as a file and installed on any other shop via composition.apply or /api/admin/compositions/import.","description":"Export the CURRENT shop state (resolved skin, palette/chrome/scene/voice/homepage-layout overrides) as a cartwright-composition-v1 JSON artifact — the read-only inverse of composition.apply. The result can be saved as a file and installed on any other shop via composition.apply or /api/admin/compositions/import.","tags":["composition"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"homepageSlug":{"description":"Page slug to read the homepage layout from (default 'home')","type":"string"}}}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"schema":{"type":"string","const":"cartwright-composition-v1"},"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":280},"skin":{"type":"string","minLength":1,"maxLength":50},"palette":{"type":"object","properties":{"accent":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"accentDeep":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"cream":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"sand":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"ink":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"},"muted":{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"}},"required":["accent","accentDeep","cream","sand","ink","muted"],"additionalProperties":false},"voice":{"type":"object","properties":{"identity":{"type":"object","properties":{"tone":{"type":"string","minLength":1,"maxLength":40},"audience":{"type":"string","minLength":1,"maxLength":40},"formality":{"type":"string","minLength":1,"maxLength":40},"vibe":{"type":"string","minLength":2,"maxLength":40}},"additionalProperties":false},"genomeOverrides":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"additionalProperties":false},"chrome":{"type":"object","properties":{"headerKey":{"type":"string","minLength":1},"footerKey":{"type":"string","minLength":1}},"additionalProperties":false},"scene":{"type":"string"},"homepageLayout":{"type":"object","properties":{"sections":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"key":{"type":"string"},"enabled":{"default":true,"type":"boolean"},"effect":{"type":"string","enum":["fade-up","fade","zoom-in","slide-left","slide-right","parallax","none"]},"props":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","key","enabled"],"additionalProperties":false}}},"required":["sections"],"additionalProperties":false}},"required":["schema","name","skin"],"additionalProperties":false,"description":"Portable composition. homepageLayout section props are polymorphic and validated against each section key's registry schema."}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Export the current look","value":{}}]}},"/api/v1/tools/mockup.set":{"post":{"operationId":"invoke_mockup_set","summary":"Publish a self-contained HTML mockup as the live homepage (writes the home page's vibeHtml — the same field/sanitizer the admin Vibe Sandbox uses). The vibe takeover renders ABOVE the active design AND above the first-run welcome canvas, so the homepage becomes the mockup instantly. Step 1 of the mockup-first flow: generate → mockup.set → owner reviews on localhost; once approved, implement for real (designs/blank/ or sections) and call mockup.clear. Requires confirm: true. Undo with mockup.clear.","description":"Publish a self-contained HTML mockup as the live homepage (writes the home page's vibeHtml — the same field/sanitizer the admin Vibe Sandbox uses). The vibe takeover renders ABOVE the active design AND above the first-run welcome canvas, so the homepage becomes the mockup instantly. Step 1 of the mockup-first flow: generate → mockup.set → owner reviews on localhost; once approved, implement for real (designs/blank/ or sections) and call mockup.clear. Requires confirm: true. Undo with mockup.clear.","tags":["mockup"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"html":{"type":"string","minLength":1},"confirm":{"type":"boolean","const":true}},"required":["html","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"published":{"type":"boolean","const":true},"slug":{"type":"string","const":"home"},"htmlLength":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"note":{"type":"string"}},"required":["published","slug","htmlLength","note"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Publish a homepage mockup","value":{"html":"<section class=\"min-h-screen grid place-items-center bg-sol-cream\"><h1 class=\"text-5xl font-bold text-sol-ink\">The vision, as a mockup</h1></section>","confirm":true}}]}},"/api/v1/tools/mockup.clear":{"post":{"operationId":"invoke_mockup_clear","summary":"Remove the homepage mockup (nulls the home page's vibeHtml so the active design renders again). Note: clearing does NOT resurrect the first-run welcome canvas if the site was otherwise touched (its predicate retires permanently on any design/copy/product/setup change — correct behavior). Step 2 of the mockup-first flow, after the mockup is implemented for real. Requires confirm: true.","description":"Remove the homepage mockup (nulls the home page's vibeHtml so the active design renders again). Note: clearing does NOT resurrect the first-run welcome canvas if the site was otherwise touched (its predicate retires permanently on any design/copy/product/setup change — correct behavior). Step 2 of the mockup-first flow, after the mockup is implemented for real. Requires confirm: true.","tags":["mockup"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"confirm":{"type":"boolean","const":true}},"required":["confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"cleared":{"type":"boolean","const":false},"note":{"type":"string"}},"required":["cleared","note"],"additionalProperties":false},{"type":"object","properties":{"cleared":{"type":"boolean","const":true},"slug":{"type":"string","const":"home"},"note":{"type":"string"}},"required":["cleared","slug","note"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Clear the homepage mockup","value":{"confirm":true}}]}},"/api/v1/tools/content.import_site":{"post":{"operationId":"invoke_content_import_site","summary":"Scrape an existing website by URL and rebuild it as Cartwright content — every page/service/blog post is created as a DRAFT (nothing goes live) with its hero image imported, ready for the owner to review, rephrase, and publish. Products are skipped in this version. Needs FIRECRAWL_API_KEY. Requires confirm: true (it uses scrape credits and creates many drafts).","description":"Scrape an existing website by URL and rebuild it as Cartwright content — every page/service/blog post is created as a DRAFT (nothing goes live) with its hero image imported, ready for the owner to review, rephrase, and publish. Products are skipped in this version. Needs FIRECRAWL_API_KEY. Requires confirm: true (it uses scrape credits and creates many drafts).","tags":["content"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","format":"uri"},"maxPages":{"type":"integer","minimum":1,"maximum":200},"confirm":{"type":"boolean","const":true}},"required":["url","confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"site":{"type":"string"},"outcomes":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"kind":{"type":"string","enum":["home","product","service","blog","legal","contact","page"]},"action":{"type":"string","enum":["page","service","post","skipped"]},"ok":{"type":"boolean"},"slug":{"type":"string"},"status":{"type":"string","const":"draft"},"adminUrl":{"type":"string"},"publicUrl":{"type":"string"},"imageImported":{"type":"boolean"},"reason":{"type":"string"}},"required":["url","kind","action","ok"],"additionalProperties":false}},"summary":{"type":"object","properties":{"created":{"type":"integer","minimum":0,"maximum":9007199254740991},"skipped":{"type":"integer","minimum":0,"maximum":9007199254740991},"failed":{"type":"integer","minimum":0,"maximum":9007199254740991},"imagesImported":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["created","skipped","failed","imagesImported"],"additionalProperties":false},"notice":{"type":"string"}},"required":["site","outcomes","summary","notice"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Import a site as drafts","value":{"url":"https://example.com","maxPages":30,"confirm":true}}]}},"/api/v1/tools/sitepack.export":{"post":{"operationId":"invoke_sitepack_export","summary":"Export this entire site (design + pages + products/services + content + media + branding) as a portable .cartpack that can be restored onto a newer Cartwright. Read-only; returns the pack as base64 + a report. Excludes orders/customers/keys/domain by design. Requires confirm: true.","description":"Export this entire site (design + pages + products/services + content + media + branding) as a portable .cartpack that can be restored onto a newer Cartwright. Read-only; returns the pack as base64 + a report. Excludes orders/customers/keys/domain by design. Requires confirm: true.","tags":["sitepack"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:read","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"confirm":{"type":"boolean","const":true}},"required":["confirm"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string"},"filename":{"type":"string"},"sizeBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"counts":{"type":"object","properties":{"pages":{"type":"integer","minimum":0,"maximum":9007199254740991},"categories":{"type":"integer","minimum":0,"maximum":9007199254740991},"products":{"type":"integer","minimum":0,"maximum":9007199254740991},"services":{"type":"integer","minimum":0,"maximum":9007199254740991},"posts":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaAssets":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["pages","categories","products","services","posts","mediaAssets"],"additionalProperties":false},"skippedProductMedia":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaFetchFailed":{"type":"integer","minimum":0,"maximum":9007199254740991},"cartpackBase64":{"type":"string","minLength":1}},"required":["name","filename","sizeBytes","counts","skippedProductMedia","mediaFetchFailed","cartpackBase64"],"additionalProperties":false}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Export the whole site","value":{"confirm":true}}]}},"/api/v1/tools/sitepack.import":{"post":{"operationId":"invoke_sitepack_import","summary":"Restore a portable .cartpack onto THIS site. NON-destructive: a colliding slug/sku is created with a suffix (about → about-2), never overwriting. dryRun:true returns the plan (preview) without writing; confirm:true applies it after snapshotting the current site first (the snapshot rides back as base64 for undo). Pages/services/posts restore as drafts. Admin-only, behind the sitePack flag.","description":"Restore a portable .cartpack onto THIS site. NON-destructive: a colliding slug/sku is created with a suffix (about → about-2), never overwriting. dryRun:true returns the plan (preview) without writing; confirm:true applies it after snapshotting the current site first (the snapshot rides back as base64 for undo). Pages/services/posts restore as drafts. Admin-only, behind the sitePack flag.","tags":["sitepack"],"security":[{"bearerAuth":[]}],"x-cartwright-required-scope":"settings:write","x-cartwright-anonymous-read":false,"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"cartpackBase64":{"type":"string","minLength":1},"dryRun":{"type":"boolean"},"confirm":{"type":"boolean"},"allowModeMismatch":{"type":"boolean"}},"required":["cartpackBase64"]}}}},"responses":{"200":{"description":"Tool completed successfully","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["ok","result"],"properties":{"ok":{"const":true},"result":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"dryRun":{"type":"boolean","const":true},"name":{"type":"string"},"mode":{"type":"string","enum":["website","webshop","agent-marketplace"]},"plan":{"type":"object","properties":{"name":{"type":"string"},"mode":{"type":"string","enum":["website","webshop","agent-marketplace"]},"collections":{"type":"array","items":{"type":"object","properties":{"collection":{"type":"string","enum":["pages","categories","services","posts","products"]},"total":{"type":"integer","minimum":0,"maximum":9007199254740991},"create":{"type":"integer","minimum":0,"maximum":9007199254740991},"suffixed":{"type":"integer","minimum":0,"maximum":9007199254740991},"skip":{"type":"integer","minimum":0,"maximum":9007199254740991},"items":{"type":"array","items":{"type":"object","properties":{"key":{"anyOf":[{"type":"string"},{"type":"null"}]},"action":{"type":"string","enum":["create","create-suffixed","skip"]},"resolvedSlug":{"type":"string"},"resolvedSku":{"type":"string"},"reason":{"type":"string"}},"required":["key","action"],"additionalProperties":false}}},"required":["collection","total","create","suffixed","skip","items"],"additionalProperties":false}},"riders":{"type":"object","properties":{"variants":{"type":"integer","minimum":0,"maximum":9007199254740991},"productMedia":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["variants","productMedia"],"additionalProperties":false},"media":{"type":"object","properties":{"total":{"type":"integer","minimum":0,"maximum":9007199254740991},"reuse":{"type":"integer","minimum":0,"maximum":9007199254740991},"fetch":{"type":"integer","minimum":0,"maximum":9007199254740991},"fetchBytes":{"type":"number","minimum":0},"skip":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["total","reuse","fetch","fetchBytes","skip"],"additionalProperties":false},"designRef":{"type":"object","properties":{"slug":{"type":"string"},"kind":{"type":"string","enum":["data","code"]},"version":{"type":"string"},"installed":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["slug","kind","version","installed"],"additionalProperties":false},"countChecks":{"type":"array","items":{"type":"object","properties":{"collection":{"type":"string","enum":["pages","categories","products","services","posts","mediaAssets","variants","productMedia"]},"declared":{"type":"integer","minimum":0,"maximum":9007199254740991},"actual":{"type":"integer","minimum":0,"maximum":9007199254740991},"ok":{"type":"boolean"}},"required":["collection","declared","actual","ok"],"additionalProperties":false}},"warnings":{"type":"array","items":{"type":"string"}},"totals":{"type":"object","properties":{"create":{"type":"integer","minimum":0,"maximum":9007199254740991},"suffixed":{"type":"integer","minimum":0,"maximum":9007199254740991},"skip":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["create","suffixed","skip"],"additionalProperties":false}},"required":["name","mode","collections","riders","media","designRef","countChecks","warnings","totals"],"additionalProperties":false}},"required":["dryRun","name","mode","plan"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":true},"name":{"type":"string"},"created":{"type":"object","properties":{"categories":{"type":"integer","minimum":0,"maximum":9007199254740991},"products":{"type":"integer","minimum":0,"maximum":9007199254740991},"variants":{"type":"integer","minimum":0,"maximum":9007199254740991},"productMedia":{"type":"integer","minimum":0,"maximum":9007199254740991},"pages":{"type":"integer","minimum":0,"maximum":9007199254740991},"services":{"type":"integer","minimum":0,"maximum":9007199254740991},"posts":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"skipped":{"type":"object","properties":{"categories":{"type":"integer","minimum":0,"maximum":9007199254740991},"products":{"type":"integer","minimum":0,"maximum":9007199254740991},"variants":{"type":"integer","minimum":0,"maximum":9007199254740991},"productMedia":{"type":"integer","minimum":0,"maximum":9007199254740991},"pages":{"type":"integer","minimum":0,"maximum":9007199254740991},"services":{"type":"integer","minimum":0,"maximum":9007199254740991},"posts":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"mediaStored":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaFailed":{"type":"integer","minimum":0,"maximum":9007199254740991},"appliedComposition":{"type":"boolean"},"snapshotId":{"anyOf":[{"type":"string"},{"type":"null"}]},"warnings":{"type":"array","items":{"type":"string"}},"snapshotBase64":{"type":"string"}},"required":["ok","name","created","skipped","mediaStored","mediaFailed","appliedComposition","snapshotId","warnings","snapshotBase64"],"additionalProperties":false},{"type":"object","properties":{"ok":{"type":"boolean","const":false},"name":{"type":"string"},"error":{"type":"string"},"snapshotBase64":{"type":"string"}},"required":["ok","name","error","snapshotBase64"],"additionalProperties":false}]}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/UnauthorizedProblem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/RateLimitProblem"},"500":{"$ref":"#/components/responses/Problem"},"default":{"$ref":"#/components/responses/Problem"}},"x-examples":[{"name":"Preview a restore","value":{"cartpackBase64":"<base64 .cartpack>","dryRun":true}},{"name":"Apply a restore","value":{"cartpackBase64":"<base64 .cartpack>","confirm":true}}]}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"sb_live_…","description":"Cartwright API key with named per-scope grants (analytics:read, audit:read, audit:revert, cart:write, catalog:read, categories:read, categories:write, customer:read, discounts:read, discounts:write, features:read, features:write, marketing:write, orders:read, orders:write, pages:read, pages:write, products:write, settings:read, settings:write). Each operation declares its required scope in x-cartwright-required-scope; keys carry only the scopes the operator granted.","x-cartwright-scopes-supported":["analytics:read","audit:read","audit:revert","cart:write","catalog:read","categories:read","categories:write","customer:read","discounts:read","discounts:write","features:read","features:write","marketing:write","orders:read","orders:write","pages:read","pages:write","products:write","settings:read","settings:write"],"x-cartwright-scopes":{"analytics:read":"Read analytics","audit:read":"Read audit","audit:revert":"Manage audit","cart:write":"Manage cart","catalog:read":"Read catalog","categories:read":"Read categories","categories:write":"Manage categories","customer:read":"Read customer","discounts:read":"Read discounts","discounts:write":"Manage discounts","features:read":"Read features","features:write":"Manage features","marketing:write":"Manage marketing","orders:read":"Read orders","orders:write":"Manage orders","pages:read":"Read pages","pages:write":"Manage pages","products:write":"Manage products","settings:read":"Read settings","settings:write":"Manage settings"}}},"headers":{"WWWAuthenticate":{"description":"Bearer authentication challenge","schema":{"type":"string","example":"Bearer realm=\"cartwright-api\""}},"RetryAfter":{"description":"Seconds before the request should be retried","schema":{"type":"integer","minimum":1}},"RateLimitPolicy":{"description":"HTTPAPI draft-11 quota policy structured field. Anonymous calls use public-agent; authenticated/private attempts use auth-attempt.","schema":{"type":"string","example":"\"public-agent\";q=60;w=60"}},"RateLimit":{"description":"HTTPAPI draft-11 current service-limit structured field for the active policy","schema":{"type":"string","example":"\"public-agent\";r=59;t=1"}},"LegacyRateLimitLimit":{"description":"Legacy request quota for the active policy","schema":{"type":"integer","minimum":0,"example":60}},"LegacyRateLimitRemaining":{"description":"Legacy remaining request quota for the active policy","schema":{"type":"integer","minimum":0,"example":59}},"LegacyRateLimitReset":{"description":"Legacy seconds until the token bucket is fully replenished","schema":{"type":"integer","minimum":1,"example":1}}},"schemas":{"Problem":{"type":"object","required":["type","title","status","detail","instance","code","resolution","ok","error"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":400,"maximum":599},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"resolution":{"type":"string"},"ok":{"const":false},"error":{"type":"string","deprecated":true}}},"invoke_orders_get_output___schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/invoke_orders_get_output___schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/invoke_orders_get_output___schema0"}}]},"invoke_gdpr_export_user_output___schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/invoke_gdpr_export_user_output___schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/invoke_gdpr_export_user_output___schema0"}}]},"invoke_magic_generate_page_output___schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/invoke_magic_generate_page_output___schema0"}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/invoke_magic_generate_page_output___schema0"}}]}},"responses":{"Problem":{"description":"RFC 9457-compatible problem details","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"UnauthorizedProblem":{"description":"Bearer authentication failed","headers":{"WWW-Authenticate":{"$ref":"#/components/headers/WWWAuthenticate"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"RateLimitProblem":{"description":"Public-agent or authentication-attempt quota exhausted","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/LegacyRateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/LegacyRateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/LegacyRateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}