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.

5 min readSume
All posts

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.

Cost of 15 listing tours by number of languages at $0.20 per job (read 2026-10-05)
LanguagesJobsSume costPer tour
115$3.00$0.20
230$6.00$0.40
345$9.00$0.60
575$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 start and end in seconds.
  • Use a key like listing-0412-pt per 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

All Use cases posts

Written by Sume