{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 402,
"title": "You need to upgrade your plan to access this feature",
"type": "payment_required"
}
{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 403,
"title": "You don't have the permissions to perform this action",
"type": "forbidden"
}
Builds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects//publish/ until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects//publish. To take the app offline, use DELETE /v1/projects//publish.
{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 402,
"title": "You need to upgrade your plan to access this feature",
"type": "payment_required"
}
{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 403,
"title": "You don't have the permissions to perform this action",
"type": "forbidden"
}
Who can open the published app; project reads report this value as publish_audience. A custom audience can include existing grants managed in the UI. Omit to keep the current setting.
Groups who can open the app; allowed only with audience custom. Providing a list replaces all group and user grants and removes workspace-wide access; an empty list removes those grants. Existing organization access and email invitations managed in the UI are preserved. Omit to preserve saved targets across audience changes. Targets are inactive outside custom mode. Null is not accepted.
Slug for the managed published URL: acme-landing-page gives https://acme-landing-page.lovable.app. Custom domains and workspace branding can change the hostname.
Example:
"acme-landing-page"
Response
Deployment started. Poll GET /v1/projects/{project_id}/publish/{deployment_id} (the Location header) with the returned id until deployment finishes.
Where to address the failure; see the operation description for the action for each class. Null when no failure category is available. More values may be added; for unknown values, show error_message and contact support instead of automatically retrying.
Deployment progress. running means the deployment was accepted and has not reported completion. completed means the deployment succeeded and url is set. unknown means the deployment exists but its workflow state has no recognized public mapping; it confirms neither success nor failure. Poll again with backoff and a bounded timeout, then report an indeterminate result if it persists. Unknown or mismatched deployment IDs return HTTP 404. Clients must tolerate new values.
URL produced by this successful deployment; null until this deployment succeeds, even when an older version is published.
Example:
"https://acme-landing-page.lovable.app"
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Lovable Documentation","description":"Lovable Documentation — Build full-stack websites with AI using natural language. Explore Lovable features, integrations, tutorials, and best practices.","colors":{"primary":"#0095FF","light":"#1AA3FF","dark":"#0084E6"},"logo":{"light":"https://mintcdn.com/lovable-f9060f1e/lZT1ihBcprll2Agr/assets/logo/logoblack.svg?fit=max\u0026auto=format\u0026n=lZT1ihBcprll2Agr\u0026q=85\u0026s=8d9eafaf19f94e27f0d13ac160d54f54","dark":"https://mintcdn.com/lovable-f9060f1e/lZT1ihBcprll2Agr/assets/logo/logowhite.svg?fit=max\u0026auto=format\u0026n=lZT1ihBcprll2Agr\u0026q=85\u0026s=fed1a7a9be6502f49d06a55cec77288c","href":"https://lovable.dev/"},"favicon":"https://mintcdn.com/lovable-f9060f1e/b_1_IEcMDh-0NUDG/assets/logo/favicon.svg?fit=max\u0026auto=format\u0026n=b_1_IEcMDh-0NUDG\u0026q=85\u0026s=a439abba3defb47beabd3f6e7d318cb5","api":{"playground":{"display":"interactive"},"examples":{"defaults":"required","languages":["curl"],"prefill":true,"autogenerate":true},"url":"full"},"navbar":{"links":[{"icon":"message","href":"https://lovable.dev/support","label":"Support"},{"icon":"blog","href":"https://lovable.dev/blog","label":"Blog"}],"primary":{"type":"button","label":"Start building for free","href":"https://lovable.dev/signup?utm_source=lovable_docs\u0026utm_medium=navigation"}},"footer":{"socials":{"x":"https://x.com/Lovable","github":"https://github.com/lovablelabs","linkedin":"https://linkedin.com/company/lovable-dev","youtube":"https://youtube.com/@lovable","discord":"https://discord.gg/lovable-dev","reddit":"https://www.reddit.com/r/lovable"}},"seo":{"metatags":{"og:image":"/assets/logo/opengraph-image.png","canonical":"https://docs.lovable.dev"},"indexing":"all"},"contextual":{"options":["copy","assistant","download-pdf","download-spec"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"lovable-f9060f1e","hasAudioNarration":false,"actualSubdomain":"lovable-f9060f1e","customDomains":["docs.lovable.dev"],"gitSource":{"type":"github","owner":"lovablelabs","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae26a764f7bcbb8db4d1dd6","collectionId":"d305deef-c12c-45ea-971f-dc7e80bb91a1","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae26a764f7bcbb8db4d1dd6"},"feedback":{"thumbs":true,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae26a764f7bcbb8db4d1dd6","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"Documentation","count":272},{"language":"default","tag":"Connect","count":125},{"language":"default","tag":"Connector catalog","count":113},{"language":"default","tag":"Build","count":68},{"language":"default","tag":"API Reference","count":33},{"language":"default","tag":"Workspace \u0026 account","count":29},{"language":"default","tag":"Lovable API","count":27},{"language":"default","tag":"Endpoints","count":25},{"language":"default","tag":"Data \u0026 databases","count":21},{"language":"default","tag":"Backend","count":19}]},"assistantConfig":{"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"deflection":{"enabled":true,"type":"link","email":"support@lovable.dev","url":"https://lovable.dev/support"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"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":"editor-v7-file-tree","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":"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":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"instinct-self-updating-docs","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"assets/css/styles.css","content":".supabase{color:#59cf8c}"}],"page":{"pagePath":"api-reference/deploy-domains/publish-project","slug":"/api-reference/deploy-domains/publish-project","pageMetadata":{"title":"Publish project","description":"**Plan:** `Business or higher`\n\n**Scope:** `projects:write`\n\nBuilds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects/{project_id}/publish/{deployment_id} until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects/{project_id}/publish. To take the app offline, use DELETE /v1/projects/{project_id}/publish.","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest post /v1/projects/{project_id}/publish","href":"/api-reference/deploy-domains/publish-project","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 p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Plan:\"\n }), \" \", _jsx(_components.code, {\n children: \"Business or higher\"\n })]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Scope:\"\n }), \" \", _jsx(_components.code, {\n children: \"projects:write\"\n })]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Builds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects/\", \"/publish/\", \" until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects/\", \"/publish. To take the app offline, use DELETE /v1/projects/\", \"/publish.\"]\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":"Publish project","description":"**Plan:** `Business or higher`\n\n**Scope:** `projects:write`\n\nBuilds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects/{project_id}/publish/{deployment_id} until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects/{project_id}/publish. To take the app offline, use DELETE /v1/projects/{project_id}/publish.","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest post /v1/projects/{project_id}/publish","href":"/api-reference/deploy-domains/publish-project","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/lovable-f9060f1e/84f62c0d01f1469d/sign-in-with-lovable-demo.js"],"openApiReferenceData":{"operation":{"description":"**Plan:** `Business or higher`\n\n**Scope:** `projects:write`\n\nBuilds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects/{project_id}/publish/{deployment_id} until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects/{project_id}/publish. To take the app offline, use DELETE /v1/projects/{project_id}/publish.","operationId":"publishProject","parameters":["ed2290a7-f946-41c0-ac36-e2651d3054ab","23b6a9b3-afff-467d-a2cb-ac2eb9ea7b4e","35a5aaa7-a667-4283-9c92-430391d5f860"],"requestBody":"bf4f6c96-c47c-4d5c-af7a-bfd881f92fdf","responses":{"202":"7a8e4d81-db99-4ce0-8b6d-656b3ded4f56","400":"17793e36-e4a4-4e0c-bce2-2cdaca7d9b34","401":"44835967-46a4-4c23-ab97-7dfddc0260f3","402":"c43c6cf0-f744-4536-a573-f2d3e71b0eea","403":"79547d13-f4b9-4c07-a7b3-af26c0327a28","404":"4355f5a7-0129-4044-99a3-5a020e475831","406":"b9bd76f9-6084-493d-9bed-25d9216d567c","429":"3928f81b-33ef-4b66-879e-eeb4fd6a7085","503":"502e5430-543c-4d33-9f86-44da6ab7c5b4","default":"94250ff6-fadd-4cd9-8f4a-5b5ab4c5d39b"},"security":["a595c54e-86e0-4121-a410-147db231ec7f","a60ac5eb-2723-4673-9d20-b2b350e918d0"],"summary":"Publish project","tags":["deploy-domains"],"x-codeSamples":[{"label":"cURL","lang":"bash","source":"curl --request POST \\\n --url 'https://api.lovable.dev/v1/projects/project-id/publish' \\\n --header 'Lovable-API-Key: lov_your-api-key' \\\n --header 'Lovable-Version: 2026-09-11' \\\n --header 'Content-Type: application/json' \\\n --data '{}'"},{"label":"JavaScript","lang":"javascript","source":"const response = await fetch(\"https://api.lovable.dev/v1/projects/project-id/publish\", {\n method: \"POST\",\n headers: {\n \"Lovable-API-Key\": process.env.LOVABLE_API_KEY ?? \"lov_your-api-key\",\n \"Lovable-Version\": \"2026-09-11\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({}),\n});\nif (!response.ok) {\n throw new Error(`Lovable API ${response.status}: ${await response.text()}`);\n}\nconsole.log(await response.json());"}],"x-rateLimit":{"app_limiters":[{"class":"publish","default_limits":[{"limit":10,"scope":"authenticated_user","window_seconds":60}],"description":"Limit on requests to build and publish projects."},{"class":"mcp_free_build","default_limits":[{"condition":"Free workspace MCP callers","limit":10,"scope":"authenticated_user","window_seconds":600},{"condition":"Free workspace MCP callers","limit":30,"scope":"workspace","window_seconds":600}],"description":"Additional build-action bucket for free workspace MCP callers.","notes":["Applies only when the client source is MCP and the workspace tier is free."]},{"class":"general","default_limits":[{"condition":"API key auth","limit":12000,"scope":"api_key","window_seconds":1800},{"condition":"Session or OAuth auth","limit":12000,"scope":"authenticated_user","window_seconds":1800}],"description":"General request limit: one bucket per API key, or the user's bucket shared with Lovable sessions for session and OAuth callers."}],"class":"publish","default_limits":[{"limit":10,"scope":"authenticated_user","window_seconds":60}]},"method":"post","type":"path","servers":["d46911fb-5480-4a8c-8d9c-9fa4a467e1fa"],"path":"/v1/projects/{project_id}/publish","baseUrlOptions":["https://api.lovable.dev"],"title":"Publish project","codeSamples":[{"label":"cURL","lang":"bash","source":"curl --request POST \\\n --url 'https://api.lovable.dev/v1/projects/project-id/publish' \\\n --header 'Lovable-API-Key: lov_your-api-key' \\\n --header 'Lovable-Version: 2026-09-11' \\\n --header 'Content-Type: application/json' \\\n --data '{}'"},{"label":"JavaScript","lang":"javascript","source":"const response = await fetch(\"https://api.lovable.dev/v1/projects/project-id/publish\", {\n method: \"POST\",\n headers: {\n \"Lovable-API-Key\": process.env.LOVABLE_API_KEY ?? \"lov_your-api-key\",\n \"Lovable-Version\": \"2026-09-11\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({}),\n});\nif (!response.ok) {\n throw new Error(`Lovable API ${response.status}: ${await response.text()}`);\n}\nconsole.log(await response.json());"}],"requestExampleLanguages":["bash"],"requiredOnlyExamples":true,"requestExampleType":"codeSamples","responseExampleType":"generated","prefillPlaygroundWithExample":true,"prefillPlaygroundExamples":[{"body.audience":"custom","body.audience_targets.items.0.id":"grp_01jw3k9m2xq8r5v0c7d4e6f2gh","body.audience_targets.items.0.type":"group","body.name":"acme-landing-page"}],"urlDisplay":"full"},"dependencies":{"parameters":{"ed2290a7-f946-41c0-ac36-e2651d3054ab":{"description":"Project ID.","example":"prj_01jw3k9m2xq8r5v0c7d4e6f2gh","in":"path","name":"project_id","required":true,"schema":{"description":"Project ID.","examples":["prj_01jw3k9m2xq8r5v0c7d4e6f2gh"],"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"}},"23b6a9b3-afff-467d-a2cb-ac2eb9ea7b4e":{"description":"Stable API version to serve, as a YYYY-MM-DD date. Omit for the oldest supported stable version, currently 2026-09-11.","example":"2026-09-11","in":"header","name":"Lovable-Version","schema":{"type":"string","description":"Stable API version to serve, as a YYYY-MM-DD date. Omit for the oldest supported stable version, currently 2026-09-11.","uniqueKey":"","typeLabel":"string"}},"35a5aaa7-a667-4283-9c92-430391d5f860":{"description":"Comma-separated beta revision strings to enable on top of the stable version.","in":"header","name":"Lovable-Beta","schema":{"type":"string","description":"Comma-separated beta revision strings to enable on top of the stable version.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"audience":{"description":"Who can open the published app; project reads report this value as publish_audience. A custom audience can include existing grants managed in the UI. Omit to keep the current setting.","enum":["public","workspace","custom"],"examples":["custom"],"type":"string","uniqueKey":"audience","typeLabel":"enum\u003cstring>"},"audience_targets":{"description":"Groups who can open the app; allowed only with audience custom. Providing a list replaces all group and user grants and removes workspace-wide access; an empty list removes those grants. Existing organization access and email invitations managed in the UI are preserved. Omit to preserve saved targets across audience changes. Targets are inactive outside custom mode. Null is not accepted.","examples":[[{"id":"grp_01jw3k9m2xq8r5v0c7d4e6f2gh","type":"group"}]],"items":{"additionalProperties":false,"properties":{"id":{"description":"Group ID, as returned by GET /v1/workspaces/{workspace_id}/groups.","examples":["grp_01jw3k9m2xq8r5v0c7d4e6f2gh"],"minLength":1,"type":"string","isRequired":true,"uniqueKey":"audience_targets.items.[INDEX].id","typeLabel":"string"},"type":{"description":"Audience target type. Only group targets are supported.","enum":["group"],"examples":["group"],"type":"string","isRequired":true,"uniqueKey":"audience_targets.items.[INDEX].type","typeLabel":"enum\u003cstring>"}},"required":["type","id"],"type":"object","uniqueKey":"audience_targets.items.[INDEX]","typeLabel":"object"},"maxItems":100,"type":"array","uniqueKey":"audience_targets","typeLabel":"object[]"},"name":{"description":"Slug for the managed published URL: acme-landing-page gives https://acme-landing-page.lovable.app. Custom domains and workspace branding can change the hostname.","examples":["acme-landing-page"],"type":"string","uniqueKey":"name","typeLabel":"string"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"audience":"custom","audience_targets":[{"id":"grp_01jw3k9m2xq8r5v0c7d4e6f2gh","type":"group"}],"name":"acme-landing-page"}}},"exampleType":"generated"}},"required":true,"exampleType":"generated"},"responses":{"7a8e4d81-db99-4ce0-8b6d-656b3ded4f56":{"content":{"application/json":{"schema":{"properties":{"error_class":{"oneOf":[{"description":"Where to address the failure; see the operation description for the action for each class. Null when no failure category is available. More values may be added; for unknown values, show error_message and contact support instead of automatically retrying.","enum":["transient","code","configuration","data","integration","policy","internal",null],"examples":["configuration"],"type":"string","isRequired":true,"uniqueKey":"error_class.oneOf.0","typeLabel":"enum\u003cstring>"},{"description":"Where to address the failure; see the operation description for the action for each class. Null when no failure category is available. More values may be added; for unknown values, show error_message and contact support instead of automatically retrying.","enum":["transient","code","configuration","data","integration","policy","internal",null],"examples":["configuration"],"type":"null","isRequired":true,"uniqueKey":"error_class.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error_class","typeLabel":"enum\u003cstring> | null"},"error_message":{"oneOf":[{"description":"Human-readable reason for a deployment failure; null unless the deployment failed.","examples":["Missing environment variable VITE_API_URL"],"type":"string","isRequired":true,"uniqueKey":"error_message.oneOf.0","typeLabel":"string"},{"description":"Human-readable reason for a deployment failure; null unless the deployment failed.","examples":["Missing environment variable VITE_API_URL"],"type":"null","isRequired":true,"uniqueKey":"error_message.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error_message","typeLabel":"string | null"},"id":{"description":"Deployment ID.","examples":["c3d4e5f6-a7b8-9012-cdef-345678901234"],"type":"string","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"status":{"description":"Deployment progress. running means the deployment was accepted and has not reported completion. completed means the deployment succeeded and url is set. unknown means the deployment exists but its workflow state has no recognized public mapping; it confirms neither success nor failure. Poll again with backoff and a bounded timeout, then report an indeterminate result if it persists. Unknown or mismatched deployment IDs return HTTP 404. Clients must tolerate new values.","enum":["running","completed","error","unknown"],"examples":["completed"],"type":"string","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"url":{"oneOf":[{"description":"URL produced by this successful deployment; null until this deployment succeeds, even when an older version is published.","examples":["https://acme-landing-page.lovable.app"],"type":"string","isRequired":true,"uniqueKey":"url.oneOf.0","typeLabel":"string"},{"description":"URL produced by this successful deployment; null until this deployment succeeds, even when an older version is published.","examples":["https://acme-landing-page.lovable.app"],"type":"null","isRequired":true,"uniqueKey":"url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"url","typeLabel":"string | null"}},"required":["id","status","url","error_message","error_class"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error_class":"configuration","error_message":"Missing environment variable VITE_API_URL","id":"c3d4e5f6-a7b8-9012-cdef-345678901234","status":"completed","url":"https://acme-landing-page.lovable.app"}}},"exampleType":"generated"}},"description":"Deployment started. Poll GET /v1/projects/{project_id}/publish/{deployment_id} (the Location header) with the returned id until deployment finishes.","headers":{"Location":{"schema":{"description":"Relative URL of the deployment to poll: /v1/projects/{project_id}/publish/{deployment_id}.","type":"string"}},"Lovable-Beta":{"description":"Beta revisions applied to the request, comma-separated. Present only when the request selected beta revisions.","schema":{"type":"string"}},"Lovable-Version":{"description":"Stable API version that served the request. Absent when the request was rejected before version selection or when selection itself failed.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"generated"},"17793e36-e4a4-4e0c-bce2-2cdaca7d9b34":{"content":{"application/json":{"example":{"detail":"validation failed","errors":[{"location":"body.members","message":"expected array length >= 1"}],"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":400,"title":"Bad Request","type":"invalid_request"},"schema":{"description":"Common error response. An operation may document a different response body for a specific status code, such as per-member results for a bulk credit-limit update.","properties":{"detail":{"oneOf":[{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"string","isRequired":true,"uniqueKey":"detail.oneOf.0","typeLabel":"string"},{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"null","isRequired":true,"uniqueKey":"detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"detail","typeLabel":"string | null"},"errors":{"oneOf":[{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location","typeLabel":"string | null"},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].message","typeLabel":"string"}},"required":["location","message"],"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null"}]},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string"}},"required":["location","message"],"type":"object"},"type":"null","isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"object[] | null"},"props":{"oneOf":[{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"object","isRequired":true,"uniqueKey":"props.oneOf.0","typeLabel":"object"},{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"null","isRequired":true,"uniqueKey":"props.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"props","typeLabel":"object | null"},"request_id":{"description":"Identifier of this request, echoed from the X-Request-Id response header. Quote it when reporting a failure.","example":"4bf92f3577b34da6a3ce929d0e0e4736","type":"string","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"status":{"description":"HTTP status code, echoed in the body.","example":429,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"description":"Human-readable error summary. The wording may change; use type to decide how your application handles the error.","example":"Too Many Requests","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"Stable machine-readable error type: a snake_case token such as rate_limited, not a URI. Clients may switch on it; new types are additive.","example":"rate_limited","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"}},"required":["type","title","status","request_id","detail","props","errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":"validation failed","errors":[{"location":"body.members","message":"expected array length >= 1"}],"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":400,"title":"Bad Request","type":"invalid_request"}}},"exampleType":"examples"}},"description":"The request body or parameters are malformed or fail validation. Each failing field is listed in errors.","headers":{"Lovable-Beta":{"description":"Beta revisions applied to the request, comma-separated. Present only when the request selected beta revisions.","schema":{"type":"string"}},"Lovable-Version":{"description":"Stable API version that served the request. Absent when the request was rejected before version selection or when selection itself failed.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"examples"},"44835967-46a4-4c23-ab97-7dfddc0260f3":{"content":{"application/json":{"example":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":401,"title":"Authorization header required","type":"unauthorized"},"schema":{"description":"Common error response. An operation may document a different response body for a specific status code, such as per-member results for a bulk credit-limit update.","properties":{"detail":{"oneOf":[{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"string","isRequired":true,"uniqueKey":"detail.oneOf.0","typeLabel":"string"},{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"null","isRequired":true,"uniqueKey":"detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"detail","typeLabel":"string | null"},"errors":{"oneOf":[{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location","typeLabel":"string | null"},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].message","typeLabel":"string"}},"required":["location","message"],"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null"}]},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string"}},"required":["location","message"],"type":"object"},"type":"null","isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"object[] | null"},"props":{"oneOf":[{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"object","isRequired":true,"uniqueKey":"props.oneOf.0","typeLabel":"object"},{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"null","isRequired":true,"uniqueKey":"props.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"props","typeLabel":"object | null"},"request_id":{"description":"Identifier of this request, echoed from the X-Request-Id response header. Quote it when reporting a failure.","example":"4bf92f3577b34da6a3ce929d0e0e4736","type":"string","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"status":{"description":"HTTP status code, echoed in the body.","example":429,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"description":"Human-readable error summary. The wording may change; use type to decide how your application handles the error.","example":"Too Many Requests","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"Stable machine-readable error type: a snake_case token such as rate_limited, not a URI. Clients may switch on it; new types are additive.","example":"rate_limited","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"}},"required":["type","title","status","request_id","detail","props","errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":401,"title":"Authorization header required","type":"unauthorized"}}},"exampleType":"examples"}},"description":"Missing or invalid API key, session token, or OAuth access token.","headers":{"WWW-Authenticate":{"description":"Authentication challenge identifying the supported authentication scheme.","example":"Bearer","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"examples"},"c43c6cf0-f744-4536-a573-f2d3e71b0eea":{"content":{"application/json":{"example":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":402,"title":"You need to upgrade your plan to access this feature","type":"payment_required"},"schema":{"description":"Common error response. An operation may document a different response body for a specific status code, such as per-member results for a bulk credit-limit update.","properties":{"detail":{"oneOf":[{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"string","isRequired":true,"uniqueKey":"detail.oneOf.0","typeLabel":"string"},{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"null","isRequired":true,"uniqueKey":"detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"detail","typeLabel":"string | null"},"errors":{"oneOf":[{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location","typeLabel":"string | null"},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].message","typeLabel":"string"}},"required":["location","message"],"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null"}]},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string"}},"required":["location","message"],"type":"object"},"type":"null","isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"object[] | null"},"props":{"oneOf":[{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"object","isRequired":true,"uniqueKey":"props.oneOf.0","typeLabel":"object"},{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"null","isRequired":true,"uniqueKey":"props.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"props","typeLabel":"object | null"},"request_id":{"description":"Identifier of this request, echoed from the X-Request-Id response header. Quote it when reporting a failure.","example":"4bf92f3577b34da6a3ce929d0e0e4736","type":"string","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"status":{"description":"HTTP status code, echoed in the body.","example":429,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"description":"Human-readable error summary. The wording may change; use type to decide how your application handles the error.","example":"Too Many Requests","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"Stable machine-readable error type: a snake_case token such as rate_limited, not a URI. Clients may switch on it; new types are additive.","example":"rate_limited","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"}},"required":["type","title","status","request_id","detail","props","errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":402,"title":"You need to upgrade your plan to access this feature","type":"payment_required"}}},"exampleType":"examples"}},"description":"Public API access requires Business or higher. Some operations or configurations require an additional feature entitlement.","headers":{"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"examples"},"79547d13-f4b9-4c07-a7b3-af26c0327a28":{"content":{"application/json":{"example":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":403,"title":"You don't have the permissions to perform this action","type":"forbidden"},"schema":{"description":"Common error response. An operation may document a different response body for a specific status code, such as per-member results for a bulk credit-limit update.","properties":{"detail":{"oneOf":[{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"string","isRequired":true,"uniqueKey":"detail.oneOf.0","typeLabel":"string"},{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"null","isRequired":true,"uniqueKey":"detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"detail","typeLabel":"string | null"},"errors":{"oneOf":[{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location","typeLabel":"string | null"},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].message","typeLabel":"string"}},"required":["location","message"],"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null"}]},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string"}},"required":["location","message"],"type":"object"},"type":"null","isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"object[] | null"},"props":{"oneOf":[{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"object","isRequired":true,"uniqueKey":"props.oneOf.0","typeLabel":"object"},{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"null","isRequired":true,"uniqueKey":"props.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"props","typeLabel":"object | null"},"request_id":{"description":"Identifier of this request, echoed from the X-Request-Id response header. Quote it when reporting a failure.","example":"4bf92f3577b34da6a3ce929d0e0e4736","type":"string","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"status":{"description":"HTTP status code, echoed in the body.","example":429,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"description":"Human-readable error summary. The wording may change; use type to decide how your application handles the error.","example":"Too Many Requests","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"Stable machine-readable error type: a snake_case token such as rate_limited, not a URI. Clients may switch on it; new types are additive.","example":"rate_limited","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"}},"required":["type","title","status","request_id","detail","props","errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":403,"title":"You don't have the permissions to perform this action","type":"forbidden"}}},"exampleType":"examples"}},"description":"The key or caller lacks the required scope or permission. For email_not_verified, verify the account email before retrying.","headers":{"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"examples"},"4355f5a7-0129-4044-99a3-5a020e475831":{"content":{"application/json":{"example":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":404,"title":"Not Found","type":"project_not_found"},"schema":{"description":"Common error response. An operation may document a different response body for a specific status code, such as per-member results for a bulk credit-limit update.","properties":{"detail":{"oneOf":[{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"string","isRequired":true,"uniqueKey":"detail.oneOf.0","typeLabel":"string"},{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"null","isRequired":true,"uniqueKey":"detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"detail","typeLabel":"string | null"},"errors":{"oneOf":[{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location","typeLabel":"string | null"},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].message","typeLabel":"string"}},"required":["location","message"],"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null"}]},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string"}},"required":["location","message"],"type":"object"},"type":"null","isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"object[] | null"},"props":{"oneOf":[{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"object","isRequired":true,"uniqueKey":"props.oneOf.0","typeLabel":"object"},{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"null","isRequired":true,"uniqueKey":"props.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"props","typeLabel":"object | null"},"request_id":{"description":"Identifier of this request, echoed from the X-Request-Id response header. Quote it when reporting a failure.","example":"4bf92f3577b34da6a3ce929d0e0e4736","type":"string","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"status":{"description":"HTTP status code, echoed in the body.","example":429,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"description":"Human-readable error summary. The wording may change; use type to decide how your application handles the error.","example":"Too Many Requests","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"Stable machine-readable error type: a snake_case token such as rate_limited, not a URI. Clients may switch on it; new types are additive.","example":"rate_limited","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"}},"required":["type","title","status","request_id","detail","props","errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":404,"title":"Not Found","type":"project_not_found"}}},"exampleType":"examples"}},"description":"The project does not exist, has been deleted, or is not accessible to the authenticated client.","headers":{"Lovable-Beta":{"description":"Beta revisions applied to the request, comma-separated. Present only when the request selected beta revisions.","schema":{"type":"string"}},"Lovable-Version":{"description":"Stable API version that served the request. Absent when the request was rejected before version selection or when selection itself failed.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"examples"},"b9bd76f9-6084-493d-9bed-25d9216d567c":{"content":{"application/json":{"example":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":406,"title":"This endpoint produces application/json. Send a matching Accept header, */*, or omit the header.","type":"not_acceptable"},"schema":{"description":"Common error response. An operation may document a different response body for a specific status code, such as per-member results for a bulk credit-limit update.","properties":{"detail":{"oneOf":[{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"string","isRequired":true,"uniqueKey":"detail.oneOf.0","typeLabel":"string"},{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"null","isRequired":true,"uniqueKey":"detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"detail","typeLabel":"string | null"},"errors":{"oneOf":[{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location","typeLabel":"string | null"},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].message","typeLabel":"string"}},"required":["location","message"],"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null"}]},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string"}},"required":["location","message"],"type":"object"},"type":"null","isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"object[] | null"},"props":{"oneOf":[{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"object","isRequired":true,"uniqueKey":"props.oneOf.0","typeLabel":"object"},{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"null","isRequired":true,"uniqueKey":"props.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"props","typeLabel":"object | null"},"request_id":{"description":"Identifier of this request, echoed from the X-Request-Id response header. Quote it when reporting a failure.","example":"4bf92f3577b34da6a3ce929d0e0e4736","type":"string","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"status":{"description":"HTTP status code, echoed in the body.","example":429,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"description":"Human-readable error summary. The wording may change; use type to decide how your application handles the error.","example":"Too Many Requests","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"Stable machine-readable error type: a snake_case token such as rate_limited, not a URI. Clients may switch on it; new types are additive.","example":"rate_limited","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"}},"required":["type","title","status","request_id","detail","props","errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":406,"title":"This endpoint produces application/json. Send a matching Accept header, */*, or omit the header.","type":"not_acceptable"}}},"exampleType":"examples"}},"description":"The Accept header excludes every media type this endpoint produces.","headers":{"Lovable-Beta":{"description":"Beta revisions applied to the request, comma-separated. Present only when the request selected beta revisions.","schema":{"type":"string"}},"Lovable-Version":{"description":"Stable API version that served the request. Absent when the request was rejected before version selection or when selection itself failed.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"examples"},"3928f81b-33ef-4b66-879e-eeb4fd6a7085":{"content":{"application/json":{"example":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":429,"title":"Too Many Requests","type":"rate_limited"},"schema":{"description":"Common error response. An operation may document a different response body for a specific status code, such as per-member results for a bulk credit-limit update.","properties":{"detail":{"oneOf":[{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"string","isRequired":true,"uniqueKey":"detail.oneOf.0","typeLabel":"string"},{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"null","isRequired":true,"uniqueKey":"detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"detail","typeLabel":"string | null"},"errors":{"oneOf":[{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location","typeLabel":"string | null"},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].message","typeLabel":"string"}},"required":["location","message"],"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null"}]},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string"}},"required":["location","message"],"type":"object"},"type":"null","isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"object[] | null"},"props":{"oneOf":[{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"object","isRequired":true,"uniqueKey":"props.oneOf.0","typeLabel":"object"},{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"null","isRequired":true,"uniqueKey":"props.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"props","typeLabel":"object | null"},"request_id":{"description":"Identifier of this request, echoed from the X-Request-Id response header. Quote it when reporting a failure.","example":"4bf92f3577b34da6a3ce929d0e0e4736","type":"string","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"status":{"description":"HTTP status code, echoed in the body.","example":429,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"description":"Human-readable error summary. The wording may change; use type to decide how your application handles the error.","example":"Too Many Requests","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"Stable machine-readable error type: a snake_case token such as rate_limited, not a URI. Clients may switch on it; new types are additive.","example":"rate_limited","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"}},"required":["type","title","status","request_id","detail","props","errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":429,"title":"Too Many Requests","type":"rate_limited"}}},"exampleType":"examples"}},"description":"Too many requests. Retry after the interval in Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Present when the limiter can compute a retry delay.","schema":{"minimum":1,"type":"integer"}},"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"examples"},"502e5430-543c-4d33-9f86-44da6ab7c5b4":{"content":{"application/json":{"example":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":503,"title":"Request timed out","type":"request_timeout"},"schema":{"description":"Common error response. An operation may document a different response body for a specific status code, such as per-member results for a bulk credit-limit update.","properties":{"detail":{"oneOf":[{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"string","isRequired":true,"uniqueKey":"detail.oneOf.0","typeLabel":"string"},{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"null","isRequired":true,"uniqueKey":"detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"detail","typeLabel":"string | null"},"errors":{"oneOf":[{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location","typeLabel":"string | null"},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].message","typeLabel":"string"}},"required":["location","message"],"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null"}]},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string"}},"required":["location","message"],"type":"object"},"type":"null","isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"object[] | null"},"props":{"oneOf":[{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"object","isRequired":true,"uniqueKey":"props.oneOf.0","typeLabel":"object"},{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"null","isRequired":true,"uniqueKey":"props.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"props","typeLabel":"object | null"},"request_id":{"description":"Identifier of this request, echoed from the X-Request-Id response header. Quote it when reporting a failure.","example":"4bf92f3577b34da6a3ce929d0e0e4736","type":"string","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"status":{"description":"HTTP status code, echoed in the body.","example":429,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"description":"Human-readable error summary. The wording may change; use type to decide how your application handles the error.","example":"Too Many Requests","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"Stable machine-readable error type: a snake_case token such as rate_limited, not a URI. Clients may switch on it; new types are additive.","example":"rate_limited","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"}},"required":["type","title","status","request_id","detail","props","errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":null,"errors":null,"props":null,"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":503,"title":"Request timed out","type":"request_timeout"}}},"exampleType":"examples"}},"description":"The service is temporarily unavailable, or the processing deadline expired (request_timeout). A mutation may still complete; check resource state before retrying.","headers":{"Lovable-Beta":{"description":"Beta revisions applied to the request, comma-separated. Present only when the request selected beta revisions.","schema":{"type":"string"}},"Lovable-Version":{"description":"Stable API version that served the request. Absent when the request was rejected before version selection or when selection itself failed.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"examples"},"94250ff6-fadd-4cd9-8f4a-5b5ab4c5d39b":{"content":{"application/json":{"schema":{"description":"Common error response. An operation may document a different response body for a specific status code, such as per-member results for a bulk credit-limit update.","properties":{"detail":{"oneOf":[{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"string","isRequired":true,"uniqueKey":"detail.oneOf.0","typeLabel":"string"},{"description":"Human-readable guidance for this occurrence, or null when inapplicable. For invalid_request this is validation failed; the actionable field messages are in errors. Other error types may provide guidance such as re-authentication instructions.","example":"validation failed","type":"null","isRequired":true,"uniqueKey":"detail.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"detail","typeLabel":"string | null"},"errors":{"oneOf":[{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.0","typeLabel":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].location","typeLabel":"string | null"},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.0.items.[INDEX].message","typeLabel":"string"}},"required":["location","message"],"type":"object","uniqueKey":"errors.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"object[]"},{"description":"Field-level error details on validation failures; null when no field-level details apply.","example":[{"location":"body.workspace_id","message":"expected string"}],"items":{"properties":{"location":{"oneOf":[{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"string"},{"description":"Request field that failed validation, such as body.workspace_id or query.limit; null when the failure has no field location.","example":"body.workspace_id","type":"null"}]},"message":{"description":"Explanation of the validation failure for this field.","example":"expected string","type":"string"}},"required":["location","message"],"type":"object"},"type":"null","isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"object[] | null"},"props":{"oneOf":[{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"object","isRequired":true,"uniqueKey":"props.oneOf.0","typeLabel":"object"},{"description":"Error-specific metadata, or null when inapplicable. Keys depend on type: security_critical_findings includes finding_refs (an array of strings); retired_version and retired_beta may include migration_url (a string URL). Ignore unrecognized keys.","example":{"finding_refs":["supabase/finding-1"]},"type":"null","isRequired":true,"uniqueKey":"props.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"props","typeLabel":"object | null"},"request_id":{"description":"Identifier of this request, echoed from the X-Request-Id response header. Quote it when reporting a failure.","example":"4bf92f3577b34da6a3ce929d0e0e4736","type":"string","isRequired":true,"uniqueKey":"request_id","typeLabel":"string"},"status":{"description":"HTTP status code, echoed in the body.","example":429,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"description":"Human-readable error summary. The wording may change; use type to decide how your application handles the error.","example":"Too Many Requests","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"Stable machine-readable error type: a snake_case token such as rate_limited, not a URI. Clients may switch on it; new types are additive.","example":"rate_limited","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"}},"required":["type","title","status","request_id","detail","props","errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":"validation failed","errors":[{"location":"body.workspace_id","message":"expected string"}],"props":{"finding_refs":["supabase/finding-1"]},"request_id":"4bf92f3577b34da6a3ce929d0e0e4736","status":429,"title":"Too Many Requests","type":"rate_limited"}}},"exampleType":"generated"}},"description":"Error. The response body uses the standard error envelope; status matches the HTTP status code and type is a machine-readable error code.","headers":{"Lovable-Beta":{"description":"Beta revisions applied to the request, comma-separated. Present only when the request selected beta revisions.","schema":{"type":"string"}},"Lovable-Version":{"description":"Stable API version that served the request. Absent when the request was rejected before version selection or when selection itself failed.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params":{"description":"Present only when the request carried query parameters this operation does not declare. Comma-separated, URL-escaped names of the ignored parameters, at most 20.","schema":{"type":"string"}},"X-Lovable-Unknown-Query-Params-Omitted":{"description":"Present with X-Lovable-Unknown-Query-Params when more than 20 unknown parameters were ignored. Number of names left out of that header.","schema":{"minimum":1,"type":"integer"}},"X-RateLimit-Limit":{"description":"Maximum requests per time window for the rate limit closest to exhaustion. All three X-RateLimit headers describe that same limit.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests still available under the limit described by X-RateLimit-Limit.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the limit described by X-RateLimit-Limit next regains capacity. Omitted when unknown.","schema":{"type":"integer"}},"X-Request-Id":{"description":"Identifier of this request. Matches request_id in the error envelope; quote it when reporting a failure.","schema":{"type":"string"}}},"exampleType":"generated"}},"security":{"a595c54e-86e0-4121-a410-147db231ec7f":{"LovableAPIKey":{"description":"Lovable API key. Send its value in the Lovable-API-Key header.","in":"header","name":"Lovable-API-Key","type":"apiKey","scopes":["projects:write"],"schemeName":"LovableAPIKey"}},"a60ac5eb-2723-4673-9d20-b2b350e918d0":{"BearerAuth":{"bearerFormat":"JWT","description":"Lovable session token or OAuth access token. Send it in the Authorization header as Bearer \u003ctoken>.","scheme":"bearer","type":"http","scopes":["projects:write"],"schemeName":"BearerAuth"}}},"servers":{"d46911fb-5480-4a8c-8d9c-9fa4a467e1fa":{"description":"Production","url":"https://api.lovable.dev"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"description":"Lovable API key. Send its value in the Lovable-API-Key header.","in":"header","name":"Lovable-API-Key","type":"apiKey","scopes":["projects:write"],"schemeName":"LovableAPIKey"},"schema":{"title":"Lovable-API-Key","type":"string","description":"Lovable API key. Send its value in the Lovable-API-Key header.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"LovableAPIKey","name":"Lovable-API-Key"}],"title":"LovableAPIKey"},{"schemes":[{"scheme":{"bearerFormat":"JWT","description":"Lovable session token or OAuth access token. Send it in the Authorization header as Bearer \u003ctoken>.","scheme":"bearer","type":"http","scopes":["projects:write"],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Lovable session token or OAuth access token. Send it in the Authorization header as Bearer \u003ctoken>.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"https://api.lovable.dev/v1/openapi.yaml?view=rest"},"subdomain":"lovable-f9060f1e","siteName":"Lovable Documentation","title":"Publish project - Lovable Documentation","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"contextualStarterQuestions":[],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-27T20:58:33.963Z","originalFileLocation":"api-reference/deploy-domains/publish-project.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=\"Plan: Business or higher Scope: projects:write Builds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects/{project_id}/publish/{deployment_id} until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects/{project_id}/publish. To take the app offline, use DELETE /v1/projects/{project_id}/publish.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Lovable Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Publish project - Lovable Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Plan: Business or higher Scope: projects:write Builds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects/{project_id}/publish/{deployment_id} until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects/{project_id}/publish. To take the app offline, use DELETE /v1/projects/{project_id}/publish.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Lovable Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://lovable-f9060f1e.mintlify.app/assets/logo/opengraph-image.png\">\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=\"Publish project - Lovable Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Plan: Business or higher Scope: projects:write Builds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects/{project_id}/publish/{deployment_id} until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects/{project_id}/publish. To take the app offline, use DELETE /v1/projects/{project_id}/publish.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://lovable-f9060f1e.mintlify.app/assets/logo/opengraph-image.png\">\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=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Lovable Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0095FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/deploy-domains/publish-project.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.lovable.dev/#organization\",\"name\":\"Lovable Documentation\",\"url\":\"https://docs.lovable.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/lovable-f9060f1e/lZT1ihBcprll2Agr/assets/logo/logoblack.svg?fit=max\u0026auto=format\u0026n=lZT1ihBcprll2Agr\u0026q=85\u0026s=8d9eafaf19f94e27f0d13ac160d54f54\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.lovable.dev#website\",\"name\":\"Lovable Documentation\",\"url\":\"https://docs.lovable.dev\",\"publisher\":{\"@id\":\"https://docs.lovable.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project#webpage\",\"url\":\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project\",\"name\":\"Publish project\",\"description\":\"Plan: Business or higher Scope: projects:write Builds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects/{project_id}/publish/{deployment_id} until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects/{project_id}/publish. To take the app offline, use DELETE /v1/projects/{project_id}/publish.\",\"dateModified\":\"2026-10-27T20:58:33.963Z\",\"isPartOf\":{\"@id\":\"https://docs.lovable.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Lovable API\",\"item\":\"https://docs.lovable.dev/api-reference/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Endpoints\",\"item\":\"https://docs.lovable.dev/api-reference/workspaces/list-workspaces\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Publish project\",\"item\":\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project#apireference\",\"headline\":\"Publish project\",\"name\":\"Publish project\",\"description\":\"Plan: Business or higher Scope: projects:write Builds and deploys the project. Returns 202 with the Deployment representation, status running, and null url and error fields; poll GET /v1/projects/{project_id}/publish/{deployment_id} until deployment finishes. Optionally set audience to choose who can open the published app; project reads report it as publish_audience. Omit audience to keep the current setting. Audience changes apply to the currently published version immediately, before the new deployment finishes. To change access settings without rebuilding, use PATCH /v1/projects/{project_id}/publish. To take the app offline, use DELETE /v1/projects/{project_id}/publish.\",\"url\":\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project\",\"mainEntityOfPage\":{\"@id\":\"https://docs.lovable.dev/api-reference/deploy-domains/publish-project#webpage\"},\"image\":\"https://docs.lovable.dev/assets/logo/opengraph-image.png\",\"dateModified\":\"2026-10-27T20:58:33.963Z\",\"publisher\":{\"@id\":\"https://docs.lovable.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.lovable.dev#website\"}}]}\u003c/script>","siteName":"Lovable Documentation","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction/welcome"}]},{"tab":"API Reference","groups":[{"group":"Lovable API","pages":[{"title":"API basics","sidebarTitle":"Introduction","href":"/api-reference/introduction"},{"title":"API changelog","href":"/api-reference/changelog"},{"group":"Endpoints","pages":[{"group":"Workspaces","pages":[{"title":"List workspaces","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/workspaces","href":"/api-reference/workspaces/list-workspaces"},{"title":"Get workspace","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/workspaces/{workspace_id}","href":"/api-reference/workspaces/get-workspace"}]},{"group":"Members \u0026 access","pages":[{"title":"List project collaborators","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}/collaborators","href":"/api-reference/members-access/list-project-collaborators"},{"title":"List workspace groups","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/workspaces/{workspace_id}/groups","href":"/api-reference/members-access/list-workspace-groups"},{"title":"List workspace members","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/workspaces/{workspace_id}/members","href":"/api-reference/members-access/list-workspace-members"},{"title":"Get workspace member","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/workspaces/{workspace_id}/members/{user_id}","href":"/api-reference/members-access/get-workspace-member"}]},{"group":"Projects","pages":[{"title":"List projects","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects","href":"/api-reference/projects/list-projects"},{"title":"Get project","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}","href":"/api-reference/projects/get-project"},{"title":"Delete project","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest delete /v1/projects/{project_id}","href":"/api-reference/projects/delete-project"},{"title":"Update project","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest patch /v1/projects/{project_id}","href":"/api-reference/projects/update-project"},{"title":"Create embed URL","description":"**Plan:** `Business or higher`\n\n**Scope:** `projects:write`\n\nCreates a preview URL valid for one hour that can be loaded in an iframe on one exact HTTPS origin. Visitors do not need a Lovable login. It shows the project's built preview; it does not grant access to the editor or the published app.","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest post /v1/projects/{project_id}/embed-url","href":"/api-reference/projects/create-embed-url"}]},{"group":"Deploy \u0026 domains","pages":[{"title":"Publish project","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest post /v1/projects/{project_id}/publish","href":"/api-reference/deploy-domains/publish-project"},{"title":"Unpublish project","description":"**Plan:** `Business or higher`\n\n**Scope:** `projects:write`\n\nTakes the published app offline. Audience and visibility settings are retained and apply again on the next POST /v1/projects/{project_id}/publish. Returns 204 whether or not the app was online, so a repeated call is safe.","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest delete /v1/projects/{project_id}/publish","href":"/api-reference/deploy-domains/unpublish-project"},{"title":"Update publish settings","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest patch /v1/projects/{project_id}/publish","href":"/api-reference/deploy-domains/update-publish-settings"},{"title":"Get publish status","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}/publish/{deployment_id}","href":"/api-reference/deploy-domains/get-publish-status"}]},{"group":"Security \u0026 governance","pages":[{"title":"List personal data findings","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}/pii-labels","href":"/api-reference/security-governance/list-personal-data-findings"},{"title":"List security scans","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}/security-scans","href":"/api-reference/security-governance/list-security-scans"},{"title":"Get security scan","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}/security-scans/{scan_id}","href":"/api-reference/security-governance/get-security-scan"},{"title":"List security scan findings","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}/security-scans/{scan_id}/findings","href":"/api-reference/security-governance/list-security-scan-findings"},{"title":"Get workspace security insights","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/workspaces/{workspace_id}/security-center/insights","href":"/api-reference/security-governance/get-workspace-security-insights"},{"title":"List workspace security project inventory","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/workspaces/{workspace_id}/security-center/insights/projects","href":"/api-reference/security-governance/list-workspace-security-project-inventory"}]},{"group":"Analytics","pages":[{"title":"Get project analytics","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}/analytics","href":"/api-reference/analytics/get-project-analytics"},{"title":"Get project analytics breakdowns","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}/analytics/breakdowns","href":"/api-reference/analytics/get-project-analytics-breakdowns"},{"title":"Get project realtime analytics","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/projects/{project_id}/analytics/realtime","href":"/api-reference/analytics/get-project-realtime-analytics"},{"title":"Get workspace analytics","deprecated":null,"version":null,"openapi":"https://api.lovable.dev/v1/openapi.yaml?view=rest get /v1/workspaces/{workspace_id}/analytics","href":"/api-reference/analytics/get-workspace-analytics"}]}]}]},{"group":"Events \u0026 hooks","pages":[{"title":"Events \u0026 hooks","href":"/api-reference/events-and-hooks"},{"group":"Reference","pages":[{"group":"Hooks","pages":[{"title":"Before message submission","version":null,"deprecated":null,"hideApiMarker":true,"playground":"none","openapi":"https://api.lovable.dev/v1/openapi.yaml?view=webhooks webhook message.before_submit.v1","href":"/api-reference/hooks/message-before-submit-v1"}]},{"group":"Events","pages":[{"title":"Project created","version":null,"deprecated":null,"hideApiMarker":true,"playground":"none","openapi":"https://api.lovable.dev/v1/openapi.yaml?view=webhooks webhook project.created.v1","href":"/api-reference/events/project-created-v1"},{"title":"Project deleted","version":null,"deprecated":null,"hideApiMarker":true,"playground":"none","openapi":"https://api.lovable.dev/v1/openapi.yaml?view=webhooks webhook project.deleted.v1","href":"/api-reference/events/project-deleted-v1"},{"title":"Project published","version":null,"deprecated":null,"hideApiMarker":true,"playground":"none","openapi":"https://api.lovable.dev/v1/openapi.yaml?view=webhooks webhook project.published.v1","href":"/api-reference/events/project-published-v1"},{"title":"Project transferred to another workspace","version":null,"deprecated":null,"hideApiMarker":true,"playground":"none","openapi":"https://api.lovable.dev/v1/openapi.yaml?view=webhooks webhook project.workspace_transferred.v1","href":"/api-reference/events/project-workspace-transferred-v1"}]}]}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"title":"Publish project - Lovable Documentation","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DmVyH30O.js","utils-BHQqGGOd.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CD-E4BIt.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp5Lq9Ds.js","snippetPresets-C4xAVCFP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CgXVLxUC.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BF8I5oUf.js","shallow-Byd0lWnC.js","getApiPlaygroundDisplay-BGOZG1OK.js","CodeSnippet-CpvQL0CY.js","CodeSnippets-B8wkBKXa.js","Page-CBCH2P7b.js","getPastedJson-Ry3scI3Y.js","icon-D7a9HcdD.js","MethodPill-CJ8pmHhz.js","DuplicateIcon-rh1HJF0t.js","createIcon-DvGznqYs.js","DynamicMarkdown-Cc6AuSHS.js","SectionHeading-B4A0S-ep.js","axios-vUo_bRtp.js","Markdown-Cc16CX65.js","clsx-Cs6nMGht.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-zbf22OZA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-C_fs-y5n.js"]}