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
(5)
Developer
John
Maintained by CommunityActor stats
11
Bookmarked
245
Total users
106
Monthly active users
8 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.
🪢 Use in n8n
Prefer a visual workflow? A dedicated n8n community node wraps this transcript API so you can drop it into any pipeline with no code.
- In n8n, open Settings → Community Nodes → Install and enter the package name
n8n-nodes-youtube-transcripts-api. - Add your Apify API token as an Apify API credential (grab the token from your Apify account → Integrations).
- Drop the YouTube Transcripts node into a workflow, pass one URL or an array of URLs, and wire the transcript output into your next step: Google Sheets, a database, or an LLM node.
The node is published on npm with build provenance: n8n-nodes-youtube-transcripts-api. It calls this same Actor, so pricing and output fields match the API and MCP paths above.
🔧 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
- Actor on Apify Store
- n8n community node: n8n-nodes-youtube-transcripts-api
- Apify MCP integration docs
- Model Context Protocol
- Apify platform docs
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.
📡 Where the transcripts come from
Every row in the dataset is built from the caption track that YouTube already publishes on the public video page. Nothing here is run through speech-to-text, so the wording you get back is the same wording a viewer sees in the transcript panel, delivered as timestamped snippets with start and duration, plus one clean non_timestamped block for feeding straight into an LLM. Short-form videos are covered the same way: paste a YouTube Shorts URL and it resolves to the same video_id as any other URL format. This Actor is an independent tool. It is not affiliated with, endorsed by, or operated by YouTube or Google, and it is not YouTube's own API.
Does YouTube have a public transcript API?
Not one you can point at arbitrary videos for bulk transcript text. YouTube's own Data API will list caption tracks, but actually downloading a caption file through it requires OAuth as the channel owner, so it only works on videos you already control. This Actor reads caption tracks that are public on the video page, which is why it works on videos you do not own, and it returns language, language_code, is_generated, is_translatable, and translation_languages next to the text so you know exactly which track you got.
How is this different from grabbing captions by hand?
By hand you open the video, expand the transcript panel, copy, paste, then do it again. Fine for one video, painful by the twentieth. Send an array of URLs instead and each one lands as its own dataset row with video_id, total_seconds, the transcript, and, when include_metadata is on, the title, channel, view count, and upload date. If you are not sure which languages a batch actually has, run it once with list_only: true first: that returns available_transcripts per video and is not charged as a videoprocessed event.
Last Updated: 2026.07.14