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

# Media requirements

> Prepare a source video the API can download and caption.

## Video limits

| Property                         | Limit                                                |
| -------------------------------- | ---------------------------------------------------- |
| Source formats                   | MP4, MOV, WebM                                       |
| Maximum file size                | 500 MiB (524,288,000 bytes)                          |
| Maximum duration                 | 600 seconds                                          |
| Default requested duration limit | 60 seconds                                           |
| Maximum dimensions               | Long edge ≤ 1920 pixels and short edge ≤ 1080 pixels |
| Audio                            | An audio track containing speech is required         |
| Output                           | MP4 video, SRT subtitles, JSON transcript            |

Both 1920 × 1080 landscape and 1080 × 1920 portrait videos are supported. A square video must fit within 1080 × 1080. Odd pixel dimensions may be rounded down by one pixel during encoding.

`max_duration_seconds` is a hard input limit and credit reservation. It does **not** trim the video. A longer source fails validation after inspection.

## Direct HTTPS URLs

The API downloads `video_url` from the processing server. The URL must:

* Use HTTPS on the standard port, with a public hostname.
* Return the video directly with HTTP `200` and no redirect.
* Be reachable without cookies or additional authorization headers.
* Contain no embedded username/password or URL fragment.
* Remain valid while the job is waiting and downloading.

Signed object-storage URLs are supported when they meet these requirements. Account for queue time when choosing their expiration.

URLs for local networks, localhost, private addresses, and custom ports are rejected. A YouTube page, a cloud-drive sharing page, or a login page is not a direct media URL.

## Uploads

There is no public upload endpoint in this release. Upload your media to your own object storage, then provide its direct HTTPS URL.

## Transcript format

The downloaded JSON transcript contains the full text and individual words:

```json theme={"system"}
{
  "text": "Make every word count.",
  "timestamp_unit": "seconds",
  "words": [
    { "text": "Make", "start": 0.12, "end": 0.4 },
    { "text": "every", "start": 0.42, "end": 0.75 },
    { "text": "word", "start": 0.78, "end": 1.08 },
    { "text": "count.", "start": 1.1, "end": 1.5 }
  ]
}
```

Times are measured in **seconds**, not milliseconds, from the start of the source video. The example timestamps above are illustrative.
