YouTube Transcript Scraper — Captions, SRT & Text
Pricing
from $1.49 / 1,000 transcript scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
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 suite | Social listening |
|---|---|
| YouTube Transcript Scraper ◄── you are here | Bluesky Scraper |
| YouTube Comments Scraper | Product 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 priority —
enmatchesen-US; manual captions win over auto-generated when type isany - YouTube translation — optional
translateTouses built-intlangwhen the source track allows it - LLM-ready text + timestamps — concatenated
textplussegments[{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
| Parameter | Description |
|---|---|
videoUrls | Watch / Shorts / youtu.be URLs or 11-char video IDs |
languages | Preference list of language codes (default ["en"]) |
transcriptType | any (manual first), manual, or generated |
translateTo | Optional YouTube translation target (e.g. es) |
includeMetadata | Title, channel, duration, views, thumbnail (default on) |
includeSrt / includeVtt | Add formatted subtitle strings |
includeErrorRows | Keep failed videos in the dataset (default on; not billed) |
maxVideos | Run cap (default 50, hard cap 250) |
hl / gl | YouTube language and country (default en / US) |
requestDelaySecs | Throttle between player / timedtext calls |
proxyConfiguration | Optional 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.
| Field | Description |
|---|---|
type / ok | Always transcript; ok is false on structured errors |
videoId / videoUrl | Canonical watch URL |
title / channelName / channelId / channelUrl | Player metadata |
durationSeconds / viewCount / thumbnailUrl | Length, views, best thumbnail |
languageCode / languageName | Caption language actually returned |
isGenerated / isTranslated | Auto-generated ASR / YouTube tlang |
segmentCount | Number of timestamped cues |
text | Full transcript, one string (LLM / SEO) |
segments | {start, duration, text} cues in seconds |
srt / vtt | Present when the matching include flag is on |
availableLanguages | Caption tracks on the video (languageCode, isGenerated) |
errorCode / errorMessage | Set when ok is false |
scrapedAt | UTC 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
translateTofor 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 ApifyClientclient = 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().itemsprint(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.
Related Actors
| Actor | Use after / beside |
|---|---|
| YouTube Comments Scraper | Replies, likes, pinned / hearted comments on the same videos |
| Bluesky Scraper | Cross-platform social listening |
| Product Hunt Scraper | Launch-day comments when the video is a product drop |