YouTube Transcript & Subtitles Scraper API
Pricing
from $0.01 / 1,000 results
YouTube Transcript & Subtitles Scraper API
Scrape YouTube transcripts, subtitles, and captions in bulk, the cheapest pay-per-video YouTube transcript API on Apify. Callable from any MCP client (Claude, Cursor, ChatGPT). Supports YouTube videos, Shorts, and every URL format.
Pricing
from $0.01 / 1,000 results
Rating
5.0
(4)
Developer
John
Maintained by CommunityActor stats
11
Bookmarked
177
Total users
64
Monthly active users
19 hours ago
Last modified
Categories
Share
🎥 YouTube Transcript & Subtitles Scraper: Pay-Per-Video MCP API
Scrape YouTube transcripts, subtitles, and captions in bulk at near-free pay-per-video rates. Built for MCP clients (Claude, Cursor, VS Code, ChatGPT), AI agents, content pipelines, and SEO research. Works with standard videos, YouTube Shorts, and every URL format.
💡 Pricing: $0.0001 per video transcribed, about $0.10 per 1,000 videos. Tiny per-run startup + per-result fees ($0.00001 each, set by Apify). No subscription, no proxy fees.
Example code (Python): https://github.com/johnisanerd/Apify-Youtube-Transcripts-API
⚡ What you get back
For every video, the dataset receives:
non_timestamped- full transcript text, ready for LLMs.timestamped- every snippet withtext,start, anddurationin seconds.language,language_code,is_generated,is_translatable,translation_languages.total_seconds- video duration.video_id,url,success,timestamp.- On failure: structured
error,error_message,error_type(no crash; the run continues).
🎯 Use cases
- LLM training data - bulk-collect transcripts for fine-tuning or RAG.
- AI agents that watch YouTube - let Claude or Cursor pull a transcript on demand via MCP.
- Content repurposing - turn videos into blog posts, summaries, or social clips.
- SEO research - mine transcripts for keywords, topics, and competitor analysis.
- Podcast & video search - index thousands of videos by their actual spoken content.
🤖 Use with MCP (Claude, Cursor, VS Code, ChatGPT)
This Actor is callable as a tool from any Model Context Protocol client. The Apify MCP server exposes every Actor on the store: no installation, no separate package.
Step 1: Get an Apify API token
Grab a token from your Apify account → Integrations.
Step 2: Connect your MCP client
Claude Desktop / Claude Code: edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{"mcpServers": {"apify": {"url": "https://mcp.apify.com","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
Cursor: add .cursor/mcp.json in your project (or ~/.cursor/mcp.json globally):
{"mcpServers": {"apify": {"url": "https://mcp.apify.com","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
VS Code: add .vscode/mcp.json:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
ChatGPT / web-only clients: use the hosted Apify Tester MCP Client in the browser.
Step 3: Ask your agent
Once connected, prompt naturally:
"Use Apify to get the transcript of https://www.youtube.com/watch?v=dQw4w9WgXcQ"
"Pull YouTube transcripts for these three URLs and summarize each: …"
"Find the YouTube transcript scraper on Apify and run it for this Shorts URL."
Your client will discover this Actor via the search-actors tool, register it as a callable function, and feed the transcript back into the conversation.
Full reference: Apify MCP integration docs · MCP server source.
🔧 Input
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
youtube_url | string or array of strings | ✅ | — | One URL or many. Works with standard videos, Shorts, youtu.be, embed, and mobile URLs. |
languages | array of strings | — | ["en"] | Ordered list of ISO 639-1 language codes. First match wins. |
translate_to | string | — | — | If set, translate the picked transcript into this language code. Source must be translatable (see list_only). |
transcript_type | enum any / manual / generated | — | any | Filter by manually-created vs. auto-generated captions. |
output_formats | array of strings | — | [] | Extras: srt, vtt, text. The structured fields are always included; these add formatted-subtitle strings. |
preserve_formatting | boolean | — | false | Keep YouTube's inline <i> / <b> tags in transcript text. |
list_only | boolean | — | false | Discovery mode: do not fetch transcripts; return the list of available transcripts per video. Free of the per-video charge. |
include_metadata | boolean | — | true | Enrich each result with video metadata: title, description, channel, view count, like count, video duration, upload date, thumbnail URL, tags, categories. Adds ~1-3 seconds per video. Set to false to skip and run faster. |
Single video
{ "youtube_url": "https://www.youtube.com/watch?v=p8gV_7zFN44" }
Batch (processed in parallel)
{"youtube_url": ["https://www.youtube.com/watch?v=5kcaHAuGxmY","https://www.youtube.com/watch?v=p8gV_7zFN44","https://www.youtube.com/shorts/s4UkCaf_scs"]}
Pick a language
{"youtube_url": "https://www.youtube.com/watch?v=p8gV_7zFN44","languages": ["es", "en"]}
Tries Spanish first, falls back to English.
Translate to another language
{"youtube_url": "https://www.youtube.com/watch?v=p8gV_7zFN44","languages": ["en"],"translate_to": "fr"}
Picks the English transcript and translates it to French. If the source isn't translatable, you'll get the original English transcript back without an error.
Get SRT + VTT alongside JSON
{"youtube_url": "https://www.youtube.com/watch?v=p8gV_7zFN44","output_formats": ["srt", "vtt", "text"]}
Adds srt, vtt, and text fields to each dataset item in addition to the structured timestamped and non_timestamped fields.
Discover what transcripts exist (no charge)
{"youtube_url": "https://www.youtube.com/watch?v=p8gV_7zFN44","list_only": true}
Returns available_transcripts per video without fetching any captions. Useful to discover which languages and which translations are available before committing to a transcript-fetch run.
💡 Large batches just work. The default run timeout is unlimited and the actor uses 1 GB of memory with a 5-worker thread pool, so batches of hundreds of URLs finish in a single run. Failed or skipped videos are still recorded in the dataset (with
success: falseand anerror_message), so you can retry only the missing ones if you ever need to.
📤 Example output
With include_metadata: true (the default), each dataset item carries both the transcript and the video metadata:
{"url": "https://www.youtube.com/watch?v=p8gV_7zFN44","video_id": "p8gV_7zFN44","language": "English","language_code": "en","is_generated": false,"is_translatable": true,"translation_languages": ["es", "fr", "de"],"total_seconds": 4782.52,"duration_human": "1h 19m 42s","source_type": "Manual","snippet_count": 1238,"timestamped": [{ "text": "Hello and welcome to this video", "start": 0.08, "duration": 3.5 }],"non_timestamped": "Hello and welcome to this video...","title": "Some video title","channel_name": "Some Channel","channel_id": "UCxxxxxxxxxxxxxxxxxxxxxx","channel_url": "https://www.youtube.com/channel/UCxxxxxxxxxxxxxxxxxxxxxx","view_count": 12345678,"like_count": 234567,"video_duration_seconds": 4783,"upload_date": "2024-05-12","thumbnail_url": "https://i.ytimg.com/vi/p8gV_7zFN44/hqdefault.jpg","tags": ["education", "tutorial"],"categories": ["Education"],"availability": "public","was_live": false,"timestamp": "2026-06-30T10:30:00","success": true}
Set include_metadata: false to skip the title/channel/view-count/thumbnail fields and run ~1-3 seconds faster per video.
💰 Pricing
| Event | Price | Charged for |
|---|---|---|
videoprocessed | $0.0001 | each video successfully transcribed (~$0.10 per 1,000 videos) |
apify-actor-start | $0.00001 | one event per GB of memory at run start (Apify-managed) |
apify-default-dataset-item | $0.00001 | per item stored in the dataset (Apify-managed) |
Total cost examples (typical 1-video run = setup + 1 video + 1 dataset item):
| Run size | Total cost |
|---|---|
| 1 video | ~$0.00012 |
| 10 videos | ~$0.0011 |
| 100 videos | ~$0.0101 |
| 1,000 videos | ~$0.101 |
| 10,000 videos | ~$1.001 |
Unlike actors that charge per second of video, this one charges per video: a 5-hour lecture costs the same as a 60-second Short. No subscription, no proxy fees. Failed videos and videos with no transcript are not charged.
🚀 Quickstart
- Open this Actor on the Apify store.
- Paste a YouTube URL into
youtube_url(or an array of URLs). - Click Start. Results appear in the dataset within seconds.
Prefer the API? Every Actor on Apify has an API endpoint and can be called from any language, scheduled, or wired into webhooks.
❓ FAQ
What if the video has no transcript?
The Actor records an error entry in the dataset (success: false, error_message: …) and moves on to the next URL. You are only charged for successful transcriptions of the requested videos.
Does it work for YouTube Shorts?
Yes. https://www.youtube.com/shorts/VIDEO_ID works out of the box, as do youtu.be/, /embed/, and m.youtube.com formats.
Can I call this from an AI agent? Yes, that is the primary design goal. See the Use with MCP section above for Claude, Cursor, VS Code, and ChatGPT setup.
What about translation?
The output includes is_translatable and a list of translation_languages available for each transcript. Translation itself is not performed by this Actor; pair it with your favorite LLM (or another Apify Actor) for translation.
Why is this so much cheaper than other YouTube transcript scrapers? This is a loss-leader: built for adoption, not margin. The actor uses YouTube's own caption tracks via a free open-source library, so the marginal cost is near zero.
🔗 Links
Featured Tasks
Ready-to-run examples that show this API solving a specific problem. Each opens its own setup so you can run it on your account in one click.
- Get YouTube transcripts in Claude Code via MCP - pull any video's transcript straight into Claude Code (free trial available) through MCP, with timestamped and plain text output.
- Use YouTube transcripts in Claude Cowork via MCP - fetch transcripts inside Claude Cowork (free trial available) as an MCP plugin for research and document workflows.
- Download a batch of YouTube transcripts in bulk - transcribe a whole list of videos in one run, one dataset row per video with language metadata.
For developers
- Run the YouTube transcript API without IP blocks - fetch transcripts at scale without IpBlocked or RequestBlocked errors.
- Get YouTube transcripts without API rate limits - pull transcripts in bulk without 429 rate-limit errors.
- Translate YouTube subtitles via API - render any video's captions into another language with the translate_to input.
- YouTube transcript API in Python without IP blocks and for Node.js and JavaScript.
- Get a YouTube Shorts transcript by URL - paste any Shorts URL and get its transcript.
- Hosted YouTube transcript MCP server - a no-setup MCP server that returns transcripts as a callable tool.
Transcripts by language
Translate any video's captions on demand. Representative pages: Spanish, French, German, Japanese, Korean, Russian, Hindi, Portuguese, Arabic, and more. See the full set on the Examples tab.
In-language landing pages: YouTube字幕下载 API (Chinese), YouTube字幕翻译 API (Chinese), Скачать субтитры YouTube (Russian), Перевод субтитров YouTube (Russian).
Use in your MCP client
Connect the actor as a callable MCP tool in ChatGPT, Cursor, Visual Studio Code, Windsurf, or Cline.
Last Updated: 2026.07.04