15 listing tours in five languages: 75 caption jobs, $15.00
Burning translated room labels on 15 listing tour videos in Spanish, Portuguese, French, German and Italian is 75 Sume caption jobs at $0.20 each, $15.00.

A brokerage with 15 listing tour videos that wants captions in Spanish, Portuguese, French, German and Italian runs 75 caption jobs, which is $15.00 at Sume's $0.20 a job. Index-Translate does the text for free on its public API, and the five target languages all use Latin script, which the default caption style handles.
The scenario assumes 15 tours of up to 60 seconds, each with one caption job per language that carries the room label and price line as authored cues. Prices are from the Video captions docs and pricing page; the free API is from the Index-Translate README, read 2026-10-05.
The bill by language
Every language adds one job per tour, so five languages cost five times one.
| Languages | Jobs | Sume cost | Per tour |
|---|---|---|---|
| 1 | 15 | $3.00 | $0.20 |
| 2 | 30 | $6.00 | $0.40 |
| 3 | 45 | $9.00 | $0.60 |
| 5 | 75 | $15.00 | $1.00 |
What to translate and what to leave alone
Translate room labels such as Kitchen and Primary bedroom. Do not translate the price, the address or the agent name; send them through unchanged inside the cue so the translator never sees them.
- Pass the label to Index-Translate and join it with the numeric price line afterwards.
- Use one cue per room, each with its own
startandendin seconds. - Use a key like
listing-0412-ptper tour and language so retries are safe.
Run it for one tour
This translates two room labels into one language, joins the price line and submits a single caption job.
import os, time, requests
API = "https://api.sume.com"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
def translate(text, lang):
p = f"Translate the following English text into {lang}, output only the translation without explanation.\n\n{text}"
r = requests.post("https://index-translate.bilibili.com/v1/chat/completions", timeout=120,
json={"model": "Index-Translate-35B-A3B", "temperature": 0,
"messages": [{"role": "user", "content": p}]})
r.raise_for_status()
return r.json()["choices"][0]["message"]["content"].strip()
ROOMS = [("Kitchen", 0, 4), ("Primary bedroom", 4, 8)]
PRICE = "$489,000"
lang, code, url = "Portuguese", "pt", "https://cdn.example.com/tour-0412.mp4"
cues = [{"text": f"{translate(name, lang)} | {PRICE}", "start": a, "end": b} for name, a, b in ROOMS]
r = requests.post(f"{API}/v1/video-captions", timeout=60,
json={"video_url": url, "style": "slam", "cues": cues},
headers={**H, "Idempotency-Key": f"listing-0412-{code}"})
r.raise_for_status()
print(r.json()["data"]["status_url"])
Where it stops
The same list of five languages in a script other than Latin or Hangul needs a test first; see the post on which scripts Sume captions are documented for. Housing advertising rules also vary by market, so have a person check the translated copy for claims before publishing.
Sources
Related posts
More in Use cases
- Add one real shot: how a filmed clip changes an AI Short
One filmed shot of your own among generated clips gives an AI Short a part nobody else has. What YouTube's pages say, the label question, and a Timeline build.
- Find each script line in a recorded read: match STT words to script
Transcribe a studio read with Sume STT, then match its words to your script lines to get start and end seconds per line for cutting takes. Python.
- Fit a voiceover to a 30-second ad: measure pace, then set TTS speed
Send timestamps.words, read the last word end time, and rescale generation_config.speed (0.6 to 1.5) until a Sume TTS take fits its slot. Two takes, 2 cents.
- Five product photos to one 15-second ad: five clips and a Timeline
Animate five angles of one product with Wan 3.0 at $0.625 each, cut 3 s from each in a $0.10 Timeline render, add $0.20 captions: $3.43 for a 15 s vertical ad.
Written by Sume