---
title: Use Final Cut Pro with invideo
description: Send an invideo timeline to Final Cut Pro as a project file with its media, and bring a Final Cut Pro project back into invideo through XML or OTIO.
---
Final Cut Pro is Apple's editor for Mac, strong at fast cutting with its magnetic timeline, roles and multicam. invideo has the same timeline tools in the cloud, plus generation and agents that edit next to you, and the round trip below is for teams who work in both.

The project moves both ways as an editable timeline. `export` with `format` `final_cut` makes a project file that Final Cut Pro opens. `import_timeline` takes a Final Cut 7 .xml or an .otio back onto a branch, so a Final Cut Pro project needs one conversion on the way in.

## When to use both

Use both when part of your team works in Final Cut Pro and part works in invideo. Common cases:

- **Agent first, editor last.** Your agent builds the cut in invideo. An editor finishes it in Final Cut Pro.
- **Editor first, agent next.** An editor cuts in Final Cut Pro. Your agent adds captions, music, generated shots or more versions in invideo.
- **Back and forth.** An editor tweaks the agent's cut in Final Cut Pro, and the agent brings the tweak back onto a branch.

## Hand-off: from Final Cut Pro into invideo

In Final Cut Pro, select the project. Click **File**, then **Export XML**. Final Cut Pro saves an .fcpxml file. `import_timeline` refuses .fcpxml with `code` `import_format`, so convert the file first, in one of two ways:

- **Through DaVinci Resolve.** Import the .fcpxml in Resolve with **File**, then **Import**, then **Timeline**. Then export the timeline as an .otio with **File**, then **Export**, then **Timeline**.
- **Through a converter.** An outside converter such as XtoCC turns the .fcpxml into a Final Cut 7 .xml.

Then collect the media the project uses into one folder, and zip that folder stored, with no compression:

```bash
zip -0 -r media.zip ./fcp-media
```

`./fcp-media` is the folder with the project's media. media.zip is the name you give the zip.

Then your agent brings the project in:

- **Check first.** `import_timeline` with `dry_run: true`, `project_file_name` and `media_file_name`. It checks the names and the timeline, and starts nothing.
- **Upload.** `start_upload` for the converted file and for the zip, a PUT of each file's bytes to its `upload_url`.
- **Import.** `import_timeline` on a branch URL, with `project_upload_id`, `media_upload_id` and an `idempotency_key`. For media in a Google Drive folder that anyone with the link can read, pass `media_drive_link` instead of the zip.

Every sequence in the file becomes a timeline. The branch's old state is kept as a checkpoint first. The media arrives in the background, so the agent reads the URL for its status. A file the project names that is not in the zip fails alone, and its clips keep their timing.

A rendered file works too. For an MP4 out of Final Cut Pro, the agent uses `add_media` with `media_url`, or `start_upload` and then `add_media` with the `upload_id`. In a terminal, `invideo asset upload <project-url> <file>`.

## Hand-off: from invideo to Final Cut Pro

Your agent runs `export` with `format` `final_cut` on the branch you approved. The export card gives a project file and a zip of the media. Unzip the media, then open the project file in Final Cut Pro. [Export to Premiere Pro, DaVinci Resolve or Final Cut Pro](/how-to/export-to-premiere-resolve-final-cut) lists what to check after it opens.

## 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.

These steps bring a converted Final Cut Pro project into invideo.

<Steps>
<Step title="Make a branch for the import">
The agent creates a branch with `timeline_history` and `action: "create_branch"`. Expected result: a `branch_url`. The import never goes onto main.
</Step>
<Step title="Check the file names">
The agent calls `import_timeline` on the branch URL with `dry_run: true`, `project_file_name` and `media_file_name`. Expected result: `status` `checked`. An .fcpxml name returns `code` `import_format` instead.
</Step>
<Step title="Upload the two files">
The agent calls `start_upload` for the converted file and for the zip, and PUTs each file's bytes to its `upload_url`. Expected result: two `upload_id` values.
</Step>
<Step title="Import onto the branch">
The agent calls `import_timeline` with `project_upload_id`, `media_upload_id` and an `idempotency_key`. Expected result: one timeline per sequence on the branch, and a checkpoint of the old state.
</Step>
<Step title="Check the import">
The agent reads the branch URL until the media has landed, then runs `check_timeline` and `capture` at a few cuts. Expected result: frames that match the project in Final Cut Pro.
</Step>
</Steps>

The check, then the import, over MCP:

```json
{
  "url": "<branch-url>",
  "as": "<name>",
  "dry_run": true,
  "project_file_name": "timeline.otio",
  "media_file_name": "media.zip"
}
```

```json
{
  "url": "<branch-url>",
  "as": "<name>",
  "project_upload_id": "<project-upload-id>",
  "media_upload_id": "<media-upload-id>",
  "idempotency_key": "fcp-import-v1"
}
```

`<branch-url>` is the `branch_url` from `timeline_history`. `<name>` is the name you chose with `register`. `<project-upload-id>` and `<media-upload-id>` are the `upload_id` values `start_upload` returns.

The same import from a terminal:

```bash
invideo agent register <project-url> --name <name>
export INVIDEO_AS=<name>
invideo edit show <edit-url>
invideo branch new <edit-url> --name fcp-in --token <state_token>
invideo edit import <branch-url> timeline.otio media.zip \
  --idempotency-key "fcp-import-v1"
invideo edit check <branch-url>
```

`<project-url>` comes from `list_projects` or `invideo project new`. `<edit-url>` is the timeline's URL. `<state_token>` comes from `invideo edit show`. `<branch-url>` is the `branch_url` that `invideo branch new` returns. `invideo edit import` uploads both files itself and takes no `--dry-run`.

## When to stay in Final Cut Pro

Stay in Final Cut Pro when you cut alone on a Mac, the job leans on its magnetic timeline and roles, or the master must come out above 1080p straight from the timeline. invideo's `export` makes MP4 at 1080p or lower, and 4K and HDR go through a model after the export.

Move to invideo when you want an agent to do the edit, generation in the same project, or a person to review each change on a branch.

## If something goes wrong

| Symptom | Fix |
| --- | --- |
| `code` `import_format`: "it takes .xml, .otio" | An .fcpxml or a library does not import. Convert the .fcpxml to .otio in DaVinci Resolve, or to a Final Cut 7 .xml with a converter. |
| `code` `several_timelines` | The URL reaches more than one timeline. Call again with one of the timeline URLs the message lists, on your branch. |
| "media_upload_id takes a .zip of the project's media" | Zip the media folder with `zip -0 -r`, then upload the .zip. |
| "No upload with that id for this user" | Call `start_upload` again, PUT the bytes, and pass the new `upload_id`. |
| A clip has no media after the import | That file was not in the zip. Its clips keep their timing. Add the file to the zip and import again with a new `idempotency_key`. |
| Avoid: import onto the main timeline | Instead: create a branch first. The import replaces the branch it lands on. To undo, restore the checkpoint with `timeline_history` and `action: "restore"`. |
| Avoid: resend after a timeout | Instead: retry with the same `idempotency_key`. It finds the first import. |
| The export card says `completed` but lists only the project file | The media zip is still packing. Read the card again until the zip is listed. |

## Related

- [Export to Premiere Pro, DaVinci Resolve or Final Cut Pro](/how-to/export-to-premiere-resolve-final-cut)
- [Use DaVinci Resolve with invideo](/integrations/davinci-resolve)
- [Use Premiere Pro with invideo](/integrations/premiere)
- [Let a person tweak the cut your agent made in Premiere Pro or DaVinci Resolve](/how-to/creators/let-a-human-tweak-the-cut)
- [Deliver in 4K or HDR from an invideo cut](/how-to/film/4k-and-hdr-delivery)