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
- Text to speech long text limit: 1,200 seconds, not just characters
Sume TTS 1.0 has two limits: 20,000 characters in, 1,200 seconds of audio out. Over the audio limit it fails with tts_duration_exceeded and captures no credit.
- Text to speech sentence timestamps API: one lip-sync clip each
Sume TTS 1.0 returns gapless sentence segments; with wav output each gets its own audio_url, ready to drive a lip-sync clip. Request shape and the 5 s catch.
- TTS WAV or MP3 for video: keep WAV until the last mux
Sume TTS 1.0 defaults to mp3 at 44100 Hz and 128 kbps. If the audio will be joined, sliced or muxed into video, ask for wav; mp3 adds padding at every edge.
- 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.
Written by Sume