validation_failed | Request body or params failed Zod validation. | A required field is missing, has the wrong type, or violates a constraint (slug regex, op-list structure, legal pointer, etc.). Also used for domain-specific validation failures (e.g. slug already in use returns 409 with this code). | Inspect the `error.details` field for Zod issues or a `fields` list describing the violated path. |
user_block_invalid_config | User-block `config` does not match the schema for its `kind`. | For `kind: 'layoutCellBlock'`, the `config` did not parse as `LayoutCellBlockConfig` (cell types, geometry, animations, etc.). | Inspect the appended Zod issue in `error.message` and fix the offending cell config. |
parameter_path_invalid | A parameter path on a user block must begin with `/`. | Supplied `parameters[].path` did not start with `/` (JSON-pointer form required). | Prefix the path with `/` (e.g. `/cells/abc/content/text`). |
brand_kit_music_missing | Format references a brand-kit audio slot, but the brand kit has no uploaded music. | An `audioTracks[i]` has `source: 'brand_kit'` and the resolved brand kit's `musicSpacesKey` is null. | Upload music to the brand kit, or change the audio slot's source. |
legacy_format_ops_locked | Cannot patch `ops` or `openContentPaths` on a legacy-template format. | The format has `sourceKind: 'legacy-template'`, which is immutable at the op-list level. | Create a new block-composer format via POST /v1/formats, or patch only legacy-safe fields (name, brandKitId, status). |
missing_required_variable | A required parameter was not provided in variables. | The block defines a parameter with no defaultValue and the caller omitted it. | Check the block's /schema endpoint for the full parameter list; include all required names in `variables`. |
invalid_variable_type | A provided variable's value doesn't match its parameter's declared type. | e.g. you sent a string for a `number` parameter, or an invalid hex for a `color`. | Look up the parameter's type via the /schema endpoint and coerce the value accordingly. |
parameter_path_stale | A parameter's path points at a cell field that no longer exists. | The block was structurally edited after the parameter was marked; the target cell or field was renamed or deleted. | Open the block in the canvas designer and re-mark the parameter, or remove the stale parameter entry. |
parameter_name_duplicate | Two parameters within the same block share a name. | Parameter names must be unique per block so the variables map is unambiguous. | Rename one of the conflicting parameters. |
unknown_variable | Request sent a variable name that is not declared on the format. | Typo in the variable name, a locked binding's name, or a name that was renamed/removed since the caller generated their integration. | Fetch GET /v1/formats/:slug/schema for the current variable list and align naming. |
variable_ambiguous | Bare-name variable shortcut matches multiple bindings. | The caller sent e.g. 'player.name' on a format that exposes both 'game1.player.name' and 'game2.player.name'. The shortcut only resolves when exactly one binding matches. | Use the scoped name (e.g. 'game1.player.name'). error.details.fields[].alternatives lists valid options. |
variables_and_overrides_exclusive | Request body includes both 'variables' and 'contentOverrides'. | Only one envelope may be used per request. 'variables' is the flagship named-parameter shape; 'contentOverrides' is preserved for legacy raw-pointer integrations. | Pick one envelope. Prefer 'variables' — fetch GET /v1/formats/:slug/schema for the variable contract. |
duplicate_instance_label | Two user-block instances in the format share an instanceLabel. | Instance labels must be unique within a format because they scope public variable names. Editor blocks this client-side; defense-in-depth at the server PATCH validator. | Rename one of the duplicates in the format editor. |
user_block_op_immutable | Cannot mutate op.content on a user-block instance op post-drop. | format.ops is an immutable template after a user block is dropped. Data edits must flow through parameter_bindings + default_overrides. Design changes must happen in the block designer. | Use the instance-edit panel (which auto-parameterizes) or, for design changes, edit the source user block in the canvas designer and use the updateInstance PATCH flow. |
unsupported_parameter_field | Field type is not supported for parameter binding. | pathTypeCompatibilityMap has no entry for this cell field + target parameter type. The editor refused to auto-create a binding because it cannot infer a safe coercion. | Parameterize a supported field on the cell, or change the cell kind in the block designer. |