YouTube Transcripts Scraper: Text, Timed Segments, SRT avatar

YouTube Transcripts Scraper: Text, Timed Segments, SRT

Pricing

from $1.80 / 1,000 transcripts

Go to Apify Store
YouTube Transcripts Scraper: Text, Timed Segments, SRT

YouTube Transcripts Scraper: Text, Timed Segments, SRT

YouTube transcripts (full text, timed segments, language, auto-generated flag) for videos, Shorts, channels or playlists; from $2.48 per 1,000 transcripts. Caption languages, title, channel, date, views, srt/vtt. Videos without captions are free error rows.

Pricing

from $1.80 / 1,000 transcripts

Rating

0.0

(0)

Developer

Arcadium Data

Arcadium Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

YouTube Transcripts Scraper: Text, Timed Segments, SRT

Give it YouTube video, Shorts, channel or playlist links (or plain video IDs) and it returns each transcript as JSON: full text, timed segments, language, whether it was auto-generated, every caption language the video has, and the video's title, channel, length, publish date and views. From $2.48 per 1,000 transcripts (less on higher Apify plans); you pay only for rows you get.

Why this actor

  • Channel and playlist input with a date range, not just single video links.
  • Agent-ready output: languageMatched, availableLanguages and error codes tell an agent what it got and why.
  • srt and vtt formats for subtitle work, plain text for RAG and LLM summaries.
  • Videos without captions, private, age-restricted or missing videos and repeats are free.

Built by Arcadium Data: public data, dated and agent-ready, never personal data.

Use with AI agents

The actor takes plain JSON and returns one flat row per video, so an AI agent or MCP client (for example through mcp.apify.com) can call arcadium/youtube-transcripts directly. Input example for "what does this video say":

{ "urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] }

And for "the last 20 videos of a channel, in English":

{ "urls": ["https://www.youtube.com/@kurzgesagt"], "maxVideosPerSource": 20, "languages": ["en"], "includeSegments": false }

Read transcript (the text), language and isAutoGenerated; segments has timestamps for citations (url + &t=<start>s). 100 transcripts cost $0.45. A video without captions, a private or age-restricted video comes back as a free row with rowType: "error", a code (no_match, not_found, unavailable, blocked) and a message, never as a failed run, so an agent can tell "no captions" from "try again later".

What you get

FieldWhat it holds
videoId, url, titleThe video. Shorts are returned the same way.
channelName, channelId, channelHandle, channelUrlThe channel that published it.
durationSeconds, publishDate, viewCount, likeCount, category, isLiveContent, keywordsBasic video metadata. publishDate is ISO 8601 with YouTube's offset.
descriptionVideo description, short or full (your choice); emails and phone numbers removed.
transcriptThe whole transcript as one string.
segmentsCaption lines in order: start and duration in seconds, text.
segmentCount, wordCountFor chunking and token estimates.
language, languageName, isAutoGeneratedWhich caption track you got, and whether it is YouTube speech recognition (true) or uploaded by the creator (false).
languageMatchedfalse when none of your languages existed and the original-language track was returned instead.
availableLanguagesEvery caption track of the video (code, name, isAutoGenerated), so you can ask for another one.
translationStatus, translatedFromOnly with translateTo: original, translated or unavailable (see Limitations).
srt, vttReady subtitle files when subtitleFormat is srt or vtt.
sourceThe channel or playlist URL the video came from.
scrapedAtWhen the row was read.

Output example:

{
"rowType": "transcript",
"platform": "youtube",
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"channelName": "Rick Astley",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"channelHandle": "@RickAstleyYT",
"channelUrl": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw",
"durationSeconds": 213,
"publishDate": "2009-10-24T23:57:33-07:00",
"viewCount": 1829055386,
"likeCount": 19491653,
"category": "Music",
"isLiveContent": false,
"keywords": ["rick astley", "Never Gonna Give You Up", "nggyu"],
"description": "The official video for “Never Gonna Give You Up” by Rick Astley. Never: The Autobiography OUT NOW!...",
"language": "en",
"languageName": "English",
"isAutoGenerated": false,
"languageMatched": true,
"translationStatus": "not_requested",
"translatedFrom": null,
"availableLanguages": [
{ "code": "en", "name": "English", "isAutoGenerated": false },
{ "code": "en", "name": "English", "isAutoGenerated": true },
{ "code": "de-DE", "name": "German (Germany)", "isAutoGenerated": false },
{ "code": "ja", "name": "Japanese", "isAutoGenerated": false }
],
"transcript": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ ...",
"segmentCount": 61,
"wordCount": 487,
"segments": [
{ "start": 1.36, "duration": 1.68, "text": "[♪♪♪]" },
{ "start": 18.64, "duration": 3.24, "text": "♪ We're no strangers to love ♪" },
{ "start": 22.64, "duration": 4.32, "text": "♪ You know the rules and so do I ♪" }
],
"source": null,
"scrapedAt": "2026-10-22T08:00:00.000Z"
}

Input

{
"urls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://www.youtube.com/@kurzgesagt",
"https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI"
],
"languages": ["en"],
"maxVideosPerSource": 10
}
FieldWhat it does
urlsVideo links (watch?v=, youtu.be, /shorts/, /live/, /embed/), bare video IDs, channel links (/@handle, /channel/UC..., /c/..., /user/...; add /shorts or /streams for those tabs) and playlist links.
languagesPreferred caption languages in order, e.g. ["en", "de"]. en also matches en-US. Empty: the video's original spoken language.
captionTypeany (uploaded first, then auto-generated), manual or auto.
translateToA language code. A native track in that language is used when the video has one; otherwise YouTube's own translation is tried.
maxVideosPerSourceTranscripts per channel or playlist (default 50, up to 5,000). Channels are read newest first.
publishedAfter, publishedBeforeDate range, YYYY-MM-DD. Skipped videos are free; a channel stops at the first older videos.
includeSegmentsTimed caption lines (on by default).
subtitleFormatnone, srt or vtt.
descriptionshort (default), full or none.
maxResultsStop after this many transcripts in total. A cost cap.
includeErrorRowsA free row for every video or URL without a transcript (on by default).

Input names of the most used YouTube transcript actors are accepted as they are (youtube_url, channel_url, videoUrl, videoUrls, startUrls, language, max_videos, start_date, end_date, translate_to, targetLanguage, transcript_type, output_formats, maxVideosPerChannel, maxItems, outputFormat), so an existing input can be pasted in.

Use it from code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("arcadium/youtube-transcripts").call(run_input={
"urls": ["https://www.youtube.com/@kurzgesagt"],
"maxVideosPerSource": 5,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item["rowType"] == "transcript":
print(item["title"], item["wordCount"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('arcadium/youtube-transcripts').call({
urls: ['https://www.youtube.com/watch?v=dQw4w9WgXcQ'],
subtitleFormat: 'srt',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].transcript.slice(0, 200));

Pricing

You pay per transcript delivered. Videos without captions, private, age-restricted or missing videos, repeats and videos outside your date range are free. Every row already includes the video metadata (title, channel, length, date, views, caption languages); there is no extra metadata charge.

Apify planPer 1,000 transcripts
Free$2.48
Bronze$2.25
Silver$2.03
Gold, Platinum, Diamond$1.80

Plus a one-off $0.001 per GB of memory when a run starts.

Set a maximum cost per run in the Apify run options and the actor stops before it goes over.

Use cases

  • RAG and knowledge bases: index a channel's or a course playlist's transcripts with timestamps for citations.
  • Summaries and notes: feed transcript to an LLM; wordCount tells you how many tokens to expect.
  • Content and competitor research: what a channel talked about this month (publishedAfter).
  • Subtitles: download srt or vtt in the language you need.
  • Agents: "watch" a video for the user by reading its transcript.

Limitations

  • Only captions YouTube already has (uploaded or auto-generated). Videos without any captions give a free no_match row; the actor does not download or transcribe audio.
  • Auto-generated transcripts have no punctuation and can misspell names.
  • Translation: YouTube currently refuses its machine-translated tracks to anonymous clients. With translateTo, a video that has a native track in that language returns it (translationStatus: "original", common for big channels and TED talks, which carry dozens of languages); otherwise you get the original language with translationStatus: "unavailable".
  • Age-restricted and members-only videos need a signed-in account and are skipped (free unavailable row). Premieres and upcoming streams have no captions yet.
  • Live streams: captions of a running live stream are not available; recorded streams work once YouTube has processed them.

Privacy

Public data only, read the way an anonymous visitor's browser and the YouTube app read it. No login, no cookies, no account. Comments and viewer data are never collected. Emails and phone numbers that appear in descriptions or transcripts are replaced with [email] and [phone]. The channel name is the publisher of the video.

FAQ

Which language do I get? The first of your languages that the video has, uploaded captions before auto-generated ones. With no languages, the original spoken language (the language of the auto-generated track); a video without an auto-generated track gives YouTube's default track, usually English when there is one. availableLanguages lists everything the video offers.

A video returned no transcript. Why? Look at its error row: no_match means the video has no captions (or none of the captionType you asked for), not_found that it is private or removed, unavailable that it is age-restricted, members-only or not published yet. These rows are free.

How fast is it? About 1 to 1.5 seconds per video, 4 videos in parallel. 100 transcripts take one to two minutes.

Something looks wrong in the output. Who do I tell? Open an issue on the actor page with the run link. We read them all.