Publish an app to its live site.
Publishes the app to its live site: its managed address, and every custom domain attached to it (changes kind domain) once that domain is active. A domain that becomes active later joins the live site without another publish. Check GET .../publishability first and send the sourceRunId it returns, so the build the creator approved is the one that goes live. Returns a publish job: poll GET .../infra/publish-jobs/{publishJobId} until status is succeeded (publishedUrl is the live site) or failed (error says why). Send the same idempotencyKey to retry safely.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your access token.
clientportal-ai. writeOAuthPrivate IntegrationSub-Account TokenRequest
Headers
The API version.
v3v3Path Parameters
The project.
Possible values: Value must match regular expression ^prj_[A-Za-z0-9_-]+$
prj_5f0c2a3eBody
Exact successful run backing the preview approved by the creator. When provided, publish fails closed instead of selecting a different run that became ready concurrently.
Possible values: Value must match regular expression ^run_[A-Za-z0-9_-]+$
run_7b2c9e41Stable retry key. Domain-aware clients should always provide one; when omitted, source-bound requests receive a deterministic server-generated key while source-less legacy requests remain independent publish attempts.
Possible values: non-empty and <= 200 characters
publish-prj_5f0c2a3e-2026-10-23Response
Publish job accepted.
The publish job; poll it with GET .../infra/publish-jobs/{publishJobId}.
job_3f9a1c2b7d4e5f6a7b8c9d0eThe managed address the app is published to.
5f0c2a3e.app.clientclub.netThe active custom domains the publish also serves.
["portal.acmefitness.com"]The managed address's revision this publish took.
Possible values: >= 0
1The live site's address once the job succeeds.
https://5f0c2a3e.app.clientclub.netThe job's state; queued when accepted.
queuedrunningsucceededfailedqueued