Update Component
update_componentUpdate an authored component's complete version-4 source/metadata IN PLACE (same id) — the correct verb for the author→preview→fix loop (preview_component returns the admission or runtime error; fix the template here and re-preview, instead of creating a new component each iteration). Pass componentId + the changed fields as body. Same source contract as create_component: {version:4, componentId, template, manifest, definition}, admitted before the write; the template finds its root with document.getElementById('root'), and declared slots arrive in the scene's assets, never params. PLACED CLIPS: every placed clip renders the exact version it pins, so an update moves placed clips ONLY when you name a project — put projectId (and optionally compositionId; default the project's active composition) in body, and that composition's placements move to the new version in the same write. The answer carries repinned (what moved) and placementsPinnedToPrevious (placements across the org still rendering the previous version). Without projectId nothing placed moves: previews and renders of an existing clip keep the old version. For one placement, register the source WITHOUT projectId, read its immutable sourceVersionId, then use apply_composition clip.update to change only the selected clip source and exact pin under observed concurrency expectations. Explicit-project update_component admits and repins all matching placements in that composition; use it only when that broader edit is requested.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | PUT /components/:id body: every writable field, all optional; an omitted field is carried forward. Org/user are server-resolved; never accepted from the body. | |
| componentId | Yes | componentId (path). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The entry's id: a `primitiveId` for a built-in, a `componentId` for an installed component. | |
| kind | No | RENDER kind (component | transition | scene). NOT the ClipSource variant — see `placement` for how to author it on the timeline. | |
| mood | No | Vibe/tone tags (e.g. 'cinematic', 'minimal'). Filter to match the edit's mood. | |
| name | No | ||
| tags | No | Free-text search keywords. | |
| tier | No | Quality/applicability RANKING (a preference, not a flag). Prefer 'recommended'; reach for 'niche' only when its specific use-case is exactly the beat. | |
| format | No | ||
| intent | No | Selection signal: a verb naming what this primitive accomplishes (e.g. 'product-trailer'). Match it to the beat you are authoring. | |
| origin | No | ||
| source | No | 'default' = built-in primitive (place by primitiveId); 'installed' = org-authored component (place by componentId). | |
| tokens | No | ||
| useCase | No | The edit ROLE(s) this primitive fills — the dimension to filter by for a beat (e.g. 'intro', 'title-over-footage', 'grade'). | |
| useWhen | No | When to use this — AND when not to. The negative guidance is load-bearing; read it before picking. | |
| version | No | The ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version (4 native, 2 retired TSX). | |
| category | No | ||
| examples | No | Usage examples, as authored. A built-in primitive projects {name, mood?, params?, description?}; an authored component's examples are whatever it wrote, which is why the item is open. One shape for both directions: what you write here is what you read back. | |
| manifest | No | ||
| repinned | No | Present when the update named `projectId`: the composition whose placements moved to the new version. | |
| warnings | No | Non-blocking save-time advisories — the create/update SUCCEEDED. Currently: a `fontFamily` string literal referencing a NON-vendored font (a bare CSS generic like 'serif', or an unknown named family like 'Arial') whose LIVE-lane pixels vary by render host — re-author with a vendored family or 'Georgia'. Omitted when there is nothing to flag; only present on the create/update responses. | |
| avoidWith | No | Authoring guidance: ids of primitives that CONFLICT with this one — do not place together. | |
| fixedCopy | No | On-screen strings this primitive BAKES — the read-side counterpart to propSchema. These literals render REGARDLESS of params (no param can change them); fork the source via get_component_source to edit them. Use this to see at author time what fixed copy (someone-else's marketing text, faux-code, faux-data) will appear before you render. | |
| pairsWith | No | Authoring guidance: ids of primitives that COMPOSE well with this one in the same edit. | |
| placement | No | ||
| textParam | No | The param field that carries this primitive's primary text; null = no single text slot. | |
| propSchema | No | ||
| description | No | ||
| ejectedFrom | No | ||
| propDefaults | No | ||
| subtextParam | No | The param field for secondary text (subtitle/byline); null = none. | |
| brandBindings | No | Params that can follow the project brand kit. Each {param, brandToken} says: set `param` to `brandToken` (a `$brand:` ref, e.g. '$brand:colors.accent') to track the brand instead of a literal. See the list response's `brandTokens` for the full ref vocabulary. Omitted when nothing is brand-bound. | |
| durationInFrames | No | ||
| placementsPinnedToPrevious | No | Placements across the org that still pin the previous version and will keep rendering it. Name `projectId` (and `compositionId`) on the update to move a composition's placements with it. |