YouTube Transcript Scraper — Subtitles & Captions, Timestamps avatar

YouTube Transcript Scraper — Subtitles & Captions, Timestamps

Pricing

from $5.00 / 1,000 transcript delivereds

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

YouTube Transcript Scraper — Subtitles & Captions, Timestamps

Get YouTube transcripts from video links, IDs or channels: the captions in the spoken language (human-written when available, else auto-generated, de-duplicated) as clean text plus timed segments. $0.005 per transcript on every plan. No captions, no charge. No API key.

Pricing

from $5.00 / 1,000 transcript delivereds

Rating

0.0

(0)

Developer

Nicholas Cheng

Nicholas Cheng

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 hours ago

Last modified

Share

YouTube Transcript Scraper

Give it YouTube links, video IDs or channels — get back what is said in each video, as clean text with timestamps. The transcript is the caption track in the language that is actually spoken: the human-written captions when the video has them, otherwise YouTube's auto-generated ones, de-duplicated so the text reads as one pass of the speech. No API key, no login, no cookies.

You pay only for transcripts that came back. A video with no captions, a private or deleted video, or one YouTube would not serve produces an explanatory row and costs nothing.

InputVideo URLs / IDs (watch, Shorts, youtu.be, embed) and/or channels (@handle, channel URL, UC… id) for their latest uploads
OutputOne row per transcript: plain text + timed segments + title, channel, duration, language
Price$0.005 per transcript — the same on every Apify plan
Not chargedVideos without captions, unavailable videos, filtered-out videos

What you get

Real output for jNQXAC9IVRw (the first video on YouTube):

{
"itemType": "transcript",
"videoId": "jNQXAC9IVRw",
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"title": "Me at the zoo",
"channelId": "UC4QobU6STFB0P71PMvOGN5A",
"channelName": "jawed",
"durationSeconds": 19,
"transcriptLanguage": "en",
"transcriptType": "manual",
"transcript": "All right, so here we are, in front of the elephants the cool thing about these guys is that they have really... really really long trunks and that's cool (baaaaaaaaaaahhh!!) and that's pretty much all there is to say",
"subtitles": [
{
"language": "en",
"type": "manual",
"name": "English",
"text": "All right, so here we are, in front of the elephants … and that's pretty much all there is to say",
"segments": [
{ "start": 1.2, "end": 3.36, "text": "All right, so here we are, in front of the elephants" },
{ "start": 5.318, "end": 7.974, "text": "the cool thing about these guys is that they have really..." },
{ "start": 7.974, "end": 12.616, "text": "really really long trunks" },
{ "start": 12.616, "end": 14.367, "text": "and that's cool" },
{ "start": 14.421, "end": 15.733, "text": "(baaaaaaaaaaahhh!!)" },
{ "start": 16.881, "end": 18.881, "text": "and that's pretty much all there is to say" }
]
}
],
"availableCaptionLanguages": [
{ "language": "en", "isAutoGenerated": false },
{ "language": "de", "isAutoGenerated": false }
]
}
  • transcript — the whole thing as one string, ready for an LLM, a search index or a summary.
  • segments — the same text as timed cues (start / end in seconds), for quoting a moment or building chapters.
  • transcriptType — manual (written by a person) or auto-generated (YouTube's speech recognition). Auto-generated captions arrive as "roll-up" cues that repeat each line two or three times; they are de-duplicated here, which is a common problem in raw auto-caption dumps.
  • availableCaptionLanguages — every caption track the video has, so you know whether a translation exists.

Input

{
"videoUrls": ["https://www.youtube.com/watch?v=aircAruvnKk", "jNQXAC9IVRw"],
"channelUrls": ["@veritasium"],
"maxVideosPerChannel": 5
}
OptionDefaultNotes
videoUrls—Watch, Shorts, youtu.be, embed, live links, or bare 11-character IDs
channelUrls—Transcribe a channel's latest uploads. @handle, channel URL, or UC… id
maxVideosPerChannel5Per channel, counting only videos that actually had a transcript
minViews, minDurationSeconds, maxDurationSeconds, titleContains—Skip videos you do not want before paying for them — e.g. minDurationSeconds: 61 drops Shorts
publishedAfter—ISO date. Applies to channel uploads (read from the channel listing); links you pass directly are not date-filtered
maxItems0Hard cap on transcripts for the run — bounds your spend

A channel page lists about 30 recent uploads; that is the pool maxVideosPerChannel draws from.


Pricing

$0.005 per transcript, on every Apify plan — Free, Bronze, Silver, Gold, Platinum, Diamond. Check the Pricing tab: all six columns are identical. There is no start fee and no per-minute fee.

The event is charged once per transcript delivered. Being straight about how that compares: several transcript Actors charge per video processed or per dataset row, which includes videos that turned out to have no captions. Here those rows are free, so the price you see is the price per transcript you actually get.

What you are not charged for

What happens here
Videos without captionsOne row with chargedForThis: false and the reason. Common for music videos and clips without speech.
Unavailable videosPrivate, deleted, region-blocked or age-restricted videos produce one explanatory row, not billed.
Bot checksIf YouTube keeps refusing after eight tries from different addresses and clients, the row says so and is not billed.
Filtered-out videosNot written, not billed.
The free planSame code path, same fields, same price. No demo mode, no row cap.

What this Actor cannot do

  • No speech recognition of our own. The transcript is YouTube's own captions. If YouTube has none for a video, you get none — we do not download the audio and transcribe it.
  • One language per video. You get the spoken language. Translations YouTube offers are listed in availableCaptionLanguages but not downloaded.
  • No members-only or private videos, and no age-restricted ones — those need a signed-in account and this Actor never signs in.
  • No search. It works from links and channels, not keywords.
  • For view counts, likes, publish dates and full descriptions, use the YouTube Video Stats Scraper (it can include the transcript too, with includeSubtitles).

How it stays working

The caption list is fetched the way YouTube's mobile apps fetch it — the iOS, Android VR and Android app clients in turn — first from a datacenter address and, if YouTube shows a bot check, from fresh residential addresses, up to eight tries. The caption file itself is downloaded directly. The watch page is never loaded, so a transcript costs a fraction of a full video scrape.

Measured over three rounds of fifteen videos (news, lectures, music; English, German, Korean and Arabic speech): the caption list came back for 14, 15 and 15 of 15 on a single pass through the clients, and all 170 caption downloads returned text. Client settings follow the open-source yt-dlp project and are updated when YouTube changes them.


Integrating

curl -X POST "https://api.apify.com/v2/acts/nick.cheng~youtube-transcript-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H 'Content-Type: application/json' \
-d '{"videoUrls":["aircAruvnKk","jNQXAC9IVRw"]}'

Official clients exist for JavaScript and Python; results export as JSON, CSV or Excel; and the Actor is available as a tool to AI agents through Apify's MCP server.