Remix Canvas
Duplicate a canvas and optionally apply edits with AI.
Always returns a Task(kind="remix") envelope — uniform across the
prompted and promptless paths. The promptless path completes
synchronously and returns status="succeeded" inline, so the returned
id is a synthetic (non-queryable) UUID and retry_after_ms is
None. The prompted path returns the in-flight task envelope; callers
poll GET /v1/tasks/{id} to observe completion.
Authorizations
API key from Settings > Developer > REST API
Headers
Calendar-dated API version pin. New integrations should pin 2026-05-01 to opt into the newest response shapes. For back-compat the server also accepts requests with no header and resolves them to the current default (today: 2026-04-12); that default advances on each sunset date. Any unsupported value returns 400 unsupported_version.
2026-04-12, 2026-05-01 "2026-05-01"
Body
Prefixed cvs_ ID of the source canvas to duplicate. The source canvas may belong to a different team. The copy is created in the team specified by team_id.
^cvs_[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$"cvs_01HT9WK8N3M2J4A5Z6P7Q8R9TV"
Optional natural-language edit prompt to apply to the copy. If omitted, the canvas is duplicated without modifications.
Name for the new canvas. Defaults to the source canvas name.
255Prefixed bk_ wire ID (Crockford base32 body) — the canonical, recommended form. For back-compat, a bare UUID string is also accepted in both path parameters and JSON request bodies (older integrations that stored raw UUIDs keep working). Both are permanent, supported inputs.
^bk_[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$"bk_01HT9WK8N3M2J4A5Z6P7Q8R9TV"
If true, no brand kit is applied — every brand-kit source is suppressed, including the canvas's own kit, the team default, and any explicit brand_kit_id override. Use only when the design must be unbranded; to merely leave the source canvas's kit alone, omit brand_kit_id instead.
Response
Successful Response
Canonical wire-format for every async design operation.
All consumers -- REST, webhooks, SSE, MCP -- serialize through
Task.from_db() so the shape is always consistent.
Prefixed task_... identifier.
^task_[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$"task_01HT9WK8N3M2J4A5Z6P7Q8R9TV"
Discriminator for the kind-specific result payload.
design, export, remix, brand_kit_extract Current lifecycle status.
queued, running, succeeded, failed, canceled, expired Current attempt number (1-based).
Maximum attempts before dead-lettering.
HATEOAS links for this task.
ISO 8601 timestamp.
ISO 8601 timestamp.
ISO 8601 timestamp.
Live progress for running tasks. Null when not applicable.
Sanitized echo of the original request.
Result payload. Present only for succeeded tasks.
Error info for failed tasks: {message, retryable}.
Credit usage. Present only for completed tasks when billing is enabled.
Suggested milliseconds to wait before the next poll. Null for terminal tasks.