curl --request POST \
--url https://studio.weaverse.io/api/v1/content/versions/{versionId}/publish-now \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"type": "theme"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({projectId: 'clz7prj0a1b2c3d4e5f6g7h8', type: 'theme'})
};
fetch('https://studio.weaverse.io/api/v1/content/versions/{versionId}/publish-now', 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}/publish-now"
payload = {
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"type": "theme"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"object": "version",
"version": {
"id": "clz8thm4c6e8g0i2k4m6o8q0",
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"userId": null,
"snapshot": {
"theme": {
"colorPrimary": "#1e40af",
"bodyFontSize": 16
},
"previewHost": "my-store.myshopify.com",
"recentColors": [
"#1e40af"
],
"defaultLocale": "en-us"
},
"createdAt": "2026-10-08T09:30:00.000Z",
"publishAt": null,
"publishedAt": "2026-10-20T14:00:00.000Z",
"status": "PUBLISHED",
"outcome": "published"
}
}{
"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": "Version could not be published and was cancelled",
"status": 409,
"details": {
"id": "clz8hst3b5d7f9h1j3l5n7p9",
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"pageId": "clz7pg9k2m4n6p8r0t2v4x6z",
"status": "CANCELLED",
"publishAt": null,
"publishedAt": null
}
}Publish a scheduled version immediately
Publishes an already scheduled page or theme version now instead of waiting for publishAt. This is the same operation as “Publish now” in Studio’s scheduled content manager. To publish an unscheduled page draft, use POST /publish-versions/{versionId} instead.
Outcomes
- 200:
versionis the published row (status: "PUBLISHED",outcome: "published"). For a page,pageUpdatedAtandprojectUpdatedAtgive the new live revisions. - 200 with
cacheDelivery: "degraded"and awarning: content is live but cache invalidation failed. The row keeps itspublishAtretry marker and edge delivery is retried without replaying content. Do not publish again. - 409
CONFLICT: the version could not be published, for example because live content moved since it was scheduled (it is cancelled; a draft returns toACTIVE), or because it is not scheduled (a theme version, a page version that is neither a draft nor scheduled, or a draft that did not transition). Nothing was applied;detailscarries the stored row when there is one, so you can reconcile. - 409
STALE_PAGE: the draft head or its live base moved. Re-read and retry.
Required scope: content:publish
curl --request POST \
--url https://studio.weaverse.io/api/v1/content/versions/{versionId}/publish-now \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"type": "theme"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({projectId: 'clz7prj0a1b2c3d4e5f6g7h8', type: 'theme'})
};
fetch('https://studio.weaverse.io/api/v1/content/versions/{versionId}/publish-now', 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}/publish-now"
payload = {
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"type": "theme"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"object": "version",
"version": {
"id": "clz8thm4c6e8g0i2k4m6o8q0",
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"userId": null,
"snapshot": {
"theme": {
"colorPrimary": "#1e40af",
"bodyFontSize": 16
},
"previewHost": "my-store.myshopify.com",
"recentColors": [
"#1e40af"
],
"defaultLocale": "en-us"
},
"createdAt": "2026-10-08T09:30:00.000Z",
"publishAt": null,
"publishedAt": "2026-10-20T14:00:00.000Z",
"status": "PUBLISHED",
"outcome": "published"
}
}{
"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": "Version could not be published and was cancelled",
"status": 409,
"details": {
"id": "clz8hst3b5d7f9h1j3l5n7p9",
"projectId": "clz7prj0a1b2c3d4e5f6g7h8",
"pageId": "clz7pg9k2m4n6p8r0t2v4x6z",
"status": "CANCELLED",
"publishAt": null,
"publishedAt": null
}
}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
Response
Published (cacheDelivery=degraded if edge delivery pending)
The response is of type object.
Was this page helpful?