---
title: "Schedule a version for publication"
method: POST
path: "/versions/{versionId}/schedule"
tags: ["Drafts and publishing"]
---

# Schedule a version for publication

`POST /versions/{versionId}/schedule`

## Request

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

Schedules a saved page or theme version to go live at `publishAt`. For page drafts, `versionId` is the id returned by the draft save. The scheduler publishes the stored content when the time comes.

**Rules**

- `publishAt` must be in the future (400).
- One schedule per slot: a page can have at most one scheduled version, and a project at most one scheduled theme version. If the slot is taken, the response is 409 `CONFLICT` and nothing changes.
- A page draft can be scheduled only while it is still the page's draft head and was built on the current live page revision. A history version whose recorded page revision no longer matches live is 409 `STALE_PAGE`.
- At fire time the base is checked again. If live content moved after scheduling, the publication is cancelled instead of overwriting the newer edit (a draft returns to `ACTIVE`).

**Replacing a page schedule.** Set `replaceScheduledVersionId` to swap the page's current scheduled version for this one in a single transaction. The replaced version is closed (a draft returns to `ACTIVE`, a history version becomes `CANCELLED`). If it is no longer the page's scheduled version, the response is 409 `CONFLICT`. Two versions of different pages are 400 `INVALID_PARAMS`, and a version cannot replace itself. Retrying an identical replacement that already committed returns the scheduled row. For `type: "theme"` the field is refused with 400: no atomic theme replacement exists, so cancel the scheduled theme version first.

Manage the result with `PATCH /versions/{versionId}` (reschedule), `PUT /versions/{versionId}` (replace content), `DELETE /versions/{versionId}` (cancel) or `POST /versions/{versionId}/publish-now`.

Required scope: `content:publish`

## Request body

- ScheduleBody
  - `projectId` string, required
  - `type` 'page' | 'theme', required
  - `publishAt` string, date-time, required
  - `replaceScheduledVersionId` string: Page versions only: a scheduled page version this schedule atomically replaces. Rejected with 400 for type=theme (no atomic theme replacement exists; cancel the scheduled theme version first).

## Response `200`

Scheduled row

- object

## Other responses

- `400`: publishAt must be in the future; replacement pair names versions of different pages (INVALID_PARAMS)
- `401`: Missing or invalid credentials
- `403`: Foreign project or missing scope (INSUFFICIENT_SCOPE)
- `404`: Not found (never discloses other tenants)
- `409`: CONFLICT: the page/project already has a scheduled version, or the replacement lost its race. STALE_PAGE / STALE_PROJECT: the draft is no longer the head, or its page/project base moved. Nothing changed

---

[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)
