How to add subtitles to Mux videos

Attach an SRT or VTT file with the Mux API, let Mux make captions, or add more languages. Checked against the Mux docs.

Facts checked on 2026.10.13. Sources

Add your own subtitle file

Mux takes SRT and WebVTT files. It turns each file into a text track on the asset. Mux serves the track as WebVTT in the HLS stream. If you are not sure which format to make, read subtitle formats explained.

You add a track with the Mux API. A track needs a URL: Mux downloads the file from that URL. It does not take a file upload.

Steps

  1. Put the subtitle file where Mux can download it. Use your own storage or a file host, and copy the link. The Mux docs do not state an access rule for this link. The Mux Contentful guide says custom captions can come from any publicly available URL. If you use a signed link, make it last long enough for Mux to download the file.
  2. Wait until the asset is ready. You can only add a track to a ready asset.
  3. Send POST https://api.mux.com/video/v1/assets/{ASSET_ID}/tracks. Use your Mux access token ID and secret for Basic authentication.
  4. Set type to text and text_type to subtitles. Both fields are required for a subtitle track.
  5. Set language_code to a BCP 47 code, such as en or pt-BR. Set name to the label the viewer sees, or leave it out and Mux uses the language code. The name must be different for each text track.
  6. If the file has captions for deaf and hard-of-hearing viewers, with sound cues such as [crowd cheers], set closed_captions to true.
  7. Mux answers with status 201 and a track in the preparing state. The track works in the player when Mux finishes.
create-text-track.json
{  "url": "https://example.com/subtitles/launch-video.fr.vtt",  "type": "text",  "text_type": "subtitles",  "language_code": "fr",  "name": "Français",  "closed_captions": false}
The body of the request. Replace the URL with the link to your file.

Add tracks when you create the asset

You can also send tracks in the same request that creates the asset. Put the video first in the inputs array. Add one entry for each text track after it. Mux says there is no limit on the number of tracks in this request.

create-asset.json
{  "inputs": [    { "url": "https://example.com/video/launch-video.mp4" },    {      "url": "https://example.com/subtitles/launch-video.en.vtt",      "type": "text",      "text_type": "subtitles",      "language_code": "en",      "name": "English"    },    {      "url": "https://example.com/subtitles/launch-video.fr.vtt",      "type": "text",      "text_type": "subtitles",      "language_code": "fr",      "name": "Français"    }  ],  "playback_policies": ["public"]}
The video is the first input. Each subtitle file is one more input.

Show a language by default

Add default_subtitles_lang to the HLS playback URL, with a BCP 47 code: https://stream.mux.com/{PLAYBACK_ID}.m3u8?default_subtitles_lang=en. If no track matches exactly, Mux picks the closest track in the same language: en picks en-US. Players show the default track even when a video autoplays with no sound. For a signed playback URL, put the parameter in the token.

In the Mux dashboard

On 2026.10.13, the Mux docs described no dashboard screen for adding a subtitle file to an asset. So this guide gives no dashboard menu path. Open an asset in your Mux dashboard and look for a text track option. If you do not find one, use the API steps above.

Two Mux integrations have their own caption screens. The Mux WordPress plugin takes custom caption files when you create the asset or later. Its Add Captions button in the Asset List makes auto-generated captions. In the Mux app for Contentful, use the Captions tab. The Contentful app takes a link to a VTT or SRT file.

Mux also runs its Robots caption workflows from the dashboard. They are in the Robots section below.

Mux auto-generated captions

Mux makes captions from the audio of a video. It does this for on-demand video and for live streams. Mux names the speech model as OpenAI Whisper. There is no extra charge on on-demand video: the cost is part of the normal Mux Video encoding and storage fees.

Add a generated_subtitles array to the first entry of inputs. This works in a create asset request and in a direct upload (inside new_asset_settings). For an asset that exists, use POST /video/v1/assets/{ASSET_ID}/tracks/{AUDIO_TRACK_ID}/generate-subtitles.

create-asset-with-captions.json
{  "inputs": [    {      "url": "https://example.com/video/launch-video.mp4",      "generated_subtitles": [        { "language_code": "es", "name": "Español (auto)" }      ]    }  ],  "playback_policies": ["public"],  "video_quality": "basic"}
Mux makes a Spanish caption track from the audio of the video.
QuestionAnswer
Languages (stable)English, Spanish, Italian, Portuguese, German, French, and automatic detection (auto)
Languages (beta)Polish, Russian, Dutch, Catalan, Turkish, Swedish, Ukrainian, Norwegian, Finnish, Slovak, Greek, Czech, Croatian, Danish, Romanian, Bulgarian. Mux says accuracy may be lower.
Live streamsEnglish, Spanish, Italian, Portuguese, German, French
TimeAbout one tenth of the video length: six minutes for a one-hour video. Playback does not wait for it.
Ready signalThe video.asset.track.ready webhook, for a track with text_source set to generated_vod
Best audioClear speech. Music, noise, and long silences give worse results. Mux does not recommend mixed-language audio.

When the Mux captions are enough

Mux captions can be all you need. This is true when you need one language, the language is on the stable list, the audio is clear, and nobody has to approve the text before viewers see it. You pay nothing extra, and you write no subtitle file. Read the captions once before you publish: speech recognition makes errors with names, terms, and accents.

Many languages and translation

One Mux asset can have many text tracks. Each track has its own language code and name. Mux says there is no limit on the number of tracks in a create asset request, and we found no other limit. Mux players read the tracks from the HLS stream and show the languages the video has. The viewer picks a language there.

Translation with Mux Robots

The auto-generated captions are not translations: the language of the captions must match the spoken language. Mux has a separate Robots workflow, Translate captions. It takes an existing caption track and makes a track in another language. The Mux docs call Robots a beta product.

  1. Get a source caption track on the asset. It can be a Mux auto-generated track or a file you added.
  2. Send POST https://api.mux.com/robots/v0/jobs/translate-captions.
  3. In parameters, set asset_id, track_id, and to_language_code. Send one job for each target language.
  4. Wait for the robots.job.translate_captions.completed webhook. By default, Mux adds the new track to the asset.

On 2026.10.13, Mux listed starting rates of $0.001 per job and $0.005 per minute of video for this workflow. Every plan gets the first 100,000 Robots units each month free. One thousand units cost $0.01. Check the Mux pricing page before you plan a large library: Mux can change the rates.

Mux also lists Robots workflows named Generate premium captions and Edit captions. The first makes captions with optional speaker labels and word-level times. Mux marks the first one experimental. The second applies fixed text replacements and a profanity filter to a track.

Limits, editing, and plans

TopicWhat Mux documents
File formatsSRT and WebVTT for text tracks
Number of tracksMux says there is no limit in a create asset request
File sizeNo limit found for a text track file
Track nameMust be different for each text track on the asset
PlansNo plan limit found for text tracks. Auto-generated captions on on-demand video are included in Mux Video fees. Contract customers who want captions on assets older than 7 days must ask Mux support.
EditorNone found. You replace a track, you do not edit it in Mux.

Edit a track after upload

  1. Download the track as a VTT file: https://stream.mux.com/{PLAYBACK_ID}/text/{TRACK_ID}.vtt. A signed asset needs a token.
  2. Edit the file in a text editor or a subtitle editor.
  3. Delete the old track with the Mux delete track API.
  4. Add the edited file as a new track, as in the first section.

Check the file before you add it. The free SRT validator finds timing errors and overlaps, and the subtitle QC checklist lists the limits that viewers notice.

Where the built-in ways stop

  • Quality in many languages. The Mux speech recognition and the Mux Robots translation are machine output. Nobody checks the words before viewers see them, and the beta languages may be less accurate.
  • Review. Mux has no place to assign a translator or a reviewer, to comment on a line, or to approve a track.
  • Editing. Mux has no subtitle editor. To fix one line, you download, edit, delete, and add the track again.
  • Timing. A tool that shows the audio waveform and checks reading speed is faster than a text editor for timing fixes.

If none of these apply, use the Mux options above.

Add subtitles to Mux with CaptionsHero

CaptionsHero has no Mux integration. It makes and checks the subtitle files. You then add them to Mux with the API steps above.

  1. Upload the video to CaptionsHero.
  2. Make the subtitles. Use an AI draft, import an SRT or VTT file, or write them in the editor.
  3. Add other languages. Use AI translation, or give each language to a translator.
  4. Assign an editor and a reviewer for each language, then review with comments on exact lines (Team and Studio plans).
  5. Approve each track (Team and Studio plans).
  6. Download VTT or SRT for each language. Mux takes both. Use the approved version.
  7. Put each file at a link Mux can download.
  8. Add each file to the Mux asset with a create asset track request, as described in the first section. Set the language code and name for each file.

Studio plans have a REST API that downloads a track as SRT or VTT: GET /api/v1/tracks/{trackId}/captions.vtt. It returns the latest saved lines of the track, not the approved copy. You can use it in a script that sends the files to your storage and then to Mux.

Details

  • All plans: AI transcription, AI translation in 82 languages, SRT and VTT import and export, and the editor with a waveform timeline and Netflix-style checks.
  • Team and Studio: assignments, review comments, change requests, approval, and email notifications.
  • Prices: Solo is free, Solo Pro is $29, Team is $149, and Studio is $399 for each month.

Other platform guides: Vimeo, Wistia, Bunny Stream, and Cloudflare Stream.

Common questions

Can I upload an SRT file to Mux?

Yes. Mux accepts SRT and WebVTT. You do not send the file itself: you send a link to it. Mux downloads the file and saves it as a text track.

Does Mux add captions automatically?

Yes, if you ask. Add generated_subtitles when you create the asset, or call the generate-subtitles endpoint for an asset that exists. Mux does not make them unless you do one of these.

How do I turn on subtitles by default in a Mux player?

Add default_subtitles_lang=en, or another language code, to the stream URL. Players show the default track at once, even when a video starts with no sound.

Can Mux translate my subtitles?

Yes, with the Mux Robots Translate captions workflow, which is in beta. The generated_subtitles feature cannot do it. It only writes the language that people speak in the video.

Can I edit auto-generated captions in Mux?

Not in an editor. You can download the track, fix it, and replace it. Mux Robots also has an Edit captions workflow for fixed replacements, such as a spelling of a brand name.

How many subtitle languages can a Mux video have?

Mux says there is no limit in a create asset request, and we found no other limit in the docs. Each text track needs its own name.

Need reviewed subtitles in many languages?

Make, review, and approve every language in CaptionsHero. Then download VTT or SRT and add the files to Mux.

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