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

# Update call actions

> Create, edit and delete the CTAs that appear over or under the video.

`call_actions` carries a feature toggle, `enabled`, above the `items` list it
gates. The list merges per item: an item **with an `id`** patches that CTA, an
item **without one** creates a new CTA, and an item with `"_destroy": true`
deletes it. CTAs you don't mention stay as they are.

This is a [merge-patch](/guides/merge-patch): send only the keys you want to
change and everything else keeps its stored value.

## Edit one CTA, create another, delete a third

<CodeGroup>
  ```bash cURL theme={null}
  curl -X PATCH https://api.vturb.com/v1/videos/{id} \
    -H "Authorization: Bearer vt_..." \
    -H "Content-Type: application/json" \
    -d '{ "call_actions": {
          "enabled": true,
          "items": [
            { "id": "66f2...", "window": { "start": 30 } },
            { "base": { "name": "Buy now", "type": "outside_video", "active": true },
              "window": { "start": 60, "end": 120 } },
            { "id": "66f3...", "_destroy": true }
          ]
        } }'
  ```

  ```json Body theme={null}
  {
    "call_actions": {
      "enabled": true,
      "items": [
        { "id": "66f2...", "window": { "start": 30 } },
        {
          "base": { "name": "Buy now", "type": "outside_video", "active": true },
          "window": { "start": 60, "end": 120 }
        },
        { "id": "66f3...", "_destroy": true }
      ]
    }
  }
  ```
</CodeGroup>

## The feature toggle

| Key       | Type    | Writes                                                      |
| --------- | ------- | ----------------------------------------------------------- |
| `enabled` | boolean | Turns the whole CTA feature on or off (sits beside `items`) |

## The item keys (inside `items`)

| Key                           | Type    | Writes                                                                                                                            |
| ----------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `id`                          | string  | Targets an existing CTA; omit to create one                                                                                       |
| `_destroy`                    | boolean | `true` deletes the CTA the `id` points to                                                                                         |
| `base.name`                   | string  | Internal label — **only** accepted when `action.as_html` or `image_as_button` is set; on a text button the `content` is the label |
| `base.type`                   | string  | `inside_video` (over the player) or `outside_video` (below it)                                                                    |
| `base.active`                 | boolean | Turns the CTA on or off                                                                                                           |
| `window.start`                | integer | Second the CTA appears                                                                                                            |
| `window.end`                  | integer | Second the CTA disappears                                                                                                         |
| `window.persist_on_video_end` | boolean | Keep the CTA visible after the video ends                                                                                         |
| `action.content`              | string  | Button label text (the structured, no-HTML path)                                                                                  |
| `action.url`                  | string  | http(s) URL the CTA opens                                                                                                         |
| `action.open_in_new_tab`      | boolean | Open the URL in a new tab                                                                                                         |
| `action.html`                 | string  | Custom HTML the CTA renders (requires `action.as_html`)                                                                           |
| `action.as_html`              | boolean | Treat the content as raw HTML                                                                                                     |
| `design.typography`           | object  | Font of a text button: `family`, `letter_spacing`, `line_height`, `size`, `weight`                                                |
| `design.styles`               | object  | Look of a text button: the colors, `border_radius`, `padding`, `shadow`                                                           |

A **text button** (no `action.as_html`, no `image_as_button`) requires `action.content`,
`action.url`, and a complete `design.typography` + `design.styles`. Within an item, the
merge is still shallow per group: patching `window.start` leaves `window.end` alone.
