Check a video crop before you pay: free video-filter /check
Validate a crop or dim program with POST /v1/video-filter/check, which is free, then submit the $0.02 encode. Diagnostics, refusal codes and next_action.

POST /v1/video-filter/check validates a Video filter program without encoding anything, and it is free; the encode that follows costs $0.02 (Sume docs, read 2026-10-03). Use it to find a bad crop before a batch: it returns object: video_filter_check with valid, diagnostics, an estimate, and a next_action of submit_video_filter or fix_program_and_recheck. That is the cheapest way to confirm that 100 crops will all be accepted.
What the program can contain
A program is up to 8 ops. dim takes an amount in (0, 1]. crop takes fractions x, y, width, height of the frame, with width and height at least 0.05. A raw filtergraph is capped at 2048 characters and 32 filters. The source video can be up to 300 seconds.
| Mistake | Refusal code | next_action |
|---|---|---|
| Crop box leaves the frame | video_filter_crop_out_of_bounds | fix_program_and_recheck |
| Dim amount above 1 or 0 | video_filter_amount_out_of_range | fix_program_and_recheck |
| Malformed filtergraph | invalid_filtergraph | fix_program_and_recheck |
| Valid program | none, valid is true | submit_video_filter |
A loop that checks first
For a batch, check every program, collect the failures, and only submit the ones that pass. Do not treat valid: true as success of the final file: it says the program is acceptable, not that the output looks right. Look at one real output before submitting the rest.
``python
import asyncio, os, httpx
async def main():
h = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
body = {"video_url": os.environ["VIDEO_URL"],
"ops": [{"op": "crop", "x": 0.2, "y": 0, "width": 0.56, "height": 1}]}
async with httpx.AsyncClient(timeout=60) as c:
r = await c.post("https://api.sume.com/v1/video-filter/check", json=body, headers=h)
print(r.status_code, r.json().get("next_action"))
asyncio.run(main())
``
Limits
The check does not preview pixels. For Content Credentials after a re-encode, see what a re-encode does to provenance.
Sources
Related posts
More in Media tools
- Cost of subtitling 20 Shorts in 5 languages: 100 caption jobs
20 Shorts x 5 languages is 100 Video captions jobs. Price it at $0.20 each, plan the idempotency keys, and know what a failed job costs.
- FLUX 21:9 ultrawide image: FLUX.2 on Sume vs FLUX 3 ratios
FLUX 3 Image lists ratios from 21:9 to 9:21. On Sume, FLUX.2 Pro and Flex take 21:9 and 9:21 too, from a 13-ratio list with no auto. A banner request in Python.
- Pull still frames from an AI video: Sume video-frames, at or fps
POST /v1/video-frames returns images at exact timestamps or at up to 2 fps. Request shape, the ready poll, and limits for a clip up to 300 seconds.
- Spotify podcast transcript upload: VTT, 5MB and Sume STT parts
Spotify takes VTT or SRT up to 5MB, with timestamps. Build one from Sume STT in 10-minute parts, stitch the cues, and upload from Spotify for Creators.
Written by Sume