YouTube Transcript Scraper Pro (Captions + AI Fallback)
Pricing
from $0.70 / 1,000 transcript extracteds
YouTube Transcript Scraper Pro (Captions + AI Fallback)
Extract YouTube transcripts at scale without burning through your budget. It starts with free captions whenever they're available, then switches to AI only for videos that don't have them. You stay in control of costs, and the output — JSON, SRT, VTT, plain text, or LLM-ready format
Pricing
from $0.70 / 1,000 transcript extracteds
Rating
5.0
(1)
Developer
CodePoetry
Maintained by CommunityActor stats
14
Bookmarked
2.9K
Total users
779
Monthly active users
a day ago
Last modified
Categories
Features
Share
Extract YouTube transcripts from videos, playlists, and channels, even when captions are missing.
Most transcript tools stop at videos with no captions. This one transcribes the audio instead: built-in AI speech-to-text, no external API key required. Give it a single video, a full playlist, or an entire channel and get transcripts in JSON, plain text, SRT, VTT, or an LLM-ready format. You pay per transcript, not per minute of server time.
Works as an MCP tool with Claude Desktop, Cursor, and any MCP-compatible client.
- No YouTube Data API key required
- Batch-friendly for video, playlist, and channel URLs
- Built-in controls for AI spend and long videos
Default behavior: AI transcription is off (
enableAiFallback: false), the lowest-cost setting. Videos without captions are reported asNO_CAPTIONS_AVAILABLEunless you turn it on.

Why use this actor
- Captions first, the cheapest transcript source
- Machine translation of captions into your language, timestamps kept
- Optional AI fallback when a video has no captions at all
- Structured outputs for automation pipelines
- Works for single videos and bulk channel/playlist runs
Quick start
-
Click Try for free on this actor's page.
-
Paste one or more YouTube URLs into the YouTube URLs field. Supported formats:
- Single video:
youtube.com/watch?v=...oryoutu.be/... - Playlist:
youtube.com/playlist?list=... - Channel:
youtube.com/@channelname
For playlists and channels the default is 10 videos; raise Max videos per playlist/channel before starting if you want more.
- Single video:
-
Choose your Output formats. Not sure? Start with Plain Text: it is the words as one block of text. Set Caption languages if you need something other than English (default:
en). -
AI transcription is off by default, the lowest-cost setting. Videos without native captions are reported with
NO_CAPTIONS_AVAILABLEunless you turn on Enable AI transcription.If you turned AI on: set a Max AI minutes per run cap before running an unknown playlist or channel (default: 30 minutes, up to 600). Native captions are checked first; AI only runs on videos that have none. Estimate cost in the Pricing section.
-
Click Start. When the run completes, download results from the Dataset tab as JSON, CSV, or Excel, or read them through the API.
See the Pricing page for the full rate card.
Official API and schema links
APIs
Input and output
How it works
- Expand: every URL becomes the videos it names. A channel URL is read from its
videos tab, newest first. A video named more than once (as a
youtu.belink and in a playlist, say) is transcribed and charged once. - Captions: for each video, the scraper looks for a caption track in your languages, in order: manual captions first (unless you chose auto-generated only), then auto-generated. The first track that downloads is used. No audio download needed.
- Machine translation (optional, on by default): with Machine-translate captions
into your language on, a video that has captions only in other languages has them
machine-translated into your first requested language, keeping every timestamp and charged
as a normal transcript. Items carry
is_machine_translated: trueandtranslated_from. - Original-language fallback (optional): with Use captions in any available language on, a video with no track in your languages delivers its track in the language it was spoken in, charged as a normal transcript.
- AI transcription (optional): the audio of a video with no captions at all is
transcribed by the built-in AI model, with the same output structure as native captions.
A video that has captions only in other languages, when translation and the
original-language fallback are both off, is returned as
LANGUAGE_NOT_FOUNDwith the languages it has.
A video that fails never stops the run: it becomes a dataset item with an error_code,
and the rest of the batch continues.
What you get
Each dataset item is one video: its metadata plus the transcript in the formats you requested.
Video metadata
| Field | Type | Description |
|---|---|---|
metadata.id | string | YouTube video ID |
metadata.title | string | Video title |
metadata.url | string | Canonical watch URL |
metadata.description | string | Full video description |
metadata.duration | number | Duration in seconds |
metadata.view_count | number | Total views |
metadata.like_count | number | Total likes |
metadata.channel | string | Channel display name |
metadata.channel_id | string | Channel ID (UC-prefixed) |
metadata.channel_url | string | Channel URL |
metadata.thumbnail | string | Highest-resolution thumbnail URL |
metadata.upload_date | string | Upload date (YYYYMMDD) |
metadata.tags | array | Creator-set tags |
metadata.categories | array | YouTube categories |
Transcript fields
A field appears only on the items it applies to. A format you did not request is absent, not empty.
| Field | Type | Description |
|---|---|---|
language | string | Language code of the transcript (e.g. en, zh-TW) |
is_auto_generated | boolean | true if YouTube auto-generated the captions |
is_ai_generated | boolean | true if the built-in AI model transcribed the audio |
is_language_fallback | boolean | true when the video's original-language track was delivered instead of your languages |
is_machine_translated | boolean | true when the transcript was machine-translated into your language from the video's original captions |
translated_from | string | Language code of the original captions a machine-translated transcript came from |
requested_languages | array | The languages you asked for, on language-fallback and machine-translated items |
transcript_json | array | Timestamped segments [{start, end, text}]. With wordLevel: true, each segment also has words: [{start, end, text}]; end is estimated for native captions, exact for AI transcriptions |
transcript_text | string | Plain text transcript |
transcript_llm | string | Text with [Music], (laughter) and similar tokens stripped, ready for AI pipelines |
transcript_srt | string | SRT subtitles |
transcript_vtt | string | WebVTT subtitles |
language_probability | number | The AI model's confidence in the language it detected (0–1). AI transcription only; absent when you forced the language |
language_was_forced | boolean | true when forceTranscriptionLanguage was set. AI transcription only |
ai_duration_charged_min | number | AI minutes charged for this video. AI transcription only |
ai_speech_duration_sec | number | Speech detected in the audio, in seconds. AI transcription only |
For a very long transcript, per-word timings are left out, and then the timestamped segments, so the item stays within the platform's size limit for one dataset item. The text formats are always kept.
Error items
| Field | Type | Description |
|---|---|---|
error_code | string | What went wrong; see the table below |
error | string | What happened and what to do about it |
retryable | string | Whether running the video again can help: yes, no or conditional |
url | string | The URL as you gave it, when no metadata could be read |
available_languages | array | The caption languages the video does have, on LANGUAGE_NOT_FOUND and CAPTION_FETCH_FAILED items |
Error items are never charged: you only pay for successful transcripts.
| Error code | Meaning | Retryable |
|---|---|---|
INVALID_URL | The URL is not a YouTube video, playlist or channel | no |
RUN_VIDEO_LIMIT_REACHED | The run already took 500 videos, the most one run transcribes | yes |
URL_EXPANSION_FAILED | A playlist or channel could not be listed | yes |
AGE_RESTRICTED | The video requires age verification | no |
PRIVATE_OR_UNAVAILABLE | The video is private, removed or blocked in the region | no |
LIVE_VIDEO | Live streams cannot be transcribed until they are archived | conditional |
BOT_DETECTION | YouTube asked for human verification | yes |
EXTRACTION_ERROR | The video's information could not be read | yes |
CAPTION_FETCH_FAILED | A caption track exists but could not be downloaded | yes |
LANGUAGE_NOT_FOUND | Captions exist, but not in your languages, and translation, the original-language fallback and AI are all off (or translation failed) | no |
NO_CAPTIONS_AVAILABLE | The video has no captions and AI transcription is off | no |
CAPTIONS_NOT_READY | The video's captions are listed but not generated yet, typical for a recent upload. Run it again later, or enable AI fallback | yes |
AI_FALLBACK_SKIPPED_TOO_LONG | The video is longer than 120 minutes, or than Skip AI for long videos | no |
AI_MINUTES_LIMIT_REACHED | The run's Max AI minutes budget would be exceeded | conditional |
AI_TRANSCRIPTION_FAILED | The audio could not be downloaded or transcribed | yes |
Use cases
1. Claude Desktop / Claude.ai MCP integration
Connect this actor as an MCP server so Claude Desktop, Claude.ai Projects, Cursor, or any other MCP-compatible AI client can fetch a transcript just by being handed a YouTube URL. Ask Claude to "summarise this video" or "extract the key points from this lecture", no copy-pasting required.
Recommended settings: outputFormats: ["llm"]
2. YouTube Shorts, per-word karaoke captions
YouTube Shorts often have auto-generated captions. Enable wordLevel: true to get per-word start times from the transcript_json field. Feed the result into a caption editor (CapCut, DaVinci Resolve, Adobe Premiere) to produce word-by-word highlighted captions, the "karaoke" style popular on short-form video.
Recommended settings: wordLevel: true, outputFormats: ["json", "srt"], subType: "auto"
3. Build a searchable knowledge base (RAG)
Bulk-extract every video from a company channel, educational YouTube account, or podcast series. Store the transcript_llm text in a vector database (Pinecone, Weaviate, pgvector) indexed by metadata.id and metadata.title. Use it as a retrieval-augmented generation (RAG) corpus so your chatbot can answer questions grounded in the exact video content.
Recommended settings: outputFormats: ["llm"], maxResults: 500, enableAiFallback: true so caption-free videos in the channel are transcribed automatically.
4. NLP / sentiment analysis pipeline
Extract transcripts from a brand's channel, a competitor's channel, or a set of product-review videos. Pipe transcript_text into an NLP pipeline (spaCy, HuggingFace Transformers, OpenAI) for sentiment scoring, named entity extraction, topic modeling, or keyword frequency. Useful for brand monitoring and competitive intelligence.
Recommended settings: outputFormats: ["text", "llm"], subType: "both"
5. LLM training data collection
Curate domain-specific transcripts from niche YouTube channels (medical lectures, legal explainers, coding tutorials, scientific talks) to build fine-tuning datasets. The transcript_llm format strips filler tokens cleanly. Use metadata.tags and metadata.categories to filter and label the data.
Recommended settings: outputFormats: ["llm"], a maxAiMinutes cap per run to control cost.
6. SEO content repurposing
Turn a library of tutorials or vlogs into written content. Pass the transcript_llm field to an LLM prompt asking it to rewrite the transcript as a blog post, Twitter/X thread, newsletter section, or LinkedIn article. Combine with metadata.title, metadata.tags, and metadata.description for context.
Recommended settings: outputFormats: ["llm"], languages: ["en"]
7. Podcast / lecture transcription (no captions)
Podcasters who upload to YouTube and educators who post lecture recordings rarely add manual captions. Enable AI transcription and the actor transcribes them with built-in AI. Set forceTranscriptionLanguage if you know the channel's language, so the model never guesses it wrong.
Recommended settings: enableAiFallback: true, forceTranscriptionLanguage: "en", skipAiFallbackIfLongerThan: 90 to skip anything over 90 minutes (videos over 120 minutes are always skipped).
8. Multilingual research with machine translation
Pull transcripts from channels in other languages and receive them in yours. With Machine-translate captions into your language on (the default), a Spanish or Japanese caption track comes back translated into your first requested language, timestamps kept, with translated_from recording the original.
Recommended settings: languages: ["en"], machineTranslateCaptions: true
9. Academic research and citation analysis
Download a researcher's full lecture series, a conference talk archive, or all videos from an academic YouTube channel. Index the transcripts by speaker, date (metadata.upload_date), and topic. Use to find when specific terminology first appeared, how arguments evolved over time, or to build a citation graph for a literature review.
Recommended settings: outputFormats: ["json", "text"], maxResults: 500, languages set to the channel's primary language.
10. Competitive intelligence monitoring (scheduled runs)
Schedule the actor to run weekly on a competitor's channel URL. Set maxResults: 5 to pull only the latest videos (channels are read newest first). Use an Apify webhook to POST the new transcripts to Slack, a CRM, or an internal dashboard. Automatically surface every new product announcement, feature mention, or pricing discussion your competitor publishes.
Recommended settings: maxResults: 5, outputFormats: ["llm"], paired with an Apify schedule and webhook.
Output examples
Native captions
{"metadata": {"id": "dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up","channel": "Rick Astley","duration": 213,"upload_date": "20091025"},"language": "en","is_auto_generated": false,"is_ai_generated": false,"transcript_json": [{ "start": 18.5, "end": 21.0, "text": "We're no strangers to love" },{ "start": 21.0, "end": 24.5, "text": "You know the rules and so do I" }],"transcript_text": "We're no strangers to love You know the rules and so do I ...","transcript_srt": "1\n00:00:18,500 --> 00:00:21,000\nWe're no strangers to love\n\n2\n00:00:21,000 --> 00:00:24,500\nYou know the rules and so do I\n"}
AI transcription
When a video has no captions and enableAiFallback is on, AI transcription runs:
{"metadata": { "id": "jNQXAC9IVRw", "title": "Me at the zoo", "duration": 19 },"language": "en","language_probability": 0.9996,"language_was_forced": false,"is_auto_generated": false,"is_ai_generated": true,"transcript_text": "Alright, so here we are, one of the elephants. ...","ai_duration_charged_min": 1,"ai_speech_duration_sec": 19}
Error
{"error_code": "LANGUAGE_NOT_FOUND","error": "Captions exist, but not in your requested language. Check available_languages and adjust Caption languages.","metadata": { "id": "dQw4w9WgXcQ", "title": "Rick Astley - Never Gonna Give You Up" },"available_languages": ["en", "es", "fr"],"retryable": "no"}
Pricing
Pay per event, with no charge for server time:
- per transcript delivered from captions (including machine-translated ones);
- per minute of video transcribed by AI, billed on the video's full length, rounded up to the minute;
- a start fee per run.
The prices for your plan are on the Pricing page; higher Apify plans pay less per event. There is no separate proxy charge on your account.
Built for bulk runs
- One small startup fee, then pay per transcript. The per-transcript price is the same whether the run has 10 videos or 500.
- No proxy bill. There is nothing to configure and no proxy line item on your account.
- AI minutes only when needed. AI charges apply only to videos with no captions in any language. If every video in your batch has captions, you never pay AI minutes.
- Duplicates charged once. A video named twice in one run is transcribed and charged once.
- Failed videos never stall the run, and error items are never charged.
Keeping AI cost predictable
- Max AI minutes per run caps the AI minutes a run may use (default 30, up to 600; 0
means the maximum, 600). A video that would exceed it is reported as
AI_MINUTES_LIMIT_REACHED. - Skip AI for long videos leaves out videos longer than the minutes you set. Videos over 120 minutes are always skipped, whatever you set here.
- Captions are always tried first. AI only runs on videos with no captions in any language;
a video captioned in other languages is machine-translated into your language (when
translation is on, the default) or returned as
LANGUAGE_NOT_FOUND, never AI-transcribed.
How it compares
| Feature | This actor | Typical alternatives |
|---|---|---|
| Transcribes videos with no captions | Yes, built-in AI, no external API key | No, returns an error |
| Machine-translates captions into your language | Yes, timestamps kept | Rare |
| LLM-optimized output (filler stripped) | Yes, transcript_llm field | No |
| Spend safeguards (AI minute cap, skip long videos) | Yes | No |
| Native transcript price | $0.001 per transcript | Up to $0.005 (5x more) |
| No monthly subscription | Yes, pay only for what you run | Flat monthly fee |
| Batch: playlists and channels | Yes | Most |
| Output formats | JSON, Text, SRT, VTT, LLM | Usually JSON only |
| Word-level timestamps | Yes | Rare |
| YouTube Data API key required | No | No |
| MCP-compatible (Claude Desktop, Cursor, etc.) | Yes, via Apify MCP integration | Rare |
Who uses it
AI and LLM developers
Every output item includes a ready-to-use transcript_llm field, filler tokens stripped, clean text, no post-processing. Batch a whole channel overnight via the API and wake up to a dataset ready for your retrieval pipeline or fine-tuning job.
Content creators and marketers
Turn any YouTube video into a blog post or newsletter draft without manual transcription. Extract pull quotes from interviews. Run an entire channel archive in one batch.
SEO professionals and researchers
Extract keyword data from video transcripts at scale. Build text content from video transcripts for search. Analyse a competitor's spoken messaging for topic and positioning gaps.
Data scientists and academics
Build NLP corpora from lectures, conference talks, and documentary interviews. Process multilingual transcripts for cross-language analysis. Run large dataset collection jobs overnight via the API.
Developers building MCP-integrated AI tools
Connect this actor as an MCP server so Claude Desktop, Claude.ai Projects, Cursor, or any MCP-compatible client can fetch and process YouTube transcripts in a single tool call. No copy-pasting, no API wiring. Just hand the model a URL.
Integration examples
Python (Apify client)
Get your API token from the Apify Console under Settings → Integrations. Keep it secret, treat it like a password.
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("codepoetry/youtube-transcript-ai-scraper").call(run_input={"startUrls": [{"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"}],"languages": ["en"],"outputFormats": ["json", "llm"],})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if "error_code" in item:print(item["error_code"], item["error"])continueprint(item["metadata"]["title"], item["transcript_llm"][:200])
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('codepoetry/youtube-transcript-ai-scraper').call({startUrls: [{ url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' }],languages: ['en'],outputFormats: ['json', 'llm'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) {if (item.error_code) continue;console.log(item.metadata.title, item.transcript_llm.slice(0, 200));}
LangChain / RAG
from apify_client import ApifyClientfrom langchain.docstore.document import Documentclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("codepoetry/youtube-transcript-ai-scraper").call(run_input={"startUrls": [{"url": "https://www.youtube.com/@channelname"}],"outputFormats": ["llm"],"maxResults": 50,})docs = [Document(page_content=item["transcript_llm"],metadata={"source": item["metadata"]["url"], "title": item["metadata"]["title"]},)for item in client.dataset(run["defaultDatasetId"]).iterate_items()if "transcript_llm" in item]# docs is ready for any LangChain vector store or retriever
Run on a schedule or trigger a webhook
To run this actor on a schedule or receive a webhook notification when a run finishes, use the Schedules and Integrations tabs on the actor's page in the Apify Console. See the Apify scheduling docs and webhook docs for setup instructions.
Advanced options
All options can be set in the Input form or passed as JSON when calling via the API.
| Option | UI label | Default | What it does |
|---|---|---|---|
startUrls | YouTube URLs | none | Videos, playlists and channels |
maxResults | Max videos per playlist/channel | 10 | Videos taken from each playlist or channel; single videos ignore it. One run transcribes at most 500 videos; each one past that is returned as RUN_VIDEO_LIMIT_REACHED |
languages | Caption languages | ["en"] | Caption languages in order of preference; the first match on the video is used. Pick from the dropdown or pass any ISO 639-1 code via the API |
subType | Caption source | "both" | "manual" = human captions only · "auto" = auto-generated only · "both" = prefer manual, fall back to auto |
outputFormats | Output formats | json, text, llm | Which transcript formats each item carries |
wordLevel | Word-level timestamps | false | Per-word timings inside transcript_json. Safe to enable for any video |
machineTranslateCaptions | Machine-translate captions into your language | true | Translate captions that exist only in other languages into your first requested language |
useAnyAvailableCaptionLanguage | Use captions in any available language | false | Deliver the video's original-language captions when none match your languages |
enableAiFallback | Enable AI transcription | false | Transcribe videos that have no captions at all |
forceTranscriptionLanguage | AI transcription language | auto-detect | The language the AI transcribes in (99 supported), instead of the one it detects in the audio |
maxAiMinutes | Max AI minutes per run | 30 | AI minute budget for the run, up to 600; 0 means the maximum (600) |
skipAiFallbackIfLongerThan | Skip AI for long videos (minutes) | 0 (off) | Skip AI for videos longer than this; videos over 120 minutes are skipped regardless |
Limitations
All non-recoverable failures produce a dataset item with an error_code field. See the
Error items table for the full reference.
- One run transcribes at most 500 videos; split bigger archives across runs.
- AI transcription covers videos up to 120 minutes long.
- Machine translation covers caption tracks only; AI transcripts are returned in the spoken language (or the one you force).
- Live streams can be transcribed only once they are archived.
maxResultsdefaults to a conservative 10; increase it for large playlists or full channel archives.
Frequently asked questions
How much does one video cost?
On the Free plan, a single video with captions costs about $0.0035 with AI off: $0.001 for the transcript plus a $0.0025 start fee per run at the default memory. Each additional video in the same run adds $0.001. AI transcription adds $0.012 per minute of audio. Higher Apify plans pay less; see the Pricing page.
What happens if a video has no captions?
With AI transcription off, the video is reported with NO_CAPTIONS_AVAILABLE. Turn on
Enable AI transcription and its audio is transcribed instead, with the same output
structure and is_ai_generated: true. If the Max AI minutes cap is reached, remaining
caption-free videos receive AI_MINUTES_LIMIT_REACHED and the run continues.
A video with captions only in other languages is never transcribed by AI: the model
transcribes the language the video is spoken in, not the one you asked for. Instead, with
Machine-translate captions into your language on (the default), its captions are
machine-translated into your language, timestamps kept. With translation off and no
transcript in your languages deliverable, it is reported with LANGUAGE_NOT_FOUND and the
languages it has in available_languages. Add one of those, turn translation back on, or
turn on Use captions in any available language to receive its original-language track.
Does it work for playlists, channels and Shorts?
Yes. A playlist or channel is expanded into its videos (use Max videos per playlist/channel to cap it), and a Shorts URL is treated like any other video. If one video is private, age-restricted, or unavailable, it gets an error item while the rest continue.
Which languages are supported?
Native captions: any language YouTube offers captions in. Pass multiple language codes
(e.g. ["en", "es"]) to fall back automatically when your first choice is unavailable.
AI transcription: 99 languages, including English, Spanish, French, German, Portuguese, Japanese, Chinese, Arabic, and Hindi.
Does it translate transcripts?
Yes, for captions. When a video has captions only in other languages, they are machine-translated into your first requested language by default (turn off Machine-translate captions into your language to opt out). An original-language fallback is in the language spoken, and an AI transcription is in the language the model hears (or the one you set in AI transcription language).
What output formats are available?
- JSON: timestamped segments as an array
[{start, end, text}, ...] - Text: plain text joined from all segments
- LLM: text with
[Music],(laughter), and other filler tokens stripped, ready for AI pipelines - SRT: standard subtitle format for video players and editing software
- VTT: WebVTT format for HTML5
<video>elements
Multiple formats can be requested in a single run.
Can I set a spending limit?
Yes. Max AI minutes per run caps total AI-transcribed minutes per run (default 30, up to 600). Skip AI for long videos skips videos over a duration threshold. You can also set a maximum total charge per run in the Apify Console.
How accurate is AI transcription?
Accurate for clear speech in widely spoken languages. Accuracy degrades with heavy accents,
domain-specific jargon, or poor audio quality. The language_probability field indicates the
model's confidence in the detected language. For quality-critical work, treat AI transcripts
as a first draft and review them.
What is a YouTube transcript scraper?
A YouTube transcript scraper extracts the spoken text from YouTube videos, converting a YouTube video to text without any manual work. This actor retrieves captions when YouTube provides them, or generates a transcript from the audio when captions are unavailable.
Can I use this to convert a YouTube video to text?
Yes, that is exactly what it does. Paste the video URL, click Start, and the actor returns the spoken words as plain text (or JSON, SRT, VTT, or LLM-ready format). For videos with no captions, enable AI transcription to generate the text from the audio.
Do I need a YouTube Data API key?
No. The actor reads publicly available caption data without any YouTube API credentials.
How does this compare to the YouTube Data API?
The YouTube Data API v3 does not provide transcript data for videos you don't own. It requires a Google Cloud project, OAuth credentials, and per-day quotas. This actor requires none of that.
How does this compare to the youtube-transcript-api Python library?
The youtube-transcript-api library is
fine for a handful of videos in your own Python script. This actor adds cloud infrastructure,
batch processing across playlists and channels, AI transcription for caption-free videos,
machine translation, multiple output formats, scheduling, and Apify platform integrations
(webhooks, REST API, n8n, Make, Zapier).
Is it legal to extract YouTube transcripts?
YouTube's Terms of Service restrict automated access, and you are responsible for complying with their Terms and applicable law in your jurisdiction. This actor reads only publicly available caption data, the same data visible when you click "Show transcript" in the YouTube player. It does not bypass any authentication, access private content, or collect personal user data. See Apify's web scraping legality guide for a broader overview.
More actors from CodePoetry
- Airbnb Scraper API: scrape listings, prices, reviews, ratings, and availability calendars for any city or listing URL, with 99 fields per rental. Failed listings cost nothing.
- Markdown RAG Chunker: split PDF, Word, HTML, and Markdown documents into header-aware chunks with stable IDs and exact token counts, LangChain-ready, pay per chunk. Pairs well with this scraper for RAG pipelines.
Get started
Click Try for free at the top of this page. The Rick Astley demo URL is pre-filled; run it in one click to see the full output structure.
Questions or bugs? Use the Issues tab on this actor's page. Response time is typically within 24 hours.
Changelog
2026-10-10
- A run stopped early (by you, or when its time limit is reached) now saves every result it has already collected, instead of returning an empty dataset.
- A video whose captions are listed but not generated yet (typical for a recent upload) is
now returned as
CAPTIONS_NOT_READYwith a retry hint, or transcribed with AI when AI fallback is on, instead of being reported asLANGUAGE_NOT_FOUND. - One unreadable caption track no longer fails the whole run; that video comes back as an error item and the rest of the run completes.
Notes
This is an unofficial scraper. It is not affiliated with, authorised by, sponsored by or endorsed by YouTube or Google, and those names are used only to say which public website it reads. Every result lands in the Apify dataset with a stable schema, available via the API, CLI, MCP, and integrations like n8n, Make, and Zapier.