YouTube Transcript Scraper — Captions, Subtitles & Video Data avatar

YouTube Transcript Scraper — Captions, Subtitles & Video Data

Pricing

from $3.50 / 1,000 video transcripts

Go to Apify Store
YouTube Transcript Scraper — Captions, Subtitles & Video Data

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

Trevor Ortega

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

10 days ago

Last modified

Categories

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?

FieldDescription
videoId, urlVideo ID and watch URL
title, description, tags, categoryVideo title, full description, creator tags, YouTube category
channelName, channelId, channelHandle, channelUrlChannel that published the video
publishDate, uploadDateISO timestamps with time zone
durationSeconds, viewCount, likeCountLength, views and likes as YouTube shows them
thumbnailUrlHighest-resolution thumbnail
isLiveContent, isFamilySafe, isUnlistedFlags
transcriptFull transcript as one plain-text string (ready for LLMs, search or summaries)
segmentsCaption lines: {start, duration, text} with times in seconds
language, languageName, isAutoGeneratedLanguage of the returned transcript and whether YouTube generated it automatically
availableLanguagesEvery caption track on the video: code, name, auto-generated or manual
isTranslatableWhether YouTube offers machine translation for the track
translationLanguage, translationStatus, translatedTranscript, translatedSegmentsPresent when Translate to is set
transcriptStatusok, or no_captions when you choose to keep videos without captions
sourceUrl, positionInSource, scrapedAtWhich input produced the video, its position in the playlist/channel list, and when it was scraped

How to scrape YouTube transcripts

  1. 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/….
  2. 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.
  3. Optionally set Preferred transcript language (for example en) and Translate to (for example es).
  4. 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.

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.