2026-10-31 · 5 min read
A Caption API for Real Estate Video Tours: Captions That Sell the Listing on Mute
A walkthrough video earns attention in exactly the places sound is off: property portals, social feeds, and message threads between buyers. When the narration carries the address, the price, and the one detail that makes the listing special, a muted viewer misses all three. Burned-in captions put that information on the screen where it cannot be skipped.
Agencies and media teams handling many listings hit the same wall: captioning each tour by hand does not scale past a handful of properties a week. caption.sh is built for that volume. POST each tour video, receive a captioned MP4 back, and keep a consistent style across the whole portfolio without opening an editor.
Captioning a tour programmatically
import time, requests, sys
KEY = "YOUR_CAPTION_API_KEY"
HEADERS = {"Authorization": f"Bearer {KEY}"}
def caption_tour(video_url: str) -> str:
r = requests.post(
"https://api.caption.sh/v1/videos",
headers=HEADERS,
json={"source_url": video_url, "options": {"font": "inter"}},
timeout=30,
)
job_id = r.json().get("job_id")
if not job_id:
sys.exit(f"submit failed: {r.status_code} {r.text}")
deadline = time.time() + 15 * 60
while time.time() < deadline:
job = requests.get(
f"https://api.caption.sh/v1/jobs/{job_id}",
headers=HEADERS, timeout=30,
).json()
if job.get("status") == "done":
r = requests.get(
f"https://api.caption.sh/v1/jobs/{job_id}/result",
headers=HEADERS, allow_redirects=False, timeout=30,
)
return r.headers["Location"]
if job.get("status") == "error":
sys.exit(f"caption job failed: {job}")
time.sleep(5)
sys.exit("timed out waiting for caption job")Results are stored for 24 hours and then deleted, which is plenty when the captioned file is downloaded straight into your listing pipeline. Submissions are limited per API key, so a loop over a batch of tours should be ready to wait and retry when it sees a 429 rather than treating it as a failure.
Why captions fit property video
- Portals and feeds autoplay muted, so the captioned version is the only version most viewers experience.
- Speech in tours is information-dense: room names, dimensions, upgrades. Word-timed captions keep that detail visible instead of lost.
- One style across every listing reads as a brand. Set the font once and each office's tours come out looking like one company, not a folder of one-offs.
At $0.10 per minute, captioning a two-minute tour costs twenty cents, less than the photography, the staging, and everything else the listing already paid for. Get an API key at caption.sh and run one current listing through it to see the difference on mute.