Register variants from a manifest
PUT/cms/pagebuilder/variants
Creates or updates the variants listed in a frontend’s pagebuilder-variants.json manifest. Entries with status: "disable" disable an existing variant, and status: "planned" entries are skipped. Variants not listed are left untouched; nothing is deleted. Validation is all-or-nothing: if any entry is invalid, the response is 422 and nothing is written. Use ?dry_run=1 to see what would change without writing. Thumbnails are uploaded separately (POST …/{blockType}/{key}/thumbnail). Requires an API key linked to a CMS user who can create and update Page Builder variants.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Validate and report without writing
Request Bodyrequired
Section titled “Request Bodyrequired”A frontend’s pagebuilder-variants.json: variants grouped by block type. Other top-level fields (site, generatedAt, …) are ignored. In GET responses, entries also carry thumbnail (image URL or null) and usedBy (number of published layouts using the variant).
object
Block type → variants
object
A display variant a frontend implements. Unknown fields (e.g. component, note, thumbnail in a manifest) are ignored when importing.
object
Variant key, ^[a-z0-9_]{1,64}$. Never changes once registered.
Example
lead_gridName editors see (required unless status is “disable” or “planned”)
Example
Lead story + gridWhen editors should use it
Make this the block type’s default (fallback) variant. Only one per block type; must have breakpoints null.
implemented (create or update), disable (disable an existing variant), planned (skipped)
Example
implementedContent_list only: source kinds this variant supports; null = all
Screen sizes the variant can be used on; null = all (must be null for the default variant)
List blocks only: number of items the design shows well (whole numbers ≥ 1, min ≤ default ≤ max)
object
Fields editors fill in per block; read by the frontend from variantOptions[key]
object
Label editors see
Option key, ^[A-Za-z0-9_-]+$ (generated from the name when omitted)
List only: allow several values
Example
{ "key": "lead_grid", "label": "Lead story + grid", "description": "One large lead story followed by a grid of smaller stories.", "isDefault": false, "status": "implemented", "allowedSources": [ "section", "query" ], "breakpoints": null, "limit": { "min": 3, "default": 7, "max": 13 }, "options": [ { "name": "Lead badge", "key": "leadBadge", "type": "text", "default": "TOP STORY" }, { "name": "Show byline", "key": "showByline", "type": "boolean", "default": "true" } ]}Example
{ "blocks": { "content_list": [ { "key": "lead_grid", "label": "Lead story + grid", "limit": { "min": 3, "default": 7, "max": 13 } } ], "ad_slot": [ { "key": "default", "label": "Default", "isDefault": true } ] }}Responses
Section titled “Responses”Import report
What a variant import did (or would do, with dry_run). When ok is false nothing was written.
object
False when any entry is invalid; nothing is written then
True when called with dry_run=1 (nothing written)
Number of database operations applied
All validation errors, prefixed with blockType.key
One result per manifest entry
object
Updated: the fields that changed
This variant becomes the block type’s default
Skipped: why
Example
{ "ok": true, "dryRun": false, "applied": 2, "errors": [], "results": [ { "blockType": "content_list", "key": "lead_grid", "action": "created" }, { "blockType": "content_list", "key": "thumb_list", "action": "updated", "changed": [ "label", "optionsSchema" ] }, { "blockType": "content_list", "key": "image_only", "action": "disabled" }, { "blockType": "content_list", "key": "video_rail", "action": "skipped", "reason": "status is \"planned\"" } ]}API key not linked to a CMS user with the required permission
Invalid manifest; nothing was written
What a variant import did (or would do, with dry_run). When ok is false nothing was written.
object
False when any entry is invalid; nothing is written then
True when called with dry_run=1 (nothing written)
Number of database operations applied
All validation errors, prefixed with blockType.key
One result per manifest entry
object
Updated: the fields that changed
This variant becomes the block type’s default
Skipped: why
Example
{ "ok": true, "dryRun": false, "applied": 2, "errors": [], "results": [ { "blockType": "content_list", "key": "lead_grid", "action": "created" }, { "blockType": "content_list", "key": "thumb_list", "action": "updated", "changed": [ "label", "optionsSchema" ] }, { "blockType": "content_list", "key": "image_only", "action": "disabled" }, { "blockType": "content_list", "key": "video_rail", "action": "skipped", "reason": "status is \"planned\"" } ]}