Cut a Seedance 2.5 clip shorter: video-trim or regenerate?

To shorten a Seedance 2.5 clip, cut it with video-trim at $0.02 a job. Regenerating re-rolls the whole video and cannot go under the model's 4-second minimum.

5 min readSume
All posts

If a Seedance 2.5 clip is good but too long, cut it with Sume's POST /v1/video-trim instead of regenerating. Trim is $0.02 per job, keeps the footage you already approved, and runs worker ffmpeg with no model inference. Regenerating with a shorter duration produces a different video, and Seedance 2.5 accepts 4 to 30 seconds, so it cannot make anything shorter than 4.

Use the cut when the first seconds are right. Regenerate when the motion, the framing or the dialogue is wrong. The rest of this post covers the request, the two precision modes and a script.

When is a cut enough?

A cut is enough when you want a prefix or a middle range of what you already have: a 12-second clip trimmed to its best 6 seconds, or a 30-second Seedance 2.5 render whose ending drifts. The model's length range is 4 to 30 seconds on seedance-2.5, and other catalog models top out at 15, so the cut can also reach lengths the generator cannot produce, down to 0.2 seconds.

A cut is not enough when the problem is inside the frames. Trimming never fixes a face, a product shape or a line of dialogue. It also does not sequence clips; joining several is a Timeline job, and the trim page points there.

What does the request look like?

Trim needs a video_url on your workspace's media.sume.com storage, which includes Sume-generated artifacts, a start in seconds, and exactly one of end or duration. Duration runs from 0.2 to 900 seconds. An end past the source clamps and the result warns trim_clamped_to_source. An Idempotency-Key is required. Default mode is async, and mode: "sync" waits up to 30 seconds.

The result is a new MP4 artifact; the source is untouched. Read it at GET /v1/jobs/{id}/result, where kind is video_trim and video_url is the new file.

Exact or keyframe: which precision?

precision decides how the cut is made. Pick by what you do next.

video-trim precision modes, read 2026-10-02
PrecisionHow it cutsTrade-off
exact (default)Frame-accurate re-encode (libx264, yuv420p)Slower; allows an output width, height and fps conform
keyframeStream copyCut may start a GOP early; re-base against actual_start_seconds; no output conform

How do I run it from a script?

This script keeps seconds 2 to 10 of a clip, waits up to 30 seconds, and prints the new file's URL. If the job is still running it prints the job id for polling instead.

import os, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
r = requests.post(
    "https://api.sume.com/v1/video-trim",
    json={"video_url": os.environ["CLIP_URL"], "start": 2,
          "end": 10, "mode": "sync"},
    headers={**H, "Idempotency-Key": "trim-" + os.environ["CLIP_URL"][-24:]},
    timeout=60,
)
r.raise_for_status()
job_id = r.json()["request_id"]
if r.status_code == 202:
    print("still running; poll /v1/jobs/" + job_id + "/status")
else:
    out = requests.get(f"https://api.sume.com/v1/jobs/{job_id}/result",
                       headers=H, timeout=30)
    print(out.json())

What if the clip is not on media.sume.com?

Off-host URLs are rejected at admit with unsupported_media_source. Import the clip first with POST /v1/media-imports. A dead or foreign media.sume.com URL returns source_not_found, and a non-video returns unsupported_media_type.

Also remember that the audio belongs to the clip. audio: keep is the default and remuxes AAC; audio: drop removes the track. For other options see cutting a product video into feed cutdowns, and the Video trim reference for every refusal code.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume