Two video models in one episode: match their colour with video filter

Clips from different models may not share a grade. Test an eq or colortemperature pass for free with /v1/video-filter/check, then encode at $0.02 a clip.

5 min readSume
All posts

When one episode mixes clips from two video models, the cut can show the seam in colour, and the cheap fix on Sume is POST /v1/video-filter: write a short filtergraph for the odd clip, test it with the free POST /v1/video-filter/check, and encode only when the check passes. An encode costs $0.02 per job (read 2026-10-03), so matching four stray clips in an episode is $0.08.

Longer Reels can make this more common. Metricool's Instagram news page reports that Instagram's updated Reels guide gives ideal clip lengths from 3 seconds to 3 minutes (reported, read 2026-10-03). A three-minute episode is rarely one generation, because most video models cap a clip at 15 to 30 seconds, so it is many clips, sometimes from more than one model. The grade is the part nobody planned for.

What the filter route can and cannot touch

Video filter 1.0 takes one clip hosted on media.sume.com and a program, then returns a new MP4. The source is untouched. The program has two parts: up to 8 ops[] entries (dim and crop only), and a filtergraph string of up to 2,048 characters and 32 named filters, applied after the ops. The filtergraph is filters only: no inputs, no outputs, no file paths, and no stream specifiers such as [0:v].

The allowlist matters for colour. It includes tone and colour filters such as eq, hue, colorbalance, colorlevels, colortemperature, colorcontrast, colorcorrect, normalize and vibrance. It does not include lut3d, drawtext, subtitles or movie, so a downloaded LUT file cannot be applied here. If your grade lives in a LUT, approximate it with the filters above or grade before you upload.

Video filter facts for a colour match (read 2026-10-03)
ItemValue
Encode price$0.02 per job
Check priceFree, creates no job and reserves no credits
Source limit300 seconds, hosted on media.sume.com
OpsUp to 8, dim and crop only
Filtergraph2,048 characters, 32 filters, no stream specifiers
OutputNew MP4 that inherits geometry, frame rate and audio
Idempotency-KeyRequired on the encode, not on the check

A worked example: warm up the cool clip

Say clips 1, 2 and 4 of an episode come from one model and look neutral, while clip 3 comes from another and looks cooler and flatter. Pick a reference still from a neutral clip and the odd still from clip 3, look at them side by side, and decide on two or three moves rather than ten: warm the temperature, lift saturation a little, and bring the contrast closer.

Write that as one filtergraph, for example eq=contrast=1.06:saturation=1.12,colortemperature=temperature=6200. Those are ordinary ffmpeg filter options, and the numbers are a starting point for your own footage, not a rule. Run the check first. It runs the same schema, allowlist and source preflight as the encode and returns valid, the compiled filter names and next_action, which is submit_video_filter when the program is good and fix_program_and_recheck when it is not.

import os, requests

API = "https://api.sume.com"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
clip = os.environ["ODD_CLIP_URL"]  # a media.sume.com artifact
graph = "eq=contrast=1.06:saturation=1.12,colortemperature=temperature=6200"
body = {"video_url": clip, "filtergraph": graph}

check = requests.post(f"{API}/v1/video-filter/check", headers=H, json=body)
check.raise_for_status()
c = check.json()
print(c["valid"], c.get("next_action"), c.get("diagnostics"))

if c["valid"]:
    r = requests.post(f"{API}/v1/video-filter",
                      headers={**H, "Idempotency-Key": "ep3-clip3-warm-v1"},
                      json={**body, "mode": "sync"})
    print(r.status_code, r.json().get("request_id"))
    # 200 means finished; 202 means poll /v1/jobs/<id>/status, then /result

What to do in your own episode

Match toward the clip that carries the most screen time, not toward the one you like best. Grading five clips to match one is five encodes. Grading one clip to match four is one.

Version the idempotency key with the program. ep3-clip3-warm-v1 becomes ep3-clip3-warm-v2 when you change a number, because reusing a key for a different payload is a conflict. Keep each result's video_url: it is a new artifact, never the source, and it goes straight into the Timeline video[] slot in place of the original.

Do the colour pass before you join clips, not after. A pass on a finished 90-second episode would grade every clip the same way, and the problem is that the clips differ. Source clips are capped at 300 seconds for this route, so a long finished cut cannot be graded in one call anyway.

Finally, spot-check with stills. Pull a frame from the original and from the graded clip at the same time with video frames, put them next to a neutral clip's frame, and judge the three together. A grade that looks right alone can still look wrong against its neighbours.

What Sume does and does not do

Sume applies a validated pixel program you write and returns a new file, and the check tells you whether the program will be accepted before you pay. It does not look at two clips and compute the match for you, it does not accept a LUT file, and it does not promise that a filter that passes the check will look right; that part is your eye. A program that passes the check can still fail on the worker, and that comes back as a structured job error.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume