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

# Create Video Upload URL

> Create a signed upload URL for a video asset.

**Limits:** 5 GB, plan-based duration: 2 hours on Standard, 5 hours on Professional/Enterprise

## Request

```bash theme={null}
curl -X POST "https://api.mosaic.so/uploads/video/get_upload_url" \
  -H "Authorization: Bearer mk_your_api_key"
```

## Response

```json theme={null}
{
  "video_id": "7f8d9c2b-4a6e-8b3f-1d5c-9e2f3a4b5c6d",
  "upload_url": "https://storage.googleapis.com/...",
  "upload_fields": {
    "key": "...",
    "policy": "...",
    "x-goog-signature": "..."
  },
  "max_file_size_bytes": 5368709120
}
```

## Upload File

POST as form-data. **Fields first, then file:**

<CodeGroup>
  ```python Python theme={null}
  import requests

  resp = requests.post(
      "https://api.mosaic.so/uploads/video/get_upload_url",
      headers={"Authorization": "Bearer mk_your_api_key"}
  )
  data = resp.json()

  with open("video.mp4", "rb") as f:
      requests.post(data["upload_url"], data=data["upload_fields"], files={"file": f})
  ```

  ```javascript JavaScript theme={null}
  const { video_id, upload_url, upload_fields } = await fetch(
    "https://api.mosaic.so/uploads/video/get_upload_url",
    { method: "POST", headers: { "Authorization": "Bearer mk_your_api_key" } }
  ).then(r => r.json());

  const formData = new FormData();
  Object.entries(upload_fields).forEach(([k, v]) => formData.append(k, v));
  formData.append("file", file);
  await fetch(upload_url, { method: "POST", body: formData });
  ```
</CodeGroup>

Use `video_id` in `update_params` after [finalizing the upload](/api/asset-management/post-uploads-video-finalize-upload).
