Update a page (partial)
Create-style merge on an existing page (PUT, PATCH, and POST /pages/{id} share this route).
Only sent top-level keys change. Item write shape is documented on PageUpsert.items.
Query parameters
content_locale— write translated content in that locale (must be a site locale, else 422; default = site default)dry_run=1— 200{dry_run: true, valid: true}or the same 422s; nothing is saved or archivedreplace=1— each sent canvas array is the full canvas (unlisted ids deleted, positions reassigned from array order)
Optimistic concurrency
Send the ETag from GET /pages/{page_id} as If-Match to make the write conditional. It is compared
inside the page write lock: a stale value → 412 precondition_failed with top-level current_etag.
Without If-Match the write is unconditional. Another write holding the lock → 409 concurrent_modification.
File editables
FileRef / File sit under the item's source key — not as the item value:
{"Attachment":{"source":{"__type":"FileRef","source":"nimbu://<site>/uploads/<id>"}}}Batch set differs: the FileRef object is the operation value.
Responses
Unknown editable → 422 editable_not_in_theme (invalid editable <Slug>).
Unknown repeatable slug → 422 repeatable_not_in_theme.
Personal access token tied to a user account. Requires the X-Nimbu-Site header to scope requests.
In: header
Identifier of the site context when authenticating with a personal access token.
In: header
Path Parameters
Page identifier or fullpath
Query Parameters
When true, each sent canvas array becomes the full canvas (unlisted ids deleted, positions reassigned).
When true, validate only. 200 {dry_run: true, valid: true} or the same 422s. Nothing saved/archived.
Locale to write translated content in. Must be one of the site locales (default = site default).
Header Parameters
Optional ETag precondition: the quoted ETag from GET /pages/{page_id}. Checked inside the page write lock; stale → 412 with current_etag. Omit for an unconditional write. Only a single strong ETag is supported; W/"..." and multi-value If-Match are treated as stale.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X PATCH "https://example.com/pages/string" \ -H "Content-Type: application/json" \ -d '{}'{
"id": "66f1a2b3c4d5e6f7a8b9c0d0",
"title": "Updated Home"
}{
"message": "string",
"errors": {
"property1": [
"string"
],
"property2": [
"string"
]
}
}{
"message": "string",
"code": "string",
"current_etag": "string"
}{
"message": "string",
"code": "editable_not_in_theme",
"data": {
"editables": [
"string"
],
"canvas": "string",
"repeatable": "string",
"slugs": [
"string"
]
}
}