One output object for every episode: 1080x1920 at 30 fps in Timeline
Pin the same Timeline output block on every Shorts episode: 1080x1920 at 30 fps. Mixed-model clips then do not trigger the fps resample warning.

Define one output object, such as {"width": 1080, "height": 1920, "fps": 30}, and put it in every Timeline body of a season. Sume's default is already 1080x1920, but if you omit output.fps the frame rate follows the longest video source, so two episodes built from different models can land at different rates.
That behavior is in the Timeline 1.0 docs (read 2026-10-06): the job reports output_fps_resamples_sources when the chosen rate differs from a source's. YouTube's Shorts series wants every episode to be portrait or square and 180 seconds at most; it does not set a frame rate.
What does the object control?
The figures are laid out below.
| Field | Allowed values | Omitted |
|---|---|---|
output.width and output.height | Even integers 256 to 2160 | 1080x1920 |
output.fps | 24, 25, 30, or 60 | Matches the sources, 30 only if none has a rate |
output.fade_in_seconds and fade_out_seconds | 0 to 5 each; sum no more than the output length | No fades |
Why pin fps?
If a rate differs from a source's, the job repeats or drops a frame every few frames, which can look like judder on motion. Pinning 30 means every episode has the same cadence, and you see the output_fps_resamples_sources warning on the clips that need conforming, rather than discovering it in the season. Warnings are not failures, so a render still finishes.
How do I keep it consistent?
Keep the object in one place in your code and merge it into every body. Never send codec, crf, filtergraph, or similar keys; Timeline rejects provider and ffmpeg fields with a 400. Give each episode its own Idempotency-Key, for example s02-e05-v1, so a retried submit returns the original job.
Sources
Related posts
More in Developers
- One 6-minute b-roll, twelve Shorts episodes: source_in offsets
Slice one imported b-roll into twelve non-repeating 30-second episode backgrounds with Timeline 1.0 source_in, and plan the whole season unbilled in Python.
- One Sume API key per service: what it isolates and what it does not
Sume request budgets are per key and reads and writes are already separate. A key per service isolates revocation and scope, not generation capacity.
- GPT Image 2.5 Flare on Sume: the id is openai/gpt-image-2.5, no suffix
Flare is openai/gpt-image-2.5 on Sume's Image API and Sunburst is openai/gpt-image-2.5-sunburst. An id ending in -flare returns 404 model_not_found.
- OpenAI images.generate to Sume /v1/images: field by field map
Move a gpt-image-1 images.generate call to Sume POST /v1/images: which fields carry over, which return 400, and why size becomes image_size. Python mapper.
Written by Sume