YouTube Transcripts Scraper: Text, Timed Segments, SRT
Pricing
from $1.80 / 1,000 transcripts
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
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,availableLanguagesand 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
| Field | What it holds |
|---|---|
videoId, url, title | The video. Shorts are returned the same way. |
channelName, channelId, channelHandle, channelUrl | The channel that published it. |
durationSeconds, publishDate, viewCount, likeCount, category, isLiveContent, keywords | Basic video metadata. publishDate is ISO 8601 with YouTube's offset. |
description | Video description, short or full (your choice); emails and phone numbers removed. |
transcript | The whole transcript as one string. |
segments | Caption lines in order: start and duration in seconds, text. |
segmentCount, wordCount | For chunking and token estimates. |
language, languageName, isAutoGenerated | Which caption track you got, and whether it is YouTube speech recognition (true) or uploaded by the creator (false). |
languageMatched | false when none of your languages existed and the original-language track was returned instead. |
availableLanguages | Every caption track of the video (code, name, isAutoGenerated), so you can ask for another one. |
translationStatus, translatedFrom | Only with translateTo: original, translated or unavailable (see Limitations). |
srt, vtt | Ready subtitle files when subtitleFormat is srt or vtt. |
source | The channel or playlist URL the video came from. |
scrapedAt | When 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}
| Field | What it does |
|---|---|
urls | Video 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. |
languages | Preferred caption languages in order, e.g. ["en", "de"]. en also matches en-US. Empty: the video's original spoken language. |
captionType | any (uploaded first, then auto-generated), manual or auto. |
translateTo | A language code. A native track in that language is used when the video has one; otherwise YouTube's own translation is tried. |
maxVideosPerSource | Transcripts per channel or playlist (default 50, up to 5,000). Channels are read newest first. |
publishedAfter, publishedBefore | Date range, YYYY-MM-DD. Skipped videos are free; a channel stops at the first older videos. |
includeSegments | Timed caption lines (on by default). |
subtitleFormat | none, srt or vtt. |
description | short (default), full or none. |
maxResults | Stop after this many transcripts in total. A cost cap. |
includeErrorRows | A 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 ApifyClientclient = 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 plan | Per 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.
Related actors and data
- YouTube Videos Scraper: Channels, Playlists, Search
- Google News Scraper: Real Article URLs, Full Text
- Substack Posts Scraper: Likes, Comments, Free Post Text
- Arcadium Data MCP Server: AI agents can ask the same questions as tools (
youtube_transcript).
Use cases
- RAG and knowledge bases: index a channel's or a course playlist's transcripts with timestamps for citations.
- Summaries and notes: feed
transcriptto an LLM;wordCounttells you how many tokens to expect. - Content and competitor research: what a channel talked about this month (
publishedAfter). - Subtitles: download
srtorvttin 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_matchrow; 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 withtranslationStatus: "unavailable". - Age-restricted and members-only videos need a signed-in account and are skipped (free
unavailablerow). 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.