How to add subtitles to Bunny Stream videos

Upload a VTT or SRT file with the Stream API, use Bunny's automatic captions, or make reviewed subtitles in many languages first.

Facts checked on 2026.10.13. Sources

The ways to add subtitles in Bunny Stream

Bunny Stream takes caption files in two formats: .vtt and .srt. A video can have one caption track for each language. There are three ways to get a track onto a video.

WayYou provideCostWhere
Upload a fileA VTT or SRT file that you madeNo caption fee on the pricing page. Captions use storage.The Stream API
Automatic captionsNothing. Bunny transcribes the speech.$0.10 per language-minuteLibrary settings, or the API
Automatic translationNothing. Bunny translates the captions.$0.10 per language-minute, for each language you selectLibrary settings, or the API

Where captions are in the dashboard

On 2026.10.13, the dashboard path to your library was Delivery › Stream, then your library. The dashboard page of the Bunny docs lists a Transcribing and accessibility area in the library. It covers automatic captions and translation.

The docs that we checked do not list a dashboard step to upload a caption file by hand. They list the API for that. Open a video in your library and look for a captions option. If you do not see one, use the API steps below.

Upload a VTT or SRT file with the API

The Add Caption endpoint sends one caption file for one language to one video. The file goes in the JSON body as Base64 text.

  1. Open your library in Stream and click API. Copy the library ID and the Stream API key. Every library has its own key.
  2. Find the video's GUID. The Stream API uses it as the video ID.
  3. Save the captions as UTF-8 text in a .vtt or .srt file. Check the file with the SRT validator first.
  4. Convert the file to Base64 text with no line breaks.
  5. Send a POST request to https://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}. Put the language code in the path, for example es. Send your API key in the AccessKey header.
  6. Put label and captionsFile in the JSON body. The label is the name for the track. The captionsFile field holds the Base64 text.
  7. Read the answer. Status 200 means Bunny stored the track. Status 400 means the upload failed. The answer then has an errorList and a warningList that tell you what is wrong with the file.
add-caption.sh
LIBRARY_ID=123456VIDEO_ID=00000000-0000-0000-0000-000000000000CAPTIONS=$(base64 < captions-es.vtt | tr -d '\n')curl --request POST \  --url "https://video.bunnycdn.com/library/$LIBRARY_ID/videos/$VIDEO_ID/captions/es" \  --header "AccessKey: $BUNNY_STREAM_API_KEY" \  --header "Content-Type: application/json" \  --data "{\"label\":\"Español\",\"captionsFile\":\"$CAPTIONS\"}"
Placeholders: replace the library ID, the video GUID, and the key with your own.
  • The language comes from the srclang part of the path. The srclang field in the body is deprecated, and Bunny ignores it.
  • Send the call again for each language. Each language has its own path.
  • To remove a track, send a DELETE request to the same path.

Not sure which file to send? Read Subtitle formats explained. To change an SRT file to VTT, use the free tool below.

Bunny's automatic captions and translation

Bunny calls this feature Transcribing. It is built on Whisper, a speech recognition model. It makes a caption track from the speech in the video. It can also translate that track. The docs list 56 languages for both, with two-letter codes such as en, es, and ja.

Turn it on for a library

  1. Go to Delivery › Stream and open your library.
  2. Open the transcribing settings in the Transcribing and accessibility area.
  3. Turn on transcribing and choose the languages.
  4. Upload videos. Bunny makes captions for each new video. Videos that you uploaded before you turned it on get nothing.

Run it for one video

Send a POST request to the video's /transcribe path in the Stream API. The body can set the source language and a list of target languages. This request overrides the library setting, and you pay for it even when the library setting is off. Add force=true to run it again on a video that Bunny already transcribed. Bunny bills the run again.

The Bunny docs also describe a dashboard route through the Smart Chapters tool: open the video, open the Chapters tab, and choose Generate Smart Chapters. If the video has no caption track, Bunny runs Transcribe to make one.

Price

Bunny charges $0.10 for each language and each minute of video. A 60-minute video in English and Spanish costs 60 × 2 × $0.10, which is $12. Bunny's pricing docs list no free allowance for transcribing. Bunny bills by use, with a $1 monthly minimum.

Check the language first

Bunny finds the spoken language from the first 30 seconds of audio. If that part has music or silence, the guess can be wrong. In that case, set the language yourself when you start the run.

When Bunny's captions are enough

For one language, with clear speech and a video that is not for a client, the automatic track is a good start and costs little. Watch the video once with captions on. Fix what is wrong before you publish. Bunny's docs describe no editor for the text, so a fix means a new file (see the limits below).

Many languages and the player menu

One video holds one track for each language code. Add a track for each language that you need. The Bunny player has a captions control for the tracks, and a separate menu for audio tracks.

  • A viewer can pick a track in the player. The C key turns captions on and off.
  • The player saves the viewer's choice in the browser. A viewer who picks Spanish once gets Spanish on the next visit.
  • The docs for the player do not describe the layout of the captions menu. Test it in your own embed.
  • Automatic tracks use the language code with -auto added, for example en-auto. The docs do not say how Bunny names translated tracks.

Bunny Stream also supports several audio tracks in one video. That is a different feature. It is for dubbing, not for subtitles.

Limits, editing, and accessibility

QuestionAnswer on 2026.10.13
File formatsVTT and SRT.
Size or track limitsThe docs give none for caption files. Video can last 72 hours at most.
PlansThe docs list no plan tiers and no plan gate on captions or the API. Bunny bills by use.
Edit after uploadThe docs describe no caption editor. Send a new file for the same language to replace the track. Delete a track with the API.
Default trackSet it per embed with the captions parameter, or for the whole library in the Player tab of the library settings.
Closed captions or SDHThe docs say nothing about SDH or a caption type. The label is free text. Put a clear name in it, for example English (SDH).

The Add Caption answer has a valid flag and lists errors and warnings. It is not a quality check. For line length and reading speed, use the subtitle QC checklist.

Where the built-in ways stop

The built-in ways work well for one language, or for a quick draft. They stop short in these cases:

  • Review. The docs describe no way to assign a translator, comment on a line, or approve a track before it goes live.
  • Fixes. The docs describe no text or timing editor. You fix the file elsewhere and send it again.
  • Quality in other languages. The docs give no accuracy figure for the captions or the translation. A client who pays for subtitles may want a human to check each language.
  • Cost across languages. Each extra language adds $0.10 per minute, again for every video.
  • Many videos. Each upload is one API call for each language and video. You need a script to do it at scale.

Add subtitles with CaptionsHero, then upload to Bunny Stream

CaptionsHero is a subtitle workflow tool for teams. It has no Bunny Stream integration. You make and approve the subtitles in CaptionsHero, download a file, and upload it to Bunny Stream with the API steps above.

  1. Upload the video to CaptionsHero.
  2. Make the subtitles. Use the AI draft, import an SRT or VTT file, or write them in the editor. The editor has a waveform timeline and Netflix-style QC.
  3. Add the other languages. Use AI translation or a human translator. Each language is a separate track.
  4. On Team and Studio, assign an editor and a reviewer to each language. The reviewer comments on exact lines and asks for changes.
  5. Approve each track when the review is done.
  6. Download the approved version as VTT or SRT. Do this for each language.
  7. Upload each file to Bunny Stream with the Add Caption endpoint. Use the right language code in the path.

Later edits in CaptionsHero do not reach Bunny Stream. After a change, download the file again and send it with the same language code. Bunny replaces the old track.

Do you host video in other places too? See the guides for Vimeo, Wistia, and Mux. For Cloudflare Stream, which the Studio plan can publish to directly, see the Cloudflare Stream page.

What CaptionsHero needs and costs

NeedPlanPrice per month
AI draft, AI translation in 82 languages, editor, QC, SRT and VTT exportAll plansSolo is free. Solo Pro is $29.
An editor and a reviewer for each language, comments, approval, email noticesTeam, 8 seats$149
The same, with 20 seats and the REST APIStudio, 20 seats$399

The price is flat for each organization. There is no sales call. CaptionsHero imports and exports SRT and VTT only. Bunny Stream takes both, so no conversion is needed.

Common questions

Does Bunny Stream support subtitles?

Yes. A video can hold a caption track for each language, and the Bunny player shows them. Bunny's API calls every track a caption.

Can Bunny Stream add subtitles automatically?

Yes. The Transcribing feature listens to the audio and writes a caption track. It is billed by the language and the minute, and it needs to be on before you upload, or started later for one video.

How do I turn on captions by default in the Bunny player?

Add the captions parameter to the embed URL with a language code, for example ?captions=en. For auto-generated captions, use en-auto. You can also set a default for the whole library in the Player tab of its settings.

Can I edit captions after I upload them to Bunny Stream?

Bunny's docs describe no caption editor. Change the file in a subtitle editor and upload it again for the same language. Bunny replaces the track and raises its version number.

Can I upload an SRT file to Bunny Stream?

Yes. Bunny lists SRT and VTT as its caption formats. Both go through the same Add Caption call. Convert only if your player or another service asks for VTT.

What is the difference between subtitles and captions on Bunny Stream?

Bunny does not separate the two. It has one kind of track with a language code and a label. If you need SDH, which also describes sounds, write it in the file and say so in the label.

Need Bunny Stream subtitles that someone has reviewed?

Make the subtitles, assign a reviewer for each language, approve, and download VTT or SRT for Bunny.

Free forever plan. No card required. No sales call.

  • Every language gets a translator and a reviewer
  • Feedback on the exact line, not in an email thread
  • Only the approved version ships
  • See who's holding up which language
  • AI drafts in 82 languages, or bring your SRT
  • Private, in the browser, nothing to install

Sources