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

# Video Transformations

> Common video recipes: resizing, trimming, poster frames, and what the 202 means

Videos use the same URL shape as images, with one difference that shapes everything else: encoding runs as a background job.

```http theme={null}
GET /t/w_1280,h_720,q_80/videos/clip.mp4
```

A bare `/t/videos/clip.mp4` is never transcoded. It streams the stored file with range requests, so seeking works. Transcoding happens only when the URL asks for it, and `q_auto` is enough to opt in.

The full parameter table is in the [API reference](/api-reference/media/transform#video-parameters).

## The first request returns 202

A transformation that is not cached yet answers `202` with a `statusUrl`, not the original file. That is deliberate: an untransformed, full-size video is never served in place of the one you asked for.

```json theme={null}
{ "status": "processing", "statusUrl": "/video-status/w_640/videos/clip.mp4" }
```

Poll that URL until it reports `completed`, then request the transform again. Keep its transformation segment, since jobs are keyed on the path **and** its parameters. See [video status](/api-reference/video/status).

Encoding runs roughly 5 to 30 seconds per file. For anything you know you will serve, [prewarm it at upload](/media-transformations/upload-and-prewarm) so the first visitor never meets the `202`.

## Recipes

**Downscale to 720p**

```http theme={null}
GET /t/w_1280,h_720,q_80/clip.mp4
```

Without an explicit `w` or `h`, videos are downscaled to 720p anyway. That default is what makes an 8K source processable at all.

**Trim a section**

```http theme={null}
GET /t/so_5,eo_12/clip.mp4
```

Offsets in seconds. `eo` is exclusive, so this is a 7 second clip.

**A poster frame**

```http theme={null}
GET /t/t_true,tt_5,f_webp,w_500/clip.mp4
```

`t_true` extracts a single frame as an image instead of transcoding, and `tt` picks which second. Thumbnails are queued ahead of other video work.

**A smaller file**

```http theme={null}
GET /t/q_40/clip.mp4
```

`q` maps to CRF as `round(51 - q / 100 * 33)`, so a lower `q` is a smaller, rougher file. The default `q_60` favors encoding speed, which matters most on large sources.

## Related

<CardGroup cols={2}>
  <Card title="All video parameters" icon="code" href="/api-reference/media/transform#video-parameters">
    The full table, plus the CRF mapping and supported formats.
  </Card>

  <Card title="Upload & Cache Warming" icon="upload" href="/media-transformations/upload-and-prewarm">
    Queue variants at upload so the first request is already warm.
  </Card>

  <Card title="Video Status" icon="video" href="/api-reference/video/status">
    Poll a queued transformation.
  </Card>

  <Card title="Video Processing Config" icon="gear" href="/configuration/video-processing">
    Worker concurrency, retries and encode limits.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.