Video filter limits: 8 ops, 2,048 characters, 32 filters

Video filter takes up to 8 dim/crop ops plus a filters-only graph of 2,048 characters and 32 filters. See what is allowed, what is refused, and the free check.

4 min readSume
All posts

One video-filter job accepts at most 8 ops[] entries (dim or crop) and a filtergraph of at most 2,048 characters and 32 named filters. Sume applies ops[] first, then the filtergraph. An encode job costs $0.02, and the check endpoint costs nothing.

The limits in one table

From the video-filter docs, read 2026-10-09.

Video filter program limits, as of 2026-10-09
PartLimitRefusal code
ops[]8 maximumvideo_filter_too_many_ops
dim amount(0, 1]video_filter_amount_out_of_range
crop width / height0.05 to 1 of the framevideo_filter_crop_out_of_bounds
filtergraph length2,048 charactersinvalid_filtergraph
named filters32invalid_filtergraph
source length300 soutput_duration_exceeded

What the graph may not contain

The graph is filters-only: no inputs, no outputs, no paths, and no stream specifiers such as [0:v]. The server wraps the graph in [0:v]...[vout] itself. Internal labels like split[a][b] are fine. trim, setpts, drawtext, subtitles, movie, lut3d and any filter that reads a file or socket are off the allowlist. Use video trim for cuts and captions for text.

Check first, free

POST /v1/video-filter/check runs the schema, the op whitelist, the allowlist and the source preflight. It returns diagnostics, creates no job and reserves no credit. A valid program still can fail on the worker (a bad expression, memory, time), in which case the job returns a structured error.

curl -X POST https://api.sume.com/v1/video-filter/check \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"video_url":"https://media.sume.com/artifacts/artf_demo/talk.mp4","ops":[{"op":"dim","amount":0.45},{"op":"crop","x":0.2,"y":0,"width":0.6,"height":1}]}'

Budget

Ten clips through the same program is 10 x $0.02 = $0.20. Run the check on one clip first: it is the same validator as the encode. Import the clip first with POST /v1/media-imports so it sits on media.sume.com, send an Idempotency-Key header, then poll GET /v1/jobs/:id/status and read GET /v1/jobs/:id/result. The API rejects off-host URLs at admit, so a bad URL fails before any work runs.

Sizing a program

Eight ops are usually enough for a brightness dim plus crops. The 2,048-character budget is the tighter limit for long graphs: a split-blur-overlay graph of about 200 characters leaves room for roughly nine more like it. The 32-filter count includes each named filter in a chain, so a chain of 10 filters repeated across 3 branches is 30. Keep programs short; a failure on the worker, such as a bad expression, returns a structured job error, so test an expression on a short clip first. Every media job follows the same lifecycle: submit with an Idempotency-Key, receive a job, poll GET /v1/jobs/:id/status until it is ready, then read GET /v1/jobs/:id/result. A retry with the same key does not queue a second job, so a network error during submit never doubles a charge.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume