Skip to main content
Videos use the same URL shape as images, with one difference that shapes everything else: encoding runs as a background job.
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.

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.
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. Encoding runs roughly 5 to 30 seconds per file. For anything you know you will serve, prewarm it at upload so the first visitor never meets the 202.

Recipes

Downscale to 720p
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
Offsets in seconds. eo is exclusive, so this is a 7 second clip. A poster frame
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
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.

All video parameters

The full table, plus the CRF mapping and supported formats.

Upload & Cache Warming

Queue variants at upload so the first request is already warm.

Video Status

Poll a queued transformation.

Video Processing Config

Worker concurrency, retries and encode limits.