curl --request POST \
--url https://studio.weaverse.io/api/v1/content/projects/{projectId}/assignments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"op": "update",
"updates": [
{
"id": "clz8r5t6u0005pa01abou0001",
"locale": "",
"handle": "our-story"
}
]
}
'{
"object": "assignments_updated",
"data": [
{
"id": "clz8r5t6u0005pa01abou0001",
"projectId": "clz8p2k0q0001ab12cd34ef56",
"type": "CUSTOM",
"handle": "our-story",
"locale": "",
"market": null,
"pageId": "clz8q1m2n0004pg01abou0003",
"cachedPageData": null,
"shopifyResourceId": null,
"createdAt": "2026-10-14T09:12:30.000Z",
"updatedAt": "2026-10-15T11:40:02.000Z",
"deletedAt": null
}
]
}{
"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>"
}Assignments
Update, localize or remove page assignments
Runs one structural operation on this project’s page assignments, selected by op. All operations are live writes (routing changes immediately, no draft or publish step).
Operations:
update(content:write): changeshandleandlocaleof 1-100 assignments byid. Every id must belong to this project; one foreign id refuses the whole batch with404and nothing moves. Returns the updated rows. A handle that another assignment already uses in that scope, or a custom page that would hold two handles in one scope (details.handles), returns409 CONFLICTand nothing moves.localize(content:write): creates a locale-specific copy of pagepageIdforlocale, with the same type and handle and a copy of its SEO. Returns the new page.unassign(content:delete,confirmequal topageId): removes up to 100 resource assignments (assignmentIds) from template pagepageId. Only rows that template owns in this project are removed; other ids are ignored. The template’s own wiring row and the page itself are never removed. Returns the number removed.reset-localized(content:delete,confirmequal toassignmentId): removes the localized assignmentassignmentIdof pagepageIdso the route falls back to the default page. A version of the content is kept for recovery.rename-locale(content:delete,confirmequal to theprojectId): moves every assignment of the project fromfromLocaletotoLocale. Returns the number of rows moved.
A wrong confirm value returns 400 INVALID_PARAMS.
Required scope: content:write (all operations); unassign, reset-localized and rename-locale also need content:delete
POST
/
projects
/
{projectId}
/
assignments
curl --request POST \
--url https://studio.weaverse.io/api/v1/content/projects/{projectId}/assignments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"op": "update",
"updates": [
{
"id": "clz8r5t6u0005pa01abou0001",
"locale": "",
"handle": "our-story"
}
]
}
'{
"object": "assignments_updated",
"data": [
{
"id": "clz8r5t6u0005pa01abou0001",
"projectId": "clz8p2k0q0001ab12cd34ef56",
"type": "CUSTOM",
"handle": "our-story",
"locale": "",
"market": null,
"pageId": "clz8q1m2n0004pg01abou0003",
"cachedPageData": null,
"shopifyResourceId": null,
"createdAt": "2026-10-14T09:12:30.000Z",
"updatedAt": "2026-10-15T11:40:02.000Z",
"deletedAt": null
}
]
}{
"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>"
}Authorizations
Bearer token: a shop API key (WEAVERSE_API_KEY), a scoped API key or a delegated MCP OAuth token; translation-unit routes also accept a project-bound translation agent token. Each operation lists the scope it requires; the scope table is in the API description.
Path Parameters
Body
application/json
Response
Operation result
The response is of type object.
Was this page helpful?