video_filter_too_many_ops: more than 8 ops, use filtergraph
Sume video-filter accepts at most 8 ops. A ninth returns video_filter_too_many_ops; move extra pixel work into the filtergraph, which has its own caps.

A Sume video-filter program takes at most 8 entries in ops[]. A ninth returns video_filter_too_many_ops. The ops list only knows dim and crop, so more steps, or any other pixel work, go in the filtergraph field of the same request.
Limits are from the Video filter docs, read 2026-10-01. Blackmagic's Resolve 21.1 announcement says assistants such as Claude can batch render; if an assistant builds your program, this is the limit it will hit.
What are the program limits?
The ops list holds at most 8 entries and runs before the filtergraph. A request needs at least one op or a filtergraph.
| Step | Goes in | Count that matters |
|---|---|---|
| Luma dim | ops[] as dim | Counts toward 8 |
| Rectangle crop | ops[] as crop | Counts toward 8 |
| Blur, tone, geometry, fade | filtergraph | Counts toward 32 filters |
| Anything beyond ops and graph | A second video-filter job on the first job's MP4 | New request, new limits |
What do I do with a ninth step?
If the ninth step is a crop or dim, fold it into the graph: the filtergraph is applied after ops[] and can hold up to 32 named filters. If it is other pixel work, such as a blur or a geometry change, it was always a filtergraph job, because ops[] refuses every op name except dim and crop.
Order is fixed: ops first, then the graph. See video-filter order of operations.
Does a long program stay one request?
Yes. Ops and filtergraph travel in one body, and the result is one new MP4 from one job, with the source untouched. Since each result is a new artf_ file, you can also feed it to a second request when a program truly needs more than one pass.
How do I find the error without paying?
Use POST /v1/video-filter/check, or the hosted MCP video_filter tool with check_only: true. Both are free and return diagnostics instead of a job.
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": "crop", "x": 0, "y": 0, "width": 1, "height": 0.9 },
{ "op": "dim", "amount": 0.9 }
],
"filtergraph": "gblur=sigma=2,hflip"
}'Sources
Related posts
More in Developers
- unsupported_filter_op: video-filter ops are dim and crop only
In Sume video-filter, ops[].op must be dim or crop. Another name returns unsupported_filter_op; an extra key on a valid op returns unsupported_filter_op_field.
- Extract frames from a long video API: duration_out_of_range
Video frames fails duration_out_of_range for a source over 300 seconds. Cut a range under 300 seconds with video trim first, then extract frames from it.
- Video frames job succeeded but one frame url is null
If one instant fails to extract, video frames returns that entry with url null and the job still finishes ready. Filter the null entries and ask again for them.
- Extract frames from video at fps: mid-bin times, 24 frame cap
Sume video frames turns fps into mid-bin timestamps (0.5/fps, 1.5/fps, and so on), caps the result at 24 frames, and accepts fps above 0 up to 2.
Written by Sume