Get an alert when a new video model id appears: daily catalog diff
Kling 4.0 is due in October. A small Python script diffs GET /v1/videos/models against yesterday's ids and prints what is new or gone, so you test on day one.

The simplest alert for a new video model on Sume is a daily diff of the ids returned by GET /v1/videos/models. Save the sorted id list, run the script on a schedule, and print any id that is new or missing. A new id means your key can call a new model; no id means it cannot yet, whatever a launch page says.
This is timely because Kling 4.0 is in early access since 2026-09-28 with a full launch due in October 2026, per Kling's announcement (read 2026-10-02). That page does not say when any third-party API will list it, so the catalog is the signal to watch. Catalog behavior is from Sume's video docs.
What does the script do?
It requests the catalog, compares the id set with a JSON file from the last run, prints additions and removals, then overwrites the file. The first run reports every id as new, which is fine: it creates the baseline.
import json
import os
from pathlib import Path
import requests
STATE = Path("video-model-ids.json")
r = requests.get(
"https://api.sume.com/v1/videos/models",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
timeout=30,
)
r.raise_for_status()
now = {m["id"] for m in r.json()["data"]}
before = set(json.loads(STATE.read_text())) if STATE.exists() else set()
for model_id in sorted(now - before):
print("NEW", model_id)
for model_id in sorted(before - now):
print("GONE", model_id)
STATE.write_text(json.dumps(sorted(now)))What should happen when a new id shows up?
Do not switch production on a new id alone. Read the new entry's supported_durations, supported_resolutions and pricing_skus, run one short test clip with your own prompt, and compare the cost to the model you use today. Sume bills provider list times 1.25, reserved on submit.
| Field | Why it matters |
|---|---|
supported_durations | Whether your shot lengths are allowed |
supported_resolutions | Whether your delivery size is available |
supported_aspect_ratios | Whether vertical or ultra-wide works |
pricing_skus | What a clip will cost |
Where should I run it?
Any scheduler works: cron, a CI job or a serverless timer. Keep the state file in the same place between runs, and send the output to a channel your team reads. A GONE line matters as much as a NEW one, because a removed id will fail requests that still name it.
Sources
Related posts
More in Developers
- next_poll_after_seconds is null on a finished job: fix the poll loop
Sume sets next_poll_after_seconds to null once a job is terminal, so sleep(null) crashes naive loops. Stop on terminal, then read result_ready.
- NEXT_PUBLIC_ plus a Sume API key: why it ships to the browser
A NEXT_PUBLIC_ prefix inlines the value into client JavaScript at build time. Keep the Sume API key server-side, proxy via a route handler, rotate if it leaked.
- Poll a Sume job with AbortSignal.any in Node 26.10
Node 26.10.0 fixes AbortSignal.any() propagation. Here is a Sume job poll loop with a hard deadline and a caller cancel, using next_poll_after_seconds.
- Node fetch with AbortSignal.timeout: poll a Sume job
A Node recipe: submit a Sume job with fetch, bound each call with AbortSignal.timeout, poll status_url, read the result. A local timeout does not cancel it.
Written by Sume