YouTube Transcript Scraper — Captions, SRT & Text avatar

YouTube Transcript Scraper — Captions, SRT & Text

Pricing

from $1.49 / 1,000 transcript scrapeds

Go to Apify Store
YouTube Transcript Scraper — Captions, SRT & Text

YouTube Transcript Scraper — Captions, SRT & Text

Scrape YouTube transcripts and subtitles without a Data API key: timestamped captions, full text, SRT/VTT, language fallback, and video metadata. Batch watch, Shorts, and youtu.be URLs for SEO, RAG, and MCP agents. Export JSON via API, Python, or Node.js.

Pricing

from $1.49 / 1,000 transcript scrapeds

Rating

0.0

(0)

Developer

Andrej Kiva

Andrej Kiva

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Unofficial tool for publicly accessible YouTube caption data. YouTube and related trademarks belong to their respective owners. Not affiliated with, sponsored by, or endorsed by YouTube or Google. Provided for informational use only; users must comply with applicable terms and laws.

YouTube suiteSocial listening
YouTube Transcript Scraper ◄── you are hereBluesky Scraper
YouTube Comments ScraperProduct Hunt Scraper

YouTube Transcript Scraper for Apify — a YouTube captions scraper and YouTube subtitles scraper that turns public videos and Shorts into structured JSON: timestamped caption segments, full plain text, optional SRT / WebVTT, language metadata, and video title / channel / duration. No YouTube login, no Data API quota. A practical YouTube transcript API alternative for SEO repurposing, RAG corpora, and agent workflows — run from Python, Node.js, cURL, or MCP / AI assistants and export the dataset as JSON / CSV / Excel.

When to use

  • Turn a video or lecture into blog copy, show notes, or SEO landing text
  • Build an LLM / RAG corpus from a list of YouTube URLs (Python or Node.js)
  • Pull captions in a preferred language (manual first, auto-generated captions fallback)
  • Export SRT or WebVTT for editors and players
  • Batch watch, Shorts, embed, and youtu.be links in one YouTube scraper run

When not to use

  • Private, age-gated, or members-only videos (public Innertube only)
  • Videos with captions disabled — those rows get errorCode: TRANSCRIPTS_DISABLED
  • Full channel, playlist, or search crawls — this Actor is URL-list transcripts, not a YouTube catalog scraper
  • Comment threads — use YouTube Comments Scraper instead

Key features

  • Transcripts-first slice — purpose-built YouTube transcript / captions scraper, not a bloated “everything” YouTube tool
  • ANDROID Innertube player — same caption track list the mobile client uses; no Data API key
  • No login — Chrome-impersonated TLS via curl_cffi
  • Language priorityen matches en-US; manual captions win over auto-generated when type is any
  • YouTube translation — optional translateTo uses built-in tlang when the source track allows it
  • LLM-ready text + timestamps — concatenated text plus segments[{start, duration, text}]
  • SRT / VTT on demand — extra string fields for editors without a second formatter
  • Video metadata — title, channel, duration, views, thumbnail from the player response
  • Structured errors — failed videos stay in the dataset (errorCode) and are not billed; the rest of the batch continues
  • Shorts + youtu.be — watch URLs, Shorts, embeds, live paths, and bare 11-char video IDs
  • Proxy-ready — Apify RESIDENTIAL when datacenter IPs hit a consent wall or empty timedtext

Input

ParameterDescription
videoUrlsWatch / Shorts / youtu.be URLs or 11-char video IDs
languagesPreference list of language codes (default ["en"])
transcriptTypeany (manual first), manual, or generated
translateToOptional YouTube translation target (e.g. es)
includeMetadataTitle, channel, duration, views, thumbnail (default on)
includeSrt / includeVttAdd formatted subtitle strings
includeErrorRowsKeep failed videos in the dataset (default on; not billed)
maxVideosRun cap (default 50, hard cap 250)
hl / glYouTube language and country (default en / US)
requestDelaySecsThrottle between player / timedtext calls
proxyConfigurationOptional Apify proxy (RESIDENTIAL if blocked)

English captions, metadata on:

{
"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
"languages": ["en"],
"transcriptType": "any",
"includeMetadata": true
}

Batch + SRT + language fallback:

{
"videoUrls": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/dQw4w9WgXcQ",
"https://www.youtube.com/shorts/dQw4w9WgXcQ"
],
"languages": ["es", "en"],
"transcriptType": "any",
"includeSrt": true,
"maxVideos": 20,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}

Output

One dataset row per video — ready for CSV / Excel / JSON export.

FieldDescription
type / okAlways transcript; ok is false on structured errors
videoId / videoUrlCanonical watch URL
title / channelName / channelId / channelUrlPlayer metadata
durationSeconds / viewCount / thumbnailUrlLength, views, best thumbnail
languageCode / languageNameCaption language actually returned
isGenerated / isTranslatedAuto-generated ASR / YouTube tlang
segmentCountNumber of timestamped cues
textFull transcript, one string (LLM / SEO)
segments{start, duration, text} cues in seconds
srt / vttPresent when the matching include flag is on
availableLanguagesCaption tracks on the video (languageCode, isGenerated)
errorCode / errorMessageSet when ok is false
scrapedAtUTC timestamp
{
"type": "transcript",
"ok": true,
"videoId": "dQw4w9WgXcQ",
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"channelName": "Rick Astley",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"durationSeconds": 213,
"languageCode": "en",
"languageName": "English",
"isGenerated": false,
"isTranslated": false,
"segmentCount": 42,
"text": "We're no strangers to love You know the rules and so do I",
"segments": [
{"start": 18.64, "duration": 3.24, "text": "We're no strangers to love"}
],
"availableLanguages": [
{"languageCode": "en", "languageName": "English", "isGenerated": false},
{"languageCode": "en", "languageName": "English (auto-generated)", "isGenerated": true}
],
"errorCode": null,
"scrapedAt": "2026-08-21T13:00:00Z"
}

Use cases

  • Repurpose webinars and product videos into indexed articles
  • Feed lecture or podcast YouTube uploads into a vector store
  • Localize captions with translateTo for a target market
  • QA whether a channel ships manual subtitles vs auto-captions
  • Give an MCP agent a YouTube URL and get the spoken text back

Integration examples

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/youtube-transcript-scraper').call({
videoUrls: ['https://www.youtube.com/watch?v=dQw4w9WgXcQ'],
languages: ['en'],
includeSrt: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].text);

Python

from apify_client import ApifyClient
client = ApifyClient()
run = client.actor("crawloop/youtube-transcript-scraper").call(
run_input={
"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
"languages": ["en"],
"includeSrt": True,
}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[0]["text"])

cURL

curl -X POST "https://api.apify.com/v2/acts/crawloop~youtube-transcript-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"videoUrls":["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"languages":["en"]}'

MCP and AI assistants

Use this Actor from AI tools via Apify MCP. Connect your Apify account, then call this Actor by its Store ID / name (crawloop/youtube-transcript-scraper).

Example prompts:

  • "Run YouTube Transcript Scraper for https://www.youtube.com/watch?v=dQw4w9WgXcQ and return the full text"
  • "Scrape English transcripts for this URL list, include SRT, and summarize each video in 5 bullets"
  • "Chain YouTube Transcript Scraper then YouTube Comments Scraper for this video to compare spoken claims vs audience replies"

Suite next step

After exporting captions, run YouTube Comments Scraper on the same URLs to attach audience replies, likes, and pinned comments.

FAQ

How do I scrape YouTube transcripts without the official API?
This Actor is a YouTube transcript API alternative: it reads the public caption track list and fetches timedtext JSON. No Data API key or OAuth.

Do I need a YouTube login or cookies?
No for public videos with captions. Enable Apify RESIDENTIAL proxy if you see bot checks or empty tracks from datacenter IPs.

Manual vs auto-generated captions?
transcriptType: any prefers uploaded captions, then auto-generated captions (ASR). Use manual or generated to force one.

Does this scrape YouTube subtitles and SRT?
Yes. You get timestamped segments, concatenated text, and optional srt / vtt strings for editors and web players.

Can I scrape YouTube Shorts transcripts?
Yes. Shorts URLs and bare video IDs work the same as watch URLs when YouTube exposes captions.

What if a video has no captions?
The row is marked ok: false with errorCode: TRANSCRIPTS_DISABLED (when error rows are on). Other videos in the batch still run. Failed rows are not billed.

Does this download video or audio?
No. Captions only — no media files, no speech-to-text fallback.

Channel or playlist URL?
Not in this Actor. Expand the list yourself (or another catalog scraper), then pass video URLs here.

ActorUse after / beside
YouTube Comments ScraperReplies, likes, pinned / hearted comments on the same videos
Bluesky ScraperCross-platform social listening
Product Hunt ScraperLaunch-day comments when the video is a product drop