YouTube Transcript JS API
A TypeScript/JavaScript library to fetch YouTube video transcripts. This is a complete port of the popular Python library youtube-transcript-api
with additional features and TypeScript support.
Features
- 🎯 Simple API: Easy-to-use methods for fetching transcripts
- 🌍 Multi-language Support: Fetch transcripts in any available language
- 🔄 Translation: Translate transcripts to different languages
- 📄 Multiple Formats: Export transcripts in various formats (SRT, VTT, JSON, plain text)
- 🛡️ Error Handling: Comprehensive error types for different scenarios
- ⚡ TypeScript: Full TypeScript support with type definitions
- 🔄 Retry Logic: Built-in retry mechanism with exponential backoff
- 🎭 Rate Limiting: Smart request handling to avoid YouTube's rate limits
- 🖥️ CLI Support: Command-line interface for easy transcript fetching from the terminal
Table of Contents
Installation
npm install youtube-transcript-js-api
For CLI usage, install globally:
npm install -g youtube-transcript-js-api
Quick Start
import { getTranscript, YouTubeTranscriptApi } from 'youtube-transcript-js-api';
const transcript = await getTranscript('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
console.log(transcript);
const api = new YouTubeTranscriptApi();
const transcript = await api.getTranscript('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
CLI Usage:
youtube-transcript get "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
youtube-transcript get "VIDEO_URL" --format srt --output subtitles.srt
API Reference
Basic Usage
getTranscript(videoUrl, languages?)
Fetch transcript for a YouTube video.
import { getTranscript } from 'youtube-transcript-js-api';
const transcript = await getTranscript('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
const transcript = await getTranscript(
'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
['en']
);
const transcript = await getTranscript(
'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
['en', 'es', 'fr']
);
listTranscripts(videoUrl)
List all available transcripts for a video.
import { listTranscripts } from 'youtube-transcript-js-api';
const transcriptList = await listTranscripts('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
console.log(transcriptList.transcripts);
Advanced Usage
Using the API Class
import { YouTubeTranscriptApi } from 'youtube-transcript-js-api';
const api = new YouTubeTranscriptApi({
userAgent: 'Custom User Agent',
timeout: 15000,
headers: {
'Custom-Header': 'value'
}
});
const transcript = await api.getTranscript('VIDEO_URL');
const transcript = await api.getTranscriptByLanguage('VIDEO_URL', 'es');
const transcript = await api.getTranslatedTranscript('VIDEO_URL', 'fr', 'en');
const transcriptList = await api.listTranscripts('VIDEO_URL');
Formatting Transcripts
import {
getTranscript,
TextFormatter,
SRTFormatter,
VTTFormatter,
JSONFormatter,
TimestampFormatter
} from 'youtube-transcript-js-api';
const transcript = await getTranscript('VIDEO_URL');
const textFormatter = new TextFormatter();
const plainText = textFormatter.format(transcript);
const srtFormatter = new SRTFormatter();
const srtContent = srtFormatter.format(transcript);
const vttFormatter = new VTTFormatter();
const vttContent = vttFormatter.format(transcript);
const jsonFormatter = new JSONFormatter(true);
const jsonContent = jsonFormatter.format(transcript);
const timestampFormatter = new TimestampFormatter(true);
const timestampContent = timestampFormatter.format(transcript);
Error Handling
import {
getTranscript,
VideoUnavailableError,
TranscriptsDisabledError,
NoTranscriptFoundError,
TranscriptRetrievalError,
TooManyRequestsError
} from 'youtube-transcript-js-api';
try {
const transcript = await getTranscript('VIDEO_URL');
} catch (error) {
if (error instanceof VideoUnavailableError) {
console.log('Video is private, deleted, or does not exist');
} else if (error instanceof TranscriptsDisabledError) {
console.log('Transcripts are disabled for this video');
} else if (error instanceof NoTranscriptFoundError) {
console.log('No transcript found in requested language');
console.log('Available languages:', error.availableLanguages);
} else if (error instanceof TooManyRequestsError) {
console.log('Rate limited - wait before making more requests');
} else if (error instanceof TranscriptRetrievalError) {
console.log('Failed to retrieve transcript:', error.message);
}
}
Supported Video URL Formats
The library supports various YouTube URL formats:
https://www.youtube.com/watch?v=VIDEO_ID
https://youtu.be/VIDEO_ID
https://www.youtube.com/embed/VIDEO_ID
https://www.youtube.com/v/VIDEO_ID
- Direct video ID:
VIDEO_ID
Supported Languages
The library supports all languages that YouTube supports for transcripts. Common language codes include:
en
- English
tr
- Turkish
es
- Spanish
fr
- French
de
- German
it
- Italian
pt
- Portuguese
ru
- Russian
ja
- Japanese
ko
- Korean
zh-Hans
- Chinese (Simplified)
zh-Hant
- Chinese (Traditional)
And many more...
CLI Usage
The library includes a command-line interface for easy transcript fetching from the terminal.
Installation for CLI
npm install -g youtube-transcript-js-api
CLI Commands
Get Transcript
youtube-transcript get "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
youtube-transcript get "https://www.youtube.com/watch?v=dQw4w9WgXcQ" --language en
youtube-transcript get "VIDEO_URL" --output transcript.txt
youtube-transcript get "VIDEO_URL" --format srt --output subtitles.srt
youtube-transcript get "VIDEO_URL" --format vtt --output subtitles.vtt
youtube-transcript get "VIDEO_URL" --format timestamp
youtube-transcript get "VIDEO_URL" --format json --output transcript.json
youtube-transcript get "VIDEO_URL" --translate es --output transcript_spanish.txt
youtube-transcript get "VIDEO_URL" --language en --translate fr --output transcript_french.txt
List Available Transcripts
youtube-transcript list "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
CLI Options
--language | -l | Specific language code (e.g., en, es, fr) | Any available |
--format | -f | Output format (text, srt, vtt, json, timestamp) | text |
--output | -o | Output file (defaults to stdout) | stdout |
--translate | -t | Translate to target language | None |
CLI Examples
youtube-transcript get "https://youtu.be/dQw4w9WgXcQ"
youtube-transcript get "dQw4w9WgXcQ" -l en -f srt -o subtitles.srt
youtube-transcript get "https://www.youtube.com/watch?v=dQw4w9WgXcQ" -l en -t es -o spanish.txt
youtube-transcript get "VIDEO_URL" -f timestamp
youtube-transcript list "VIDEO_URL"
youtube-transcript get "VIDEO_URL" | grep "important keyword"
youtube-transcript get "VIDEO_URL" -f json -o data.json
Configuration Options
interface TranscriptConfig {
userAgent?: string;
timeout?: number;
cookies?: string;
headers?: Record<string, string>;
}
Rate Limiting
The library includes built-in protection against rate limiting:
- Random delays between requests
- Exponential backoff retry logic
- Multiple user agents rotation
- Request throttling
Examples
Save transcript as SRT file
import fs from 'fs';
import { getTranscript, SRTFormatter } from 'youtube-transcript-js-api';
const transcript = await getTranscript('VIDEO_URL');
const srtFormatter = new SRTFormatter();
const srtContent = srtFormatter.format(transcript);
fs.writeFileSync('transcript.srt', srtContent);
Get transcript with timestamps
import { getTranscript, TimestampFormatter } from 'youtube-transcript-js-api';
const transcript = await getTranscript('VIDEO_URL');
const formatter = new TimestampFormatter(true);
const formattedTranscript = formatter.format(transcript);
console.log(formattedTranscript);
Translate transcript
import { YouTubeTranscriptApi } from 'youtube-transcript-js-api';
const api = new YouTubeTranscriptApi();
const transcript = await api.getTranslatedTranscript('VIDEO_URL', 'es', 'en');
Error Types
YouTubeTranscriptError
- Base error class
VideoUnavailableError
- Video is private, deleted, or doesn't exist
TranscriptsDisabledError
- Transcripts are disabled for the video
NoTranscriptFoundError
- No transcript found in requested language
TranscriptRetrievalError
- Failed to retrieve transcript data
TranslationError
- Failed to translate transcript
TooManyRequestsError
- Rate limited by YouTube
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
MIT License - see the LICENSE file for details.
Related Projects
Disclaimer
This library is for educational and research purposes only. Please respect YouTube's Terms of Service and use this library responsibly.