YouTube Transcript Scraper — Captions, Subtitles & Video Data
Pricing
from $3.50 / 1,000 video transcripts
YouTube Transcript Scraper — Captions, Subtitles & Video Data
Returns YouTube transcripts (full text + timed segments), language, auto vs manual flag, caption languages, optional translation and video metadata for video, playlist and channel URLs.
Pricing
from $3.50 / 1,000 video transcripts
Rating
0.0
(0)
Developer
Trevor Ortega
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
10 days ago
Last modified
Share
Get the transcript of any YouTube video, playlist or channel: the full text, every caption line with its start time and duration, the language, whether the captions are auto-generated or uploaded by the creator, the list of all caption languages, an optional translation, and the video's metadata (title, channel, publish date, duration, views, likes, tags, description, thumbnail).
Built for reliability. Every video is retried on fresh IPs and through two different YouTube app clients until the captions come back. In our test runs, every public video with captions was delivered: 282 of 282 deliveries (240 distinct videos) from a playlist and 13 channels (videos and Shorts tabs), in English, Spanish, German, Hindi, Punjabi, Chinese and more. Videos that have no captions at all are skipped and not charged.
What data does YouTube Transcript Scraper extract?
| Field | Description |
|---|---|
videoId, url | Video ID and watch URL |
title, description, tags, category | Video title, full description, creator tags, YouTube category |
channelName, channelId, channelHandle, channelUrl | Channel that published the video |
publishDate, uploadDate | ISO timestamps with time zone |
durationSeconds, viewCount, likeCount | Length, views and likes as YouTube shows them |
thumbnailUrl | Highest-resolution thumbnail |
isLiveContent, isFamilySafe, isUnlisted | Flags |
transcript | Full transcript as one plain-text string (ready for LLMs, search or summaries) |
segments | Caption lines: {start, duration, text} with times in seconds |
language, languageName, isAutoGenerated | Language of the returned transcript and whether YouTube generated it automatically |
availableLanguages | Every caption track on the video: code, name, auto-generated or manual |
isTranslatable | Whether YouTube offers machine translation for the track |
translationLanguage, translationStatus, translatedTranscript, translatedSegments | Present when Translate to is set |
transcriptStatus | ok, or no_captions when you choose to keep videos without captions |
sourceUrl, positionInSource, scrapedAt | Which input produced the video, its position in the playlist/channel list, and when it was scraped |
How to scrape YouTube transcripts
- Paste video URLs or IDs, playlist URLs or channel URLs into YouTube URLs or video IDs, one per line. All usual forms work:
watch?v=,youtu.be/,/shorts/,/live/,/embed/,/playlist?list=,/@handle,/channel/UC…,/c/…,/user/…. - For playlists and channels, set Max videos per playlist / channel (newest first for channels). Use Channel tab to pick Videos, Shorts or past Live streams.
- Optionally set Preferred transcript language (for example
en) and Translate to (for examplees). - Click Start. Results appear in the Dataset tab. Download them as JSON, CSV or Excel, or fetch them through the API.
Input example
{"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI","https://www.youtube.com/@veritasium"],"maxVideosPerSource": 20,"language": "en","translateTo": "de","includeSegments": true,"maxItems": 100,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Output example
{"videoId": "J1WoNuemKOg","url": "https://www.youtube.com/watch?v=J1WoNuemKOg","title": "We sent a camera to space to film the solar eclipse","channelName": "Veritasium","channelId": "UCHnyfMqiRRG1u-2MsSQLbXA","channelHandle": "@veritasium","channelUrl": "https://www.youtube.com/@veritasium","publishDate": "2026-08-17T07:30:16-07:00","durationSeconds": 1365,"viewCount": 2735031,"likeCount": 67673,"category": "Education","tags": ["veritasium", "science", "physics"],"thumbnailUrl": "https://i.ytimg.com/vi/J1WoNuemKOg/maxresdefault.jpg","transcriptStatus": "ok","language": "en","languageName": "English","isAutoGenerated": false,"transcript": "In just a couple of seconds Spain is about to get its first total solar eclipse in over 100 years. …","segmentCount": 476,"segments": [{ "start": 0.0, "duration": 1.001, "text": "In just a couple of seconds" },{ "start": 1.001, "duration": 3.628, "text": "Spain is about to get its first total solar eclipse in over 100 years." }],"availableLanguages": [{ "languageCode": "en", "name": "English", "isAutoGenerated": false },{ "languageCode": "en", "name": "English (auto-generated)", "isAutoGenerated": true }],"isTranslatable": true,"translationLanguage": "de","translationStatus": "translated","translatedTranscript": "In wenigen Sekunden wird Spanien die erste totale Sonnenfinsternis seit über 100 Jahren erleben. …","sourceUrl": "https://www.youtube.com/@veritasium","positionInSource": 3,"scrapedAt": "2026-10-07T20:21:10Z"}
Which transcript language do I get?
With Preferred transcript language empty, you get the video's original spoken language. This also holds for videos with dubbed audio, where YouTube adds an auto-generated track for every dub language. A caption track uploaded by the creator is used when there is one, and YouTube's auto-generated track otherwise. Set a language code such as en, de or pt-BR to prefer that language (creator track first, then auto-generated). If the video has no track in that language, the original-language transcript is returned. Set Translate to if you need it in your language anyway. availableLanguages always lists every track on the video.
Can it translate YouTube subtitles?
Yes. Set Translate to (for example en, es, fr). If the creator uploaded a track in that language, it is used as is (translationStatus: native_track). Otherwise the Actor asks YouTube for its own machine translation (translated). YouTube rate-limits machine translation hard, so the Actor retries it on fresh IPs. In our tests 19 of 20 videos were translated. A video whose translation still fails keeps its original transcript and gets translationStatus: rate_limited. not_offered means YouTube does not allow translation for that track.
Does it work without login or an API key?
Yes. It reads the same public caption data the YouTube apps use. No Google account, no cookies and no YouTube Data API key are needed. Age-restricted, private and members-only videos need a login, so they are skipped and not charged. The run summary (key-value store, SUMMARY) counts them.
Proxy note: why residential?
YouTube answers most datacenter IPs with "Sign in to confirm you're not a bot". In our tests on Apify datacenter IPs, even 8 retries per video left about 1 in 10 videos without a transcript and many without metadata. On Apify RESIDENTIAL proxy (the default), every video in our tests went through. The Actor trims each YouTube answer to a few KB, so residential traffic is about 25–55 KB per video (long videos have longer transcripts). In our runs, total platform usage (residential proxy + compute) came to about $0.30–0.50 per 1,000 videos. With translation it was about $1.20 per 1,000, because of the extra retries. Platform usage is billed to your Apify account in addition to the per-result price.
Monitor changes on a schedule
Turn on Only new or changed items to get a feed of new uploads: each run remembers which videos earlier runs returned and outputs only videos it has not returned before, from the newest Max videos per playlist / channel of each channel or playlist. Videos already returned are skipped before any request, so they cost nothing; a video that was skipped (no captions yet, upcoming premiere, members-only, failed) is not remembered and is tried again on the next run. Save the input as a task and add a Schedule in Apify (for example daily); give each watch its own Monitoring key if several schedules use the same channels. Every output item has changeType: "new". Video URLs in the input are returned on the first run only.
Pricing
Pay per result: $0.0035 per video saved ($3.50 per 1,000 transcripts), plus the small platform usage above. Videos without captions, unavailable videos and failed videos are not charged. Use Max results to cap the cost of a run. There is no subscription, and Apify's free plan is enough to try it.
Integrations and API
Use it from Zapier, Make, n8n or Google Sheets, or call it from Python/Node with the Apify client (see the API tab). AI agents can call it through Apify's MCP server. A single video usually finishes in a few seconds. The transcript field is ready to drop into an LLM prompt for summaries, Q&A, translation or search indexing.
Is it legal to scrape YouTube transcripts?
The Actor only reads data that YouTube shows publicly to any visitor: captions, titles, descriptions and public counts. It does not log in, does not bypass age or membership gates, and does not download video or audio. Transcripts are the creators' content: check copyright and YouTube's terms for your use case, especially before republishing. You are responsible for how you use the data.
Support
Found a video that fails, or need another field? Open an issue in the Issues tab with the video URL. Issues are usually answered within a day.