---
title: Use OpenEdit with invideo
description: Caption a clip with OpenEdit on your machine, bring its MP4 into invideo as footage, and finish it with stock, music, generation and a timeline review.
---
It depends on how much of the video you need. OpenEdit, VEED's open-source editing pipeline, burns captions and subtitles onto a clip from your coding agent; invideo adds the timeline a person can review, plus generation, stock and music around that clip.

## When to use both

Use both when the captioned clip is one part of a finished video. OpenEdit does the captions on your machine. invideo does the rest of the edit.

- **A captioned clip inside a longer cut.** The talking-head clip from OpenEdit sits between b-roll, titles and an end card.
- **Stock and music around it.** invideo searches stock video and music and places them on tracks.
- **Generated shots.** A missing shot or a product close-up comes from a video model in the same project.
- **A person reviews the cut.** Someone opens the timeline in the browser, sees each clip on its own track, and asks for changes.

## Hand-off: from OpenEdit into invideo

OpenEdit's finished file is an MP4 with the subtitles burned in. It lands under the `runs/` folder in your project, and the agent reports its path. Install OpenEdit's skill in your coding agent with this command:

```bash
npx skills add veedstudio/open-edit --skill open-edit
```

OpenEdit transcribes in one of three ways: hosted by VEED with a veed.io account, with WhisperX on your machine, or from Whisper-family JSON your own service makes. With WhisperX, OpenEdit's README says nothing leaves your machine.

Then your agent brings the MP4 into invideo:

- **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 MP4 becomes a clip like any other. Its captions are part of the picture, so invideo cannot restyle them or turn them off.

Then the finish:

- **Stock** from `search_library` in `stock_video` and `stock_image`, placed with `place_media`.
- **Music** from `search_library` in `stock_music`, under the voice with the `ducker` audio effect.
- **Generated shots** from a model such as `seedance_2_5.r2v` with `generate`, priced with `dry_run` first.
- **Titles and an end card** with `add_text` and `set_text_style`.

If you want captions you can change later, bring the clip without captions instead. Your agent then makes them in invideo with `media` `audio.transcript` and `add_captions`, or reads OpenEdit's own transcript JSON and places it as the [Whisper page](/integrations/whisper) shows.

## Hand-off: from invideo to OpenEdit

The way back is an MP4. `export` with `format` `video` renders the timeline. OpenEdit takes a video file from your disk, so your agent downloads the export and gives OpenEdit its path.

## Steps

Your agent sets up with [invideo for AI agents](/agents) first. Then it runs these 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="Caption the clip in OpenEdit">
The agent uses the `/open-edit` skill to caption the clip. If OpenEdit asks which transcription to use, the agent asks you. Expected result: an MP4 path under `runs/`.
</Step>
<Step title="Bring the MP4 in">
The agent calls `start_upload`, puts the bytes, then `add_media` on the timeline URL. Expected result: a sequence URL and a media bin id.
</Step>
<Step title="Build the cut on a branch">
The agent creates a branch with `timeline_history`, then places the clip, stock and music with `edit_timeline`. Expected result: a new `state_token`.
</Step>
<Step title="Pick and price the shot">
The agent runs `find_models` with the missing shot in words, picks one, and reads its inputs with `get_model`. A good pick is `seedance_2_5.r2v`. The agent can search for others with `find_models`. It calls `generate` with `dry_run: true` and the real inputs, and tells you the price. Expected result: a price and no charge.
</Step>
<Step title="Make the shot">
The agent calls `generate` with `max_credits` set to that price and an `idempotency_key`. Expected result: a thread URL, then a sequence URL when the shot lands. The agent reads that URL with `read`, and never calls `generate` again to check.
</Step>
<Step title="Check the captions stay in frame">
The agent calls `capture` at a few caption times. Expected result: no caption covered by a title or cut off by a crop.
</Step>
<Step title="Check and export">
The agent runs `check_timeline`, then calls `export`. Expected result: an export card with status `completed`.
</Step>
</Steps>

A missing shot from a terminal:

```bash
invideo agent register <project-url> --name <name>
export INVIDEO_AS=<name>
invideo gen models <project-url> --query "close-up of the product on a desk"
invideo gen model <project-url> --model seedance_2_5.r2v
invideo gen run <page-url> --model seedance_2_5.r2v --dry-run \
  -i prompt="close-up of the product on a desk"
invideo gen run <page-url> --model seedance_2_5.r2v \
  -i prompt="close-up of the product on a desk" \
  --max-credits <price> --idempotency-key shot-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.

## When to stay in OpenEdit

Stay in OpenEdit when the job is captions on one clip and nothing else. Stay there too when the audio must stay on your machine, with WhisperX. If you want a person to change the edit in VEED's editor, OpenEdit hands its edit to VEED as a project, as its README describes.

## 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`. |
| A title covers a burned-in caption | Move the title or the clip with `set_position`, then `capture` again. |
| `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 OpenEdit vs invideo](/compare/openedit)
- [Use Whisper timings with invideo](/integrations/whisper)
- [Use VEED with invideo](/integrations/veed)
- [Word-by-word captions](/how-to/creators/word-by-word-captions)
- [Reels and Shorts from your footage](/how-to/creators/reels-and-shorts-from-your-footage)

<Collapse title="Can invideo restyle OpenEdit's captions?">
No. OpenEdit burns the captions into the picture, so they are pixels in the MP4. For captions you can restyle, bring the clean clip and make the captions in invideo.
</Collapse>