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.

4 min readSume
All posts

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:

  • tmix blends neighbouring frames. It softens a jittery clip into a motion-blur look but the framing still wobbles.
  • zoompan adds a deliberate zoom or pan on a clip. It moves the frame on purpose and does not cancel movement.
  • crop (also available as the crop op with fractions of the frame) removes edges. A stabilizer usually crops in, but cropping alone does not stabilize.
Stabilization-related filters against the Sume video filter allowlist, from packages/timeline-compiler filter.ts (read 2026-10-04)
ffmpeg filterOn the allowlistDoes it stabilize
deshakeNo, refused as unknown_filterWould, but unavailable
vidstabdetectNo, refused as unknown_filterWould, but unavailable
tmixYesNo, blends frames
zoompanYesNo, adds movement
cropYesNo, 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

All Media tools posts

Written by Sume