YouTube Transcript Scraper
Pricing
from $0.08 / 1,000 transcript extracteds
YouTube Transcript Scraper
Extract transcripts and timestamped caption segments from public YouTube videos. Export text for summaries, RAG, content research, and AI-agent workflows.
Pricing
from $0.08 / 1,000 transcript extracteds
Rating
0.0
(0)
Developer
Hanna Nosova
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
5
Monthly active users
13 days ago
Last modified
Categories
Share
Extract transcripts and timestamped caption segments from public YouTube videos. Export text for summaries, RAG, content research, and AI-agent workflows.
At a glance
- Transcript extraction: Convert public YouTube captions into clean transcript text.
- Timestamped segments: Keep start and duration values for quotes, clips, RAG chunks, and evidence tables.
- URL and ID input: Use watch URLs, Shorts URLs, youtu.be links, embed URLs, live URLs, or raw video IDs.
- Metadata option: Include public title, channel name, duration, and thumbnail URL when available.
- Batch-safe errors: Videos without public captions save clear status rows instead of failing the whole run.
- Bounded video work: A slow or blocked video becomes an actionable error row instead of consuming the whole run timeout.
- Subtitle exports: Optionally return SRT and WebVTT alongside JSON transcript text and segments.
Ready-to-run examples
- Extract YouTube transcripts for AI summaries - Get transcript text ready for summaries and LLM workflows.
- Extract timestamped YouTube transcript segments - Keep segment timing for quotes, clips, and RAG chunks.
- Batch extract YouTube video captions - Process a small list of captioned videos.
- YouTube video to SEO transcript text - Use transcript text for content and search workflows.
View all ready-to-run examples
What can it do?
YouTube Transcript Scraper turns public YouTube captions into structured data.
It accepts YouTube watch URLs, Shorts URLs, youtu.be links, embed URLs, live URLs, or raw video IDs.
For every video, it returns a dataset row with the video ID, URL, title, channel name, caption language, transcript text, and optional timestamped segments.
Videos without public captions are handled gracefully with a clear error message instead of failing the whole run.
Common workflows
-
SEO and content teams: repurpose transcripts into briefs, blog drafts, quote libraries, keyword research, and content audits.
-
Researchers and analysts: collect spoken content from public videos for media monitoring, qualitative research, public-interest analysis, or education datasets.
-
LLM and RAG builders: create clean text chunks from public captions for search, summarization, classification, embeddings, and retrieval workflows.
-
Sales and marketing teams: extract talks, interviews, demos, webinars, and competitor videos into searchable text for faster review.
-
Journalists and fact checkers: create searchable transcript records for public videos, speeches, interviews, and announcements.
Why use this actor?
- Structured output with one row per video
- Transcript text plus timestamped segments
- Public caption language selection
- Graceful handling for videos with no captions
- Works with video URLs and video IDs
- Low-cost runs for captioned public videos
- Output ready for spreadsheets, APIs, and AI workflows
What data can you extract?
| Field | Description |
|---|---|
videoId | YouTube video ID |
videoUrl | Canonical watch URL |
title | Public video title when available |
channelName | Public channel name when available |
language | Caption language used |
isAutoGenerated | Whether the selected captions appear auto-generated |
transcriptText | Full transcript as one clean text string |
segments | Timestamped transcript segments |
duration | Video duration in seconds when available |
thumbnailUrl | Public thumbnail URL when available |
captionsAvailable | Whether public caption tracks were found |
status | Machine-readable success or error result |
errorCode | Stable reason such as NO_CAPTIONS, BLOCKED, RATE_LIMITED, or VIDEO_TIMEOUT |
requestedLanguages | Caption languages requested in priority order |
availableLanguages | Public caption tracks, names, generated status, and translation availability |
isTranslated | Whether YouTube translated the selected caption track |
segmentCount | Number of returned caption segments |
charCount | Character count of transcriptText |
processingTimeMs | Per-video processing time |
srt / vtt | Optional ready-to-save subtitle text |
error | Explanation for unavailable captions or failed videos |
Pricing
This Actor uses Apify pay-per-event pricing. The prices below come from the current Actor pricing configuration. Apify public plans map to Store discount tiers, so the table shows both the user-facing plan context and the pricing tier name. The final price shown in Apify depends on the user account plan and any custom agreement.
| Event | What is charged | Price |
|---|---|---|
start | One-time fee charged when a run starts. Covers fixed startup cost (init, proxy warmup, first HTTP setup). | $0.005 |
| Event | What is charged | Free / no discount | Starter / Bronze | Scale / Silver | Business / Gold | Custom / Platinum | Custom / Diamond |
|---|---|---|---|---|---|---|---|
transcript | Charged per transcript extracted. | $0.15338 / 1,000 | $0.13338 / 1,000 | $0.10403 / 1,000 | $0.08003 / 1,000 | $0.05335 / 1,000 | $0.03735 / 1,000 |
Apify may also charge platform usage for compute, storage, proxies, or data transfer outside this Actor pricing. Check the Actor run and the Apify Pricing tab for the exact cost shown to your account.
How to use YouTube Transcript Scraper
- Open the actor on Apify.
- Paste one or more public YouTube video URLs.
- Optionally set a preferred caption language such as
en,es, orde. - Choose whether to include timestamped segments.
- Click Start.
- Download the dataset as JSON, CSV, Excel, XML, or HTML.
Input configuration
| Setting | JSON key | What to enter |
|---|---|---|
| YouTube video URLs | videoUrls | Public YouTube watch, Shorts, youtu.be, embed, or live URLs. |
| YouTube video IDs | videoIds | Raw 11-character IDs when you already have them. |
| Caption language | language | Preferred caption language such as en, es, or de. |
| Preferred languages | languages | Optional language codes in priority order; takes precedence over legacy language. |
| Include timestamps | includeTimestamps | Whether to include timestamped transcript segments. |
| Include metadata | includeMetadata | Whether to include video metadata with transcript text. |
| Additional formats | outputFormats | Add srt or vtt; JSON fields are always returned. |
| Transcript window | startSeconds, durationSeconds | Return only captions overlapping a time range. Zero keeps the full remaining transcript. |
| Maximum videos | maxVideos | Cost and size cap for the run. |
| Concurrency | maxConcurrency | Videos processed in parallel, from 1 to 10. |
| Deadlines | requestTimeoutSecs, videoTimeoutSecs | Bound individual requests and total time spent on one video. |
| Proxy configuration | proxyConfiguration | Apify proxy settings for the run. |
Example input
{"videoUrls": [{ "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }],"language": "en","includeTimestamps": true,"includeMetadata": true,"maxVideos": 1}
Example output
{"videoId": "dQw4w9WgXcQ","videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Example video title","channelName": "Example channel","language": "en","isAutoGenerated": false,"transcriptText": "We're no strangers to love...","segments": [{ "start": 0.0, "duration": 2.1, "text": "We're no strangers to love" }],"duration": 213,"thumbnailUrl": "https://i.ytimg.com/...","captionsAvailable": true}
Accepted YouTube URL formats
https://www.youtube.com/watch?v=VIDEO_IDhttps://youtu.be/VIDEO_IDhttps://www.youtube.com/shorts/VIDEO_IDhttps://www.youtube.com/embed/VIDEO_IDhttps://www.youtube.com/live/VIDEO_ID- Raw
VIDEO_IDvalues
Caption language selection
Set legacy language to one preferred caption language code, or use languages for an ordered fallback list.
If that exact language is not available, the actor falls back to a related language variant or the first public caption track.
For example, en may match English captions when present.
The selected language is returned in language; requestedLanguages, availableLanguages, and isTranslated explain the decision.
SRT, WebVTT, and transcript windows
JSON transcript fields are always returned. Set outputFormats to include srt or vtt when you also need subtitle-file text for editors, players, or archives.
Use startSeconds with optional durationSeconds to keep only caption segments overlapping a time window. The default zero values preserve the full transcript.
Timestamped transcript segments
Enable includeTimestamps to receive segment-level timing.
Each segment can include:
start— segment start in secondsduration— segment length in secondstext— spoken caption text
Disable timestamps when you only need the combined transcript text.
Metadata fields
Enable includeMetadata to include public video details when available.
Metadata can include title, channel name, duration, and thumbnail URL.
Some unavailable or restricted videos may return less metadata.
Handling videos with no captions
Not every public YouTube video has public captions.
When captions are unavailable, the actor still saves a row with:
captionsAvailable: false- the video ID and URL
- an
errormessage explaining what happened
This makes batch runs easier to audit because one bad video does not stop the rest of the run.
Run diagnostics and failure handling
Every run writes RUN_SUMMARY to the default key-value store. It reports requested and unique videos, invalid and duplicate inputs, successful transcripts, error rows, timeouts, blocks, and no-caption results.
Equivalent URLs and repeated IDs are processed once. Slow or blocked videos have a per-video deadline and save an error row; successful rows are saved together with their transcript charge so row and charge counts remain aligned.
Tips for best results
- Use public videos with captions enabled.
- Start with a small batch to confirm your input format.
- Use
languagewhen you need a specific caption language. - Keep
maxVideoslow for testing and increase it after validation. - Check
captionsAvailablebefore using transcript text in automated workflows.
AI-agent recipe
Goal: turn public webinar or video captions into a summary and quote table.
Input:
{"videoUrls": [{ "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }],"language": "en","includeTimestamps": true,"includeMetadata": true,"maxVideos": 1}
Prompt to use with Claude / ChatGPT / MCP: "Extract transcripts from these public YouTube URLs. Create a table with video URL, key claims, notable quotes, and timestamps."
Follow-up automation:
- Schedule: Run after each new public webinar, podcast, or product video is published.
- Export: Docs, Sheets, a vector DB, or Slack summaries for content review.
- Guardrail: Use only public caption tracks returned by the actor; respect copyright and platform terms.
Integrations
You can connect the dataset to:
- Google Sheets for editorial review
- Zapier or Make for automations
- Vector databases for embeddings and retrieval
- BI tools for media analysis
- Internal dashboards for monitoring public video content
- LLM workflows for summarization, tagging, and question answering
API usage
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fetch_cat/youtube-transcript-scraper').call({videoUrls: [{ url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' }],language: 'en',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].transcriptText);
Python
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('fetch_cat/youtube-transcript-scraper').call(run_input={'videoUrls': [{'url': 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'}],'language': 'en',})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items[0].get('transcriptText'))
cURL
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~youtube-transcript-scraper/runs?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"videoUrls":[{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"}],"language":"en"}'
MCP and AI agents
Use this actor through Apify MCP when you want an AI assistant to fetch public video transcripts.
MCP server URL pattern:
https://mcp.apify.com/?tools=fetch_cat/youtube-transcript-scraper
Claude Code setup:
$claude mcp add apify-youtube-transcripts --transport http --url "https://mcp.apify.com/?tools=fetch_cat/youtube-transcript-scraper"
Claude Desktop JSON config:
{"mcpServers": {"apify-youtube-transcripts": {"url": "https://mcp.apify.com/?tools=fetch_cat/youtube-transcript-scraper"}}}
Example prompts:
- "Extract the transcript from this public YouTube video and summarize the key claims."
- "Get transcripts for these five public webinar URLs and make a topic table."
- "Find quotes in this public interview transcript about pricing."
Common use cases
- Video-to-blog repurposing
- Public webinar transcript extraction
- Research corpus creation
- Podcast-style YouTube episode analysis
- Competitive content monitoring
- Training data preparation from public captions
- Subtitle QA and language availability checks
Limitations
This actor extracts public captions only.
It cannot access private videos, members-only videos, deleted videos, region-blocked content unavailable to the runner, or videos without public caption tracks.
Transcript quality depends on the caption track provided for the public video.
Auto-generated captions may contain recognition errors.
Legality and responsible use
Use this actor only for content you are allowed to access and process.
YouTube videos and captions may be protected by copyright or platform terms.
You are responsible for ensuring that your use case, storage, redistribution, and analysis comply with applicable laws, platform rules, and rights-holder requirements.
FAQ
Does it work without a YouTube account?
Yes, the actor is designed for public videos and public caption tracks.
Can it extract transcripts from private videos?
No. Private, members-only, deleted, or otherwise inaccessible videos are outside scope.
Why did a video return captionsAvailable=false?
The video may not have public captions, the video may be unavailable, or YouTube may not expose captions for that video.
Can I choose a language?
Yes. Use language for one code or languages for an ordered list such as ["de", "en"].
Can I download SRT or WebVTT?
Yes. Add srt or vtt to outputFormats. The result row includes ready-to-save subtitle text.
Are timestamps included?
Yes, when includeTimestamps is enabled.
Why are captions imperfect?
Some videos use auto-generated captions. These can include speech-recognition mistakes.
Troubleshooting
My run succeeded but transcript text is empty
Check the error and captionsAvailable fields. The video probably has no public caption track.
My preferred language was not returned
Inspect requestedLanguages, availableLanguages, and isTranslated. The requested track may not exist, or YouTube may have translated another public track.
A row has VIDEO_TIMEOUT, BLOCKED, or RATE_LIMITED
The Actor stopped work on that video so the rest of the batch could finish. Use the default residential proxy, retry the affected public URL later, or increase videoTimeoutSecs within its allowed range.
Related Actors
- YouTube Search Results Scraper - discover public videos before extracting transcripts.
- YouTube Channel Videos Scraper - build a channel video URL inventory.
- YouTube Playlist Videos Scraper - expand playlists into transcript-ready video URLs.
- YouTube Video Details Scraper - enrich transcript rows with additional public video metadata.
Support
Report bugs or wrong output from the Actor page. Include the Apify run ID or run URL, input JSON, expected output, actual output, and one reproducible public URL from YouTube when possible.
Privacy and data handling
This Actor runs with Apify limited permissions and processes the public YouTube video URLs, caption tracks, and optional public video metadata needed for the requested output. Results are stored in Apify run storage for your account. FetchCat does not use your inputs or outputs for advertising or model training and does not retain them outside the Apify run except for transient support debugging when you explicitly share run details. You are responsible for lawful use, platform rules, copyright, and avoiding unnecessary personal or sensitive data in inputs.