---
title: "Execute a revision-checked editor command"
method: POST
path: "/projects/{projectId}/editor-commands/execute"
tags: ["Timeline Editing"]
---

# Execute a revision-checked editor command

`POST /projects/{projectId}/editor-commands/execute`

## Request

- Base URL: `https://blitzreels.com/api/v1`
- URL: `https://blitzreels.com/api/v1/projects/{projectId}/editor-commands/execute`
- Auth: API key in header `Authorization`

Execute a revision-checked editor command.

## Path parameters

- `projectId` string, required

## Request body

- object
  - `expectedRevision` integer, required
  - `command` union, required
    - object
      - `kind` 'setText', required
      - `itemId` string, nullable, required
      - `text` string, required
      - `textKind` 'overlay' | 'title_card', required
      - `spec` object, nullable, required
      - `startSeconds` number, required
      - `durationSeconds` number, required
    - object
      - `kind` 'insertAsset', required
      - `assetId` string, required
      - `startSeconds` number, required
      - `durationSeconds` number, nullable, required
      - `layerIndex` integer, nullable, required
    - object
      - `kind` 'keyframes', required
      - `changes` union[], required
        - union
          - object
            - `kind` 'create', required
            - `keyframeId` string, uuid, nullable, required
            - `timelineItemId` string, required
            - `property` 'positionX' | 'positionY' | 'scale' | 'rotation' | 'opacity' | 'volume' | 'sourceCropX' | 'sourceCropY' | 'sourceCropWidth' | 'sourceCropHeight', required
            - `timeSeconds` number, required
            - `value` number, required
            - `easing` 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' | 'custom', required
            - `bezier` object, nullable, required
              - …
          - object
            - `kind` 'update', required
            - `keyframeId` string, required
            - `timelineItemId` string, required
            - `property` 'positionX' | 'positionY' | 'scale' | 'rotation' | 'opacity' | 'volume' | 'sourceCropX' | 'sourceCropY' | 'sourceCropWidth' | 'sourceCropHeight', nullable, required
            - `timeSeconds` number, nullable, required
            - `value` number, nullable, required
            - `easing` 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' | 'custom', nullable, required
            - `bezier` object, nullable, required
              - …
          - object
            - `kind` 'remove', required
            - `keyframeId` string, required
            - `timelineItemId` string, required
          - object
            - `kind` 'removeProperties', required
            - `timelineItemId` string, required
            - `properties` string[], required
    - object
      - `kind` 'crop', required
      - `itemId` string, required
      - `crop` object, required
        - `x` number, required
        - `y` number, required
        - `width` number, required
        - `height` number, required
    - object
      - `kind` 'move', required
      - `items` object[], required
        - `id` string, required
        - `startSeconds` number, required
        - `layerIndex` integer, required
    - object
      - `kind` 'duplicate', required
      - `items` object[], required
        - `id` string, required
        - `startSeconds` number, required
        - `layerIndex` integer, required
    - object
      - `kind` 'visibility', required
      - `itemIds` string[], required
      - `ignored` boolean, required
    - object
      - `kind` 'remove', required
      - `itemIds` string[], required
      - `removeAssociatedCaptions` boolean, required
    - object
      - `kind` 'pack', required
      - `mode` 'clips' | 'tracks', required
    - object
      - `kind` 'group', required
      - `itemIds` string[], required
    - object
      - `kind` 'ungroup', required
      - `groupId` string, required
    - object
      - `kind` 'reorderTrack', required
      - `sourceLayerIndex` integer, required
      - `targetInsertPosition` integer, required
    - object
      - `kind` 'replace', required
      - `itemId` string, required
      - `assetId` string, required
    - object
      - `kind` 'transform', required
      - `textLayout` object
        - `widthPx` number, required
        - `heightPx` number, required
      - `itemId` string, required
      - `positionX` number, required
      - `positionY` number, required
      - `widthPx` integer, nullable, required
      - `heightPx` integer, nullable, required
      - `keepAspectRatio` boolean, required
      - `blurredBackground` boolean, required
      - `fitMode` 'cover' | 'contain' | 'stretch', required
      - `opacity` number, required
    - object
      - `kind` 'audio', required
      - `itemId` string, required
      - `volume` number, required
      - `fadeInSeconds` number, required
      - `fadeOutSeconds` number, required

## Response `200`

Successful response

- object
  - `projectId` string, required
  - `revision` number, required
  - `baseRevision` number, required
  - `mutationReceiptId` string, required
  - `replayed` boolean, required
  - `affectedTimelineItemIds` string[], required
  - `createdTimelineItemIds` string[], required
  - `deletedTimelineItemIds` string[], required
  - `warnings` string[], required
  - `result` object, required

## Other responses

- `400`: Invalid input data
- `401`: Authorization not provided
- `403`: Insufficient access
- `500`: Internal server error

---

[API](https://skmtc.dev/blitzreels/apis/blitzreels-api.md) · [All operations](https://skmtc.dev/blitzreels/apis/blitzreels-api/llms.txt) · [OpenAPI document](https://skmtc.dev/blitzreels/apis/blitzreels-api/revisions/35608b12471d?raw)
