YouTube Transcript Scraper avatar

YouTube Transcript Scraper

Pricing

from $2.50 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper

YouTube Transcript Scraper

YouTube transcript API: bulk transcripts and captions for videos, Shorts, channels, playlists and searches. Timestamps, text, SRT/VTT, RAG-ready chunks, language fallback, translation. $2.50 per 1,000 transcripts; no captions = no charge.

Pricing

from $2.50 / 1,000 transcripts

Rating

0.0

(0)

Developer

John Wilkinson

John Wilkinson

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

YouTube Transcript API & Scraper: Bulk Videos, Channels, Shorts, RAG-Ready

Get YouTube transcripts, captions and subtitles in bulk with timestamps, as JSON, plain text, SRT, or WebVTT. It works with single videos, YouTube Shorts, whole channels, playlists, and YouTube search results. Output is ready for RAG, LLMs, AI agents, content repurposing, and research: time-aligned chunks with deep links, language fallback, and YouTube's built-in caption translation.

$2.50 per 1,000 transcripts. Videos without captions, private or deleted videos, and errors are free.

Why this YouTube transcript API?

  • Bulk input: paste any mix of video URLs, Shorts URLs, youtu.be links, video IDs, channel URLs or @handles, playlist URLs, and search queries.
  • Whole channels and playlists: takes the newest N videos, Shorts, or live streams of a channel, with an optional published-after date filter.
  • Shorts transcripts: Shorts use the same code path as regular videos.
  • Timestamps: segments with start and duration in seconds, text with [mm:ss] markers, SRT, and VTT.
  • RAG-ready chunks: time-aligned chunks[] with start, end, text, and a &t=123s deep link for citations.
  • Language control: a preferred-language list (en, es, de…), human-made captions preferred over auto-generated, fallback to the original language, and optional translation (translateTo).
  • Reliable on Apify: residential proxy by default, a fresh IP on every retry, and only a few KB transferred per video, so it stays fast and cheap.
  • Fair pricing: you pay only for transcripts you receive. A clean status and errorCode on every row (no_captions, unavailable, private, age_restricted, blocked…).
  • Metadata included: title, channel, channel ID, duration, views, Shorts flag, available caption languages, and a metadata-only mode.

Input

FieldDefaultDescription
urls–Videos, Shorts, youtu.be links, IDs, channels (@handle, /channel/UC…), playlists
searchQueries–Get transcripts of top search results
maxVideosPerSource20Newest N per channel tab, playlist, or search
channelContentvideosvideos, shorts, videos+shorts, streams, all
publishedAfter–YYYY-MM-DD (approximate for listings)
languages["en"]Preferred caption languages, in order
preferManualCaptionstrueHuman captions before auto-generated
fallbackToAnyLanguagetrueOtherwise use the original language
translateTo–e.g. en: YouTube auto-translation
includeText / includeSegmentstruePlain text / timestamped segments
includeTimestampedTextfalseText with [m:ss] every ~30 s
includeChunks / chunkSizeCharsfalse / 2000RAG chunks
includeSrt / includeVttfalseSubtitle files as strings
metadataOnlyfalseSkip transcripts and return video metadata only
maxVideos0Overall cap (0 = none)
proxyConfigurationResidentialKeep the default for best reliability

Example input

{
"urls": [
"https://www.youtube.com/watch?v=T-D1OfcDW1M",
"https://www.youtube.com/shorts/aNI2jv7lBPQ",
"https://www.youtube.com/@IBMTechnology",
"https://www.youtube.com/playlist?list=PLFgquLnL59alCl_2TQvOiD5Vgm1hCaGSI"
],
"searchQueries": ["retrieval augmented generation explained"],
"maxVideosPerSource": 10,
"publishedAfter": "2025-01-01",
"languages": ["en"],
"includeChunks": true
}

Output

One dataset item per video:

{
"videoId": "T-D1OfcDW1M",
"url": "https://www.youtube.com/watch?v=T-D1OfcDW1M",
"status": "success",
"title": "What is Retrieval-Augmented Generation (RAG)?",
"channelName": "IBM Technology",
"channelId": "UCKWaEZ-_VweaEx1j62do_vQ",
"durationSec": 395,
"isShort": false,
"viewCount": 1500000,
"language": "en",
"isAutoGenerated": false,
"availableLanguages": ["en", "en (auto)"],
"wordCount": 1062,
"text": "Large language models. They are everywhere...",
"segments": [{ "start": 0.0, "duration": 4.2, "text": "Large language models." }],
"chunks": [{ "index": 0, "start": 0.0, "end": 98.4, "text": "...", "url": "https://www.youtube.com/watch?v=T-D1OfcDW1M&t=0s" }]
}

Videos without captions return "status": "no_captions" and are not charged. Failures return "status": "error" with errorCode and error. Run statistics are saved to the RUN_SUMMARY key in the key-value store.

Pricing (pay per event)

EventPrice
Actor start (charged by Apify, per GB of run memory)$0.0005 per GB
Transcript returned$0.0025 ($2.50 per 1,000)
Video metadata (metadata-only mode)$0.0005

Listing channels, playlists and searches is free; videos without captions, private/deleted videos and errors are free. Run with low memory (512 MB is enough) and batch many videos per run to keep the start fee small. Set a maximum cost per run in Apify to cap spend; the Actor stops cleanly at the limit.

Use cases

  • RAG / AI knowledge bases: index a channel's videos into a vector database with timestamped citations.
  • Content repurposing: turn videos and Shorts into blog posts, newsletters, threads, and show notes.
  • Research and monitoring: analyse what creators, competitors, or experts say over time.
  • Subtitles: export SRT or VTT in any language YouTube provides or can translate to.
  • AI agents and MCP: call it from Claude, ChatGPT, LangChain, n8n, Make, or Zapier through the Apify API or MCP server.

API example

curl -X POST "https://api.apify.com/v2/acts/jcwilk~youtube-transcripts/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls":["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"includeSegments":false}'

FAQ

Can I use it as a YouTube transcript API from code or an AI agent? Yes: call run-sync-get-dataset-items (example above) or the Apify MCP server; you get JSON back in seconds for single videos.

Does it work for Shorts? Yes. Paste a /shorts/ URL, or set channelContent to shorts for a channel.

What if a video has no captions? You get status: no_captions and pay nothing. This Actor reads YouTube's own captions (manual or auto-generated); it does not run speech-to-text.

Which languages? Every caption track YouTube has for the video, plus YouTube's translation into ~100 languages via translateTo.

Why a residential proxy? YouTube blocks many datacenter IPs. Each video needs only a few KB through the proxy, so the cost is included in the price.

Limitations: private, members-only, and some age-restricted videos cannot be read. Live streams have captions only after they end. Listing dates are approximate ("2 weeks ago").

This tool reads publicly available caption data. You are responsible for using it in line with YouTube's terms and applicable law.