2026-10-28 · 6 min read
Captions for AI-Generated Video: Adding Word-Timed Captions to Generated Clips
AI video generators are very good at producing a clean clip: talking actors, product shots, b-roll that did not exist yesterday. The output is often a bare MP4 with no caption track. Feed players autoplay muted, so a generated clip with no captions gives a muted viewer nothing to follow.
If you are building a product on top of AI video, an ad generator, a faceless channel tool, a clipper that fills gaps with generated b-roll, captions are the last mile between a generated clip and a shippable video. Without them, a muted viewer has nothing to follow.
Generated clips are a convenient captioning workload
The work is uniform: short clips, one speaker or none, predictable formats, high volume. That is what an async job API is for. Your pipeline already hands you an MP4 or a URL. You POST it to caption.sh, poll the job, and download a new MP4 with word-timed, styled captions burned in.
# caption a generated clip right after your generator finishes
KEY=$CAPTION_API_KEY
resp=$(curl -s -X POST https://api.caption.sh/v1/videos \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"source_url":"https://cdn.example.com/generated-clip.mp4","options":{"font":"inter","size":"large","position":"bottom"}}')
job=$(echo "$resp" | jq -r .job_id)
if [ -z "$job" ] || [ "$job" = "null" ]; then echo "submit failed: $resp"; exit 1; fi
deadline=$((SECONDS + 600))
status=""
while [ $SECONDS -lt $deadline ]; do
resp=$(curl -s https://api.caption.sh/v1/jobs/$job -H "Authorization: Bearer $KEY")
status=$(echo "$resp" | jq -r .status)
[ "$status" = "done" ] && break
[ "$status" = "error" ] && { echo "job failed: $resp"; exit 1; }
sleep 5
done
[ "$status" = "done" ] || { echo "gave up waiting for job $job"; exit 1; }
curl -sL -H "Authorization: Bearer $KEY" \
https://api.caption.sh/v1/jobs/$job/result -o captioned.mp4A few details that matter for generated content. Jobs are independent, so several clips can render in parallel within the per-key throughput limits (a 429 means back off and retry). The API documents no webhook surface: you poll GET /v1/jobs/{id} until the status flips, with your own timeout, and the result endpoint redirects to a signed download URL; results are stored for 24 hours and then deleted. Because the captions are part of the pixels, no player or platform can drop or restyle them.
Style once, apply to every clip
- Set the caption style per job: font (luckiest-guy, inter, fredoka and more), colors, word-highlight animation, position and size. Every clip in a campaign comes out looking the same.
- Word-level timing keeps up with fast AI voiceover pacing: each word highlights as it is spoken.
- Pricing is $0.10 per minute, prepaid. Generated clips are usually under a minute, so per-clip captioning cost stays in cents.
If your product ships generated video, the fastest evaluation is to get an API key at caption.sh and run one of your own clips through first.