curl --request POST \
--url https://studio.weaverse.io/api/v1/content/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"op": "create"
}'{
"object": "project_settings_updated",
"projectRevision": "2026-10-20T10:02:13.000Z"
}{
"object": "project_created",
"id": "clz3a1b2c0004efgh7890ijkl",
"name": "New storefront"
}{
"object": "project_copy_started",
"targetProjectId": "clz3a2c3d0005efgh1234mnop"
}{
"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": "STALE_PROJECT",
"message": "This project changed after it was loaded. Reload before saving.",
"status": 409
}Run a project lifecycle operation
Shop-scoped project lifecycle. The body’s op field selects the operation:
create: creates a project in the caller’s shop.nameis required (1-100 characters). Setconfig.themeNameto seed it from a theme; omit it or passblankfor a blank project with generated storefront pages. If the theme seed fails, a blank project is created instead and the response carries awarning. Returns201withobject: "project_created".copy: clonessourceProjectIdinto the caller’s shop. The source must be this shop’s own project or a public demo-store project; any other shop’s project returns404. The clone runs in the background: the response is202withobject: "project_copy_started"and thetargetProjectId. Observe completion by listing the target project’s pages.namedefaults toCopy of <source name>.delete: soft-deletesprojectId(a backup is taken first) and purges its caches.confirmmust equal theprojectId, otherwise400. A project that still has variant (child) projects returns409 CONFLICT(HAS_VARIANTS). Returns200withobject: "project_deleted".set-settings: revision-fenced write of non-secret settings (name,defaultLocale). Pass the project’s currentrevision(fromGET /projects/{projectId}) asexpectedUpdatedAt; if the project changed since, the request returns409 STALE_PROJECTand writes nothing.defaultLocaleis the full Hydrogen i18n object Studio stores (label,language,country,pathPrefix). Returns200withobject: "project_settings_updated"and the newprojectRevision.purge-cache: the Studio “Clear cache” action. Invalidates the project’s caches without touching content. Returns200withobject: "cache_purged".
Every operation other than create and copy must target a live project owned by the caller’s shop; otherwise 404.
Required scope: project:manage (delete also requires content:delete)
curl --request POST \
--url https://studio.weaverse.io/api/v1/content/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"op": "create"
}'{
"object": "project_settings_updated",
"projectRevision": "2026-10-20T10:02:13.000Z"
}{
"object": "project_created",
"id": "clz3a1b2c0004efgh7890ijkl",
"name": "New storefront"
}{
"object": "project_copy_started",
"targetProjectId": "clz3a2c3d0005efgh1234mnop"
}{
"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": "STALE_PROJECT",
"message": "This project changed after it was loaded. Reload before saving.",
"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.
Body
Response
Operation result
The response is of type object.
Was this page helpful?