---
title: "Publish a saved page draft"
method: POST
path: "/publish-versions/{versionId}"
tags: ["Drafts and publishing"]
---

# Publish a saved page draft

`POST /publish-versions/{versionId}`

## Request

- Base URL: `https://studio.weaverse.io/api/v1/content`
- URL: `https://studio.weaverse.io/api/v1/content/publish-versions/{versionId}`
- Auth: HTTP bearer

Makes one saved page draft live now. `versionId` is the `versionId` returned by `PUT /projects/{projectId}/page-drafts/{pageId}`. It uses the same promotion and cache fan-out as a Studio publish. Publishing is always explicit: `content:write` never implies it.

**Preconditions**

- The version must be a draft of `pageId` in `projectId`, and it must still be the page's current draft head. Otherwise the response is 404 `PAGE_NOT_FOUND`.
- The live page and project must still be at the revisions the draft was built on. If live moved, the response is 409 `STALE_PAGE`, nothing is published and the draft head stays in place. Re-read the draft, save it again and publish the new version.

**Replacing a schedule.** Set `replaceScheduledVersionId` to publish now in place of the page's scheduled version. The scheduled version is closed in the same transaction (a scheduled draft returns to `ACTIVE`, a scheduled history version becomes `CANCELLED`), so the page is never left with neither a schedule nor a publication. If that id is no longer the page's single scheduled version (it fired, was cancelled or was replaced), the response is 409 `CONFLICT` and nothing is published. A version cannot replace itself (400).

**Response.** The published version row (`status: "PUBLISHED"`), plus the new live `pageUpdatedAt` and, when the project revision advanced, `projectUpdatedAt`. If the content committed but cache invalidation failed, the response includes `cacheDelivery: "degraded"`; the content is live and edge delivery is retried automatically, so do not publish again.

Required scope: `content:publish`

## Request body

- PublishDraftBody
  - `projectId` string, required
  - `pageId` string, required
  - `replaceScheduledVersionId` string: A scheduled version this publication replaces

## Response `200`

Published receipt

- object

## Other responses

- `401`: Missing or invalid credentials
- `403`: Foreign project or missing scope (INSUFFICIENT_SCOPE)
- `404`: Not found (never discloses other tenants)
- `409`: STALE_PAGE — head or live base moved; CONFLICT: replaceScheduledVersionId no longer names the page's scheduled version; nothing was published

---

[API](https://skmtc.dev/weaverse/apis/weaverse-content-api.md) - [All operations](https://skmtc.dev/weaverse/apis/weaverse-content-api/llms.txt) - [OpenAPI document](https://skmtc.dev/weaverse/apis/weaverse-content-api/revisions/d189794169bb?raw)
