Download YouTube Multi-Language Audio Tracks via API (2026)

How YouTube's dubbed and multi-language audio tracks work, how to list a video's languages, and how to download a specific language as MP3, M4A or MP4 with one API call, plus the yt-dlp commands if you want to do it yourself.

Vid Kraken · Updated October 19, 2026

More and more YouTube videos carry more than one audio track. A creator uploads the original in English, then adds Spanish, Hindi and Portuguese dubs, or YouTube generates them automatically. Viewers pick a language from the settings menu. For a translation model, a localization team or a multilingual media platform, that's a ready-made set of the same content in several languages.

Getting those tracks out programmatically is harder than it looks. The default download gives you only the original, the extra tracks often aren't where yt-dlp looks for audio, and nothing tells you which languages a video has until you ask.

Short version: call POST /info with includeAudioTracks: true to list a video's languages, then call POST /download with language set to the track you want (for example es or pt-BR). It works with every format: audio-mp3, audio-aac, audio and MP4 video. If a language isn't on the video, Vid Kraken falls back to the closest match, then to the original audio.

How YouTube's multi-language audio works

A video with multiple audio tracks has one original track, the language it was recorded in, and any number of dubbed tracks. The dubs can come from the creator uploading their own voice-overs, or from YouTube's automatic dubbing. Every track lines up with the same video timeline, which is what makes them useful as parallel data.

Two details matter when downloading:

  • Dubbed tracks are usually only in YouTube's combined streams. YouTube serves the original audio both as a separate audio-only stream and inside streams that combine video and audio. Dubbed languages are typically only in the combined ones. A downloader that only looks at audio-only streams never sees the dubs, and silently hands you the original.
  • Language tags vary. The same language can appear as en on one stream and en-US on another. Matching only exact tags misses tracks that are there.

Step 1: list the languages a video has

const API = "https://vidkraken.com/api/v2";
const headers = {
  Authorization: "Bearer " + process.env.VIDKRAKEN_API_KEY,
  "Content-Type": "application/json",
};

async function pollInfo(jobId) {
  while (true) {
    const job = await fetch(API + "/info/" + jobId, { headers }).then((r) => r.json());
    if (job.status !== "pending") return job;
    await new Promise((r) => setTimeout(r, 2000));
  }
}

const { jobId } = await fetch(API + "/info", {
  method: "POST",
  headers,
  body: JSON.stringify({ url: "https://youtu.be/VIDEO_ID", includeAudioTracks: true }),
}).then((r) => r.json());

const info = await pollInfo(jobId);
console.log(info.result.audio);

The result lists every track:

{
  "title": "Some multi-language video",
  "duration": 845,
  "url": "https://youtu.be/VIDEO_ID",
  "audio": [
    { "type": "original", "language": "en" },
    { "type": "dubbed", "language": "es" },
    { "type": "dubbed", "language": "pt-BR" },
    { "type": "dubbed", "language": "hi" }
  ]
}

type: "original" marks the source language. Every other track is dubbed. language is a language code, or null if YouTube doesn't label the track. A video with a single track returns just the original.

Listing tracks needs a full extraction, so it takes a few seconds longer than a plain metadata lookup. It counts against your plan's info quota only when it succeeds, and uses no bandwidth.

Step 2: download the language you want

Pass language as a BCP-47 tag on POST /download. It works with any format:

async function download(url, format, language) {
  const job = await fetch(API + "/download", {
    method: "POST",
    headers,
    body: JSON.stringify({ url, format, language }),
  }).then((r) => r.json());

  while (true) {
    await new Promise((r) => setTimeout(r, 3000));
    const s = await fetch(API + "/download/" + job.jobId, { headers }).then((r) => r.json());
    if (s.status === "COMPLETED") return s.downloadUrl;
    if (s.status === "FAILED") throw new Error(s.errorCode ?? "FAILED");
  }
}

// One MP3 per language, all from the same video.
const url = "https://youtu.be/VIDEO_ID";
const languages = info.result.audio.map((t) => t.language).filter(Boolean);
const files = await Promise.all(languages.map((lang) => download(url, "audio-mp3", lang)));

Each language is its own job and its own file. Jobs run in parallel, up to 100 per account at once. For large batches, pass a webhookUrl and skip polling: Vid Kraken POSTs the finished job to you.

Which format to pick

formatWhat you get in the chosen languageGood for
audioThe track as YouTube serves it, usually M4A (AAC) or WebM (Opus)Translation and speech models: no re-encoding, so the highest fidelity
audio-aacAAC in an M4A filePipelines calibrated on AAC
audio-mp3MP3 at 320 kbpsPlayers, editors, anything that expects .mp3
1080, 720, 480, 360MP4 video with the chosen audio trackLocalized video libraries, subtitling and QA

For video, dubbed audio sometimes only exists in a combined stream one quality step below the one you asked for. When that happens the file arrives at that quality and actualFormat tells you, for example 720 for a 1080 request.

What happens when a language isn't there

language is a preference with a defined fallback chain:

  1. Exact match. pt-BR matches a pt-BR track.
  2. Prefix match. en matches en-US or en-GB.
  3. Original audio. If neither exists, you get the original track rather than a failed job.

The job's language field echoes what you asked for, not which track was used. If you need a guaranteed language, for a training dataset for example, list the tracks with /info first and only request languages the video has.

Doing it yourself with yt-dlp

If you'd rather run yt-dlp, list the formats and look at the language column:

yt-dlp -F "https://youtu.be/VIDEO_ID"

Dubbed tracks show up with their language, and usually only on combined (video and audio) formats. That's why the obvious command often gives you the original:

# Often returns nothing, or the original, for dubbed languages:
yt-dlp -f "ba[language=es]" -x --audio-format mp3 "https://youtu.be/VIDEO_ID"

# Falls back to a combined stream in that language, then extracts the audio:
yt-dlp -f "ba[language=es]/b[language=es]/ba[language^=es]/b[language^=es]" \
  -x --audio-format mp3 "https://youtu.be/VIDEO_ID"

This works on your laptop. In production, the usual yt-dlp problems apply: bot checks, 403 errors, proxies, and extractor updates every time YouTube changes something. Multi-language jobs make it worse, because each language is another download that can be blocked. More on yt-dlp audio in our audio-only and MP3 guide.

Use cases

  • Translation and speech models. Original and dubbed tracks of the same video are time-aligned parallel audio. Use audio for the untouched stream.
  • Localization QA. Pull every dub of your own channel's videos and check them against the script.
  • Multilingual media platforms. Serve the viewer's language from one video ID, with MP4 at the quality you need.
  • Language learning. The same scene in two languages, cut to a section with startTime and endTime.

If you need the words rather than the sound, captions and transcripts are a different problem. Vid Kraken delivers audio and video files, not transcripts.

Pricing

Each language is a separate download, billed by file size like any other: you pay only for bandwidth, with a 20 MB minimum per file. A 14-minute talk is about 34 MB as a 320 kbps MP3, so four languages come to about 135 MB. Listing tracks with /info uses no bandwidth, and failed jobs are never charged. See pricing.

Try Vid Kraken

Paste a YouTube URL and get a direct download link.

Paste a link. See it work.

Paste a YouTube link, pick a format, and hit download.

Every language on the video, one API call each.

List the tracks, pick a language, get an MP3, M4A or MP4 back from our CDN. No yt-dlp, no proxies, no format selectors to maintain.

Start free

Frequently asked questions

How do I download a specific audio language from a YouTube video?+

With Vid Kraken, call POST /download with the video URL, a format such as audio-mp3, and language set to a BCP-47 tag like es or pt-BR. You get back a direct CDN link to the file with that audio track. With yt-dlp, select the language with a format filter such as b[language=es] and extract the audio, because dubbed tracks are usually only in combined video and audio streams.

How can I see which audio languages a YouTube video has?+

Call Vid Kraken's POST /info with includeAudioTracks set to true. The result lists every track, with type original or dubbed and its language code. With yt-dlp, run yt-dlp -F on the URL and look at the language column.

Which APIs support multi-language audio track selection for YouTube?+

Vid Kraken lets you list a video's audio tracks with POST /info and download any of them with the language parameter on POST /download, in MP3, M4A or MP4. It falls back to the closest matching language, then to the original audio. Many YouTube download APIs only return the original track.

Why does yt-dlp give me the original audio when I ask for a dubbed language?+

YouTube usually puts dubbed languages only in combined video and audio streams, not in the separate audio-only streams that bestaudio searches. A selector like ba[language=es] finds nothing and falls through to the original. Add a combined-stream fallback such as b[language=es] and extract the audio with -x.

Can I get dubbed YouTube audio as MP3?+

Yes. Use format audio-mp3 with the language parameter and Vid Kraken delivers that track as a 320 kbps MP3. Use format audio for the untouched stream, which is better for translation and speech models.

What happens if the language I request isn't on the video?+

Vid Kraken tries an exact match first, then a prefix match (en matches en-US), then falls back to the original audio, so the job still succeeds. To be sure of the language, list the tracks with POST /info before downloading.