studio.apply_ops
Apply several edits atomically against base_version; any refusal applies nothing and names the failing op. Small models: prefer the single-purpose verbs. Each op is {op, args}; the ops and their args are: add_scene_from_asset {asset_id, at_index?}; delete_elements {element_ids, ripple_secondary?}; shift_clips {clip_ids, delta_ms}; duplicate_clips {clip_ids, at_ms}; insert_time {at_ms, length_ms}; ripple_delete {element_id, scope?}; roll_edit {left_id, right_id, delta_ms}; slip_edit {clip_id, delta_ms}; slide_edit {clip_id, delta_ms}; move_caption {caption_id?, at_ms?, delta_ms}; cut_transcript_span {from_caption_id, to_caption_id, from_word_index?, to_word_index?}; add_track {role, name?}; remove_track {track_id, delete_clips?}; move_track {track_id, position}; rename_track {track_id, name}; set_track_muted {track_id, muted}; move_clips_to_track {clip_ids, track_id, delta_ms?}; place_product_card {stock_item_id, product_name, sell_price_cents, currency, start_ms?, duration_ms?, style?, track_id?}. base_version is the composition_version you last read; a stale one is refused with a 409 that carries head_version, so re-read with studio.get_composition and resend. Send 1 to 50 ops per call.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | The edits, applied in order; all land or none do. | |
| project_id | Yes | The studio project (vp_…) this batch edits. | |
| base_version | Yes | The composition_version your ops were planned against (0 for a project with no saved composition). |