Render a vertical 1080x1920 video from clips with an API
Timeline 1.0 defaults to a 1080x1920 MP4. Set output width, height and fps, and pick fit cover, contain, stretch or blur for clips that do not match the frame.

A POST /v1/timeline-1.0/render already outputs a vertical 1080x1920 MP4 unless you say otherwise, so for a Reels, Shorts or TikTok cut you can leave output out. Set output.width and output.height (even integers from 256 to 2160) and output.fps (24, 25, 30 or 60) only when you need a different frame.
Details are from Timeline 1.0, read 2026-09-29. Platform upload specs change, so check the platform's own page for the current limits.
How do clips that are not vertical fit the frame?
Each video[] slot has a fit: cover (default) crops to fill, contain letterboxes, stretch distorts, and blur fills the empty area with a blurred version of the clip. A landscape clip in a vertical frame is the classic case for blur.
{
"audio": { "mode": "silence", "duration_seconds": 8 },
"output": { "width": 1080, "height": 1920, "fps": 30 },
"video": [
{ "source_url": "https://media.sume.com/artifacts/artf_demo/wide.mp4",
"start": 0, "duration": 8, "fit": "blur" }
]
}What happens to frame rate?
Omit output.fps and the render runs at the rate the sources already use (the longest video sources decide; stills have none; 30 only when nothing has one). A rate that differs from a source's is met by repeating or dropping frames, which can judder on motion, and Sume reports it as the output_fps_resamples_sources warning.
What are the output options?
| Field | Value |
|---|---|
output.width, output.height | Even integers 256 to 2160; default 1080x1920 |
output.fps | 24, 25, 30 or 60; omit to match sources |
output.fade_in_seconds, fade_out_seconds | 0 to 5 each; sum no more than the output length |
video[].fit | cover, contain, stretch, blur |
What if I need a still above a clip?
That is a different job: compose a still and a video into one shot first, set its output.width and output.height to match this render so it is not rescaled twice, then use the result as a slot. Price: $0.10 per output minute.
How do I render landscape or square instead?
Set both sides in output. The docs give the same range for each, even integers from 256 to 2160, so 1920x1080 and 1080x1080 are both valid, while a 3840 side is outside the range.
{
"audio": { "mode": "silence", "duration_seconds": 8 },
"output": { "width": 1920, "height": 1080, "fps": 30 },
"video": [
{ "source_url": "https://media.sume.com/artifacts/artf_demo/wide.mp4",
"start": 0, "duration": 8 }
]
}Sources
Related posts
More in Developers
- Let the API pick the video model: sume/auto for vertical UGC clips
Send model sume/auto to POST /v1/videos and Sume picks the family. The response echoes sume/auto and never names the model. When to pin a model instead.
- Veo 3.1 personGeneration: allow_adult vs allow_all by mode
Veo 3.1 personGeneration is allow_all for text-to-video, allow_adult for image modes, and allow_adult only in some regions. Sume has no such field.
- Validate a video filter program for free before you encode
POST /v1/video-filter/check runs the same validation as the encode with no job and no credits. See what it returns and what it cannot promise about the encode.
- unsupported_media_source: why the media API rejects your video URL
unsupported_media_source means video_url is not on the Sume media host. Import the clip first; which Sume video endpoints need a hosted URL and which don't.
Written by Sume