Brighten an underexposed AI video: exposure in video-filter

To lift a dark clip in Sume, send filtergraph exposure=exposure=0.6 to video-filter. Range -3 to 3 stops, one $0.02 job, source clip up to 300 seconds.

4 min readSume
All posts

To brighten a dark video with the Sume API, send exposure=exposure=0.6 as the filtergraph of a video-filter job. The exposure filter is on Sume's allowlist, takes only inline numbers, and returns a new MP4 for one flat $0.02 job. The source clip is never changed.

This is the opposite of the dim op in the same endpoint, which only darkens. If a generated or recorded clip comes out too dark to read on a phone, exposure is the right lift.

What does the exposure filter do?

The FFmpeg documentation describes exposure as adjusting the exposure of the input video, with an exposure option from -3 to 3 (default 0) and a black level option from -1 to 1 (default 0). Positive values brighten; negative values darken. Because the filter takes plain numbers and no file path, it passes Sume's allowlist check, which refuses any filter that could read a path or a socket.

Start small. A value of 0.4 to 0.8 usually recovers a murky clip without clipping the highlights. A value of 2 or more will blow out skin tones and bright backgrounds.

How do I send the request?

Import the clip into your workspace first, because video_url must be a media.sume.com artifact or asset. Then submit the job with an Idempotency-Key; the endpoint is async by default, so poll the job and read the result.

The result has kind: video_filter and a new video_url (a fresh artf_), plus the compiled filters[]. Send POST /v1/video-filter/check with the same body first if you want a free, unbilled validation of the program.

curl -X POST https://api.sume.com/v1/video-filter \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: exposure-lift-001" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/clip.mp4",
    "filtergraph": "exposure=exposure=0.6"
  }'

Which Sume model clips are in range?

Any clip that lives on the Sume media host works, whatever made it. The only hard limit is on length: the video filter refuses a source longer than 300 seconds with output_duration_exceeded. The generation models in the table below all produce clips well inside that cap, so the filter runs on a single result with no pre-trimming.

Clip lengths from Sume's video models against the 300-second filter cap (Sume docs, read 2026-10-12)
Model idClip lengthFits the filter cap?
wan-3.02 to 30 secondsYes
gemini-omni-flash-1.13 to 10 secondsYes
grok-imagine-video-1.54 to 15 secondsYes
Uploaded footageUp to 300 secondsTrim longer clips first

When should I use exposure instead of normalize or histeq?

Use exposure when you want a predictable, uniform lift and you know roughly how many stops you need. Reach for normalize or histeq when the clip looks flat and washed out and you want the tool to stretch contrast automatically. If the picture is both dark and flat, chain them in one graph, separated by commas, for example exposure=exposure=0.5,normalize. A graph can hold up to 32 named filters and 2,048 characters.

Whatever you pick, run the free check first. A program that passes can still fail on the box for a bad expression, in which case you get a structured job error rather than a silent bad render.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume