One API call. Timestamped JSON. No proxy setup, no RequestBlocked errors, no credits vanishing at midnight. Extract any YouTube transcript in your language, your format. Works in Python, JavaScript, PHP, and curl.
# 1 credit, under 1.5s, no proxy setup curl https://api.youtubetranscripts.co/v1/transcript \ -H "x-api-key: yt_live_••••••••" \ -d '{"url":"https://youtube.com/watch?v=dQw4w9WgXcQ","lang":"en"}' # Response - clean JSON · ready for your pipeline { "video_id": "dQw4w9WgXcQ", "lang": "en", "source": "caption_auto", "word_count": 438, "requests_used": 1, "balance_remaining": 99, "content": [ { "text": "Never gonna give you up", "offset_ms": 18400 }, { "text": "Never gonna let you down", "offset_ms": 20440 } ] }
“Deployed to Railway Sunday night. Got RequestBlocked within the hour. Client demo Monday morning.”- Actual developer, actual Slack message
The open-source youtube-transcript-api library is brilliant on localhost. The moment it hits a cloud IP - AWS, GCP, Railway, Render, Vercel - YouTube sees it and blocks it. Every time.
So you spend a weekend on proxy rotation. Then the proxies get flagged. Then YouTube updates something and the whole thing breaks again. This is not a problem worth solving yourself.
No infrastructure to manage. No proxies to rotate. No YouTube bot detection to battle. Just a clean YouTube Transcript API that returns what you need.
Enter your email. Click the magic link. Your API key is on screen immediately, no credit card, no approval queue, no waiting.
Pass any public YouTube URL. Choose your language, format (segments, plain text, or SRT), and whether to enable AI fallback for videos without captions.
Timestamped segments, word count, balance remaining, video metadata - all in one response. Pipe it straight into your LLM, vector DB, or content pipeline.
Native caption extraction is fast. You have a transcript before your UI spinner completes its first rotation.
Every segment returns offset_ms and duration_ms. Build transcript viewers, chapter markers, and searchable archives.
Buy once. Use whenever. No monthly resets, no “use it or lose it” anxiety.
Video has no captions? Set ai_fallback=true. We run OpenAI Whisper automatically. 3 credits per video-minute. Response includes source: "ai_generated".
Auto-detect or pass an ISO 639-1 code. Every language YouTube supports.
Choose segments, plain text, or srt. Works as a YouTube captions API, subtitles API, or raw transcript source.
Title, views, likes, duration, thumbnail — bundled with every transcript call at no extra cost. Never a separate API hit.
Handles proxy rotation, IP management, and YouTube changes automatically. No more RequestBlocked errors on AWS, GCP, or Railway.
The same API. Six completely different products.
Feed transcripts into your vector DB. Let users ask questions about any video. Build knowledge bases from entire channels in hours.
One 20-minute video becomes a blog post, 10 tweets, a newsletter section, and show notes. No manual copy-paste.
Track what's being said about your brand across YouTube at scale. Mine transcripts for signals competitors haven't noticed.
Meet ADA, WCAG, and EU accessibility mandates. AI fallback generates captions even when YouTube doesn't provide them.
Search engines can't watch video. Publish the full transcript alongside each video. More text means more index surface.
Process entire channels or curated playlists. Clean JSON straight into your labelling pipeline. 25 videos per batch call.
Native SDKs, MCP server, and no-code connectors, all from one API key.
from youtubetranscripts import Client client = Client(api_key="yt_your_key") # Native captions - 1 credit result = client.transcript( url="https://youtube.com/watch?v=VIDEO_ID", lang="en", format="segments" ) # Full text string text = " ".join(s.text for s in result.content) # Timestamped iteration for seg in result.content: print(f"{seg.offset_ms}ms → {seg.text}") # AI fallback - 3 credits/min, no captions needed result = client.transcript(url=url, ai_fallback=True) print(result.source) # "ai_generated" print(result.balance_remaining) # credits left
import { Client } from 'youtubetranscripts' const client = new Client({ apiKey: 'yt_your_key' }) // 1 credit - native captions const result = await client.transcript({ url: 'https://youtube.com/watch?v=VIDEO_ID', lang: 'en', format: 'segments', aiFallback: true // auto Whisper if no captions }) // Full text const text = result.content.map(s => s.text).join(' ') // TypeScript - full type safety on response const { content, source, balance_remaining, word_count } = result
use YouTubeTranscripts\Client; $client = new Client(['api_key' => 'yt_your_key']); $result = $client->transcript([ 'url' => 'https://youtube.com/watch?v=VIDEO_ID', 'lang' => 'en', 'format' => 'plain', ]); // Full transcript text echo $result->content; // Credits remaining echo $result->balance_remaining;
# Single transcript curl https://api.youtubetranscripts.co/v1/transcript \ -H "x-api-key: yt_your_key" \ -d '{"url":"https://youtube.com/watch?v=VIDEO_ID"}' # Batch - 25 videos per call (Pro pack and above) curl https://api.youtubetranscripts.co/v1/transcript/batch \ -H "x-api-key: yt_your_key" \ -d '{"urls":["ID_1","ID_2","ID_3"]}' # Check balance curl https://api.youtubetranscripts.co/v1/account/balance \ -H "x-api-key: yt_your_key"
Pull transcripts directly inside Claude conversations via MCP
Transcribe YouTube from your code editor, no context switching
MCP server installs in under 30 seconds
The only YouTube Transcript API with never-expire credits, AI fallback, and no subscription. Get YouTube transcripts in production without IP blocks or broken scrapers.
| Provider | Credits expire? | AI fallback | No subscription | Entry price | Works in production? |
|---|---|---|---|---|---|
| YouTubeTranscripts.co us | ✓ Never expire | ✓ Whisper | ✓ Pay once | $5 for 300 | ✓ Always |
| Supadata | ⚠ Monthly reset | ✓ | ✗ Sub only | $5/mo → 300 | ⚠ Intermittent |
| ScrapeCreators | ✓ Never expire | ✓ | ✓ | $10 for 1,000 | ✓ |
| TranscriptAPI.com | ⚠ End of period | ✗ | ✗ Sub only | ~$10/mo | ✓ |
| Transcribr.io | ⚠ 6-month limit | ✗ | ✓ | $9 for 500 | ✗ |
| Open-source library | N/A - free | ✗ | ✓ | $0 | ✗ Blocked by cloud IPs |
No subscriptions. No resets. No auto-charge. Credits stack - buy multiple packs and balances combine.
pip install youtubetranscripts. Initialise a Client with your API key and call client.transcript(url='...'). The response includes .content (list of segments with text, offset_ms, duration_ms), .lang, .source, and .balance_remaining. Full docs with examples at docs.youtubetranscripts.co/python.ai_fallback=true. We download the audio and transcribe it with OpenAI Whisper. Cost: 3 credits per video-minute. A 10-minute video costs 30 credits. The response includes source: "ai_generated" so you always know which path ran. On the free tier, videos without captions return HTTP 422 with a clear upgrade message.npm install youtubetranscripts. Full TypeScript types, Promise-based async/await, works in Node.js 18+, Bun, and Deno. MCP server also available for Claude Desktop, Cursor, and Windsurf - use YouTube transcripts inside your AI assistant without any HTTP calls.balance_remaining. You never need a separate balance-check call.A YouTube Transcript API is a programmatic interface for extracting the text content of YouTube videos: auto-generated captions, manually uploaded subtitles, and AI-generated transcriptions for uncaptioned videos. It is also commonly referred to as a YouTube captions API or YouTube subtitles API — all three terms describe the same underlying capability. YouTube's official Data API v3 does not expose transcripts to third-party developers, so every service in this category works by accessing YouTube's public caption infrastructure directly.
The key differences between providers are: reliability in cloud environments, pricing model, and what happens when a video has no captions. The open-source youtube-transcript-api Python library is the most popular starting point, but it fails consistently when deployed to cloud providers because YouTube blocks their IP ranges.
Common production use cases include:
The YouTubeTranscripts.co Python SDK is the fastest way to get YouTube transcripts in production. Install once, make one function call, get structured data back with timestamps and metadata included.
The response includes balance_remaining in every call. You never need a separate balance endpoint. Full API reference at docs.youtubetranscripts.co.
100 free credits. No card. No subscription. Credits that actually stay in your account.
Get Started Free →No credit card. No subscription. Free credits never expire.