Stabilize shaky video by API: Sume has no deshake, so do this
Sume's video filter refuses deshake and vidstab as unknown filters. Prove it with the free check, stabilize upstream, then use Sume for trim, crop and captions.

Sume cannot stabilize a shaky clip. The hosted video filter takes an allowlisted ffmpeg filtergraph, and deshake and vidstabdetect are not on the list, so the request is refused as an unknown filter. Stabilize the footage in your phone, editor or a tool that has a stabilizer, then bring the steady file to Sume for the steps it does run: trim, crop, dim, captions and assembly.
You do not have to take our word for it. The video filter has a free check endpoint that validates a program without encoding, and it answers a deshake graph with the list of filters that are allowed.
Prove it with the free check
POST /v1/video-filter/check does not create a job, reserve credits or touch the encoder, and it does not need an Idempotency-Key (video filter docs). A valid response carries valid, diagnostics[] and a next_action. The script below sends deshake for a clip that is already in your workspace on media.sume.com and prints what comes back.
import json, os, sys, urllib.error, urllib.request
video_url = sys.argv[1] # a media.sume.com clip in your workspace
body = {"video_url": video_url, "filtergraph": "deshake"}
req = urllib.request.Request(
"https://api.sume.com/v1/video-filter/check",
data=json.dumps(body).encode(),
headers={
"Authorization": "Bearer " + os.environ["SUME_API_KEY"],
"Content-Type": "application/json",
},
method="POST",
)
try:
with urllib.request.urlopen(req) as res:
out = json.load(res)
except urllib.error.HTTPError as err:
out = json.load(err)
print("valid:", out.get("valid"))
print(json.dumps(out.get("diagnostics", out), indent=2))
print("next_action:", out.get("next_action"))
What the allowlist does include
The allowlist in the timeline compiler covers tone and colour, blur and sharpen, geometry, time, and a few compositing filters. None of them tracks camera motion. Three that people reach for are not stabilizers:
tmixblends neighbouring frames. It softens a jittery clip into a motion-blur look but the framing still wobbles.zoompanadds a deliberate zoom or pan on a clip. It moves the frame on purpose and does not cancel movement.crop(also available as thecropop with fractions of the frame) removes edges. A stabilizer usually crops in, but cropping alone does not stabilize.
| ffmpeg filter | On the allowlist | Does it stabilize |
|---|---|---|
| deshake | No, refused as unknown_filter | Would, but unavailable |
| vidstabdetect | No, refused as unknown_filter | Would, but unavailable |
| tmix | Yes | No, blends frames |
| zoompan | Yes | No, adds movement |
| crop | Yes | No, removes edges |
A workflow that keeps Sume in the loop
Stabilize first, then hand the steady file over. The order matters: a stabilizer re-encodes and often crops, so run it before anything that depends on the final frame size, such as burned-in captions placed as a fraction of the frame height.
Once the file is stable and on media.sume.com, video trim cuts the range you want for $0.02 per job, with precision: exact as the default frame-accurate re-encode. Video captions burn styled words into the result for $0.20 per job on videos up to 60 seconds. Timeline 1.0 then assembles several steady clips with transitions and a soundtrack.
A practical split for a creator batch: keep a folder of raw takes, stabilize the ones that need it, upload the steady versions to your workspace, then run trim and captions as a loop. Both are Idempotency-Key calls, so give each file its own key and a retry reuses the same key.
If the clip is one Sume generated, the camera comes from the prompt, and we found no stabilization or camera-lock field in the docs. Regenerate with a calmer description of the shot rather than trying to repair it afterwards.
When a no is the useful answer
An API that silently accepted deshake and returned a clip that still shook would cost you an encode and a review. Sume checks the graph up front, before any worker starts, which is why the check call is free and the refusal names the filter. If your pipeline needs stabilization, put that step ahead of Sume and treat Sume as the trim, crop, caption and assembly stage that follows.
Sources
Related posts
More in Media tools
- Temu detail video up to 180 s: stitch 30 s clips with Timeline
Temu detail video allows up to 180 s and 300 MB at 720p or higher. Sume clips top out at 30 s, so six clips stitched with Timeline cover the full length.
- TikTok trending API: browse without a query is flag-gated
Sume trending search needs a query on production. Browse with no query, limit up to 100 and relevance floors are dev-only until a flag is set. The differences.
- Transparent PNG: generate it or cut it out?
Sume lists a background option on ChatGPT Image 2.5: auto, transparent or opaque. Generate a transparent PNG directly, or cut out an existing image.
- Trim the silent lead-in: first spoken word from STT, then video trim
A clip that starts with two seconds of nothing loses viewers. Read the first word's start time from STT, then cut with video trim, exact or keyframe.
Written by Sume