---
title: Use VEED with invideo
description: Add captions and subtitles in VEED or with the veed_subtitles model inside invideo, and move the video between the two as an MP4.
---
It depends on how much editing the video needs. VEED is an online video editor known for its subtitles: Auto Subtitle writes captions from the speech, you style them, and you export the video with the subtitles burned in, or the subtitles as an SRT, VTT or TXT file. invideo adds a timeline your agent edits, generation in the same project, branches for review, and VEED's own subtitle model as a step your agent can run.

The video crosses between the two as an MP4. Subtitle files cross as SRT.

## When to use both

Use both when the captions and the edit happen in different places. Common cases:

- **Edit in invideo, caption in VEED.** Your agent cuts the video. You caption it in VEED with its presets.
- **Caption in VEED, finish in invideo.** You have a VEED video with subtitles. Your agent adds music, an intro and more versions.
- **A VEED SRT on an invideo video.** You fixed the subtitles in VEED. The agent puts the same words on the invideo timeline.

## VEED inside invideo

invideo runs VEED models, so some VEED steps never leave the project:

- **`veed_subtitles`** (VEED Subtitles) burns styled, auto-transcribed subtitles into a video. It takes a `video` and a `preset`. It also takes your own subtitles as `srt_file` or `srt_content`, and then skips the transcription.
- **`veed_video_bg_remove.veed_bg_standard`** and **`veed_video_bg_remove.veed_bg_fast`** remove a video's background. They are models of `media` `video.removeBackground`.
- **`veed_lipsync_v2`** (Veed Lipsync v2) syncs a video to a new audio track.

`veed_subtitles` makes a new video with the words in the picture. For captions you can still edit on the timeline, the agent uses `add_captions` instead.

## Hand-off: from VEED into invideo

In VEED, export the project, then download it as an MP4. Download the subtitles as an SRT if you want to keep the words. Then your agent brings the video in:

- **A public link.** `add_media` with `media_url`.
- **A file on your computer.** `start_upload` with the `file_name`, a PUT of the bytes to the `upload_url`, then `add_media` with the `upload_id`. In a terminal, `invideo asset upload <project-url> <file>`.
- **A file in a chat app.** You drag the file into the chat. It arrives through `file` on `add_media`.

Each file becomes a sequence in the project, with its own sequence URL. On a timeline's URL, `add_media` also puts it in that timeline's media bin.

The agent reads the SRT file and writes its lines into `add_captions`, one slide per line, with times turned into frames at the timeline's rate. Or it passes the SRT to `veed_subtitles` as `srt_content`.

## Hand-off: from invideo to VEED

Your agent runs `export` with `format` `video`. The result is a 1080p MP4. You upload it to VEED and run Auto Subtitle there.

To send the subtitles as a file, the agent reads the caption slides with `get_timeline` mode `collection` and writes an SRT file. You upload that SRT to VEED with the video.

## Steps

Edits and exports are free. Generation and transcripts cost credits. Paid stock costs a small credit charge, or one of your workspace's iStock licenses. Your agent runs a dry run first and tells you the price before it spends anything.

Your agent runs a dry run first. For any call that costs 1 credit or more, it tells you the price and waits for your yes. A call under 1 credit runs without asking, and your agent tells you what it cost.

<Steps>
<Step title="Bring the video in">
The agent calls `add_media` with the MP4 from VEED or your own file. Expected result: a sequence URL.
</Step>
<Step title="Pick editable captions or burned-in subtitles">
For editable captions, the agent prices `audio.transcript` with `dry_run`, runs it, then sends `add_captions` on a timeline. For burned-in subtitles, it reads the inputs of `veed_subtitles` with `get_model`. Expected result: a plan it tells you, with the price for the paid step.
</Step>
<Step title="Price the subtitle run">
The agent calls `generate` with `veed_subtitles`, the video's sequence URL, a `preset` and `dry_run: true`, and tells you the price. Expected result: a price and no charge.
</Step>
<Step title="Run it">
The agent calls `generate` again without `dry_run`, with `max_credits` set to that price and an `idempotency_key`. Expected result: a thread URL, then a sequence URL when the video lands. The agent reads that URL with `read`, and never calls `generate` again to check.
</Step>
<Step title="Check, then export">
The agent looks at the result with `media` `video.frames`, checks that the subtitles sit inside the frame, then exports. Expected result: an MP4 you can post or send to VEED.
</Step>
</Steps>

The key MCP call, the full `generate` call, priced first:

```json
{
  "url": "<sequence-url>",
  "model": "veed_subtitles",
  "inputs": {
    "video": "<sequence-url>",
    "preset": "simple",
    "position": "bottom"
  },
  "dry_run": true
}
```

`<sequence-url>` is the `url` that `add_media` returns for the video.

The same run from a terminal:

```bash
invideo agent register <project-url> --name <name>
export INVIDEO_AS=<name>
invideo gen model <project-url> --model veed_subtitles
invideo gen run <page-url> --model veed_subtitles --dry-run \
  -i video=<sequence-url> -i preset=simple -i position=bottom
invideo gen run <page-url> --model veed_subtitles \
  -i video=<sequence-url> -i preset=simple -i position=bottom \
  --max-credits <price> --idempotency-key subs-1
```

`<project-url>` comes from `invideo project new` or `list_projects`. `<name>` is the name you choose in `invideo agent register`. `<page-url>` is a page that `invideo notebook show <project-url>` lists. `<price>` is the price the dry run returns. `<sequence-url>` is the `url` that `invideo asset upload` returns for the video.

## When to stay in VEED

Stay in VEED when you caption a finished clip by hand, with its presets, and want an SRT, VTT or TXT file as the output. A short clip with one round of subtitles is quick there.

Move to invideo when an agent does the edit, when the captions must stay editable on a timeline, or when one video becomes many versions.

## If something goes wrong

| Symptom | Fix |
| --- | --- |
| `add_media` with `media_url` is refused | The link must be public. Download the file, then upload it with `start_upload` and `add_media` with the `upload_id`. |
| `veed_subtitles` refuses an input | Read the inputs again with `get_model` and fix the field the refusal names. |
| Subtitles show twice | The VEED download already had subtitles burned in. Download it without them, or skip `veed_subtitles`. |
| `get_model` or `generate` refuses the model as not found | Models retire. Run `find_models` with the job in words, use the best match, and tell the person which model you used. |
| Avoid: call `generate` again to check on a run | Instead: read the thread or sequence URL with `read`. A second `generate` starts a second paid run. |

## Related

- [When to use VEED vs invideo](/compare/veed)
- [Add word-by-word captions](/how-to/creators/word-by-word-captions)
- [Make an SRT captions file for an LMS](/how-to/training/srt-for-an-lms)
- [Know the cost before you spend](/how-to/cost-before-you-spend)
- [invideo for AI agents](/agents)