> ## Documentation Index
> Fetch the complete documentation index at: https://docs.submagic.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Update Preset

> Update the settings of an existing preset

# Update Preset

Update the settings on an existing preset. Only the toggles and values below can be changed — the preset's saved media (caption theme, hook, logo, color filter, music) is created in the editor and cannot be replaced through the API.

<Note>
  This endpoint requires authentication and has a rate limit of 500 requests per
  hour.
</Note>

## Authentication

<ParamField header="x-api-key" type="string" required>
  Your Submagic API key starting with `sk-`
</ParamField>

## Path Parameters

<ParamField path="id" type="string" required>
  The unique identifier (UUID) of the preset to update
</ParamField>

## Request Body

All fields are optional, but you must provide at least one. A toggle that
depends on saved media can only be enabled when the preset has that media — check
the `configured` object from [Get Preset](/api-reference/get-preset) first,
otherwise the request fails with `VALIDATION_ERROR`.

<ParamField body="name" type="string">
  Preset name (1-100 characters)
</ParamField>

<ParamField body="description" type="string | null">
  Preset description (up to 500 characters). Pass `null` to clear it.
</ParamField>

<ParamField body="captions" type="boolean">
  Whether projects created with this preset get its saved caption theme. Can
  only be enabled if `configured.captions` is `true`.
</ParamField>

<ParamField body="hookTitle" type="boolean">
  Whether projects created with this preset get its saved hook title. Can only
  be enabled if `configured.hookTitle` is `true`.
</ParamField>

<ParamField body="magicZooms" type="boolean">
  Whether Magic Zooms are enabled.
</ParamField>

<ParamField body="magicBrolls" type="boolean">
  AI Auto B-rolls: Submagic automatically picks the moments and inserts b-roll
  across the whole video.
</ParamField>

<ParamField body="magicBrollsPercentage" type="number">
  How much of the video AI Auto B-rolls should cover, as a percentage (0-100).
  Only used together with `magicBrolls: true`.
</ParamField>

<ParamField body="magicBrollsTransitions" type="boolean">
  Whether AI Auto B-rolls use transition effects between clips.
</ParamField>

<ParamField body="logo" type="boolean">
  Whether projects created with this preset get its saved logo. Can only be
  enabled if `configured.logo` is `true`.
</ParamField>

<ParamField body="colorFilter" type="boolean">
  Whether projects created with this preset get its saved color filter. Can only
  be enabled if `configured.colorFilter` is `true`.
</ParamField>

<ParamField body="cleanAudio" type="boolean">
  Whether Clean Audio is enabled.
</ParamField>

<ParamField body="eyeContactCorrection" type="boolean">
  Whether Eye Contact correction is enabled.
</ParamField>

<ParamField body="music" type="boolean">
  Whether projects created with this preset get its saved background music. Can
  only be enabled if `configured.music` is `true`.
</ParamField>

<ParamField body="musicVolume" type="number">
  Background music volume, 1-100. Can only be set if `configured.music` is
  `true`.
</ParamField>

<ParamField body="transitionSoundVolume" type="number | null">
  Volume applied to all transition sounds, 0-100. Pass `null` to turn transition
  sounds off.
</ParamField>

## Response

Returns the updated preset. See [Get Preset](/api-reference/get-preset) for the
full object shape.

<RequestExample>
  ```bash cURL theme={null}
  curl -X PUT "https://api.submagic.co/v1/presets/550e8400-e29b-41d4-a716-446655440000" \
    -H "x-api-key: sk-your-api-key-here" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "My TikTok Preset",
      "magicZooms": true,
      "music": true,
      "musicVolume": 25
    }'
  ```

  ```javascript JavaScript theme={null}
  const updatePreset = async (presetId, updateData) => {
    const response = await fetch(
      `https://api.submagic.co/v1/presets/${presetId}`,
      {
        method: "PUT",
        headers: {
          "x-api-key": "sk-your-api-key-here",
          "Content-Type": "application/json",
        },
        body: JSON.stringify(updateData),
      }
    );

    return response.json();
  };

  const preset = await updatePreset("550e8400-e29b-41d4-a716-446655440000", {
    name: "My TikTok Preset",
    magicZooms: true,
    music: true,
    musicVolume: 25,
  });
  ```

  ```python Python theme={null}
  import requests

  def update_preset(preset_id, update_data):
      url = f'https://api.submagic.co/v1/presets/{preset_id}'
      headers = {
          'x-api-key': 'sk-your-api-key-here',
          'Content-Type': 'application/json'
      }

      response = requests.put(url, headers=headers, json=update_data)
      return response.json()

  preset = update_preset('550e8400-e29b-41d4-a716-446655440000', {
      'name': 'My TikTok Preset',
      'magicZooms': True,
      'music': True,
      'musicVolume': 25
  })
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "My TikTok Preset",
    "captions": true,
    "hookTitle": true,
    "magicZooms": true,
    "magicBrolls": false,
    "logo": false,
    "colorFilter": false,
    "cleanAudio": true,
    "eyeContactCorrection": false,
    "music": true,
    "musicVolume": 25,
    "configured": {
      "captions": true,
      "hookTitle": true,
      "logo": false,
      "colorFilter": false,
      "music": true
    },
    "sourceProjectId": "88a08eec-712a-45d0-8d0b-3b631700cb3a",
    "createdAt": "2024-01-10T08:00:00.000Z",
    "updatedAt": "2024-01-12T09:30:00.000Z"
  }
  ```

  ```json 400 VALIDATION_ERROR - Toggle Not Configured theme={null}
  {
    "error": "VALIDATION_ERROR",
    "message": "Cannot enable music: this preset has no saved music"
  }
  ```

  ```json 404 NOT_FOUND theme={null}
  {
    "error": "NOT_FOUND",
    "message": "Preset not found"
  }
  ```
</ResponseExample>
