Dim a bright product clip before captions: free check, then encode

Make white captions readable on a bright product clip: the free /v1/video-filter/check, then a dim op at the $0.02 encode rate, then Timeline.

4 min readSume
All posts

When captions are hard to read over a bright product clip, dim the clip first. Sume's video filter takes one clip, applies a dim op that multiplies the luma by an amount in (0, 1], and returns a new MP4. Test the program for free with POST /v1/video-filter/check, then encode with POST /v1/video-filter. The public rate is $0.02 per encode job, per the Video filter page, which also tells you to read the live price from GET /v1/catalog. The check creates no job, reserves no credits and starts no encoder.

Step 1: the free check

0.45 makes the clip less bright and 1 changes nothing. Black stays black and the chroma does not change. The API refuses 0 and anything above 1. The check returns object: video_filter_check with valid, diagnostics[], the compiled filter names and, for a valid program, an estimate. A program can pass the check and still fail on the worker for a reason such as memory or time, and you would then get a structured job 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.6 }]
  }'

Step 2: encode

The source must be a clip on media.sume.com in your workspace. The API does not fetch from the open internet, so import an outside clip first with POST /v1/media-imports. The encode needs an Idempotency-Key. The default mode is async, and mode: "sync" waits at most 30 seconds for a 200 with the finished job and returns 202 if the job is not done by then. Poll GET /v1/jobs/:id/status and read GET /v1/jobs/:id/result. The result has kind: video_filter, a new video_url that is never the source, duration_seconds and ops_applied. The source clip does not change.

Limits and refusals

The source must be at most 300 seconds, and a program holds at most 8 ops. The output keeps the geometry, frame rate and audio of the source unless the program changes them. Put captions on afterwards, since the filter does not draw text: drawtext and subtitles are not on the allowlist.

Video filter refusals you can hit with a dim op (Sume docs, read 2026-10-05)
CodeWhen
video_filter_amount_out_of_rangeThe dim amount is not in (0, 1]
unsupported_media_sourcevideo_url is not on the Sume media host
source_not_foundThe media.sume.com URL is dead or from another workspace
unsupported_media_typeThe HEAD result is not a video
output_duration_exceededThe source is longer than 300 s

Dim how much

Start at 0.6 for a bright shot and look at one still. A heavy dim, such as 0.3, makes a product look dull and moves the eye from the product to the text. If a single scene is too bright, dim only that clip before you join, and leave the others alone. A filter does one clip, and assembly stays on Timeline 1.0, so a flow for an ad is: dim the bright clips, put all the clips in a Timeline compose, and add captions there.

For a batch of clips, send each check first and only encode the clips whose valid is true. The check is free, and it answers in the same call, so a loop of checks costs you nothing but requests. The public rate is stated per encode job, so a batch of 30 clips is 30 jobs at the rate on the page.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume