---
title: Use Synthesia with invideo
description: Bring a Synthesia avatar clip into invideo as an MP4, then add b-roll, text, music, captions and variants on a timeline.
---
Synthesia makes the AI avatar, the talking presenter, for training and business videos. invideo adds what goes around that clip on a real timeline, with b-roll, text, music, captions and a branch for each variant.

## When to use both

Use both when the avatar is one part of a bigger edit. The avatar renders in Synthesia. The finish happens in invideo.

- **The presenter needs cutaways.** Stock or generated b-roll covers the jumps and keeps the viewer's eye moving.
- **The video needs a brand look.** Titles, lower thirds and logo go on as text and image clips you can change later.
- **You test variants.** One avatar take, several hooks, shapes or end cards, each on its own branch.
- **You want captions you can edit.** Captions come from a transcript as a caption track, not burned into the picture.
- **Your agent works in the cut you have open.** Synthesia has real-time editing with live cursors and a version history, and its MCP cannot edit Studio drafts. In invideo, you and your agent work in one cloud project at the same time, and the agent works on a branch while you watch every edit land live.

## Hand-off: from Synthesia into invideo

The avatar clip crosses as an MP4. In Synthesia, open the video's three-dot menu, choose **Download**, then the .mp4 option. Synthesia's help says videos with interactive elements, such as buttons or branching, cannot be downloaded.

Then your agent brings it 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.

Then the finish:

- **Place the avatar** with `place_media` and `linked_audio` set to true, so the voice comes with the picture.
- **B-roll** from `search_library` in `stock_video`, or from `seedance_2_5.frames` with `generate`. The agent places it on the track above with `place_media` mode `place_on_top`.
- **Text** with `add_text`, styled with `set_text_style`.
- **Music** from `search_library` in `stock_music`, under the voice with the `ducker` audio effect.
- **Captions** with `media` `audio.transcript` on the avatar clip, then `add_captions` with slides and words.

## Hand-off: from invideo to Synthesia

The way back is an MP4. `export` with `format` `video` renders the timeline. Use the file wherever Synthesia takes an uploaded video, as Synthesia's own docs describe. For a project in Premiere Pro, Final Cut Pro or DaVinci Resolve instead, see [Export to Premiere Pro, DaVinci Resolve or Final Cut Pro](/how-to/export-to-premiere-resolve-final-cut).

## Steps

Your agent sets up with [invideo for AI agents](/agents) first. Then it runs these steps on a branch.

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 in the avatar clip">
The agent calls `start_upload` and `add_media` on the timeline URL. Expected result: a sequence URL and a media bin id.
</Step>
<Step title="Lay down the presenter">
The agent creates a branch with `timeline_history`, then places the clip with `place_media` and `linked_audio`. Expected result: one video clip and its linked sound.
</Step>
<Step title="Add b-roll, text and music">
The agent searches `stock_video` and `stock_music` with `search_library`, tells you the cost of any paid item, adds the picks with `add_media`, and places them with `edit_timeline`. Expected result: cutaways over the jumps, titles on screen, music under the voice.
</Step>
<Step title="Pick and price the cutaway">
The agent runs `find_models` with the cutaway in words, picks one, and reads its inputs with `get_model`. A good pick is `seedance_2_5.frames`. Your 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 cutaway">
For a price of 1 credit or more, the agent waits for your yes. Then it calls `generate` with `max_credits` set to that price and an `idempotency_key`. Expected result: a thread URL, then a sequence URL when the cutaway lands. The agent reads that URL with `read`, and never calls `generate` again to check.
</Step>
<Step title="Caption the voice">
The agent prices `audio.transcript` with `dry_run`, starts it, and calls again after `retry_after_s` for the words. Then it sends `add_captions`. Expected result: a caption clip with each word timed.
</Step>
<Step title="Make the variants">
The agent creates a branch per variant with `timeline_history` and changes the hook, shape or end card on each. Expected result: one branch URL per variant.
</Step>
<Step title="Check and export">
The agent calls `capture` and `check_timeline` on each branch, then `export`. Expected result: an export card with status `completed` per variant.
</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 "office cutaway, hands typing"
invideo gen model <project-url> --model seedance_2_5.frames
invideo gen run <page-url> --model seedance_2_5.frames --dry-run \
  -i prompt="office cutaway, hands typing"
invideo gen run <page-url> --model seedance_2_5.frames \
  -i prompt="office cutaway, hands typing" \
  --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.

### The quick case, inside invideo

When you need a short talking clip and no Synthesia account, invideo runs avatar and lip-sync models with `generate`. Your agent prices each with `dry_run` first and follows the same steps as the cutaway.

- `kling_avatar.std`, `kling_avatar.pro` and `omni_human_2` are avatar models.
- `sync_lipsync_v3.video` replaces a video's sound and re-animates the speaker's lips to match.

The voice for an avatar comes from `elevenlabs_text_to_speech.elevenlabs_tts_v4` with `generate`, priced with `dry_run` first.

## When to stay in Synthesia

Stay in Synthesia when the job is the avatar itself.

- **Your own trained avatar.** Synthesia's personal avatar is trained on your footage.
- **Courses in an LMS.** Synthesia exports SCORM and adds in-video quizzes and branching scenarios.
- **Translation with the same face.** Synthesia translates and dubs its own avatar videos.
- **A team edits the avatar video together.** Synthesia has real-time editing with live cursors, and a version history you can restore.

## If something goes wrong

The table lists the failures this hand-off is known for.

| 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`. |
| Synthesia shows no **Download** for a video | Synthesia's help says videos with interactive elements cannot be downloaded. Use a version without buttons or branching. |
| `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 Synthesia vs invideo](/compare/synthesia)
- [Use HeyGen with invideo](/integrations/heygen)
- [Make a UGC ad from product photos with an AI actor](/how-to/marketing/ugc-ad-with-ai-actor)
- [Test hooks on one ad, with branches](/how-to/marketing/test-hooks-on-branches)
- [Add word-by-word captions](/how-to/creators/word-by-word-captions)
- [Know the cost before you spend](/how-to/cost-before-you-spend)
- [Models reference](/reference/models)