{
"error": {
"code": "auth_required",
"message": "A logged-in user is required.",
"details": {}
}
}
{
"error": {
"code": "template_sharing_requires_paid_plan",
"message": "Sharing a template as a public link requires a paid plan.",
"details": {
"plan": "free"
}
}
}
Manages the Template’s public “launch this demo” link at <origin>/launch/<launchToken>.
One endpoint, four actions selected by action:
enable — turn the link on. Mints a launchToken if the Template doesn’t already have
one. Only valid on a "ready" Template (409 template_not_ready otherwise).
Requires a paid plan (402 template_sharing_requires_paid_plan).
rotate — mint a new launchToken, invalidating the old URL, and ensure the link is
enabled. Same 409/402 gates as enable.
disable — turn the link off. Free, so a downgraded owner can always turn an existing
link off.
update — change launcher settings (quotaMode, entryMode, expirationMode,
expirationMinutes, landingPath, branding, protected, and visitor consent) without
touching whether the link is enabled. Free, no plan gate.
Templates expose launchExpirationMode and launchExpirationMinutes on every response; a
null minute value means fixed demos default to 24 hours (1440) and inactivity demos
default to 1 hour (60). Both are capped by the server’s configured maximum demo lifetime.
{
"error": {
"code": "auth_required",
"message": "A logged-in user is required.",
"details": {}
}
}
{
"error": {
"code": "template_sharing_requires_paid_plan",
"message": "Sharing a template as a public link requires a paid plan.",
"details": {
"plan": "free"
}
}
}
Personal API token, sent as Authorization: Bearer <SANDYWP_API_KEY>. Obtain one from the dashboard account menu (API keys), sandywp auth login, or POST /api/account/tokens. A missing or invalid token returns 401 auth_required. Scoped OAuth tokens are limited to the Imports family and GET /api/account/me; see the top-level conventions.
Selects which of the caller's workspaces to act in, for accounts belonging to more than one (legacy alias: X-SandyWP-Organization). Defaults to the caller's own personal workspace when omitted. Every id in this API (sandboxes, Templates, repositories) is scoped to a single workspace, so this header changes which set of resources is visible.
update only. anonymous (default; straight to an auto-login demo) or email (capture an email first, recorded as a lead — see GET /api/app/templates/{id}/leads).
update only. fixed expires each demo after a fixed lifetime; inactivity renews the deadline while the visitor actively uses WordPress (a background tab, including WordPress heartbeat polling, does not renew it).
update only. Allowed values depend on expirationMode and are NOT a flat enum: fixed lifetimes accept 60, 420, 1440, 4320, or 10080 minutes; inactivity lifetimes accept 10, 30, 60, or 1440 minutes. Values above the server's configured maximum demo lifetime are rejected regardless of mode. Omitting this while switching expirationMode applies that mode's default (1440 for fixed, 60 for inactivity).
update only. Sandbox-local path opened after auto-login, e.g. /, /shop/, or /wp-admin/ (default). Must start with /, must not start with //, and may carry a query string / fragment for deep links into wp-admin.
update only. Custom copy/colors for the public landing page, or null to clear it. Unknown/invalid sub-fields are silently dropped rather than rejected.
update only. Protected demo, true by default. When true, every demo launched from this link (after the change) gets DISALLOW_FILE_MODS and DISALLOW_FILE_EDIT written into its wp-config.php, so visitors get wp-admin without the plugin/theme installer, the ZIP uploader, or the file editor.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"SandyWP Documentation","colors":{"primary":"#d99830","light":"#e6b14a","dark":"#653c20"},"logo":{"light":"https://mintcdn.com/sandy-wp/dszzseu6N1-_GB7f/images/brand/sandywp-logo-light.png?fit=max\u0026auto=format\u0026n=dszzseu6N1-_GB7f\u0026q=85\u0026s=8e2affd29d5616eeb8d5bc46d549412a","dark":"https://mintcdn.com/sandy-wp/dszzseu6N1-_GB7f/images/brand/sandywp-logo-dark.png?fit=max\u0026auto=format\u0026n=dszzseu6N1-_GB7f\u0026q=85\u0026s=62edaad9c957123ea26d0c9ca6e77b3c","href":"https://sandywp.com"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"sandy-wp","hasAudioNarration":false,"actualSubdomain":"sandy-wp","customDomains":["docs.sandywp.com"],"gitSource":{"type":"github","owner":"rizaardiyanto1412","repo":"sandywp","deployBranch":"main","contentDirectory":"mintlify-docs","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae920e6e83198d0a6c82348","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"API Reference","count":103},{"language":"default","tag":"Sites","count":38},{"language":"default","tag":"Tools","count":14},{"language":"default","tag":"Account","count":14},{"language":"default","tag":"Blueprints","count":13},{"language":"default","tag":"Imports","count":11},{"language":"default","tag":"Workspaces","count":9},{"language":"default","tag":"Templates","count":7},{"language":"default","tag":"Library","count":5},{"language":"default","tag":"Using sandboxes","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"img.nav-logo{height:2.25rem}"}],"page":{"pagePath":"api-reference/endpoints/templates/configure-the-templates-public-launch-link","slug":"/api-reference/endpoints/templates/configure-the-templates-public-launch-link","pageMetadata":{"title":"Configure the template's public launch link","description":"Manages the Template's public \"launch this demo\" link at `\u003corigin>/launch/\u003claunchToken>`.\nOne endpoint, four actions selected by `action`:\n\n- `enable` — turn the link on. Mints a `launchToken` if the Template doesn't already have\n one. Only valid on a `\"ready\"` Template (`409 template_not_ready` otherwise).\n **Requires a paid plan** (`402 template_sharing_requires_paid_plan`).\n- `rotate` — mint a new `launchToken`, invalidating the old URL, and ensure the link is\n enabled. Same `409`/`402` gates as `enable`.\n- `disable` — turn the link off. Free, so a downgraded owner can always turn an existing\n link off.\n- `update` — change launcher settings (`quotaMode`, `entryMode`, `expirationMode`,\n `expirationMinutes`, `landingPath`, `branding`, `protected`, and visitor consent) without\n touching whether the link is enabled. Free, no plan gate.\n\nTemplates expose `launchExpirationMode` and `launchExpirationMinutes` on every response; a\n`null` minute value means fixed demos default to 24 hours (1440) and inactivity demos\ndefault to 1 hour (60). Both are capped by the server's configured maximum demo lifetime.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/templates/{id}/launch","href":"/api-reference/endpoints/templates/configure-the-templates-public-launch-link","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Manages the Template’s public “launch this demo” link at \", _jsx(_components.code, {\n children: \"\u003corigin>/launch/\u003claunchToken>\"\n }), \".\\nOne endpoint, four actions selected by \", _jsx(_components.code, {\n children: \"action\"\n }), \":\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"enable\"\n }), \" — turn the link on. Mints a \", _jsx(_components.code, {\n children: \"launchToken\"\n }), \" if the Template doesn’t already have\\none. Only valid on a \", _jsx(_components.code, {\n children: \"\\\"ready\\\"\"\n }), \" Template (\", _jsx(_components.code, {\n children: \"409 template_not_ready\"\n }), \" otherwise).\\n\", _jsx(_components.strong, {\n children: \"Requires a paid plan\"\n }), \" (\", _jsx(_components.code, {\n children: \"402 template_sharing_requires_paid_plan\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"rotate\"\n }), \" — mint a new \", _jsx(_components.code, {\n children: \"launchToken\"\n }), \", invalidating the old URL, and ensure the link is\\nenabled. Same \", _jsx(_components.code, {\n children: \"409\"\n }), \"/\", _jsx(_components.code, {\n children: \"402\"\n }), \" gates as \", _jsx(_components.code, {\n children: \"enable\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"disable\"\n }), \" — turn the link off. Free, so a downgraded owner can always turn an existing\\nlink off.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"update\"\n }), \" — change launcher settings (\", _jsx(_components.code, {\n children: \"quotaMode\"\n }), \", \", _jsx(_components.code, {\n children: \"entryMode\"\n }), \", \", _jsx(_components.code, {\n children: \"expirationMode\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"expirationMinutes\"\n }), \", \", _jsx(_components.code, {\n children: \"landingPath\"\n }), \", \", _jsx(_components.code, {\n children: \"branding\"\n }), \", \", _jsx(_components.code, {\n children: \"protected\"\n }), \", and visitor consent) without\\ntouching whether the link is enabled. Free, no plan gate.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Templates expose \", _jsx(_components.code, {\n children: \"launchExpirationMode\"\n }), \" and \", _jsx(_components.code, {\n children: \"launchExpirationMinutes\"\n }), \" on every response; a\\n\", _jsx(_components.code, {\n children: \"null\"\n }), \" minute value means fixed demos default to 24 hours (1440) and inactivity demos\\ndefault to 1 hour (60). Both are capped by the server’s configured maximum demo lifetime.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Configure the template's public launch link","description":"Manages the Template's public \"launch this demo\" link at `\u003corigin>/launch/\u003claunchToken>`.\nOne endpoint, four actions selected by `action`:\n\n- `enable` — turn the link on. Mints a `launchToken` if the Template doesn't already have\n one. Only valid on a `\"ready\"` Template (`409 template_not_ready` otherwise).\n **Requires a paid plan** (`402 template_sharing_requires_paid_plan`).\n- `rotate` — mint a new `launchToken`, invalidating the old URL, and ensure the link is\n enabled. Same `409`/`402` gates as `enable`.\n- `disable` — turn the link off. Free, so a downgraded owner can always turn an existing\n link off.\n- `update` — change launcher settings (`quotaMode`, `entryMode`, `expirationMode`,\n `expirationMinutes`, `landingPath`, `branding`, `protected`, and visitor consent) without\n touching whether the link is enabled. Free, no plan gate.\n\nTemplates expose `launchExpirationMode` and `launchExpirationMinutes` on every response; a\n`null` minute value means fixed demos default to 24 hours (1440) and inactivity demos\ndefault to 1 hour (60). Both are capped by the server's configured maximum demo lifetime.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/templates/{id}/launch","href":"/api-reference/endpoints/templates/configure-the-templates-public-launch-link","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"configureTemplateLauncher","tags":["Templates"],"summary":"Configure the template's public launch link","description":"Manages the Template's public \"launch this demo\" link at `\u003corigin>/launch/\u003claunchToken>`.\nOne endpoint, four actions selected by `action`:\n\n- `enable` — turn the link on. Mints a `launchToken` if the Template doesn't already have\n one. Only valid on a `\"ready\"` Template (`409 template_not_ready` otherwise).\n **Requires a paid plan** (`402 template_sharing_requires_paid_plan`).\n- `rotate` — mint a new `launchToken`, invalidating the old URL, and ensure the link is\n enabled. Same `409`/`402` gates as `enable`.\n- `disable` — turn the link off. Free, so a downgraded owner can always turn an existing\n link off.\n- `update` — change launcher settings (`quotaMode`, `entryMode`, `expirationMode`,\n `expirationMinutes`, `landingPath`, `branding`, `protected`, and visitor consent) without\n touching whether the link is enabled. Free, no plan gate.\n\nTemplates expose `launchExpirationMode` and `launchExpirationMinutes` on every response; a\n`null` minute value means fixed demos default to 24 hours (1440) and inactivity demos\ndefault to 1 hour (60). Both are capped by the server's configured maximum demo lifetime.\n","parameters":["1a859491-de03-4ae2-8cd7-9bc478f33da5","b6651787-ccba-4e50-b439-cfff373b0424"],"requestBody":"dad87de1-8638-40ed-ba80-12c8c51c41f8","responses":{"200":"d553221c-ea21-42f8-ad3f-ec9f074a03e4","400":"41d5857c-783f-4be3-a655-b218fd54e5c5","401":"ba3ea88a-a364-40a0-85ad-3c31e047ff4e","402":"d546fdc7-feca-4fe2-b022-2255795f0c55","403":"7dd7ff68-a14a-4914-9b7e-50dac28bd20d","404":"063b51d9-203f-4130-b208-39884211dbbf","409":"2a229bdb-7be7-4fc9-a250-bf513bed9077"},"method":"post","type":"path","servers":["ee9ccad4-7b5f-44f6-ade4-758bbae361d0"],"security":["e73617b5-e337-4569-b7dd-a513402275e4"],"path":"/api/app/templates/{id}/launch","baseUrlOptions":["https://app.sandywp.com"],"title":"Configure the template's public launch link","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"1a859491-de03-4ae2-8cd7-9bc478f33da5":{"name":"id","in":"path","required":true,"description":"The template id.","schema":{"type":"string","isRequired":true,"description":"The template id.","uniqueKey":"","typeLabel":"string"},"example":"tpl_xyz789"},"b6651787-ccba-4e50-b439-cfff373b0424":{"name":"X-SandyWP-Workspace","in":"header","required":false,"description":"Selects which of the caller's workspaces to act in, for accounts belonging to more than one (legacy alias: `X-SandyWP-Organization`). Defaults to the caller's own personal workspace when omitted. Every id in this API (sandboxes, Templates, repositories) is scoped to a single workspace, so this header changes which set of resources is visible.","schema":{"type":"string","isRequired":false,"description":"Selects which of the caller's workspaces to act in, for accounts belonging to more than one (legacy alias: `X-SandyWP-Organization`). Defaults to the caller's own personal workspace when omitted. Every id in this API (sandboxes, Templates, repositories) is scoped to a single workspace, so this header changes which set of resources is visible.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["enable","disable","rotate","update"],"description":"Required. What to do with the launcher.","isRequired":true,"uniqueKey":"action","typeLabel":"enum\u003cstring>"},"quotaMode":{"type":"string","description":"`update` only. Who a launched demo counts against: `visitor` (default; the visitor's own quota) or `owner` (the Template owner's plan slots).","enum":["visitor","owner"],"uniqueKey":"quotaMode","typeLabel":"enum\u003cstring>"},"entryMode":{"type":"string","description":"`update` only. `anonymous` (default; straight to an auto-login demo) or `email` (capture an email first, recorded as a lead — see `GET /api/app/templates/{id}/leads`).","enum":["anonymous","email"],"uniqueKey":"entryMode","typeLabel":"enum\u003cstring>"},"expirationMode":{"type":"string","description":"`update` only. `fixed` expires each demo after a fixed lifetime; `inactivity` renews the deadline while the visitor actively uses WordPress (a background tab, including WordPress heartbeat polling, does not renew it).","enum":["fixed","inactivity"],"uniqueKey":"expirationMode","typeLabel":"enum\u003cstring>"},"expirationMinutes":{"type":"integer","description":"`update` only. Allowed values depend on `expirationMode` and are NOT a flat enum: fixed lifetimes accept 60, 420, 1440, 4320, or 10080 minutes; inactivity lifetimes accept 10, 30, 60, or 1440 minutes. Values above the server's configured maximum demo lifetime are rejected regardless of mode. Omitting this while switching `expirationMode` applies that mode's default (1440 for fixed, 60 for inactivity).","enum":[10,30,60,420,1440,4320,10080],"uniqueKey":"expirationMinutes","typeLabel":"enum\u003cinteger>"},"landingPath":{"type":"string","description":"`update` only. Sandbox-local path opened after auto-login, e.g. `/`, `/shop/`, or `/wp-admin/` (default). Must start with `/`, must not start with `//`, and may carry a query string / fragment for deep links into wp-admin.","example":"/wp-admin/","uniqueKey":"landingPath","typeLabel":"string"},"branding":{"oneOf":[{"type":"object","description":"`update` only. Custom copy/colors for the public landing page, or `null` to clear it. Unknown/invalid sub-fields are silently dropped rather than rejected.","properties":{"eyebrow":{"type":"string","maxLength":40,"uniqueKey":"branding.oneOf.0.eyebrow","typeLabel":"string"},"headline":{"type":"string","maxLength":90,"uniqueKey":"branding.oneOf.0.headline","typeLabel":"string"},"subhead":{"type":"string","maxLength":240,"uniqueKey":"branding.oneOf.0.subhead","typeLabel":"string"},"buttonLabel":{"type":"string","maxLength":40,"uniqueKey":"branding.oneOf.0.buttonLabel","typeLabel":"string"},"logoUrl":{"type":"string","format":"uri","description":"Must be an http(s) URL.","uniqueKey":"branding.oneOf.0.logoUrl","typeLabel":"string\u003curi>"},"brandName":{"type":"string","maxLength":40,"uniqueKey":"branding.oneOf.0.brandName","typeLabel":"string"},"accentColor":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","example":"#3366ff","uniqueKey":"branding.oneOf.0.accentColor","typeLabel":"string"},"backgroundColor":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","uniqueKey":"branding.oneOf.0.backgroundColor","typeLabel":"string"},"backgroundImageUrl":{"type":"string","format":"uri","description":"Must be an http(s) URL.","uniqueKey":"branding.oneOf.0.backgroundImageUrl","typeLabel":"string\u003curi>"},"hidePoweredBy":{"type":"boolean","uniqueKey":"branding.oneOf.0.hidePoweredBy","typeLabel":"boolean"}},"uniqueKey":"branding.oneOf.0","typeLabel":"object"},{"type":"null","description":"`update` only. Custom copy/colors for the public landing page, or `null` to clear it. Unknown/invalid sub-fields are silently dropped rather than rejected.","uniqueKey":"branding.oneOf.1","typeLabel":"null"}],"uniqueKey":"branding","typeLabel":"object | null"},"protected":{"type":"boolean","description":"`update` only. Protected demo, `true` by default. When `true`, every demo launched from this link (after the change) gets `DISALLOW_FILE_MODS` and `DISALLOW_FILE_EDIT` written into its `wp-config.php`, so visitors get wp-admin without the plugin/theme installer, the ZIP uploader, or the file editor.","uniqueKey":"protected","typeLabel":"boolean"},"consentEnabled":{"type":"boolean","description":"`update` only. Show a visitor consent checkbox before launching the demo. Disabling the checkbox does not remove the saved label or default state.","uniqueKey":"consentEnabled","typeLabel":"boolean"},"consentLabel":{"oneOf":[{"type":"string","maxLength":500,"description":"`update` only. Text shown beside the visitor consent checkbox, up to 500 characters. Use `null` to clear it; enabling consent requires non-empty text.","uniqueKey":"consentLabel.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":500,"description":"`update` only. Text shown beside the visitor consent checkbox, up to 500 characters. Use `null` to clear it; enabling consent requires non-empty text.","uniqueKey":"consentLabel.oneOf.1","typeLabel":"null"}],"uniqueKey":"consentLabel","typeLabel":"string | null"},"consentDefaultChecked":{"type":"boolean","description":"`update` only. Initial checkbox state on the public launch page. Defaults to `false`.","uniqueKey":"consentDefaultChecked","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"landingPath":"/wp-admin/","branding":{"eyebrow":"\u003cstring>","headline":"\u003cstring>","subhead":"\u003cstring>","buttonLabel":"\u003cstring>","logoUrl":"\u003cstring>","brandName":"\u003cstring>","accentColor":"#3366ff","backgroundColor":"\u003cstring>","backgroundImageUrl":"\u003cstring>","hidePoweredBy":true},"protected":true,"consentEnabled":true,"consentLabel":"\u003cstring>","consentDefaultChecked":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"d553221c-ea21-42f8-ad3f-ec9f074a03e4":{"description":"The updated Template.","content":{"application/json":{"schema":{"type":"object","required":["template"],"properties":{"template":{"type":"object","description":"A reusable snapshot of a finished sandbox.","required":["id","kind","prSource","userId","orgId","createdByUserId","name","slug","description","sourceSiteId","artifactId","status","failureReason","wordpressVersion","phpVersion","sizeBytes","launchEnabled","launchToken","launchCount","launchQuotaMode","launchEntryMode","launchExpirationMode","launchExpirationMinutes","launchLandingPath","launchBranding","launchProtected","launchConsentEnabled","launchConsentLabel","launchConsentDefaultChecked","sourceBlueprintId","sourceBlueprintRevision","createdAt","updatedAt"],"properties":{"id":{"type":"string","example":"tpl_xyz789","isRequired":true,"uniqueKey":"template.id","typeLabel":"string"},"kind":{"type":"string","enum":["template"],"description":"Always `template` here. PR snapshots are served only by `/api/app/pr-snapshots`.","isRequired":true,"uniqueKey":"template.kind","typeLabel":"enum\u003cstring>"},"prSource":{"type":"null","description":"Always null for a Template.","isRequired":true,"uniqueKey":"template.prSource","typeLabel":"null"},"userId":{"type":"string","isRequired":true,"uniqueKey":"template.userId","typeLabel":"string"},"orgId":{"type":"string","isRequired":true,"uniqueKey":"template.orgId","typeLabel":"string"},"createdByUserId":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"template.createdByUserId.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"template.createdByUserId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.createdByUserId","typeLabel":"string | null"},"name":{"type":"string","isRequired":true,"uniqueKey":"template.name","typeLabel":"string"},"slug":{"type":"string","isRequired":true,"uniqueKey":"template.slug","typeLabel":"string"},"description":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"template.description.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"template.description.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.description","typeLabel":"string | null"},"sourceSiteId":{"oneOf":[{"type":"string","description":"The sandbox this Template was snapshotted from, if any (null for a Blueprint-baked Template).","isRequired":true,"uniqueKey":"template.sourceSiteId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The sandbox this Template was snapshotted from, if any (null for a Blueprint-baked Template).","isRequired":true,"uniqueKey":"template.sourceSiteId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.sourceSiteId","typeLabel":"string | null"},"artifactId":{"oneOf":[{"type":"string","description":"The snapshot artifact backing this Template. Null while `status` is `\"building\"`.","isRequired":true,"uniqueKey":"template.artifactId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The snapshot artifact backing this Template. Null while `status` is `\"building\"`.","isRequired":true,"uniqueKey":"template.artifactId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.artifactId","typeLabel":"string | null"},"status":{"type":"string","enum":["building","ready","failed"],"isRequired":true,"uniqueKey":"template.status","typeLabel":"enum\u003cstring>"},"failureReason":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"template.failureReason.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"template.failureReason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.failureReason","typeLabel":"string | null"},"wordpressVersion":{"type":"string","isRequired":true,"uniqueKey":"template.wordpressVersion","typeLabel":"string"},"phpVersion":{"type":"string","isRequired":true,"uniqueKey":"template.phpVersion","typeLabel":"string"},"sizeBytes":{"type":"integer","isRequired":true,"uniqueKey":"template.sizeBytes","typeLabel":"integer"},"launchEnabled":{"type":"boolean","isRequired":true,"uniqueKey":"template.launchEnabled","typeLabel":"boolean"},"launchToken":{"oneOf":[{"type":"string","description":"Opaque token in the public `\u003corigin>/launch/\u003claunchToken>` URL. Set once a link has ever been enabled.","isRequired":true,"uniqueKey":"template.launchToken.oneOf.0","typeLabel":"string"},{"type":"null","description":"Opaque token in the public `\u003corigin>/launch/\u003claunchToken>` URL. Set once a link has ever been enabled.","isRequired":true,"uniqueKey":"template.launchToken.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.launchToken","typeLabel":"string | null"},"launchCount":{"type":"integer","description":"Number of sandboxes launched from this Template's public link.","isRequired":true,"uniqueKey":"template.launchCount","typeLabel":"integer"},"launchQuotaMode":{"type":"string","description":"Who a launched demo counts against.","enum":["visitor","owner"],"isRequired":true,"uniqueKey":"template.launchQuotaMode","typeLabel":"enum\u003cstring>"},"launchEntryMode":{"type":"string","description":"Whether a launch-link visitor enters anonymously or must give an email first.","enum":["anonymous","email"],"isRequired":true,"uniqueKey":"template.launchEntryMode","typeLabel":"enum\u003cstring>"},"launchExpirationMode":{"type":"string","description":"`fixed` expires a demo/idle-mode sandbox after a fixed lifetime from creation/launch; `inactivity` renews the deadline while it is actively used.","enum":["fixed","inactivity"],"isRequired":true,"uniqueKey":"template.launchExpirationMode","typeLabel":"enum\u003cstring>"},"launchExpirationMinutes":{"oneOf":[{"type":"integer","description":"Null means the mode default applies: 1440 (24h) for fixed, 60 (1h) for inactivity.","isRequired":true,"uniqueKey":"template.launchExpirationMinutes.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Null means the mode default applies: 1440 (24h) for fixed, 60 (1h) for inactivity.","isRequired":true,"uniqueKey":"template.launchExpirationMinutes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.launchExpirationMinutes","typeLabel":"integer | null"},"launchLandingPath":{"type":"string","example":"/wp-admin/","isRequired":true,"uniqueKey":"template.launchLandingPath","typeLabel":"string"},"launchBranding":{"oneOf":[{"type":"object","description":"Custom copy/colors for a Template's public launch landing page. Every field is optional; unknown or invalid values (bad hex colors, non-http(s) URLs, over-length text) are dropped silently rather than rejected.","properties":{"eyebrow":{"type":"string","maxLength":40,"uniqueKey":"template.launchBranding.oneOf.0.eyebrow","typeLabel":"string"},"headline":{"type":"string","maxLength":90,"uniqueKey":"template.launchBranding.oneOf.0.headline","typeLabel":"string"},"subhead":{"type":"string","maxLength":240,"uniqueKey":"template.launchBranding.oneOf.0.subhead","typeLabel":"string"},"buttonLabel":{"type":"string","maxLength":40,"uniqueKey":"template.launchBranding.oneOf.0.buttonLabel","typeLabel":"string"},"logoUrl":{"type":"string","format":"uri","description":"Must be an http(s) URL.","uniqueKey":"template.launchBranding.oneOf.0.logoUrl","typeLabel":"string\u003curi>"},"brandName":{"type":"string","maxLength":40,"uniqueKey":"template.launchBranding.oneOf.0.brandName","typeLabel":"string"},"accentColor":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","example":"#3366ff","uniqueKey":"template.launchBranding.oneOf.0.accentColor","typeLabel":"string"},"backgroundColor":{"type":"string","pattern":"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$","uniqueKey":"template.launchBranding.oneOf.0.backgroundColor","typeLabel":"string"},"backgroundImageUrl":{"type":"string","format":"uri","description":"Must be an http(s) URL.","uniqueKey":"template.launchBranding.oneOf.0.backgroundImageUrl","typeLabel":"string\u003curi>"},"hidePoweredBy":{"type":"boolean","uniqueKey":"template.launchBranding.oneOf.0.hidePoweredBy","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"template.launchBranding.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"template.launchBranding.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.launchBranding","typeLabel":"object | null"},"launchProtected":{"type":"boolean","description":"Defaults to true. See `protected` on the launcher-configuration endpoint.","isRequired":true,"uniqueKey":"template.launchProtected","typeLabel":"boolean"},"launchConsentEnabled":{"type":"boolean","description":"Whether the public launch page shows a visitor consent checkbox.","isRequired":true,"uniqueKey":"template.launchConsentEnabled","typeLabel":"boolean"},"launchConsentLabel":{"oneOf":[{"type":"string","description":"Text shown beside the visitor consent checkbox, up to 500 characters.","isRequired":true,"uniqueKey":"template.launchConsentLabel.oneOf.0","typeLabel":"string"},{"type":"null","description":"Text shown beside the visitor consent checkbox, up to 500 characters.","isRequired":true,"uniqueKey":"template.launchConsentLabel.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.launchConsentLabel","typeLabel":"string | null"},"launchConsentDefaultChecked":{"type":"boolean","description":"Initial checkbox state on the public launch page. Defaults to false.","isRequired":true,"uniqueKey":"template.launchConsentDefaultChecked","typeLabel":"boolean"},"sourceBlueprintId":{"oneOf":[{"type":"string","description":"Set when this Template was baked from a Blueprint (out of this document's scope) rather than snapshotted from a sandbox.","isRequired":true,"uniqueKey":"template.sourceBlueprintId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Set when this Template was baked from a Blueprint (out of this document's scope) rather than snapshotted from a sandbox.","isRequired":true,"uniqueKey":"template.sourceBlueprintId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.sourceBlueprintId","typeLabel":"string | null"},"sourceBlueprintRevision":{"oneOf":[{"type":"integer","isRequired":true,"uniqueKey":"template.sourceBlueprintRevision.oneOf.0","typeLabel":"integer"},{"type":"null","isRequired":true,"uniqueKey":"template.sourceBlueprintRevision.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"template.sourceBlueprintRevision","typeLabel":"integer | null"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"template.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"template.updatedAt","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"template","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"template":{"id":"tpl_xyz789","kind":"template","prSource":null,"userId":"\u003cstring>","orgId":"\u003cstring>","createdByUserId":"\u003cstring>","name":"\u003cstring>","slug":"\u003cstring>","description":"\u003cstring>","sourceSiteId":"\u003cstring>","artifactId":"\u003cstring>","status":"building","failureReason":"\u003cstring>","wordpressVersion":"\u003cstring>","phpVersion":"\u003cstring>","sizeBytes":123,"launchEnabled":true,"launchToken":"\u003cstring>","launchCount":123,"launchQuotaMode":"visitor","launchEntryMode":"anonymous","launchExpirationMode":"fixed","launchExpirationMinutes":123,"launchLandingPath":"/wp-admin/","launchBranding":{"eyebrow":"\u003cstring>","headline":"\u003cstring>","subhead":"\u003cstring>","buttonLabel":"\u003cstring>","logoUrl":"\u003cstring>","brandName":"\u003cstring>","accentColor":"#3366ff","backgroundColor":"\u003cstring>","backgroundImageUrl":"\u003cstring>","hidePoweredBy":true},"launchProtected":true,"launchConsentEnabled":true,"launchConsentLabel":"\u003cstring>","launchConsentDefaultChecked":true,"sourceBlueprintId":"\u003cstring>","sourceBlueprintRevision":123,"createdAt":"2023-11-07T05:31:56Z","updatedAt":"2023-11-07T05:31:56Z"}}}},"exampleType":"generated"}},"exampleType":"generated"},"41d5857c-783f-4be3-a655-b218fd54e5c5":{"description":"`invalid_request` — `action` is missing/unrecognized, or `quotaMode` / `entryMode` / `expirationMode` / `landingPath` failed its shape check. `invalid_demo_expiration` — `expirationMinutes` is not an allowed value for the (resulting) `expirationMode` or exceeds the server's maximum. `invalid_launch_landing_path` — `landingPath` is not a local path. `invalid_launch_consent` — consent was enabled without usable text, or `consentLabel` exceeds 500 characters.","content":{"application/json":{"schema":{"type":"object","description":"The standard error envelope returned by every endpoint on a non-2xx response.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"A stable, machine-readable error code (e.g. `invalid_request`, `site_not_found`, `plan_limit_reached`). See each operation for the codes it can return.","example":"invalid_request","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable message. Safe to display to an end user.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional structured context (e.g. `{\"plan\": \"free\", \"limit\": 2}` for a plan-limit error). Omitted entirely on the generic internal-error fallback; `{}` when an error has no extra context.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"ba3ea88a-a364-40a0-85ad-3c31e047ff4e":{"description":"No valid bearer token was presented, or a scoped OAuth token was used outside its allowed Imports and account-identity routes.","content":{"application/json":{"schema":{"type":"object","description":"The standard error envelope returned by every endpoint on a non-2xx response.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"A stable, machine-readable error code (e.g. `invalid_request`, `site_not_found`, `plan_limit_reached`). See each operation for the codes it can return.","example":"invalid_request","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable message. Safe to display to an end user.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional structured context (e.g. `{\"plan\": \"free\", \"limit\": 2}` for a plan-limit error). Omitted entirely on the generic internal-error fallback; `{}` when an error has no extra context.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"auth_required","message":"A logged-in user is required.","details":{}}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"auth_required","message":"A logged-in user is required.","details":{}}}}},"exampleType":"examples"}},"exampleType":"examples"},"d546fdc7-feca-4fe2-b022-2255795f0c55":{"description":"`template_sharing_requires_paid_plan` — `action` is `enable` or `rotate` and the workspace is on the free plan.","content":{"application/json":{"schema":{"type":"object","description":"The standard error envelope returned by every endpoint on a non-2xx response.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"A stable, machine-readable error code (e.g. `invalid_request`, `site_not_found`, `plan_limit_reached`). See each operation for the codes it can return.","example":"invalid_request","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable message. Safe to display to an end user.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional structured context (e.g. `{\"plan\": \"free\", \"limit\": 2}` for a plan-limit error). Omitted entirely on the generic internal-error fallback; `{}` when an error has no extra context.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"template_sharing_requires_paid_plan","message":"Sharing a template as a public link requires a paid plan.","details":{"plan":"free"}}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"template_sharing_requires_paid_plan","message":"Sharing a template as a public link requires a paid plan.","details":{"plan":"free"}}}}},"exampleType":"examples"}},"exampleType":"examples"},"7dd7ff68-a14a-4914-9b7e-50dac28bd20d":{"description":"`forbidden` — the Template belongs to a different workspace.","content":{"application/json":{"schema":{"type":"object","description":"The standard error envelope returned by every endpoint on a non-2xx response.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"A stable, machine-readable error code (e.g. `invalid_request`, `site_not_found`, `plan_limit_reached`). See each operation for the codes it can return.","example":"invalid_request","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable message. Safe to display to an end user.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional structured context (e.g. `{\"plan\": \"free\", \"limit\": 2}` for a plan-limit error). Omitted entirely on the generic internal-error fallback; `{}` when an error has no extra context.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"063b51d9-203f-4130-b208-39884211dbbf":{"description":"No such Template, or it is not visible to the caller. Ownership failures are intentionally indistinguishable from a missing Template, so a Template id cannot be probed for existence.","content":{"application/json":{"schema":{"type":"object","description":"The standard error envelope returned by every endpoint on a non-2xx response.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"A stable, machine-readable error code (e.g. `invalid_request`, `site_not_found`, `plan_limit_reached`). See each operation for the codes it can return.","example":"invalid_request","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable message. Safe to display to an end user.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional structured context (e.g. `{\"plan\": \"free\", \"limit\": 2}` for a plan-limit error). Omitted entirely on the generic internal-error fallback; `{}` when an error has no extra context.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"template_not_found","message":"Template not found.","details":{}}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"template_not_found","message":"Template not found.","details":{}}}}},"exampleType":"examples"}},"exampleType":"examples"},"2a229bdb-7be7-4fc9-a250-bf513bed9077":{"description":"`template_not_ready` — `action` is `enable` or `rotate` and the Template's `status` is not `\"ready\"`.","content":{"application/json":{"schema":{"type":"object","description":"The standard error envelope returned by every endpoint on a non-2xx response.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"A stable, machine-readable error code (e.g. `invalid_request`, `site_not_found`, `plan_limit_reached`). See each operation for the codes it can return.","example":"invalid_request","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable message. Safe to display to an end user.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","description":"Optional structured context (e.g. `{\"plan\": \"free\", \"limit\": 2}` for a plan-limit error). Omitted entirely on the generic internal-error fallback; `{}` when an error has no extra context.","additionalProperties":true,"uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"e73617b5-e337-4569-b7dd-a513402275e4":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Personal API token, sent as `Authorization: Bearer \u003cSANDYWP_API_KEY>`. Obtain one from the dashboard account menu (API keys), `sandywp auth login`, or `POST /api/account/tokens`. A missing or invalid token returns `401 auth_required`. Scoped OAuth tokens are limited to the Imports family and `GET /api/account/me`; see the top-level conventions.","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"ee9ccad4-7b5f-44f6-ade4-758bbae361d0":{"url":"https://app.sandywp.com"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Personal API token, sent as `Authorization: Bearer \u003cSANDYWP_API_KEY>`. Obtain one from the dashboard account menu (API keys), `sandywp auth login`, or `POST /api/account/tokens`. A missing or invalid token returns `401 auth_required`. Scoped OAuth tokens are limited to the Imports family and `GET /api/account/me`; see the top-level conventions.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Personal API token, sent as `Authorization: Bearer \u003cSANDYWP_API_KEY>`. Obtain one from the dashboard account menu (API keys), `sandywp auth login`, or `POST /api/account/tokens`. A missing or invalid token returns `401 auth_required`. Scoped OAuth tokens are limited to the Imports family and `GET /api/account/me`; see the top-level conventions.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"openapi.yaml"},"subdomain":"sandy-wp","siteName":"SandyWP Documentation","title":"Configure the template's public launch link - SandyWP Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T11:39:42.231Z","originalFileLocation":"api-reference/endpoints/templates/configure-the-templates-public-launch-link.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Manages the Template\u0026#x27;s public \u0026quot;launch this demo\u0026quot; link at /launch/. One endpoint, four actions selected by action: - enable — turn the link on. Mints a launchToken if the Template doesn\u0026#x27;t already have one. Only valid on a \u0026quot;ready\u0026quot; Template (409 template_not_ready otherwise). Requires a paid plan (402 template_sharing_requires_paid_plan). - rotate — mint a new launchToken, invalidating the old URL, and ensure the link is enabled. Same 409/402 gates as enable. - disable — turn the link off. Free, so a downgraded owner can always turn an existing link off. - update — change launcher settings (quotaMode, entryMode, expirationMode, expirationMinutes, landingPath, branding, protected, and visitor consent) without touching whether the link is enabled. Free, no plan gate. Templates expose launchExpirationMode and launchExpirationMinutes on every response; a null minute value means fixed demos default to 24 hours (1440) and inactivity demos default to 1 hour (60). Both are capped by the server\u0026#x27;s configured maximum demo lifetime.\">\u003cmeta data-mint-head name=\"application-name\" content=\"SandyWP Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/sandy-wp/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/sandy-wp/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/sandy-wp/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/sandy-wp/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Configure the template\u0026#x27;s public launch link - SandyWP Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Manages the Template\u0026#x27;s public \u0026quot;launch this demo\u0026quot; link at /launch/. One endpoint, four actions selected by action: - enable — turn the link on. Mints a launchToken if the Template doesn\u0026#x27;t already have one. Only valid on a \u0026quot;ready\u0026quot; Template (409 template_not_ready otherwise). Requires a paid plan (402 template_sharing_requires_paid_plan). - rotate — mint a new launchToken, invalidating the old URL, and ensure the link is enabled. Same 409/402 gates as enable. - disable — turn the link off. Free, so a downgraded owner can always turn an existing link off. - update — change launcher settings (quotaMode, entryMode, expirationMode, expirationMinutes, landingPath, branding, protected, and visitor consent) without touching whether the link is enabled. Free, no plan gate. Templates expose launchExpirationMode and launchExpirationMinutes on every response; a null minute value means fixed demos default to 24 hours (1440) and inactivity demos default to 1 hour (60). Both are capped by the server\u0026#x27;s configured maximum demo lifetime.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SandyWP Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://sandy-wp.mintlify.site/_mintlify/api/og/v2?division=Templates\u0026amp;title=Configure+the+template%27s+public+launch+link\u0026amp;description=Manages+the+Template%27s+public+%22launch+this+demo%22+link+at+%60%3Corigin%3E%2Flaunch%2F%3ClaunchToken%3E%60.%0AOne+endpoint%2C+four+actions+selected+by+%60action%60%3A%0A%0A-+%60enable%60+%E2%80%94+turn+th\u0026amp;theme=7adb8c57347f76c2bf2e915e\u0026amp;signature=61e34dd1178730d58f0685ed51fa705475571a0c1af4224e5d7dd5d3cfd3a9d4\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Configure the template\u0026#x27;s public launch link - SandyWP Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Manages the Template\u0026#x27;s public \u0026quot;launch this demo\u0026quot; link at /launch/. One endpoint, four actions selected by action: - enable — turn the link on. Mints a launchToken if the Template doesn\u0026#x27;t already have one. Only valid on a \u0026quot;ready\u0026quot; Template (409 template_not_ready otherwise). Requires a paid plan (402 template_sharing_requires_paid_plan). - rotate — mint a new launchToken, invalidating the old URL, and ensure the link is enabled. Same 409/402 gates as enable. - disable — turn the link off. Free, so a downgraded owner can always turn an existing link off. - update — change launcher settings (quotaMode, entryMode, expirationMode, expirationMinutes, landingPath, branding, protected, and visitor consent) without touching whether the link is enabled. Free, no plan gate. Templates expose launchExpirationMode and launchExpirationMinutes on every response; a null minute value means fixed demos default to 24 hours (1440) and inactivity demos default to 1 hour (60). Both are capped by the server\u0026#x27;s configured maximum demo lifetime.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://sandy-wp.mintlify.site/_mintlify/api/og/v2?division=Templates\u0026amp;title=Configure+the+template%27s+public+launch+link\u0026amp;description=Manages+the+Template%27s+public+%22launch+this+demo%22+link+at+%60%3Corigin%3E%2Flaunch%2F%3ClaunchToken%3E%60.%0AOne+endpoint%2C+four+actions+selected+by+%60action%60%3A%0A%0A-+%60enable%60+%E2%80%94+turn+th\u0026amp;theme=7adb8c57347f76c2bf2e915e\u0026amp;signature=61e34dd1178730d58f0685ed51fa705475571a0c1af4224e5d7dd5d3cfd3a9d4\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/sandy-wp/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"SandyWP Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#d99830\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/endpoints/templates/configure-the-templates-public-launch-link.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.sandywp.com/#organization\",\"name\":\"SandyWP Documentation\",\"url\":\"https://docs.sandywp.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/sandy-wp/dszzseu6N1-_GB7f/images/brand/sandywp-logo-light.png?fit=max\u0026auto=format\u0026n=dszzseu6N1-_GB7f\u0026q=85\u0026s=8e2affd29d5616eeb8d5bc46d549412a\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.sandywp.com#website\",\"name\":\"SandyWP Documentation\",\"url\":\"https://docs.sandywp.com\",\"publisher\":{\"@id\":\"https://docs.sandywp.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link#webpage\",\"url\":\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link\",\"name\":\"Configure the template's public launch link\",\"description\":\"Manages the Template's public \\\"launch this demo\\\" link at /launch/. One endpoint, four actions selected by action: - enable — turn the link on. Mints a launchToken if the Template doesn't already have one. Only valid on a \\\"ready\\\" Template (409 template_not_ready otherwise). Requires a paid plan (402 template_sharing_requires_paid_plan). - rotate — mint a new launchToken, invalidating the old URL, and ensure the link is enabled. Same 409/402 gates as enable. - disable — turn the link off. Free, so a downgraded owner can always turn an existing link off. - update — change launcher settings (quotaMode, entryMode, expirationMode, expirationMinutes, landingPath, branding, protected, and visitor consent) without touching whether the link is enabled. Free, no plan gate. Templates expose launchExpirationMode and launchExpirationMinutes on every response; a null minute value means fixed demos default to 24 hours (1440) and inactivity demos default to 1 hour (60). Both are capped by the server's configured maximum demo lifetime.\",\"dateModified\":\"2026-10-28T11:39:42.231Z\",\"isPartOf\":{\"@id\":\"https://docs.sandywp.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.sandywp.com/api-reference\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Templates\",\"item\":\"https://docs.sandywp.com/api-reference/endpoints/templates/list-templates\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Configure the template's public launch link\",\"item\":\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link#apireference\",\"headline\":\"Configure the template's public launch link\",\"name\":\"Configure the template's public launch link\",\"description\":\"Manages the Template's public \\\"launch this demo\\\" link at /launch/. One endpoint, four actions selected by action: - enable — turn the link on. Mints a launchToken if the Template doesn't already have one. Only valid on a \\\"ready\\\" Template (409 template_not_ready otherwise). Requires a paid plan (402 template_sharing_requires_paid_plan). - rotate — mint a new launchToken, invalidating the old URL, and ensure the link is enabled. Same 409/402 gates as enable. - disable — turn the link off. Free, so a downgraded owner can always turn an existing link off. - update — change launcher settings (quotaMode, entryMode, expirationMode, expirationMinutes, landingPath, branding, protected, and visitor consent) without touching whether the link is enabled. Free, no plan gate. Templates expose launchExpirationMode and launchExpirationMinutes on every response; a null minute value means fixed demos default to 24 hours (1440) and inactivity demos default to 1 hour (60). Both are capped by the server's configured maximum demo lifetime.\",\"url\":\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link\",\"mainEntityOfPage\":{\"@id\":\"https://docs.sandywp.com/api-reference/endpoints/templates/configure-the-templates-public-launch-link#webpage\"},\"dateModified\":\"2026-10-28T11:39:42.231Z\",\"publisher\":{\"@id\":\"https://docs.sandywp.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.sandywp.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"SandyWP Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"SandyWP Documentation","nav":{"global":null,"groups":[{"group":"Getting started","pages":[{"title":"Welcome to SandyWP","href":"/index"},{"title":"Core concepts","href":"/concepts"}]},{"group":"Using sandboxes","pages":[{"title":"Create a sandbox","href":"/guides/create-a-sandbox"},{"title":"Open wp-admin","href":"/guides/open-wp-admin"},{"title":"Lifespan and permanence","href":"/guides/site-lifespan"},{"title":"Plans and limits","href":"/guides/plans"}]},{"group":"Tools","pages":[{"title":"File Manager","href":"/guides/file-manager"},{"title":"Database","href":"/guides/database"},{"title":"PHP settings","href":"/guides/php"},{"title":"Custom domains","href":"/guides/custom-domains"},{"title":"Email delivery","href":"/guides/email-delivery"},{"title":"Git deployment","href":"/guides/git-deployment"},{"title":"SSH access","href":"/guides/ssh-access"},{"title":"Mount a sandbox","href":"/guides/mount-a-sandbox"},{"title":"Library","href":"/guides/plugin-library"},{"title":"Templates","href":"/guides/templates"},{"title":"Webhooks","href":"/guides/webhooks"},{"title":"Blueprints","href":"/guides/blueprints"},{"title":"Clone a site","href":"/guides/clone-a-site"},{"title":"Push a local site","href":"/guides/push-local-site"}]},{"group":"Integrations","pages":[{"title":"Slack app","href":"/guides/slack"},{"title":"GitHub pull request previews","href":"/guides/github"}]},{"group":"Connectors","pages":[{"title":"Muse connector brief","href":"/connectors/muse"}]},{"group":"Account","pages":[{"title":"Two-factor authentication","href":"/guides/two-factor-authentication"}]},{"group":"Automation guides","pages":[{"title":"API keys","href":"/guides/api-keys"},{"title":"CLI","href":"/cli"}]},{"group":"API Reference","pages":[{"title":"API Reference overview","href":"/api-reference"},{"title":"Blueprint API guidance","href":"/api-reference/blueprints"},{"title":"Imports API guidance","href":"/api-reference/imports"},{"title":"Workspace API guidance","href":"/api-reference/workspaces"},{"title":"OAuth connector flow","href":"/api-reference/oauth"},{"group":"Templates","pages":[{"title":"List templates","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/templates","href":"/api-reference/endpoints/templates/list-templates"},{"title":"Snapshot a sandbox into a new template","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/templates","href":"/api-reference/endpoints/templates/snapshot-a-sandbox-into-a-new-template"},{"title":"Get a template","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/templates/{id}","href":"/api-reference/endpoints/templates/get-a-template"},{"title":"Rename a template","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /api/app/templates/{id}","href":"/api-reference/endpoints/templates/rename-a-template"},{"title":"Delete a template","description":"Deletes a Template and its snapshot artifact. Irreversible. A Template id that doesn't exist — or one owned by someone else — returns `404 template_not_found` either way: the two cases are deliberately indistinguishable so a Template id cannot be probed for existence.","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/templates/{id}","href":"/api-reference/endpoints/templates/delete-a-template"},{"title":"Configure the template's public launch link","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/templates/{id}/launch","href":"/api-reference/endpoints/templates/configure-the-templates-public-launch-link"},{"title":"List a template's captured launch leads","description":"Lists the email leads captured by a Template's public launcher when its `entryMode` is `email`.","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/templates/{id}/leads","href":"/api-reference/endpoints/templates/list-a-templates-captured-launch-leads"}]},{"group":"Sites","pages":[{"title":"List sandboxes","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites","href":"/api-reference/endpoints/sites/list-sandboxes"},{"title":"Create a sandbox (or restore one from a template)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites","href":"/api-reference/endpoints/sites/create-a-sandbox-or-restore-one-from-a-template"},{"title":"Get a sandbox","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}","href":"/api-reference/endpoints/sites/get-a-sandbox"},{"title":"Rename a sandbox, or set whether it is permanent","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /api/app/sites/{id}","href":"/api-reference/endpoints/sites/rename-a-sandbox-or-set-whether-it-is-permanent"},{"title":"Restore an expired sandbox","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}","href":"/api-reference/endpoints/sites/restore-an-expired-sandbox"},{"title":"Delete a sandbox","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/sites/{id}","href":"/api-reference/endpoints/sites/delete-a-sandbox"},{"title":"Apply a blueprint to an existing sandbox","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/blueprint","href":"/api-reference/endpoints/sites/apply-a-blueprint-to-an-existing-sandbox"},{"title":"Issue a database (Adminer) access URL","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/database","href":"/api-reference/endpoints/sites/issue-a-database-adminer-access-url"},{"title":"Get the sandbox's custom domain","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/domain","href":"/api-reference/endpoints/sites/get-the-sandboxs-custom-domain"},{"title":"Connect a custom domain","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/app/sites/{id}/domain","href":"/api-reference/endpoints/sites/connect-a-custom-domain"},{"title":"Disconnect the custom domain","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/sites/{id}/domain","href":"/api-reference/endpoints/sites/disconnect-the-custom-domain"},{"title":"Check DNS for the custom domain","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/domain/verify","href":"/api-reference/endpoints/sites/check-dns-for-the-custom-domain"},{"title":"Get WordPress debug settings","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/debug","href":"/api-reference/endpoints/sites/get-wordpress-debug-settings"},{"title":"Replace WordPress debug settings","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/app/sites/{id}/debug","href":"/api-reference/endpoints/sites/replace-wordpress-debug-settings"},{"title":"Explain the debug log with AI","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/debug/explain","href":"/api-reference/endpoints/sites/explain-the-debug-log-with-ai"},{"title":"Tail the debug log","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/debug/log","href":"/api-reference/endpoints/sites/tail-the-debug-log"},{"title":"Clear the debug log","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/sites/{id}/debug/log","href":"/api-reference/endpoints/sites/clear-the-debug-log"},{"title":"Install or deploy a plugin","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/deploy-plugin","href":"/api-reference/endpoints/sites/install-or-deploy-a-plugin"},{"title":"Poll a plugin deploy job","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/deploy-plugin","href":"/api-reference/endpoints/sites/poll-a-plugin-deploy-job"},{"title":"Get captured outgoing email","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/email","href":"/api-reference/endpoints/sites/get-captured-outgoing-email"},{"title":"Turn email capture on or off","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/app/sites/{id}/email","href":"/api-reference/endpoints/sites/turn-email-capture-on-or-off"},{"title":"Clear the captured email log","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/sites/{id}/email","href":"/api-reference/endpoints/sites/clear-the-captured-email-log"},{"title":"File manager — read operations","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/fs/{op}","href":"/api-reference/endpoints/sites/file-manager-—-read-operations"},{"title":"File manager — write operations","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/fs/{op}","href":"/api-reference/endpoints/sites/file-manager-—-write-operations"},{"title":"Get PHP ini configuration","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/php-config","href":"/api-reference/endpoints/sites/get-php-ini-configuration"},{"title":"Replace PHP ini configuration","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/app/sites/{id}/php-config","href":"/api-reference/endpoints/sites/replace-php-ini-configuration"},{"title":"Switch the PHP runtime version","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/app/sites/{id}/php-version","href":"/api-reference/endpoints/sites/switch-the-php-runtime-version"},{"title":"List a sandbox's connected Git repositories","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/repositories","href":"/api-reference/endpoints/sites/list-a-sandboxs-connected-git-repositories"},{"title":"Connect a Git repository for deploys","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/repositories","href":"/api-reference/endpoints/sites/connect-a-git-repository-for-deploys"},{"title":"Update a connected repository","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /api/app/sites/{id}/repositories/{repoId}","href":"/api-reference/endpoints/sites/update-a-connected-repository"},{"title":"Disconnect a repository","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/sites/{id}/repositories/{repoId}","href":"/api-reference/endpoints/sites/disconnect-a-repository"},{"title":"List a repository's remote branches and tags","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/repositories/{repoId}/branches","href":"/api-reference/endpoints/sites/list-a-repositorys-remote-branches-and-tags"},{"title":"Trigger a deployment","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/repositories/{repoId}/deploy","href":"/api-reference/endpoints/sites/trigger-a-deployment"},{"title":"Reset a sandbox to a clean install","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/reset","href":"/api-reference/endpoints/sites/reset-a-sandbox-to-a-clean-install"},{"title":"Get SSH connection details","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/sites/{id}/ssh","href":"/api-reference/endpoints/sites/get-ssh-connection-details"},{"title":"Turn SSH on/off, or issue a one-click ephemeral key","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/sites/{id}/ssh","href":"/api-reference/endpoints/sites/turn-ssh-onoff-or-issue-a-one-click-ephemeral-key"},{"title":"Issue a one-time login link","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/sites/{id}/magic-login","href":"/api-reference/endpoints/sites/issue-a-one-time-login-link"},{"title":"Get sandbox status, events, and jobs","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/sites/{id}/status","href":"/api-reference/endpoints/sites/get-sandbox-status-events-and-jobs"}]},{"group":"Library","pages":[{"title":"List the Library","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/plugin-library","href":"/api-reference/endpoints/library/list-the-library"},{"title":"Add a plugin to the library","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/plugin-library","href":"/api-reference/endpoints/library/add-a-plugin-to-the-library"},{"title":"Remove a plugin from the library","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/plugin-library/{id}","href":"/api-reference/endpoints/library/remove-a-plugin-from-the-library"},{"title":"Store a license key for a library plugin","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/app/plugin-library/{id}/license-key","href":"/api-reference/endpoints/library/store-a-license-key-for-a-library-plugin"},{"title":"Remove a library plugin's license key","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/plugin-library/{id}/license-key","href":"/api-reference/endpoints/library/remove-a-library-plugins-license-key"}]},{"group":"Blueprints","pages":[{"title":"List saved Blueprints","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/blueprints","href":"/api-reference/endpoints/blueprints/list-saved-blueprints"},{"title":"Save a Blueprint","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/blueprints","href":"/api-reference/endpoints/blueprints/save-a-blueprint"},{"title":"Fetch a Blueprint from a URL","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/blueprints/import","href":"/api-reference/endpoints/blueprints/fetch-a-blueprint-from-a-url"},{"title":"Upload a Blueprint ZIP bundle","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/blueprints/upload","href":"/api-reference/endpoints/blueprints/upload-a-blueprint-zip-bundle"},{"title":"Generate a Blueprint from a description","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/blueprints/generate","href":"/api-reference/endpoints/blueprints/generate-a-blueprint-from-a-description"},{"title":"Validate or adapt a Blueprint","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/blueprints/validate","href":"/api-reference/endpoints/blueprints/validate-or-adapt-a-blueprint"},{"title":"Get a Blueprint","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/blueprints/{id}","href":"/api-reference/endpoints/blueprints/get-a-blueprint"},{"title":"Update a Blueprint","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /api/app/blueprints/{id}","href":"/api-reference/endpoints/blueprints/update-a-blueprint"},{"title":"Delete a Blueprint","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/blueprints/{id}","href":"/api-reference/endpoints/blueprints/delete-a-blueprint"},{"title":"List Blueprint runs","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/blueprints/{id}/runs","href":"/api-reference/endpoints/blueprints/list-blueprint-runs"},{"title":"Get a Blueprint run","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/blueprints/{id}/runs/{runId}","href":"/api-reference/endpoints/blueprints/get-a-blueprint-run"},{"title":"Bake a Blueprint into a Template","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/blueprints/{id}/bake","href":"/api-reference/endpoints/blueprints/bake-a-blueprint-into-a-template"},{"title":"Create a sandbox from a Blueprint","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/blueprints/{id}/sites","href":"/api-reference/endpoints/blueprints/create-a-sandbox-from-a-blueprint"}]},{"group":"Imports","pages":[{"title":"List imports","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/imports","href":"/api-reference/endpoints/imports/list-imports"},{"title":"Start an import upload","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/imports","href":"/api-reference/endpoints/imports/start-an-import-upload"},{"title":"Get import status","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/imports/{id}","href":"/api-reference/endpoints/imports/get-import-status"},{"title":"Cancel or remove an import","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/imports/{id}","href":"/api-reference/endpoints/imports/cancel-or-remove-an-import"},{"title":"Append an import archive chunk","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/app/imports/{id}/upload","href":"/api-reference/endpoints/imports/append-an-import-archive-chunk"},{"title":"Seal a chunked import upload","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/imports/{id}/complete","href":"/api-reference/endpoints/imports/seal-a-chunked-import-upload"},{"title":"Initialize direct multipart upload","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/imports/{id}/multipart/init","href":"/api-reference/endpoints/imports/initialize-direct-multipart-upload"},{"title":"Get a multipart part upload URL","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/imports/{id}/multipart/part","href":"/api-reference/endpoints/imports/get-a-multipart-part-upload-url"},{"title":"Complete a multipart upload","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/imports/{id}/multipart/complete","href":"/api-reference/endpoints/imports/complete-a-multipart-upload"},{"title":"Abort multipart upload","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/imports/{id}/multipart/abort","href":"/api-reference/endpoints/imports/abort-multipart-upload"},{"title":"Finalize a streamed import","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/imports/{id}/multipart/finalize","href":"/api-reference/endpoints/imports/finalize-a-streamed-import"}]},{"group":"Workspaces","pages":[{"title":"List available workspaces","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/workspaces","href":"/api-reference/endpoints/workspaces/list-available-workspaces"},{"title":"List workspace members","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/workspaces/{id}/members","href":"/api-reference/endpoints/workspaces/list-workspace-members"},{"title":"Invite a workspace member","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/workspaces/{id}/members","href":"/api-reference/endpoints/workspaces/invite-a-workspace-member"},{"title":"Assign a member role","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /api/app/workspaces/{id}/members/{userId}","href":"/api-reference/endpoints/workspaces/assign-a-member-role"},{"title":"Remove a workspace member","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/workspaces/{id}/members/{userId}","href":"/api-reference/endpoints/workspaces/remove-a-workspace-member"},{"title":"List workspace roles","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/app/workspaces/{id}/roles","href":"/api-reference/endpoints/workspaces/list-workspace-roles"},{"title":"Create a workspace role","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/app/workspaces/{id}/roles","href":"/api-reference/endpoints/workspaces/create-a-workspace-role"},{"title":"Update a workspace role","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /api/app/workspaces/{id}/roles/{roleId}","href":"/api-reference/endpoints/workspaces/update-a-workspace-role"},{"title":"Delete a workspace role","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/app/workspaces/{id}/roles/{roleId}","href":"/api-reference/endpoints/workspaces/delete-a-workspace-role"}]},{"group":"Account","pages":[{"title":"Get the current account identity","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/account/me","href":"/api-reference/endpoints/account/get-the-current-account-identity"},{"title":"Get plan usage","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/account/usage","href":"/api-reference/endpoints/account/get-plan-usage"},{"title":"List personal API tokens","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/account/tokens","href":"/api-reference/endpoints/account/list-personal-api-tokens"},{"title":"Create a personal API token","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/account/tokens","href":"/api-reference/endpoints/account/create-a-personal-api-token"},{"title":"Revoke a personal API token","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/account/tokens/{id}","href":"/api-reference/endpoints/account/revoke-a-personal-api-token"},{"title":"Get the Demo Launches webhook","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/account/webhooks/demo-launches","href":"/api-reference/endpoints/account/get-the-demo-launches-webhook"},{"title":"Create or update the Demo Launches webhook","deprecated":null,"version":null,"openapi":"/openapi.yaml put /api/account/webhooks/demo-launches","href":"/api-reference/endpoints/account/create-or-update-the-demo-launches-webhook"},{"title":"Remove the Demo Launches webhook","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/account/webhooks/demo-launches","href":"/api-reference/endpoints/account/remove-the-demo-launches-webhook"},{"title":"Send a Demo Launches webhook test","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/account/webhooks/demo-launches/test","href":"/api-reference/endpoints/account/send-a-demo-launches-webhook-test"},{"title":"Rotate the Demo Launches webhook secret","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/account/webhooks/demo-launches/rotate","href":"/api-reference/endpoints/account/rotate-the-demo-launches-webhook-secret"},{"title":"List account SSH public keys","deprecated":null,"version":null,"openapi":"/openapi.yaml get /api/account/ssh-keys","href":"/api-reference/endpoints/account/list-account-ssh-public-keys"},{"title":"Add an account SSH public key","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/account/ssh-keys","href":"/api-reference/endpoints/account/add-an-account-ssh-public-key"},{"title":"Revoke an account SSH key","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /api/account/ssh-keys/{id}","href":"/api-reference/endpoints/account/revoke-an-account-ssh-key"}]},{"group":"OAuth","pages":[{"title":"Dynamically register a public OAuth client","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/connect/register","href":"/api-reference/endpoints/oauth/dynamically-register-a-public-oauth-client"},{"title":"Exchange an authorization code for an access token","deprecated":null,"version":null,"openapi":"/openapi.yaml post /api/connect/token","href":"/api-reference/endpoints/oauth/exchange-an-authorization-code-for-an-access-token"}]}]}]},"basePath":"","title":"Configure the template's public launch link - SandyWP Documentation","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CBsVopKK.js","utils-DZAk68jJ.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D32AYZrP.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-D_A5_cny.js","snippetPresets-xNRfS9th.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BIB25-tq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CydJ4w4j.js","shallow-CYPBeQSG.js","getApiPlaygroundDisplay-A5xJVBOu.js","CodeSnippet-BVRTgi3m.js","CodeSnippets-DjD6BSlt.js","Page-Dr40SSJq.js","getPastedJson-D4V4JyrR.js","icon-uhcnG22T.js","MethodPill-CM-ZQdGH.js","DuplicateIcon-B_WnOiNf.js","createIcon-CJsb8utt.js","DynamicMarkdown-D-2HDKEp.js","SectionHeading-KP5xmMgQ.js","axios-vUo_bRtp.js","Markdown-D_k0dg6k.js","clsx-DK3K4Z1S.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DE3EVdvd.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-fN9H9n9g.js"]}