---
title: "Duplicate a Tella Motion document"
method: POST
path: "/v1/motion/documents/{id}/duplicate"
tags: ["Tella Motion"]
---

# Duplicate a Tella Motion document

`POST /v1/motion/documents/{id}/duplicate`

## Request

- Base URL: `https://api.tella.com`
- URL: `https://api.tella.com/v1/motion/documents/{id}/duplicate`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/withchima/apis/tella-public-api/docs/v1/motion/documents/:id/duplicate/post.ts> (a function with typed inputs; its response is checked against the schema)

Copies a document under the same owner and optionally edits the copy in the same request with `commands`. Use it to reuse a design with other content, such as the same title card with another heading. The copy is independent of the original.

## Path parameters

- `id` string, required: Tella Motion document ID (ffd_…), from `GET /v1/motion/documents`.

## Request body

- DuplicateMotionDocumentRequest: Copy a document under the same owner. The copy is independent: later edits to either do not reach the other.
  - `commands` MotionEdit[]: Edits to run on the copy, as `POST /v1/motion/documents/{id}/commands` takes them, e.g. `setTitle` to give the same title card another heading.
    - union: One edit in a batch: an editor command (camelCase `type`, times in seconds) or an op (dotted `type`, raw render timeline values). See https://docs.tella.com/mcp-tools/motion-commands for every command and op with an example.
      - MotionCommandSetCurve: Sets a named curve: a number, keys on the canvas clock, or an expression over other curves. `null` removes it.
        - `name` string, required: The curve's name.
        - `type` 'setCurve', required
        - `value` union, required: A number, keys, or an expression over other curves; null removes it. Every reader (bindProperty, a shader uniform) sees the same value at the same canvas time.
          - number
          - object[]
            - `at` number, required: Seconds on the canvas clock.
            - `easing` 'linear' | 'hold' | 'ease' | 'easeIn' | 'easeOut': Into the next key; hold steps (a shot's value until a cut).
            - `value` number, required
          - union
            - number
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
      - MotionCommandBindProperty: Binds a node's property to an expression: a curve, the time, arithmetic over them, or where a canvas point lands through a lens shader's camera. Bound to a title's `text`, the title shows the number.
        - `node` string, required
        - `property` string, required: A numeric property in the units commands take (x, y px, rotation °, scale and opacity as fractions, a field:… such as a shader uniform), or text on a title: its text becomes the number.
        - `text` object: For text: around the number (0 decimals by default).
          - `decimals` integer
          - `prefix` string
          - `suffix` string
        - `to` union, required
          - number
          - object
            - `curve` string, required: The curve's name.
          - object
            - `time` 'seconds', required
          - object
            - `args` Schema0[], required
            - `op` 'add' | 'subtract' | 'multiply' | 'divide' | 'min' | 'max' | 'abs' | 'negate' | 'sin' | 'cos' | 'pow' | 'sqrt' | 'floor' | 'round' | 'mod' | 'mix' | 'clamp' | 'step' | 'smoothstep', required
          - object
            - `axis` 'x' | 'y', required
            - `project` object, required
              - …
        - `type` 'bindProperty', required
      - MotionCommandSplit: Splits a node in two at a time.
        - `at` number, required: Where to split, on the node's composition clock.
        - `newNodeId` string: The second half's id; generated when left out.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `type` 'split', required
      - MotionCommandTrim: Moves a node's start or end. A new start trims the head: what plays stays put.
        - `end` number: The new end.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `ripple` boolean: In a sequence, the node keeps its start and what follows moves by as much as its length changes.
        - `start` number: The new start; what plays stays put.
        - `type` 'trim', required
      - MotionCommandDelete: Removes a node. `ripple` closes the gap it leaves in a sequence.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `ripple` boolean: In a sequence, close the gap it leaves.
        - `type` 'delete', required
      - MotionCommandDuplicate: Copies a node, with its keys and effects, next to itself.
        - `newNodeId` string: The copy's id; generated when left out.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `type` 'duplicate', required
      - MotionCommandSetSpeed: Plays a node faster or slower (0.05 to 20).
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `speed` number, required: 2 plays twice as fast.
        - `type` 'setSpeed', required
      - MotionCommandSetTransition: Sets the transition into a sequence child from the child that ends where it starts.
        - `duration` number: Seconds, 0.5 by default; never longer than either child.
        - `kind` 'none' | 'crossfade' | 'left' | 'right' | 'up' | 'down', required: crossfade dissolves; left, right, up and down wipe in that direction; none removes the transition.
        - `node` string, required: The sequence child the transition leads into; another child must end where it starts.
        - `type` 'setTransition', required
      - MotionCommandAddTitle: Adds a title (text). `box` places the top-left of its first line and the width it wraps and aligns in.
        - `align` 'left' | 'center' | 'right': Within the box's width; center for a new title.
        - `box` object: Where the text lays out, px in its composition: x, y the top-left of the first line's box (fontSize × lineHeight tall, glyphs sit inside it by their font's metrics), width what it wraps and aligns in.
          - `width` number, required
          - `x` number, required
          - `y` number, required
        - `color` string: Text colour; white for a new title.
        - `duration` number: Seconds; 3 by default.
        - `font` string: A font from list_motion_fonts: a catalog slug, e.g. inter, or a font uploaded to your library or your workspace's by its id (mi_…).
        - `fontSize` number: Px; 96 for a new title.
        - `letterSpacing` number: Added between characters, in em: 0.05 is 5% of the font size. 0 for a new title.
        - `lineHeight` number: A multiple of the font size; 1.2 for a new title.
        - `nodeId` string: The new node's id; generated when left out.
        - `parent` string: Where the new node goes: a sequence, a group, a composition instance (its composition's root), or "" for the canvas. The canvas when left out.
        - `start` number, required: On the clock of the composition it goes in.
        - `text` string: What it says; `Title` for a new title.
        - `type` 'addTitle', required
        - `weight` integer: 100 (thin) to 900 (black); list_motion_fonts gives each font's range, and a font draws the nearest weight it has.
      - MotionCommandAddShape: Adds a shape: `fill` covers its composition, `rect` and `circle` draw in `box`. A `#00000000` fill with backdrop effects is an adjustment layer.
        - `box` object: Where a rect or circle draws, px in its composition; a circle fits the box's smaller side, centred. A rect or circle keeps its box when left out.
          - `height` number, required
          - `width` number, required
          - `x` number, required
          - `y` number, required
        - `color` string: #rrggbbaa for a see-through fill; #00000000 makes a shape whose backdrop effects adjust what is beneath it.
        - `duration` number: Seconds; 3 by default.
        - `nodeId` string: The new node's id; generated when left out.
        - `parent` string: Where the new node goes: a sequence, a group, a composition instance (its composition's root), or "" for the canvas. The canvas when left out.
        - `radius` number: A rect's corner radius, px.
        - `shape` 'fill' | 'rect' | 'circle': fill covers its composition; rect when box is given.
        - `start` number, required: On the clock of the composition it goes in.
        - `type` 'addShape', required
      - MotionCommandAddMedia: Places a video, image or sound: `mediaId` for media already in the document (`list_motion_media`), or `sourceId` for an upload, which Tella reads as the image, video or sound it is.
        - `duration` number: How long it plays: an image 3s by default; video and audio play from their start for this long, else whole, cut where the composition ends.
        - `mediaId` string: Media already in the document, from list_motion_media.
        - `nodeId` string: The new node's id; generated when left out.
        - `parent` string: Where the new node goes: a sequence, a group, a composition instance (its composition's root), or "" for the canvas. The canvas when left out.
        - `ripple` boolean: Into a sequence: what starts at start or later moves on to make room, instead of refusing an overlap. A clip that start falls inside is still refused; split it first.
        - `sourceId` string: Or an upload (su_…): a source from create_source, a chat attachment, or a library item's sourceId. Tella reads from the upload whether it is an image, a video or a sound and declares the asset to match. Pass exactly one of mediaId and sourceId.
        - `start` number, required: On the clock of the composition it goes in.
        - `type` 'addMedia', required
      - MotionCommandSetTitle: Changes a title's text, box, font, size, colour or spacing.
        - `align` 'left' | 'center' | 'right': Within the box's width; center for a new title.
        - `box` object: Where the text lays out, px in its composition: x, y the top-left of the first line's box (fontSize × lineHeight tall, glyphs sit inside it by their font's metrics), width what it wraps and aligns in.
          - `width` number, required
          - `x` number, required
          - `y` number, required
        - `color` string: Text colour; white for a new title.
        - `font` string: A font from list_motion_fonts: a catalog slug, e.g. inter, or a font uploaded to your library or your workspace's by its id (mi_…).
        - `fontSize` number: Px; 96 for a new title.
        - `letterSpacing` number: Added between characters, in em: 0.05 is 5% of the font size. 0 for a new title.
        - `lineHeight` number: A multiple of the font size; 1.2 for a new title.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `text` string: What it says; `Title` for a new title.
        - `type` 'setTitle', required
        - `weight` integer: 100 (thin) to 900 (black); list_motion_fonts gives each font's range, and a font draws the nearest weight it has.
      - MotionCommandSetShape: Changes a shape's kind, box, colour or corner radius.
        - `box` object: Where a rect or circle draws, px in its composition; a circle fits the box's smaller side, centred. A rect or circle keeps its box when left out.
          - `height` number, required
          - `width` number, required
          - `x` number, required
          - `y` number, required
        - `color` string: #rrggbbaa for a see-through fill; #00000000 makes a shape whose backdrop effects adjust what is beneath it.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `radius` number: A rect's corner radius, px.
        - `shape` 'fill' | 'rect' | 'circle': fill covers its composition; rect when box is given.
        - `type` 'setShape', required
      - MotionCommandAnimate: Applies an In or Out preset: two keys on opacity, position or scale from an edge at the node's start, or to one at its end. They are ordinary keys afterwards.
        - `in` object: Keys from an edge at its start to where it is duration later.
          - `duration` number, required: Seconds.
          - `easing` union
            - 'linear' | 'hold' | 'easyEase' | 'easyEaseIn' | 'easyEaseOut' | 'autoBezier' | 'easeInOutSine' | 'easeInOutCubic' | 'easeInOutExpo' | 'easeOutCubic' | 'easeInCubic' | 'easeOutBack' | 'easeInOutBack' | 'springGentle' | 'springBouncy'
            - object
              - …
            - object: Continuous bezier keys: one speed (units per second) on both sides of each key, derived from its neighbours when left out, with handles inInfluence and outInfluence of the segments around it (1/6 by default). autoBezier derives the speed from the keys either side; numbers only.
              - …
          - `kind` 'fade' | 'slideLeft' | 'slideRight' | 'slideUp' | 'slideDown' | 'pop', required
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `out` object: Keys from where it is duration before its end to an edge there.
          - `duration` number, required: Seconds.
          - `easing` union
            - 'linear' | 'hold' | 'easyEase' | 'easyEaseIn' | 'easyEaseOut' | 'autoBezier' | 'easeInOutSine' | 'easeInOutCubic' | 'easeInOutExpo' | 'easeOutCubic' | 'easeInCubic' | 'easeOutBack' | 'easeInOutBack' | 'springGentle' | 'springBouncy'
            - object
              - …
            - object: Continuous bezier keys: one speed (units per second) on both sides of each key, derived from its neighbours when left out, with handles inInfluence and outInfluence of the segments around it (1/6 by default). autoBezier derives the speed from the keys either side; numbers only.
              - …
          - `kind` 'fade' | 'slideLeft' | 'slideRight' | 'slideUp' | 'slideDown' | 'pop', required
        - `type` 'animate', required
      - MotionCommandSetProperty: Sets a property. On an animated property `at` is required and sets the key there; without `value` it adds a key holding the value at `at`. `blendMode`, `flipX` and `flipY` are set without `at`.
        - `at` number: Where to set it when the property is animated: the key there is added or changed. Required then.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `property` string, required: A property name (x, y, scale, rotation, opacity, volume, …) or a field:… path; inspect_motion_node_properties lists a node's.
        - `type` 'setProperty', required
        - `value` union: Left out, a key at `at` holding the value the property has there.
          - number
          - string
          - boolean
          - 'normal' | 'clear' | 'src' | 'dst' | 'srcOver' | 'dstOver' | 'srcIn' | 'dstIn' | 'srcOut' | 'dstOut' | 'srcATop' | 'dstATop' | 'xor' | 'plus' | 'modulate' | 'screen' | 'overlay' | 'darken' | 'lighten' | 'colorDodge' | 'colorBurn' | 'hardLight' | 'softLight' | 'difference' | 'exclusion' | 'multiply' | 'hue' | 'saturation' | 'color' | 'luminosity' | 'linearBurn' | 'vividLight' | 'linearLight' | 'pinLight' | 'hardMix' | 'subtract' | 'divide' | 'darkerColor' | 'lighterColor' | 'stencilAlpha' | 'stencilLuma' | 'silhouetteAlpha' | 'silhouetteLuma' | 'dissolve' | 'animatedDissolve' | 'premultipliedColorBurn' | 'premultipliedColorDodge' | 'premultipliedDifference' | 'alphaAdd'
      - MotionCommandSetKeyframes: Replaces a property's animation with these keys. `easing: "continuous"` carries speed through each key (auto bezier), so moves ease into each other without a jolt.
        - `easing` union: Every key's easing into the next, unless the key sets its own.
          - 'linear' | 'hold' | 'easyEase' | 'easyEaseIn' | 'easyEaseOut' | 'autoBezier' | 'easeInOutSine' | 'easeInOutCubic' | 'easeInOutExpo' | 'easeOutCubic' | 'easeInCubic' | 'easeOutBack' | 'easeInOutBack' | 'springGentle' | 'springBouncy'
          - object
            - `x1` number, required
            - `x2` number, required
            - `y1` number, required
            - `y2` number, required
          - object: Continuous bezier keys: one speed (units per second) on both sides of each key, derived from its neighbours when left out, with handles inInfluence and outInfluence of the segments around it (1/6 by default). autoBezier derives the speed from the keys either side; numbers only.
            - `inInfluence` number
            - `outInfluence` number
            - `speed` number
          - 'continuous'
        - `keys` object[], required
          - `at` number, required: Seconds on the node's composition clock.
          - `easing` union: Into the next key. continuous (auto bezier) carries the speed through the keys around it, so a fast move eases into a slow one and out again without a jolt and without overshooting; numbers only.
            - 'linear' | 'hold' | 'easyEase' | 'easyEaseIn' | 'easyEaseOut' | 'autoBezier' | 'easeInOutSine' | 'easeInOutCubic' | 'easeInOutExpo' | 'easeOutCubic' | 'easeInCubic' | 'easeOutBack' | 'easeInOutBack' | 'springGentle' | 'springBouncy'
            - object
              - …
            - object: Continuous bezier keys: one speed (units per second) on both sides of each key, derived from its neighbours when left out, with handles inInfluence and outInfluence of the segments around it (1/6 by default). autoBezier derives the speed from the keys either side; numbers only.
              - …
            - 'continuous'
          - `value` union, required: In the property's units.
            - number
            - string
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `property` string, required: A property name (x, y, scale, rotation, opacity, volume, …) or a field:… path; inspect_motion_node_properties lists a node's.
        - `type` 'setKeyframes', required
      - MotionCommandEditKeyframe: Moves, revalues or re-eases one key by its id (`inspect_motion_node_properties` lists ids), or re-eases several keys, or every key when neither `key` nor `keys` is given.
        - `at` number: Moves the key here.
        - `easing` union: Into the next key.
          - 'linear' | 'hold' | 'easyEase' | 'easyEaseIn' | 'easyEaseOut' | 'autoBezier' | 'easeInOutSine' | 'easeInOutCubic' | 'easeInOutExpo' | 'easeOutCubic' | 'easeInCubic' | 'easeOutBack' | 'easeInOutBack' | 'springGentle' | 'springBouncy'
          - object
            - `x1` number, required
            - `x2` number, required
            - `y1` number, required
            - `y2` number, required
          - object: Continuous bezier keys: one speed (units per second) on both sides of each key, derived from its neighbours when left out, with handles inInfluence and outInfluence of the segments around it (1/6 by default). autoBezier derives the speed from the keys either side; numbers only.
            - `inInfluence` number
            - `outInfluence` number
            - `speed` number
        - `key` string: A keyframe's id, as inspect_motion_node_properties lists it; it stays as the key moves.
        - `keys` string[]: Several keys to ease at once; every key when neither key nor keys is given. Easing only.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `property` string, required: A property name (x, y, scale, rotation, opacity, volume, …) or a field:… path; inspect_motion_node_properties lists a node's.
        - `type` 'editKeyframe', required
        - `value` union: The key's new value.
          - number
          - string
      - MotionCommandRemoveKeyframes: Removes keys by id or time, or all of them, leaving the property at its value there.
        - `at` number[]: The keys' times; all of them (the property holds its value there) when left out.
        - `keys` string[]: The keys' ids.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `property` string, required: A property name (x, y, scale, rotation, opacity, volume, …) or a field:… path; inspect_motion_node_properties lists a node's.
        - `type` 'removeKeyframes', required
      - MotionCommandAddEffect: Adds an effect to a node's stack. `kind: "shader"` runs your own SkSL. `backdrop: true` filters what is beneath the node instead (frosted glass; on a transparent shape, an adjustment layer).
        - `backdrop` boolean: Filter what is drawn beneath the node's bounds instead of the node (frosted glass; on a transparent shape, an adjustment layer). Pixel filters only.
        - `effectId` string: The effect's id in the node's stack, as inspect_motion_node_properties lists it.
        - `index` integer: Place in the stack, 0 innermost (applied first); outermost when left out.
        - `inputs` object: For kind shader: each `uniform shader` input, a node of the same composition.
        - `kind` string, required: An effect kind from list_motion_effects: a render timeline effect type (blur, glow, dropShadow, …), a built-in shader's name (fx.levels, fx.vignette, …), shader for your own SkSL in source, or an audio effect (parametricEq, compressor, reverb, …) for a node's sound, which runs in chain order and takes no backdrop.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `params` object: Parameters by name, as list_motion_effects gives them: numbers, #rrggbb(aa) colours, [x, y] points, true/false, an option, or a node path.
        - `preset` string: A preset of the kind, by name from list_motion_effects; list_motion_effects {kind, preset} shows the settings it sets, which params then override.
        - `source` string: For kind shader: SkSL with `uniform shader image;` (the node) and `half4 main(float2 p)`; `uniform float2 resolution` is bound to the node's size. For random values and noise, call the shader library, which Tella adds to your source and which draws the same on every GPU: `tella_hash2d(p)` and `tella_hash3d(p)` (a value in 0..1 per whole-number cell), `tella_noise2d(p)` and `tella_noise3d(p)` (smooth value noise in 0..1) and `tella_fbm2d(p, octaves)` and `tella_fbm3d(p, octaves)` (fractal noise, 1 to 8 octaves). Don't hash with `fract(sin(...))` or `fract(p * k)`: export GPUs round those differently, which draws lines along the noise grid.
        - `type` 'addEffect', required
        - `uniforms` object: For kind shader: each other uniform's values, as many as it declares (float 1, float2 2, half4 4); the renderer checks them against the SkSL. Each value keys as a property afterwards.
      - MotionCommandSetEffect: Changes an effect's parameters or preset, or switches it off (`enabled: false` keeps its settings and keys).
        - `backdrop` boolean: Filter what is drawn beneath the node's bounds instead of the node (frosted glass; on a transparent shape, an adjustment layer). Pixel filters only.
        - `effectId` string, required: The effect's id in the node's stack, as inspect_motion_node_properties lists it.
        - `enabled` boolean: The effect's switch: false draws the node unaffected, keeping its settings and keyframes.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `params` object: Parameters by name, as list_motion_effects gives them: numbers, #rrggbb(aa) colours, [x, y] points, true/false, an option, or a node path.
        - `preset` string: A preset of the kind, by name from list_motion_effects; list_motion_effects {kind, preset} shows the settings it sets, which params then override.
        - `type` 'setEffect', required
      - MotionCommandRemoveEffect: Removes an effect from a node's stack.
        - `effectId` string, required: The effect's id in the node's stack, as inspect_motion_node_properties lists it.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `type` 'removeEffect', required
      - MotionCommandMoveEffect: Moves an effect in the stack; index 0 applies first.
        - `effectId` string, required: The effect's id in the node's stack, as inspect_motion_node_properties lists it.
        - `index` integer, required: Its new place, 0 innermost (applied first).
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `type` 'moveEffect', required
      - MotionCommandSetMasks: Replaces a node's masks (rectangles, ellipses or SVG paths), applied before its effects. `[]` removes them.
        - `masks` object[], required: Replaces the node's masks, applied before its effects; [] removes them. Their numbers key as properties afterwards.
          - `expansion` number: Px the mask grows by; negative shrinks it.
          - `feather` number: Px of soft edge.
          - `featherFalloff` 'smooth' | 'linear': How coverage falls across the feather; smooth by default.
          - `featherPoints` object[]: Variable-width feather: at is a fraction of the mask's outline from its start, radius widens the feather outward (positive) or inward (negative) there, interpolated between points.
            - `at` number, required
            - `id` string: The point's id, to keep a point setMasks is given again; a new point gets one.
            - `radius` number, required
          - `height` number
          - `inverted` boolean: Keep what is outside the mask instead.
          - `mode` 'add' | 'subtract' | 'intersect' | 'lighten' | 'darken' | 'difference' | 'none': How it combines with the masks before it; add by default. none leaves it out, for a stack effect's mask.
          - `opacity` number
          - `path` string: SVG path data in the pixels the node is placed in.
          - `radius` number: A rect's corner radius.
          - `shape` 'rect' | 'ellipse' | 'path', required
          - `width` number
          - `x` number: Left of a rect or ellipse, in the pixels the node is placed in: masks do not follow its position, scale or rotation, so key them with it.
          - `y` number: Top of a rect or ellipse, in the pixels the node is placed in.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `type` 'setMasks', required
      - MotionCommandSetMatte: Shows a node through another node of the same composition (a track matte), by its alpha or luma. The matte node is hidden unless `showMatte`.
        - `matte` string, nullable, required: A node in the same composition; null removes the matte.
        - `mode` 'alpha' | 'alphaInverted' | 'luma' | 'lumaInverted': Show the node where the matte is opaque (alpha) or bright (luma), or the inverse; alpha by default.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `showMatte` boolean: Keep the matte node visible; it is hidden by default.
        - `type` 'setMatte', required
      - MotionCommandGroup: Groups sibling nodes into one layer in the topmost one's place, to move, fade or add effects to them together.
        - `name` string: The group's name in the editor.
        - `nodeId` string: The group's id; generated when left out.
        - `nodes` string[], required: Siblings to group.
        - `type` 'group', required
      - MotionCommandUngroup: Puts a group's nodes back in its place. A moved group leaves a hidden null they follow; a clipped or filtered group is refused.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `type` 'ungroup', required
      - MotionCommandStagger: Starts each node `interval` seconds after the one before, moving their keys and effects with them.
        - `interval` number, required: Seconds between one node's start and the next's.
        - `nodes` string[], required: In the order they start; each moves with its keys and effects.
        - `start` number: Where the first starts; where it starts now when left out.
        - `type` 'stagger', required
      - MotionCommandApplyLook: Copies one node's style (opacity, blend, flips, corners, colour, blur, shadow) and effect stack onto others. Where they sit and how big they are stay their own.
        - `from` string, required: The node whose look is copied.
        - `include` string[]: style: opacity, blend, flips, corners, colour, blur and shadow; effects: the effect stack, keys included. Both when left out. Where each node sits and how big it is stay its own.
        - `nodes` string[], required: The nodes that take it.
        - `type` 'applyLook', required
      - MotionCommandFitCanvas: Shrinks the canvas to what its nodes draw at rest, plus `padding`, moving them and their keys with it. Its note gives the rectangle to place the overlay at so the content stays where it was in the video.
        - `padding` number: Px around the content, room for shadows and glows; 48 when left out.
        - `type` 'fitCanvas', required
      - MotionCommandSetMarkers: Sets every marker a node keeps: moments or spans with labels, for timing other nodes to.
        - `markers` object[], required: Every marker the node has afterwards; [] removes them all.
          - `at` number, required: On the node's composition clock, at or after its start.
          - `duration` number: A span rather than a moment.
          - `id` string: Keep a marker's id to edit it; generated when left out.
          - `label` string: Its text.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `type` 'setMarkers', required
      - MotionCommandSetTimeRemap: Replaces a media node's or composition instance's timing with keys of which source time shows when: slow motion, speed ramps and freeze frames (`hold`). Media plays forward only.
        - `keys` object[], nullable, required: Replaces the node's timing with these keys (media forward only; an instance can reverse); null restores it.
          - `at` number, required: On the node's composition clock.
          - `easing` 'linear' | 'hold' | 'ease': Into the next key; hold freezes the frame.
          - `source` number, required: The media's (or instance's composition's) time shown there.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `type` 'setTimeRemap', required
      - MotionCommandSetExpression: Adds a wiggle (random drift over the property's value) or a loop (repeats its keys) to a property, or removes one. The value and keys underneath stay editable.
        - `expression` union, required
          - object
            - `amount` number, required: How far it wanders, in the property's units.
            - `frequency` number, required: Wiggles per second.
            - `kind` 'wiggle', required
            - `seed` integer: Another seed gives another random path.
          - object
            - `kind` 'noWiggle', required
          - object
            - `amount` number, required: Added at full scale, in the property's units: the property becomes its value plus amount × the sound's RMS level (0..1) over the frame ending now.
            - `band` object: Hertz: the level of these frequencies alone.
              - …
            - `channel` 'mono' | 'left' | 'right'
            - `kind` 'audio', required
            - `sound` string, required: The node of the same composition whose sound drives it (a voice, music, a tone).
          - object
            - `kind` 'noAudio', required
          - object
            - `direction` 'in' | 'out', required: out repeats after the last key (loopOut), in before the first.
            - `keyframes` integer: Loop only the last (or first) this many keys.
            - `kind` 'loop', required
            - `mode` 'cycle' | 'pingPong' | 'offset' | 'continue', required: cycle repeats the keys, pingPong plays them back and forth, offset repeats them from where the last cycle ended, continue carries on at the last key's speed.
          - object
            - `direction` 'in' | 'out', required
            - `kind` 'noLoop', required
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `property` string, required: A property name (x, y, scale, rotation, opacity, volume, …) or a field:… path; inspect_motion_node_properties lists a node's.
        - `type` 'setExpression', required
      - MotionCommandSetTextAnimation: Animates a title per character, word or line as it comes in or goes out. `preset: null` removes it.
        - `duration` number: Seconds each unit takes (0.4 by default).
        - `from` 'start' | 'end' | 'center' | 'edges' | 'random': Which units go first; start by default.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `phase` 'in' | 'out', required: in as the title appears; out ends as the title ends.
        - `preset` 'typewriter' | 'fade' | 'rise' | 'drop' | 'pop' | 'blur' | 'slideLeft' | 'slideRight' | 'spread' | 'spin', nullable, required: null removes the phase's animation.
        - `stagger` number: Seconds between units' starts (0.04 by default).
        - `type` 'setTextAnimation', required
        - `unit` 'character' | 'word' | 'line': What animates one at a time; character by default.
      - MotionCommandAddPath: Adds a vector path from SVG path data in canvas pixels, filled, stroked or both.
        - `cap` 'butt' | 'round' | 'square': How a stroke's open ends are drawn.
        - `color` string: Fill and stroke colour.
        - `duration` number: Seconds; 3 by default.
        - `join` 'miter' | 'round' | 'bevel': How a stroke's corners are drawn.
        - `nodeId` string: The new node's id; generated when left out.
        - `paint` 'fill' | 'stroke' | 'both': Fill the path's inside, stroke its line, or both.
        - `parent` string: Where the new node goes: a sequence, a group, a composition instance (its composition's root), or "" for the canvas. The canvas when left out.
        - `path` string, required: SVG path data in canvas pixels.
        - `start` number, required: On the clock of the composition it goes in.
        - `strokeWidth` number: Px.
        - `type` 'addPath', required
      - MotionCommandSetPath: Changes a path's points or paint, or morphs it between keyed paths (matching point counts morph point for point).
        - `cap` 'butt' | 'round' | 'square': How a stroke's open ends are drawn.
        - `color` string: Fill and stroke colour.
        - `join` 'miter' | 'round' | 'bevel': How a stroke's corners are drawn.
        - `keys` object[]: Morph keys: the shape takes each path at its time, morphing between (matching point counts morph point for point).
          - `at` number, required: Seconds on the node's composition clock.
          - `easing` union: Into the next key.
            - 'linear' | 'hold' | 'easyEase' | 'easyEaseIn' | 'easyEaseOut' | 'autoBezier' | 'easeInOutSine' | 'easeInOutCubic' | 'easeInOutExpo' | 'easeOutCubic' | 'easeInCubic' | 'easeOutBack' | 'easeInOutBack' | 'springGentle' | 'springBouncy'
            - object
              - …
            - object: Continuous bezier keys: one speed (units per second) on both sides of each key, derived from its neighbours when left out, with handles inInfluence and outInfluence of the segments around it (1/6 by default). autoBezier derives the speed from the keys either side; numbers only.
              - …
          - `path` string, required: SVG path data at this key.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `paint` 'fill' | 'stroke' | 'both': Fill the path's inside, stroke its line, or both.
        - `path` string: New points, constant.
        - `strokeWidth` number: Px.
        - `type` 'setPath', required
      - MotionCommandDuck: Turns a sound (music) down while other nodes (voice) play. Its level and fades stay editable; `under: []` removes the duck.
        - `amountDb` number: -12 by default.
        - `attack` number: Seconds, 0.3 by default.
        - `node` string, required: The sound to turn down (music).
        - `release` number: Seconds, 0.5 by default.
        - `type` 'duck', required
        - `under` string[], required: Nodes (voice) it ducks under while they play; [] removes the duck.
      - MotionCommandExpect: Fails the batch unless a node exists (or not), or a property has a value at a time, within `tolerance`.
        - `at` number: Seconds on the node's composition clock.
        - `exists` boolean: true: the node must exist; false: it must not.
        - `node` string: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `property` string: A property name (x, y, scale, rotation, opacity, volume, …) or a field:… path; inspect_motion_node_properties lists a node's.
        - `tolerance` number: How far the value may be from `value`.
        - `type` 'expect', required
        - `value` union: The property's value at `at` (its start by default).
          - number
          - string
      - MotionCommandSetFades: Sets a sound's fade in and fade out, in seconds.
        - `fadeIn` number: Seconds.
        - `fadeOut` number: Seconds.
        - `node` string, required: A node's id: ids are unique in the document, so a node inside a composition is named by its id alone. A path through instances (scene.1/title) is accepted too.
        - `type` 'setFades', required
      - MotionOp
        - `type` 'document.rename' | 'canvas.set' | 'node.insert' | 'node.remove' | 'node.patch' | 'node.move' | 'node.trim' | 'node.wrap' | 'node.unwrap' | 'node.rewrap' | 'node.split' | 'meta.set' | 'asset.set' | 'asset.remove' | 'composition.set' | 'composition.remove' | 'transition.set' | 'transition.remove' | 'curve.set', required: The op: what the document stores, with render timeline values. `GET /v1/motion/schema?schema=edits&type=…` gives each one's fields.
  - `name` string, required: The copy's name.

## Response `201`

Created

- DuplicateMotionDocumentResponse: The copy and, with commands, the batch's result
  - `applied` MotionApplyResult: The outcome of a batch. On failure `ok` is false and the error names the failing item's index; nothing is applied.
    - `changed` boolean
    - `ok` boolean, required
    - `seq` integer: The document's revision after the batch.
  - `document` MotionDocument, required: A Tella Motion document: a render timeline (a tree of media, sound, text, shape, sequence and composition nodes) that a Tella Motion clip, overlay or b-roll plays live, so edits show in the video at once.
    - `createdAt` string, required
    - `id` string, required: Document ID
    - `name` string, required
    - `ownerID` string, required: The owner's ID: the video's, for `story` documents; yours, for `user` documents.
    - `sceneID` string: The clip that plays this document, when it is a Tella Motion clip's. Absent for overlays and b-roll.
    - `scope` string, required: Who owns the document: `story` for a video's own documents (its Tella Motion clips, overlays and b-roll), `user` for one of yours that no video plays yet.

## Other responses

- `400`: The request was malformed or contained invalid parameters.
- `401`: Authentication is required. Provide a valid API key.
- `403`: You don't have permission to access this resource.
- `404`: The requested resource was not found.
- `409`: The request conflicts with the resource's current state, e.g. an Idempotency-Key whose first request is still in progress. Retry once it settles.
- `429`: You have exceeded the rate limit. Please slow down.
- `500`: An unexpected error occurred
- `501`: The requested operation is not implemented.
- `503`: A dependency was unavailable and the request was not executed. Safe to resend unchanged after the Retry-After delay.

## Changes

> 65 revisions in range; 1 not diffed.

- **2026-10-29** `6ae7d793a0a7`: 6 breaking, 15 info
  - removed `subschema #1` from the `commands/items/anyOf[subschema #14: animate]/in/easing` request property `anyOf` list
  - removed `subschema #1` from the `commands/items/anyOf[subschema #14: animate]/out/easing` request property `anyOf` list
  - removed `subschema #1` from the `commands/items/anyOf[subschema #16: setKeyframes]/easing/anyOf[subschema #1]/` request property `anyOf` list
  - removed `subschema #1` from the `commands/items/anyOf[subschema #16: setKeyframes]/keys/items/easing/anyOf[subschema #1]/` request property `anyOf` list
  - …17 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/withchima/apis/tella-public-api/changes/v1/motion/documents/:id/duplicate/post.md)

---

[API](https://skmtc.dev/withchima/apis/tella-public-api.md) - [All operations](https://skmtc.dev/withchima/apis/tella-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/withchima/apis/tella-public-api/revisions/0cc3fcd307ad?raw)
