New: AI voiceover + auto-captions - script to captioned video in one API call. Read the announcement

Auto-Captions

Captions with real word timings

Point Renderly at any audio or video URL and get back captions where every word carries its own start and end time. Burn them in during the render, or take the timings and do your own thing with them.

Two renders of the same clip, from the same source video. Only the one you are watching is downloaded.

Word-synced, not line-synced

Most captioning returns blocks of text with a start and end time for the block. That is enough to put a line on screen, and not enough to highlight the word being spoken.

Renderly returns both representations of the same result. The captions array holds caption pages of a few words each, and every word inside carries its own startMs, endMs and confidence. Word-by-word highlighting works with no extra timing work.

Alongside it, captionOverlay comes back as a ready-to-paste caption overlay you can drop straight into a composition.

One word, from the captions array
{
  "text": "coastal",
  "startMs": 2140,
  "endMs": 2530,
  "confidence": 0.99
}

Frame timings default to 30 fps; pass fps to change it.

You pay for the clip, not the file

Highlight clips come out of long recordings. A three-hour podcast yields a nine-second moment worth posting, and transcribing the whole recording to caption nine seconds of it is the kind of waste that quietly decides whether a pipeline is affordable.

Pass startTime and endTime in seconds and only that window is transcribed. Word timings come back clip-relative, so zero is the start of your clip and the result drops onto a caption overlay already aligned.

Nine seconds costs 0.25 credits even if the file is an hour long. When the source is a trimmed clip in a composition, the window is inferred for you and timings auto-align, including speed changes.

POST /api/v1/ai/captions
{
  "sourceUrl": "https://your-bucket.s3.amazonaws.com/full-podcast.mp4",
  "startTime": 76,
  "endTime": 85
}

Transcribes and bills seconds 76 to 85 only.

0.25
credits per started minute
5 GB
maximum file size
3 hrs
maximum audio length

Two ways in

Inside a render

Give the template a caption overlay marked isDynamic, then name the overlay you want transcribed. The captions are generated, placed and burned in as part of the same call. Point source at a narration overlay filled by AI voiceover in the same request and the captions cannot drift from the audio.

Declarative
{
  "projectId": "your_project_id",
  "replacements": {
    "subtitles": {
      "transcribe": { "source": "clip" }
    }
  }
}

As a standalone call

POST /api/v1/ai/captions takes a URL and returns the captions and a ready-made overlay without rendering anything. Useful when you want the timings for something else - a transcript, a search index, chapter markers - or when you want to inspect the result before committing to a render.

Standalone
{
  "sourceUrl": "https://your-bucket.s3.amazonaws.com/full-podcast.mp4",
  "startTime": 76,
  "endTime": 85
}

Omit startTime and endTime to transcribe the whole file.

Auto-caption questions

How much do auto-captions cost?
0.25 credits per started minute of audio, drawn from the same credit balance as rendering. Credits are deducted when the operation runs and refunded automatically if it fails.
Do I pay for the whole file or just the part I use?
Just the part you use. Pass startTime and endTime and only that window is transcribed and billed. A 9-second highlight from a 3-hour podcast costs 0.25 credits, not the cost of the full recording.
What makes captions word-synced rather than line-synced?
Every word carries its own startMs, endMs and confidence, not just the caption page it belongs to. That is what makes word-by-word highlighting work without any extra timing work on your side.
What are the file limits?
Files up to 5 GB and audio up to 3 hours. The source URL must be publicly reachable, and uploaded Renderly assets qualify. Most files finish inside the request; very long media returns status PROCESSING, which you poll via GET /ai/jobs/{jobId}.
Can I caption narration generated in the same request?
Yes. Set a caption variable's transcribe.source to the name of a sound overlay filled by a tts value in the same render. The captions are transcribed from the audio that call generated, so they cannot drift from it.
What happens if I retry the same file?
Retrying the same sourceUrl while a job is still in flight resumes that job rather than charging again. Every operation is logged as an AI job you can inspect.

Caption your first clip today

Start free - no credit card required.