Export one video as 9:16, 1:1 and 16:9 with the API

Call Timeline 1.0 three times with the same clip and a different output.width and height each time. Three renders cost $0.30 for a clip under a minute.

4 min readSume
All posts

Send the same video[].source_url to Timeline 1.0 three times, changing only output.width and output.height: 1080 by 1920 for 9:16, 1080 by 1080 for 1:1 and 1920 by 1080 for 16:9. Each render is its own job, billed at $0.10 per output minute rounded up, so a clip under a minute costs $0.30 for all three.

Resolve 21.1 added output sizing that can be overridden per trim so each aspect ratio gets its own framing. Sume has no multi-output call; the equivalent is one render request per size. Details are in the Timeline docs, read 2026-10-01.

Which sizes should I send?

output.width and output.height must be even integers from 256 to 2160. If you send neither, the default output is 1080 by 1920, which is already 9:16.

Output sizes for three aspect ratios and their render cost, from the Timeline docs read 2026-10-01.
Aspect ratiowidth x heightCost for a clip under 1 min
9:161080 x 1920 (default)$0.10
1:11080 x 1080$0.10
16:91920 x 1080$0.10

What happens when the source ratio does not match?

Each slot has a fit value. cover is the default, contain, stretch and blur are the others. With cover a 16:9 source rendered at 9:16 is filled edge to edge, so the sides are cut. With contain the whole frame stays visible and the rest is padded. See cover, contain, stretch and blur.

Timeline has no field for choosing which part of the frame to keep. For a crop rectangle, run the clip through video filter first: its crop op takes x, y, width and height as fractions of the source frame, and returns a new MP4.

How do I run the three renders?

The source must already be a media.sume.com URL (import with POST /v1/media-imports). Idempotency-Key is required, and each size needs its own key.

const SOURCE = "https://media.sume.com/artifacts/artf_demo/clip.mp4";
const sizes = { "9x16": [1080, 1920], "1x1": [1080, 1080], "16x9": [1920, 1080] };

for (const [name, [width, height]] of Object.entries(sizes)) {
  const res = await fetch("https://api.sume.com/v1/timeline-1.0/render", {
    method: "POST",
    headers: {
      Authorization: "Bearer " + process.env.SUME_API_KEY,
      "Content-Type": "application/json",
      "Idempotency-Key": "clip-001-" + name,
    },
    body: JSON.stringify({
      audio: { mode: "silence", duration_seconds: 20 },
      video: [{ source_url: SOURCE, start: 0, duration: 20 }],
      output: { width, height },
    }),
  });
  console.log(name, res.status, (await res.json()).id);
}

Can I check the cost first?

Yes. The unbilled plan call returns billable_minutes and estimated_cost_usd_micros without creating a job; see the Timeline docs. The reserve for a render is ceil(audio.duration_seconds / 60) minutes, so three 20-second renders reserve three minutes in total.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume