YouTube Transcript & Subtitles Scraper (any language, SRT) avatar

YouTube Transcript & Subtitles Scraper (any language, SRT)

Pricing

from $2.00 / 1,000 transcript delivereds

Go to Apify Store
YouTube Transcript & Subtitles Scraper (any language, SRT)

YouTube Transcript & Subtitles Scraper (any language, SRT)

Get YouTube transcripts and subtitles with timestamps for any video or Short: manual or auto-generated captions, any language, auto-translation, plain text, SRT and VTT, plus title, channel, views and publish date. Never returns blank transcripts. Pay only per transcript delivered.

Pricing

from $2.00 / 1,000 transcript delivereds

Rating

0.0

(0)

Developer

ScrapeMole

ScrapeMole

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

YouTube Transcript Scraper

Get the transcript of any YouTube video or Short, with timestamps, in seconds. Creator-uploaded or auto-generated captions, any language, optional auto-translation, plain text for AI/LLMs, timestamped segments, and ready-made SRT and WebVTT subtitle files. Each result includes the video's title, channel, duration, views, publish date, description and keywords at no extra cost.

You only pay for transcripts delivered. Videos without captions, private or deleted videos and invalid links are never charged.

Why this transcript scraper doesn't return blank results

The most common failure of YouTube transcript tools is a "successful" run with an empty transcript. It happens because the caption links YouTube gives the desktop website now need a hidden proof-of-origin token, and they quietly return nothing without it. This Actor:

  • Gets caption tracks through YouTube's mobile app interfaces (iOS first, then Android), which still return working caption files, and checks that the file actually has text before returning it.
  • Falls back automatically: if one route returns an empty file or gets rate-limited, the next one is tried. Rate limits (HTTP 429) are retried with exponential backoff; the whole run slows down together instead of hammering YouTube.
  • Detects YouTube's "confirm you're not a bot" check and retries on a fresh IP, switching to residential IPs automatically if needed. You don't pay extra for that.
  • Tells you exactly why when there's no transcript: NO_DATA (the video has no captions in any language), NOT_FOUND (private, deleted or wrong ID), or INVALID_INPUT (not a YouTube link), each with a plain-English message and the list of languages that are available.

Live tests, 8 Oct 2026 (real YouTube, unbiased sample of top search results for 20 queries in 9 languages, cloud server, no proxy): see Test results.

What you get

FieldDescription
transcriptTextFull transcript as one clean string (perfect for ChatGPT, Claude, RAG, summaries, search)
segments[{ start, duration, end, text }] in seconds
srt, vttReady-to-use subtitle files (optional)
language, languageName, isAutoGenerated, isTranslatedWhich caption track you got
availableLanguagesEvery caption track the video has
title, channelName, channelId, channelUrl, durationSeconds, viewCount, publishDate, description, keywords, thumbnailUrl, isLiveVideo details, free
wordCount, characterCount, segmentCountHandy for LLM token budgeting

How to get a YouTube transcript

  1. Paste one or more video links or IDs (watch links, youtu.be, Shorts, live and embed URLs all work).
  2. Optionally choose preferred languages (e.g. en, es, pt-BR) or Translate to a language.
  3. Click Start and download the transcripts as JSON, CSV, Excel, or plain text through the API.

Input example

{
"videos": [
"https://www.youtube.com/watch?v=aircAruvnKk",
"https://youtu.be/jNQXAC9IVRw",
"https://www.youtube.com/shorts/VIDEO_ID"
],
"languages": ["en"],
"translateTo": "",
"includeSrt": true
}

Output example

{
"videoId": "jNQXAC9IVRw",
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"status": "ok",
"title": "Me at the zoo",
"channelName": "jawed",
"durationSeconds": 19,
"publishDate": "2005-04-23",
"language": "en",
"languageName": "English",
"isAutoGenerated": false,
"isTranslated": false,
"availableLanguages": [{ "languageCode": "en", "languageName": "English", "isAutoGenerated": false }, { "languageCode": "de", "languageName": "German", "isAutoGenerated": false }],
"transcriptText": "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",
"segments": [{ "start": 1.2, "duration": 2.16, "end": 3.36, "text": "All right, so here we are, in front of the elephants" }],
"wordCount": 39
}

Videos without captions

{ "videoId": "M1-AuVWOo1I", "status": "error", "errorCode": "NO_DATA", "errorMessage": "This video has no captions: the uploader added none and YouTube did not auto-generate any.", "title": "How to Cook Pasta | ..." }

Not charged. If you need text for videos without captions, you need speech-to-text, which this Actor doesn't do.

Switching from another transcript Actor

Already calling pintostudio/youtube-transcript-scraper from code, n8n, Make or Zapier? Change the Actor ID and keep your input: {"videoUrl": "https://www.youtube.com/watch?v=…", "targetLanguage": "pt"} works here as-is. videoUrls, urls and url are accepted too.

targetLanguage is honoured strictly: you get the video's own captions in that language when they exist, otherwise YouTube's translation into it, and the row's language and isTranslated fields tell you which. If YouTube refuses the translation (it rate-limits translations), you get the original transcript with a translationError note instead of an empty result. Instead of a bare list of segments you get one row per video with segments (start, duration, text), the plain text, optional SRT/VTT and video metadata. Videos without captions are reported as free error rows rather than empty results.

Pricing

Pay per transcript. Proxy and platform costs are included, with no start fee and no charge for failed or caption-less videos, or for translations YouTube refuses.

Apify planPrice per transcript1,000 transcripts
Free$0.004$4.00
Starter (Bronze)$0.003$3.00
Scale (Silver)$0.0025$2.50
Business (Gold)$0.002$2.00

Set Max cost per run and the Actor stops cleanly when it reaches it.

Use cases

  • AI and LLM pipelines: summarize videos, build RAG knowledge bases, generate blog posts, show notes and quizzes from YouTube content.
  • Content repurposing: turn videos into articles, social posts and newsletters; create subtitles (SRT/VTT) for re-uploads.
  • Research and monitoring: analyze what creators, competitors or politicians say; track mentions of brands and keywords.
  • SEO: mine transcripts for keywords and questions your audience asks.
  • Language learning and accessibility: get captions in another language with YouTube's own translation.

API, Python and AI agents

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("scrapemole/youtube-transcript-scraper").call(run_input={
"videos": ["https://www.youtube.com/watch?v=aircAruvnKk"], "languages": ["en"]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item.get("transcriptText", item.get("errorMessage"))[:200])

Works with n8n, Make, Zapier, LangChain, LlamaIndex and the Apify MCP server, so Claude, ChatGPT or Cursor agents can fetch transcripts on their own.

Test results

Live tests on 2026-10-08 against real YouTube, from a cloud server with no proxy. The videos were the top search results for 20 queries in 9 languages (cooking, news, lectures, Shorts, music, gaming...), not hand-picked:

MetricResult
Runs with varied options (languages, translation, SRT/VTT, manual-first)12/12 (100.0%)
Videos60
Transcripts returned where captions exist47/47 (100.0%)
Empty transcripts returned0
Videos with no captions on YouTube13: reported as NO_DATA, not charged (each one checked independently)
Billing accuracyCharged exactly once per transcript delivered
Stress run: 120 videos, 8 parallel91/91 (100.0%) transcripts where captions exist, 0 failures, 7.9s total

FAQ

Does it work for YouTube Shorts and live streams? Yes. Shorts and finished live streams with captions work like normal videos. Live streams that are still running usually have no caption track yet.

Which language will I get? The first of your preferred languages that exists (creator captions before auto-generated, unless you change that). If none exist and "Fall back to any language" is on, you get the video's original-language transcript. availableLanguages lists everything the video has.

Can it translate? Yes. Set Translate to (e.g. en) and YouTube's own auto-translation is used whenever the original track supports it (isTranslated: true). YouTube rate-limits translation more strictly than plain captions. If a translation is refused even after retries, you still get the original-language transcript with a translationError note, and that item isn't charged. For large translation jobs, use residential proxy.

Why does a video return NO_DATA when I can see captions on YouTube? Very rarely YouTube shows captions that are burned into the video picture. Those are part of the image, not a caption track, so no tool can download them as text.

Age-restricted or members-only videos? YouTube requires a signed-in account for these. This Actor doesn't log in, so they return a clear NO_DATA or NOT_FOUND message and aren't charged.

How fast is it? In our stress test, 120 videos took 7.9 seconds at 8 parallel requests. Thousands of videos per run are fine.

Is it legal? The Actor only reads publicly available captions and video details. Respect copyright and YouTube's terms when you reuse transcripts.

Found a problem? Open an issue with the run link. Each run stores a RUN_SUMMARY (requests, retries, errors) to help debug it.

More from ScrapeMole

ScrapeMole builds focused, reliable scrapers for public data: pay per result, no start fees, clear error rows that are never charged, and a RUN_SUMMARY on every run.

Building an AI agent with its own wallet? The YouTube and Google Trends data is also sold per call over x402 (USDC on Base, no account): see scrapemole.pages.dev. Questions or a missing field? Open an issue on this Actor. ScrapeMole is the maker of this Actor.