Video filter crops 16:9 to 9:16 only up to 300 seconds of source
Sume video filter takes a source of at most 300 seconds. To crop a longer 16:9 recording to 9:16 for Shorts, trim first, then crop with x 0.3418 width 0.3164.

Sume's video filter accepts a source of at most 300 seconds, so a 16:9 recording longer than 5 minutes fails with output_duration_exceeded if you crop it directly. Trim it into pieces of 300 seconds or less first, then send each piece through a crop op with x 0.341796875, y 0, width 0.31640625, height 1.
The limit is stated in the video filter docs (read 2026-10-06): "source ≤ 300 s", with output_duration_exceeded as the refusal code. Video trim, by contrast, accepts a source up to 1800 seconds and an output up to 900 (video trim docs).
Where do the crop fractions come from?
A 9:16 window inside a 16:9 frame is as tall as the frame and (9/16) / (16/9) = 81/256 of its width, which is 0.31640625. Centered, it starts at (1 - 0.31640625) / 2 = 0.341796875. The docs say crop takes fractions of the source frame and the compiler rounds to even values for yuv420p, so you never send pixels.
| Source | Crop width | Result before scaling |
|---|---|---|
| 1920x1080 | 607.5 px, rounded to an even value by the compiler | About 608x1080 |
| 1280x720 | 405 px, rounded to an even value | About 404x720 or 406x720 |
What is the order for a long recording?
First, POST /v1/video-trim for each range of 300 seconds or less (a Short is at most 180 seconds anyway, per YouTube Help). Second, POST /v1/video-filter/check with the crop op, which is free and reports valid without encoding. Third, POST /v1/video-filter for each trimmed piece. Each trim and each filter job is $0.02.
The crop keeps the source's frame rate and audio. Put the result in a Timeline video[] slot, where fit: cover scales the narrow strip to the 1080x1920 default output.
Sources
Related posts
More in Developers
- curl and jq script to test a new Sume image model id in one command
A 6-line shell script that posts one prompt to Sume POST /v1/images for any model id and prints the url, cost and status, to vet a gpt-image-1 replacement fast.
- Cursor mcp.json for the hosted Sume server: env interpolation or OAuth
Cursor reads .cursor/mcp.json with url and headers and supports ${env:NAME}. Pass the Sume key from the environment, or omit headers and use OAuth. Validated.
- Cyber Monday product videos in bulk: a Sume Format queue
Adobe expects $15.1B on Cyber Monday. How to run one Sume Format over a product list with a bulk queue, concurrency 1 to 16, and recheck failed items.
- How to watch the Sume image model list for new and removed models
Image catalogs change. Snapshot GET /v1/images/models each night and diff the ids in Python, so a retired or new model reaches you before a request fails.
Written by Sume