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

# Upload a video

> Upload a local MP4 before starting an evaluation.

Use the upload flow for a video stored on your local filesystem.

## Flow

1. Reserve a video record with `POST /v1/videos`.
2. Send the MP4 bytes to the returned upload path.
3. Complete the upload with `POST /v1/videos/{id}/complete`.
4. Retrieve `GET /v1/videos/{id}` until the status reaches `ready`.
5. Submit an evaluation with `video.upload_id`.

The SDK handles the full flow and streams the file from disk.

<Tabs>
  <Tab title="TypeScript">
    ```ts theme={null}
    const video = await galileo.videos.upload({ path: "./clip.mp4" });
    const evaluation = await galileo.evaluations.createAndWait({
      prompt: "A paper boat floats down a narrow stream.",
      video: { upload_id: video.id },
    });
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={null}
    video = galileo.videos.upload("./clip.mp4")
    evaluation = galileo.evaluations.create_and_wait(
        prompt="A paper boat floats down a narrow stream.",
        video={"upload_id": video.id},
    )
    ```
  </Tab>
</Tabs>

The SDK calculates a SHA-256 hash by default. Galileo can skip the transfer when it already stores the same file. Set `dedupe: false` in TypeScript or `dedupe=False` in Python to skip the hash pass.
