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.
| Way | You provide | Cost | Where |
|---|---|---|---|
| Upload a file | A VTT or SRT file that you made | No caption fee on the pricing page. Captions use storage. | The Stream API |
| Automatic captions | Nothing. Bunny transcribes the speech. | $0.10 per language-minute | Library settings, or the API |
| Automatic translation | Nothing. Bunny translates the captions. | $0.10 per language-minute, for each language you select | Library 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.
- Open your library in
Streamand clickAPI. Copy the library ID and the Stream API key. Every library has its own key. - Find the video's GUID. The Stream API uses it as the video ID.
- Save the captions as UTF-8 text in a
.vttor.srtfile. Check the file with the SRT validator first. - Convert the file to Base64 text with no line breaks.
- Send a
POSTrequest tohttps://video.bunnycdn.com/library/{libraryId}/videos/{videoId}/captions/{srclang}. Put the language code in the path, for examplees. Send your API key in theAccessKeyheader. - Put
labelandcaptionsFilein the JSON body. The label is the name for the track. ThecaptionsFilefield holds the Base64 text. - Read the answer. Status 200 means Bunny stored the track. Status 400 means the upload failed. The answer then has an
errorListand awarningListthat tell you what is wrong with the file.
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\"}"
- The language comes from the
srclangpart of the path. Thesrclangfield 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
DELETErequest 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
- Go to
Delivery › Streamand open your library. - Open the transcribing settings in the
Transcribing and accessibilityarea. - Turn on transcribing and choose the languages.
- 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
-autoadded, for exampleen-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
| Question | Answer on 2026.10.13 |
|---|---|
| File formats | VTT and SRT. |
| Size or track limits | The docs give none for caption files. Video can last 72 hours at most. |
| Plans | The docs list no plan tiers and no plan gate on captions or the API. Bunny bills by use. |
| Edit after upload | The docs describe no caption editor. Send a new file for the same language to replace the track. Delete a track with the API. |
| Default track | Set it per embed with the captions parameter, or for the whole library in the Player tab of the library settings. |
| Closed captions or SDH | The 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.
- Upload the video to CaptionsHero.
- 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.
- Add the other languages. Use AI translation or a human translator. Each language is a separate track.
- On Team and Studio, assign an editor and a reviewer to each language. The reviewer comments on exact lines and asks for changes.
- Approve each track when the review is done.
- Download the approved version as VTT or SRT. Do this for each language.
- 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
| Need | Plan | Price per month |
|---|---|---|
| AI draft, AI translation in 82 languages, editor, QC, SRT and VTT export | All plans | Solo is free. Solo Pro is $29. |
| An editor and a reviewer for each language, comments, approval, email notices | Team, 8 seats | $149 |
| The same, with 20 seats and the REST API | Studio, 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.