# Uploading media

> Three ways into a project's input folder, and which to choose.

The first two put files in the same place, the project's `input/` folder in SyncWords' storage,
and you can mix them in one project. The third keeps the folders in a bucket of your own.

These pages describe projects that read their input folder (`"sourceMedia": {"@type":
"S3FolderSource"}`, the default): files land in the folder and each is processed once. A project
that reads a [feed](/vod-express/concepts/inputs#feeds) takes its media from the feed and
**takes no uploads**: an API upload is refused with `409` (`project_reads_feed`), and a file copied
in with the AWS CLI is never processed.

- **[AWS CLI or SDK](/vod-express/uploads/aws-role)**: For bulk transfers, pipelines and anything already on S3. The API vends an IAM role for your account; you upload with `aws s3 cp` / `sync` or any S3 SDK, and download results the same way. **Needs:** an AWS account (any), one-time setup.
- **[Through the API](/vod-express/uploads/api-uploads)**: For apps, scripts and browsers without AWS credentials. The API signs the upload, one `PUT` for a file up to 5 GB or part by part for any size; the bytes go straight to S3. **Needs:** nothing beyond your API token.
- **[Your own bucket](/vod-express/uploads/own-bucket)**: For a media system that can only write to a bucket with an access key, or media that should stay in your bucket. Enter the bucket and keys once per account; a project's input and output folders are then prefixes of it, on AWS S3 or an S3-compatible store (Cloudflare R2, Wasabi). **Needs:** a bucket and an access key pair for it.

| | AWS role | API upload | Your own bucket |
|---|---|---|---|
| Needed | An AWS account (any) | Your API token | A bucket and an access key pair |
| Files at once | Unlimited (`aws s3 sync`) | One upload per file (run several in parallel) | Unlimited: whatever writes to your bucket |
| Interrupted transfers | The AWS CLI retries failed parts | In parts, resumable: list the parts S3 holds and send the rest. One `PUT`: start again | Your tools' |
| Largest file | 5 TB | 5 TB | Your store's limit |
| Name checks | None: any name is accepted | Media extensions only; names whose outputs would collide are refused | None |
| Download results | `aws s3 sync` of `output/` | Presigned URLs from `GET …/outputs/download` | Read your output folder; the API's download links work too |

## Accepted media

Video: `mp4`, `mov`, `m4v`, `mkv`, `webm`, `avi`, `mxf`, `ts`, `mts`, `m2ts`, `mpg`, `mpeg`,
`wmv`, `flv`, `3gp`. Audio: `wav`, `mp3`, `m4a`, `aac`, `flac`, `ogg`, `opus`.

The file needs an audio stream with speech; a video without audio fails.

## After uploading

A project that [stopped itself](/vod-express/concepts/projects#auto-stop) after its last file
starts again on its own when a new file lands, either way, within a minute, unless you turned its
[`startOnNewFiles`](/vod-express/concepts/projects#starting-again-on-a-new-file) off. Any other `stopped` project (stopped with
`POST …/stop`, or created with `autoStart: false` and never started) waits for you to start it:

```bash
curl -s -X POST -H "$AUTH" $API/projects/$PROJECT/start
```

It is harmless on a running project, so an upload routine can always end with it.
