---
title: "Create or update visual presets atomically; supports dry run"
method: POST
path: "/projects/{projectId}/visuals/apply"
tags: ["Platform"]
---

# Create or update visual presets atomically; supports dry run

`POST /projects/{projectId}/visuals/apply`

## Request

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

Create or update visual presets atomically; supports dry run.

## Path parameters

- `projectId` string, uuid, required

## Request body

- object
  - `items` union[], required
    - union
      - object
        - `id` string, required
        - `at` number, required
        - `duration` number, required
        - `preset` 'broll-headline', required
        - `text` string, required
        - `assetId` string, uuid, required
      - object
        - `id` string, required
        - `at` number, required
        - `duration` number, required
        - `preset` 'steps', required
        - `text` string, required
        - `steps` string[], required
      - object
        - `id` string, required
        - `at` number, required
        - `duration` number, required
        - `preset` 'quote', required
        - `text` string, required
        - `attribution` string, required
      - object
        - `id` string, required
        - `at` number, required
        - `duration` number, required
        - `preset` 'end-screen', required
        - `text` string, required
        - `cta` string, required
        - `logoAssetId` string, uuid, nullable, required
      - object
        - `id` string, required
        - `at` number, required
        - `duration` number, required
        - `preset` 'key-number', required
        - `text` string, required
        - `value` number, required
        - `suffix` string, required
      - object
        - `id` string, required
        - `at` number, required
        - `duration` number, required
        - `preset` 'before-after', required
        - `text` string, required
        - `beforeAssetId` string, uuid, required
        - `afterAssetId` string, uuid, required
      - object
        - `id` string, required
        - `at` number, required
        - `duration` number, required
        - `preset` 'screenshot-focus', required
        - `text` string, required
        - `assetId` string, uuid, required
        - `focus` object, required
          - `x` number, required
          - `y` number, required
          - `width` number, required
          - `height` number, required
      - object
        - `id` string, required
        - `at` number, required
        - `duration` number, required
        - `preset` 'chapter', required
        - `text` string, required
        - `number` string, required
  - `expectedRevision` integer, nullable, required
  - `dryRun` boolean, required

## Response `200`

Successful response

- object
  - `success` true, required
  - `dryRun` boolean, required
  - `revision` integer, required
  - `mutationReceiptId` string, nullable, required
  - `replayed` boolean, required
  - `items` object[], required
    - `id` string, required
    - `timelineItemId` string, uuid, required
    - `contentItemId` string, uuid, required
    - `compositionId` string, uuid, required
    - `status` 'created' | 'updated', required
  - `warnings` string[], 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)
