Unreadable captions on bright Reels: dim 0.45, check for free

Burned-in captions vanish on bright footage. Sume video filter dim 0.45 darkens luma; the /video-filter/check endpoint validates the program at no charge.

4 min readSume
All posts

If white captions disappear into a bright beach or snow clip, darken the footage first and burn the captions second. Sume's video filter multiplies luma across the whole clip with the dim op, where amount is greater than 0 and at most 1: 0.45 is noticeably darker and 1 is unchanged. The encode is $0.02 per job, and a separate /v1/video-filter/check call validates the same program without creating a job, reserving credits or touching the encoder. So you can test the request shape for nothing, then pay once.

Instagram offers its own caption controls for reels (read 2026-10-03), and this page does not replace them; it is for creators who burn captions into the video file.

Check first, then encode

The check answers valid, returns diagnostics instead of a 400, and tells you the next_action: submit_video_filter or fix_program_and_recheck. It runs the same schema, op whitelist and source preflight as the encode. A program that passes can still fail on the box, so a structured job error is still possible, but typos and out-of-range values are caught for free. Note that the source must already be a media.sume.com URL, and Idempotency-Key is not needed on the check.

import json, os, urllib.request

API = "https://api.sume.com/v1"

def post(path, body, key):
    req = urllib.request.Request(
        f"{API}{path}",
        data=json.dumps(body).encode(),
        headers={
            "Authorization": f"Bearer {os.environ['SUME_API_KEY']}",
            "Content-Type": "application/json",
            "Idempotency-Key": key,
        },
        method="POST",
    )
    with urllib.request.urlopen(req) as res:
        return json.load(res)

def check_then_filter(video_url, amount):
    program = {"video_url": video_url, "ops": [{"op": "dim", "amount": amount}]}
    verdict = post("/video-filter/check", program, "unused-on-check")
    print(verdict["valid"], verdict.get("next_action"))
    if not verdict["valid"]:
        print(verdict["diagnostics"])
        return None
    job = post("/video-filter", program, f"dim-{amount}-v1")
    return job["request_id"]

print(check_then_filter(os.environ["SUME_CLIP_URL"], 0.45))

Picking the amount

The 0.8 row is a suggestion for a test, not a documented recommendation.

Dim amounts and what the docs promise, read 2026-10-03
amountEffect (Sume docs)
0Refused: video_filter_amount_out_of_range
0.45Darker; the docs' own example
0.8Not documented as a preset; a lighter pass to try
1Unchanged
above 1Refused: out of range

Order of operations

Run the filter, then burn captions on the new MP4. Video captions takes a public HTTPS URL for the clip and bills $0.20 per job for clips up to 60 seconds, so doing the dim first avoids paying for a caption render you then have to redo. The filter accepts sources up to 300 seconds; for a longer clip, cut it first with video trim.

The other caption levers still apply. A design override changes colours, typography and placement per request, so an outline or a heavier weight may fix legibility without touching the footage at all. Try that first if the clip is only mildly bright, since a dimmed clip changes the look of everything, not only the text area.

When not to dim

A practical test loop is cheap. Run the free check on three amounts, submit one encode at the most promising value for $0.02, pull a still with video frames, and only then spend $0.20 on the caption render. If the still still looks washed out, the clip needs a different fix, and you have spent a few cents finding that out. Remember that the original file is untouched, so you can always return to it and try again.

Dimming changes the footage for every viewer, so it is a poor fix when the problem is only the caption's colour. If the text is white on a light sky, try a darker caption colour or an outline through a design override first; the override changes colours, typography, placement, phrasing and motion for the request, and it leaves your pixels alone. It is not supported on punch or tiktok-green, so on those styles dimming is the available lever.

Product footage is the other case to avoid. A dimmed white product can read as grey, and the dim op does not know where the caption will land. If only the lower third is bright, crop is not the answer either, because it removes pixels rather than darkening them.

Compare the dimmed and original frames side by side before you publish, on a phone, in daylight if you can. That is the real test for caption legibility.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume