Black Friday price variants: one clip, twelve caption jobs, $2.40
Test twelve Black Friday price points on one video: submit twelve video-captions jobs with different cues at $0.20 each and a unique idempotency key per price.

Twelve price-point versions of one Black Friday video cost $2.40 in caption jobs. Generate or edit the clip once, then submit twelve POST /v1/video-captions jobs that differ only in cues, because each accepted caption job is $0.20. Black Friday is 27 November 2026, so a test run in early November still leaves time to pick a winner.
The arithmetic
| Item | Rate | Count | Total |
|---|---|---|---|
| Base clip | your own, or a model clip | 1 | varies |
| Caption job with cues | $0.20 per accepted job | 12 | $2.40 |
| Extra round of 12 | $0.20 per accepted job | 12 | $2.40 |
| Failed or refused submit | not charged if not accepted | - | $0.00 |
Why not one render with twelve overlays
A caption job burns the cues you send onto one video and returns one video. There is no way to ask it for twelve outputs in a single call, so you submit twelve. That is also what you want for a test: each job is independent, has its own job id and can be judged on its own. Keep every cue phrase-level and short, since a price card is two or three words.
Submit them
Use one idempotency key per business intent: the clip plus the price. A retry then returns the same job instead of billing a second time. This loop submits four of the twelve; extend the tuple. Pace real batches against your generation limits.
import json, os, urllib.request
URL = "https://api.sume.com/v1/video-captions"
CLIP = "https://example.com/offer.mp4"
def submit(price):
body = {"video_url": CLIP, "style": "slam", "cues": [
{"text": "BLACK FRIDAY", "start": 0.5, "end": 3.0},
{"text": f"${price}", "start": 3.2, "end": 7.0}]}
req = urllib.request.Request(
URL, json.dumps(body).encode(),
{"Authorization": "Bearer " + os.environ["SUME_API_KEY"],
"Content-Type": "application/json",
"Idempotency-Key": f"bf-offer-price-{price}"})
with urllib.request.urlopen(req) as r:
return json.load(r)
def main():
for price in (19, 29, 39, 49):
out = submit(price)
print(price, out["data"]["request_id"])
main()Read results, not hunches
Post each variant to a comparable audience and compare on the platform's own numbers. Sume does not measure ad performance, so the test design and the sample size are yours. Check offers against what you actually charge; a price shown in a video is a claim, and consumer-protection rules about sale prices differ by country.
Limits
Each submit reserves its $0.20 up front, so a late submit can be refused with 402 insufficient_credits if the balance runs short, and a burst can hit 429 queue_full or 429 rate_limited; see the admission notes. A restyle with source_caption_id reuses the word timings but is still a render, billed the same. Requests refused before a job is accepted never reach billing.
Sources
Related posts
More in Pricing
- Subtitles in three languages: three caption jobs at $0.20 each
Each Sume standalone caption job costs $0.20 for video up to 60 seconds, and burns one set of cues. Three languages means three jobs, $0.60 in all.
- Cheapest speech-to-text API per hour, October 2026
Per-hour STT cost from xAI, OpenAI and Google pages against Sume's $0.01 per minute, with a candid note on where Sume is the expensive option.
- Cheapest TTS API per 1,000 characters, October 2026
List prices per 1,000 characters from Mistral, xAI, Speechify, Artificial Analysis and Sume, converted from each vendor's own units, with the trade-offs.
- Cost of 1,000 six-second AI video clips by model
A batch of 1,000 six-second clips costs $75 on Grok Imagine Video 1.5 and $750 on Wan 3.0 at 720p. Full Sume table plus how to submit it without queue_full.
Written by Sume