Budget a week of Shorts before rendering: Timeline plan sum
Sume's unbilled Timeline plan returns billable minutes and an estimated cost. A Python script sums seven plans so you know the week's render cost first.

Varied Shorts mean different lengths, and different lengths mean different bills. Sume's Timeline docs, read on October 5, 2026, price Timeline 1.0 at $0.10 per output minute, rounded up per job: the reserve is ceil(audio.duration_seconds / 60) minutes. A 61-second Short is two minutes. A 59-second Short is one.
The plan endpoint is unbilled
POST /v1/timeline-1.0/plan runs schema and Sume-host URL checks and the pure compiler. It returns object timeline_plan with duration_seconds, segment_count, billable_minutes and estimated_cost_usd_micros. It creates no job, reserves no credits and downloads no media. The docs add that a plan cannot predict short-source pad or loop warnings, so treat the figure as the estimate it is.
The Timeline documents must reference files already imported into your workspace on media.sume.com, because the plan checks that every URL is Sume-hosted.
Sum a week of plans
Put one Timeline document per Short in a folder, then run this. It prints each Short's minutes and the total in dollars. Set SUME_API_BASE and SUME_API_KEY first.
import glob, json, os
import requests
BASE = os.environ["SUME_API_BASE"].rstrip("/")
HEAD = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
total = 0
for path in sorted(glob.glob("shorts/*.json")):
with open(path) as f:
doc = json.load(f)
r = requests.post(f"{BASE}/v1/timeline-1.0/plan", json=doc, headers=HEAD, timeout=30)
r.raise_for_status()
body = r.json()
plan = body.get("data", body)
micros = plan["estimated_cost_usd_micros"]
total += micros
print(path, plan["duration_seconds"], "s", plan["billable_minutes"], "min", micros / 1e6, "USD")
print("week total USD", total / 1e6)Why vary lengths on purpose
Seven Shorts of exactly 30 seconds is $0.70 of Timeline cost: seven jobs, one minute each. Mix in a 15-second teaser, a 45-second explainer and a 100-second story and the figure changes by a few cents, which is nothing next to the effect on how repetitive your channel looks.
YouTube's monetization page, read the same day, targets mass-produced content from generic templates, and equal length, equal cuts and equal pacing are what a template looks like from the outside. The plan summary also reports segment_count, so you can check that cut counts differ too.
Because the plan is free, run it on every draft and keep the output with the Short. It is a cheap record of what you intended to ship.
Reading the output
If a Short plans at two billable minutes when you wanted one, the spine is a few seconds too long. Trim the narration by a sentence and plan again, since planning is free. That small edit often improves the Short anyway, because the last sentence of a long Short is usually the weakest.
The plan also cannot see media warnings such as padded short sources. Treat the estimate as a ceiling for Timeline cost and confirm the live rate in GET /v1/catalog, as the docs advise.
Sources
Related posts
More in Developers
- Bulgarian, Croatian, Slovak text to speech API: one request each
Cartesia's Sonic 3.6 list includes bg, hr and sk. Run three scripts through Sume TTS 1.0 with a language map. Three 2,000-character jobs quote 30 cents.
- Bulk ad queue says completed: read counts.failed before you ship
A Sume bulk queue is completed when every item is terminal, not when every ad worked. A Python poller that backs off, then lists failed and canceled items.
- Bulk queue replay returns 202 and the old queue: derive the key
A repeated Idempotency-Key on a Sume bulk create returns 202 and the old queue, not 200. Derive the key from the batch: safe retries, deliberate reruns.
- Bulk run 400 with details.index: validate your ad variants first
One bad item makes the whole Sume bulk create return 400 and starts nothing. A Python pre-check for concurrency 1 to 16, 1 to 100 items, and the four item keys.
Written by Sume