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.

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.
| Part | Limit | Refusal code |
|---|---|---|
| ops[] | 8 maximum | video_filter_too_many_ops |
| dim amount | (0, 1] | video_filter_amount_out_of_range |
| crop width / height | 0.05 to 1 of the frame | video_filter_crop_out_of_bounds |
| filtergraph length | 2,048 characters | invalid_filtergraph |
| named filters | 32 | invalid_filtergraph |
| source length | 300 s | output_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
- Video frames on 300 s: fps 0.08 gives 24 stills, 12.5 s apart
The video-frames route takes clips up to 300 s and 24 frames per call. At fps 0.08 a 300-second clip yields 24 source-size stills, from 6.25 s to 293.75 s.
- Video inspect on a 60 s clip: stills at 3.75 s, then every 7.5 s
With no frames program, video inspect returns 8 mid-bin stills. On a 60-second clip they land at 3.75, 11.25, 18.75 seconds and on, 768 px on the long edge.
- Video inspect with fps 0.4 returns 24 stills from a 60-second clip
The inspect frames program caps at 24 stills and fps at 2. For a 60-second clip, fps 0.4 fills all 24 slots, 2.5 seconds apart, centered in each bin.
- Video inspect seek fast vs precise: stills up to one GOP early
Sume video inspect seek: fast snaps each still to the keyframe at or before the time, about 0-5 s early on typical sources. precise decodes the exact instant.
Written by Sume