curl --request POST \
--url https://studio.weaverse.io/api/v1/content/versions/{versionId}/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"type": "page",
"publishAt": "2026-12-01T09:00:00.000Z"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
projectId: 'clz7prj0a1b2c3d4e5f6g7h8',
type: 'page',
publishAt: '2026-12-01T09:00:00.000Z'
})
};
fetch('https://studio.weaverse.io/api/v1/content/versions/{versionId}/schedule', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://studio.weaverse.io/api/v1/content/versions/{versionId}/schedule"
payload = {
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"type": "page",
"publishAt": "2026-12-01T09:00:00.000Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"object": "version",
"version": {
"id": "clz9drf2h4j6l8n0p2r4t6v8",
"pageId": "clz7pg9k2m4n6p8r0t2v4x6z",
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"userId": null,
"snapshot": {
"pageData": {
"id": "clz7pg9k2m4n6p8r0t2v4x6z",
"name": "Home",
"rootId": "root-1",
"items": [
{
"id": "root-1",
"type": "main",
"children": [
{
"id": "hero-1"
}
],
"data": {}
},
{
"id": "hero-1",
"type": "hero-image",
"data": {
"heading": "Summer collection",
"height": "large"
}
}
],
"expectedUpdatedAt": "2026-10-08T10:00:00.000Z"
},
"pageAssignment": {
"type": "INDEX",
"handle": "",
"locale": ""
}
},
"kind": "DRAFT",
"draftBasePageUpdatedAt": "2026-10-08T10:00:00.000Z",
"draftBaseProjectUpdatedAt": "2026-10-08T09:00:00.000Z",
"publishedPageUpdatedAt": null,
"publishedProjectUpdatedAt": null,
"assignedType": "INDEX",
"assignedHandle": "",
"assignedLocale": "",
"assignedMarket": null,
"assignmentDeferred": false,
"scheduleRevision": 1,
"createdAt": "2026-10-08T10:12:00.000Z",
"publishAt": "2026-12-01T09:00:00.000Z",
"publishedAt": null,
"status": "SCHEDULED",
"page": {
"name": "Home"
}
}
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "CONFLICT",
"message": "Page already has a scheduled version",
"status": 409
}Schedule a version for publication
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
publishAtmust 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
CONFLICTand 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
curl --request POST \
--url https://studio.weaverse.io/api/v1/content/versions/{versionId}/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"type": "page",
"publishAt": "2026-12-01T09:00:00.000Z"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
projectId: 'clz7prj0a1b2c3d4e5f6g7h8',
type: 'page',
publishAt: '2026-12-01T09:00:00.000Z'
})
};
fetch('https://studio.weaverse.io/api/v1/content/versions/{versionId}/schedule', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://studio.weaverse.io/api/v1/content/versions/{versionId}/schedule"
payload = {
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"type": "page",
"publishAt": "2026-12-01T09:00:00.000Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"object": "version",
"version": {
"id": "clz9drf2h4j6l8n0p2r4t6v8",
"pageId": "clz7pg9k2m4n6p8r0t2v4x6z",
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"userId": null,
"snapshot": {
"pageData": {
"id": "clz7pg9k2m4n6p8r0t2v4x6z",
"name": "Home",
"rootId": "root-1",
"items": [
{
"id": "root-1",
"type": "main",
"children": [
{
"id": "hero-1"
}
],
"data": {}
},
{
"id": "hero-1",
"type": "hero-image",
"data": {
"heading": "Summer collection",
"height": "large"
}
}
],
"expectedUpdatedAt": "2026-10-08T10:00:00.000Z"
},
"pageAssignment": {
"type": "INDEX",
"handle": "",
"locale": ""
}
},
"kind": "DRAFT",
"draftBasePageUpdatedAt": "2026-10-08T10:00:00.000Z",
"draftBaseProjectUpdatedAt": "2026-10-08T09:00:00.000Z",
"publishedPageUpdatedAt": null,
"publishedProjectUpdatedAt": null,
"assignedType": "INDEX",
"assignedHandle": "",
"assignedLocale": "",
"assignedMarket": null,
"assignmentDeferred": false,
"scheduleRevision": 1,
"createdAt": "2026-10-08T10:12:00.000Z",
"publishAt": "2026-12-01T09:00:00.000Z",
"publishedAt": null,
"status": "SCHEDULED",
"page": {
"name": "Home"
}
}
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "UNAUTHORIZED",
"message": "<string>",
"status": 123,
"details": "<unknown>"
}{
"object": "error",
"code": "CONFLICT",
"message": "Page already has a scheduled version",
"status": 409
}Authorizations
Bearer authentication: a shop API key (WEAVERSE_API_KEY), a scoped API key, a delegated MCP OAuth token, or (translation-unit routes only) a project-bound translation agent token. Scopes: content:read — Read projects, pages, theme settings, versions, drafts and translation units. content:write — Save drafts and make non-destructive edits (page items, metadata, SEO, assignments, languages, glossary). Never publishes or deletes. content:publish — Publish drafts, schedule/reschedule/cancel publications, restore versions, publish global sections. content:delete — Delete pages, global sections, languages, static keys, override reverts; required with project:manage for project deletion. project:manage — Create/copy/delete projects, settings, variants, hierarchy, backups, restore-as-new, previews, hostname policy. translations:read — Read translation units only (no general content access). translations:write — Apply translation units only; never mutates page content. A legacy unscoped API key keeps read/write/translation baseline access and every pre-scope endpoint, but never gains publish/delete/project-manage implicitly.
Path Parameters
Body
page, theme 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
Scheduled row
The response is of type object.
Was this page helpful?