YouTube Transcript Scraper
Pricing
from $2.50 / 1,000 transcripts
YouTube Transcript Scraper
YouTube transcript API: bulk transcripts and captions for videos, Shorts, channels, playlists and searches. Timestamps, text, SRT/VTT, RAG-ready chunks, language fallback, translation. $2.50 per 1,000 transcripts; no captions = no charge.
Pricing
from $2.50 / 1,000 transcripts
Rating
0.0
(0)
Developer
John Wilkinson
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
YouTube Transcript API & Scraper: Bulk Videos, Channels, Shorts, RAG-Ready
Get YouTube transcripts, captions and subtitles in bulk with timestamps, as JSON, plain text, SRT, or WebVTT. It works with single videos, YouTube Shorts, whole channels, playlists, and YouTube search results. Output is ready for RAG, LLMs, AI agents, content repurposing, and research: time-aligned chunks with deep links, language fallback, and YouTube's built-in caption translation.
$2.50 per 1,000 transcripts. Videos without captions, private or deleted videos, and errors are free.
Why this YouTube transcript API?
- Bulk input: paste any mix of video URLs, Shorts URLs,
youtu.belinks, video IDs, channel URLs or@handles, playlist URLs, and search queries. - Whole channels and playlists: takes the newest N videos, Shorts, or live streams of a channel, with an optional published-after date filter.
- Shorts transcripts: Shorts use the same code path as regular videos.
- Timestamps: segments with
startanddurationin seconds, text with[mm:ss]markers, SRT, and VTT. - RAG-ready chunks: time-aligned
chunks[]withstart,end,text, and a&t=123sdeep link for citations. - Language control: a preferred-language list (
en,es,de…), human-made captions preferred over auto-generated, fallback to the original language, and optional translation (translateTo). - Reliable on Apify: residential proxy by default, a fresh IP on every retry, and only a few KB transferred per video, so it stays fast and cheap.
- Fair pricing: you pay only for transcripts you receive. A clean
statusanderrorCodeon every row (no_captions,unavailable,private,age_restricted,blocked…). - Metadata included: title, channel, channel ID, duration, views, Shorts flag, available caption languages, and a metadata-only mode.
Input
| Field | Default | Description |
|---|---|---|
urls | – | Videos, Shorts, youtu.be links, IDs, channels (@handle, /channel/UC…), playlists |
searchQueries | – | Get transcripts of top search results |
maxVideosPerSource | 20 | Newest N per channel tab, playlist, or search |
channelContent | videos | videos, shorts, videos+shorts, streams, all |
publishedAfter | – | YYYY-MM-DD (approximate for listings) |
languages | ["en"] | Preferred caption languages, in order |
preferManualCaptions | true | Human captions before auto-generated |
fallbackToAnyLanguage | true | Otherwise use the original language |
translateTo | – | e.g. en: YouTube auto-translation |
includeText / includeSegments | true | Plain text / timestamped segments |
includeTimestampedText | false | Text with [m:ss] every ~30 s |
includeChunks / chunkSizeChars | false / 2000 | RAG chunks |
includeSrt / includeVtt | false | Subtitle files as strings |
metadataOnly | false | Skip transcripts and return video metadata only |
maxVideos | 0 | Overall cap (0 = none) |
proxyConfiguration | Residential | Keep the default for best reliability |
Example input
{"urls": ["https://www.youtube.com/watch?v=T-D1OfcDW1M","https://www.youtube.com/shorts/aNI2jv7lBPQ","https://www.youtube.com/@IBMTechnology","https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI"],"searchQueries": ["retrieval augmented generation explained"],"maxVideosPerSource": 10,"publishedAfter": "2025-01-01","languages": ["en"],"includeChunks": true}
Output
One dataset item per video:
{"videoId": "T-D1OfcDW1M","url": "https://www.youtube.com/watch?v=T-D1OfcDW1M","status": "success","title": "What is Retrieval-Augmented Generation (RAG)?","channelName": "IBM Technology","channelId": "UCKWaEZ-_VweaEx1j62do_vQ","durationSec": 395,"isShort": false,"viewCount": 1500000,"language": "en","isAutoGenerated": false,"availableLanguages": ["en", "en (auto)"],"wordCount": 1062,"text": "Large language models. They are everywhere...","segments": [{ "start": 0.0, "duration": 4.2, "text": "Large language models." }],"chunks": [{ "index": 0, "start": 0.0, "end": 98.4, "text": "...", "url": "https://www.youtube.com/watch?v=T-D1OfcDW1M&t=0s" }]}
Videos without captions return "status": "no_captions" and are not charged. Failures return "status": "error" with errorCode and error. Run statistics are saved to the RUN_SUMMARY key in the key-value store.
Pricing (pay per event)
| Event | Price |
|---|---|
| Actor start (charged by Apify, per GB of run memory) | $0.0005 per GB |
| Transcript returned | $0.0025 ($2.50 per 1,000) |
| Video metadata (metadata-only mode) | $0.0005 |
Listing channels, playlists and searches is free; videos without captions, private/deleted videos and errors are free. Run with low memory (512 MB is enough) and batch many videos per run to keep the start fee small. Set a maximum cost per run in Apify to cap spend; the Actor stops cleanly at the limit.
Use cases
- RAG / AI knowledge bases: index a channel's videos into a vector database with timestamped citations.
- Content repurposing: turn videos and Shorts into blog posts, newsletters, threads, and show notes.
- Research and monitoring: analyse what creators, competitors, or experts say over time.
- Subtitles: export SRT or VTT in any language YouTube provides or can translate to.
- AI agents and MCP: call it from Claude, ChatGPT, LangChain, n8n, Make, or Zapier through the Apify API or MCP server.
API example
curl -X POST "https://api.apify.com/v2/acts/jcwilk~youtube-transcripts/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"urls":["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"includeSegments":false}'
FAQ
Can I use it as a YouTube transcript API from code or an AI agent? Yes: call run-sync-get-dataset-items (example above) or the Apify MCP server; you get JSON back in seconds for single videos.
Does it work for Shorts? Yes. Paste a /shorts/ URL, or set channelContent to shorts for a channel.
What if a video has no captions? You get status: no_captions and pay nothing. This Actor reads YouTube's own captions (manual or auto-generated); it does not run speech-to-text.
Which languages? Every caption track YouTube has for the video, plus YouTube's translation into ~100 languages via translateTo.
Why a residential proxy? YouTube blocks many datacenter IPs. Each video needs only a few KB through the proxy, so the cost is included in the price.
Limitations: private, members-only, and some age-restricted videos cannot be read. Live streams have captions only after they end. Listing dates are approximate ("2 weeks ago").
This tool reads publicly available caption data. You are responsible for using it in line with YouTube's terms and applicable law.