Video filter check passed but the encode failed: what to do next
Sume's free video-filter check covers schema, allowlist and source, not the worker. A valid program can still fail on expressions, memory or time. Next steps.

A passing Sume POST /v1/video-filter/check does not guarantee a successful encode. The check runs the schema, the op whitelist, the filtergraph allowlist and the source preflight, then returns encode: "not_run". A valid program can still fail on the worker for a bad expression, memory or time, and in that case the job returns a structured error you can read.
This is stated on the video filter page. The check creates no job, reserves no credits and boots no box, so passing it only means the request is well formed.
What the check proves
The response has object: video_filter_check, valid, diagnostics[], the compiled program.filters (names only), and, for a valid program, an estimate and next_action set to submit_video_filter or fix_program_and_recheck. Diagnostics come back as data and not as a 400.
| Stage | Checks | Costs |
|---|---|---|
| POST /v1/video-filter/check | Schema, op whitelist, filtergraph allowlist, Sume-host and HEAD source preflight | Free |
| POST /v1/video-filter | All of the above, then the ffmpeg encode on the worker | $0.02 per encode job |
| Job result or error | Expression errors, memory and time limits surface here | Read the structured job error |
A practical order of work
Run the check first on every program, since it is free. Submit the encode with an Idempotency-Key, then poll GET /v1/jobs/:id/status and read GET /v1/jobs/:id/result for the outcome. If the job fails, read the public error metadata (category, stage, retryability) described in errors and credits before changing anything.
- Source clips must be 300 seconds or shorter; longer sources fail with
output_duration_exceeded. - Shrink the program: at most 8
ops[], and a filtergraph of at most 2048 characters and 32 named filters. - Test a risky expression on a short trimmed piece first, since a trim is $0.02 and the clip then fits the worker budget.
- Use a new idempotency key when you change the program, so the changed request is not read as a replay.
Cost of being wrong
Because the check is free and an encode is $0.02, five trial encodes cost 5 x $0.02 = $0.10. I would not guess how a failed job is billed from this page; the public docs tell you where to read the job outcome, and the live price stays in GET /v1/catalog.
Typical failure causes to look for
The docs name three families: an expression the filter engine cannot evaluate, a program that needs more memory than the worker allows, and an encode that runs out of time. The first is usually a typo in an expression inside filtergraph; shorten it to the smallest program that reproduces the failure and re-check.
A crop that is larger than the source is caught earlier, by the check, with a diagnostic. The failures this page is about are the ones the check cannot see because they depend on the frames themselves.
Sources
Related posts
More in Media tools
- 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.
- 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.
Written by Sume