Skip to main content
POST
Publish the draft as a new version

Authorizations

apiKey
string
query
required

apiKey MUST be supplied within the request body instead of query

Path Parameters

projectId
string<uuid>
required

POST /v2/api/projects/:projectId/workspaces/:workspaceId/publish Parameter

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
workspaceId
string<uuid>
required

POST /v2/api/projects/:projectId/workspaces/:workspaceId/publish Parameter

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$

Body

application/json

POST /v2/api/projects/:projectId/workspaces/:workspaceId/publish Request body

apiKey
string

Upsolve API key, generated under Account → Developer settings in the Upsolve Hub. Keys are user-scoped: pass organizationId alongside the key to select which org to act on.

Minimum string length: 1
Example:

"up_embed_************"

organizationId
string<uuid>

Your Upsolve organization's UUID — the org that owns the API key and project. This is NOT a project organization: do not pass a value registered via /projects/register-organization, and do not pass an externalId (only projectOrganizationId accepts those). Omit it when using an org-bound API key — the org is read from the key and any value sent here is ignored. Required only for user-scoped API keys (created under Account → Developer settings) and for the Supabase JWT path, where the org is ambiguous and membership is verified against it.

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Example:

"123e4567-e89b-12d3-a456-426614174000"

message
string

An optional message describing this version, like a commit message. Trimmed, capped at 500 characters, and IMMUTABLE once published -- there is no endpoint that changes it. Omit it and readers show 'Version N'.

Maximum string length: 500
bypassChecks
boolean

Publish WITHOUT running CI: the test cases and the row-level security check are skipped, not overridden. Refused with CI_NOT_ENFORCED when CI is off for this workspace, since there would be nothing to skip. Owner or admin only. Always audited: who, when, and what was failing at the time is recorded on the version. Deprecated for organizations using environments: there a publish runs no checks and this is ignored; skip tests on a deployment instead.

publishWithoutCi
boolean

Required to publish a workspace whose CI is switched off: confirms the caller knows no test cases are replayed and no row-level security is executed. Refused with CI_DISABLED_UNCONFIRMED when omitted, and with CI_ALREADY_ENABLED when CI is on for this workspace. Always audited on the version. Choosing between turning CI on and publishing unverified is the user's decision, not the caller's. Deprecated for organizations using environments: there a publish runs no checks and this is ignored; tests run when a version is deployed.

promote
boolean

Make this version the production one as soon as its publish succeeds, so end users get it without a separate promote call. Production moves only if it is still on the version it was on when this publish was requested, so a release that settled first is never undone. A publish that fails or is stopped is not promoted. Omitted or false leaves production where it is.

rlsConfirmation
string

Only after a 409 with code RLS_DESTRUCTIVE_CHANGE_UNCONFIRMED or RLS_PRODUCTION_CHANGE_UNCONFIRMED: that response's details.confirmation, sent back to go ahead with the row-level security changes it listed. Owner or admin only. Show the person the list and ask before sending it.

Required string length: 1 - 64

Response

POST /v2/api/projects/:projectId/workspaces/:workspaceId/publish Positive response

status
string
required
Allowed value: "success"
data
object
required