Canva Design Editing
The canonical, safe way to apply edits to an existing Canva design. Every Canva skill that mutates a design should follow this exact protocol: **start a transaction → perform operations → commit (with approval)**. Changes are draft-only until committed and are PERMANENTLY LOST if not committed.
The Transaction Protocol (always these steps, in order)
- **`Canva:start-editing-transaction`** — pass the `design_id`. Remember the returned `transaction_id` and the `pages` array; both are required by later calls. ALWAYS show the user the thumbnail(s) returned here.
- **`Canva:perform-editing-operations`** — apply edits. Pass the `transaction_id`, the `pages` array from the previous response, the `page_index` of the first page being changed, and an `operations` array. Batch multiple operations into a single call wherever possible.
- **`Canva:commit-editing-transaction`** — save. See the approval gate below. After committing, the `transaction_id` is invalid; a new edit needs a new transaction.
- **`Canva:cancel-editing-transaction`** — discard the draft instead of saving (e.g. the user rejects the preview, or you opened a transaction only to inspect the design).
Capabilities — what the API CAN and CANNOT do
### CAN (operations on `perform-editing-operations`) - **Text content**: `replace_text` (whole element), `find_and_replace_text` (substring) - **Text formatting** (`format_text`): font size, weight (normal/bold), style (normal/italic), color, alignment, line height, underline, strikethrough, links, list level/marker - **Media**: `update_fill` (replace image/video), `insert_fill` (add image/video), `delete_element` - **Layout**: `position_element`, `resize_element` - **Metadata**: `update_title` - **Autofill mapping**: `update_autofill_field` (fixed-page designs only)
### CANNOT - Change font **family/typeface** (only size, weight, style) - Add **new text elements** (you can only insert media, not new text boxes) - Change background colors or gradients - Add, remove, or reorder pages/slides - Modify animations, transitions, or element opacity (except on newly inserted fills) - Group/ungroup elements, or restyle shapes (only text inside shapes is editable)
When a requested change is in the CANNOT list, tell the user it must be done manually in the Canva editor — don't attempt a workaround.
Responsive pages — restricted operation set
Some pages come back marked `is_responsive: true`. On those pages, ONLY these operations are allowed: `update_title`, `replace_text`, `update_fill`, `delete_element`, `find_and_replace_text`.
Before calling `perform-editing-operations`, check the `pages` array. If any operation targets a responsive page with an unsupported op (e.g. `format_text`, `position_element`, `resize_element`, `insert_fill`), do NOT make the call — tell the user that operation isn't supported on that page and offer an alternative.
The commit approval gate (required)
`commit-editing-transaction` makes changes permanent. You MUST show the user exactly what changed (and the preview thumbnail) and get explicit approval before committing — e.g. "Here's the preview. Save these changes to your design?" Wait for a clear yes.
- Do NOT commit without approval.
- Do NOT tell the user changes are saved before the commit call has succeeded.
- After a successful commit, give the user a direct link to open the design in Canva.
- If a commit fails, all changes are lost — start a new transaction to retry.
> Note for composing skills: a skill that already collects a single up-front approval for a batch of changes (e.g. `canva-implement-feedback`) should treat that approval as covering the commit and NOT ask again. Follow that skill's own confirmation rules; the gate above is the default for direct, ad-hoc edits.
Workflow
### Step 1: Resolve the design - Short link (`canva.link/...`) → `Canva:resolve-shortlink` to get the URL. - Full Canva URL → extract the design ID (the segment after `/design/`). - Raw design ID (starts with `D`) → use directly; do NOT search. - Nothing provided → ask for the design ID or link.
### Step 2: Start the transaction and inspect Call `Canva:start-editing-transaction`. Show the thumbnail(s). Use the returned content to locate the exact `element_id`s you need to target. (If you only needed to look, call `cancel-editing-transaction` and stop.)
### Step 3: Build and perform operations Translate the user's request into concrete operations. Confirm scope first when a `find_and_replace_text` string could match in multiple places or contexts — ask which instances they mean. Batch all operations into one `perform-editing-operations` call when you can.
### Step 4: Preview and commit Show the resulting thumbnail and a plain-language list of what changed. Ask for approval, then `commit-editing-transaction`. Share the edit link.
## Rules - Always remember and reuse the `transaction_id` and `pages` array within a transaction. - Never leave a transaction uncommitted without telling the user their draft was discarded. - For destructive ops (`delete_element`, large `find_and_replace_text`), confirm scope before performing. - Prefer one batched `perform-editing-operations` call over many small ones.