YouTube Transcript Scraper avatar

YouTube Transcript Scraper

Pricing

from $1.90 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper

YouTube Transcript Scraper

YouTube transcript scraper for videos, Shorts, playlists and channels. Get captions with timestamps, full text, SRT or VTT, in your language with auto-generated fallback, plus title, channel, date and views. No API key. Videos without captions are not charged.

Pricing

from $1.90 / 1,000 transcripts

Rating

0.0

(0)

Developer

Group Oject

Group Oject

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Share

YouTube Transcript Scraper pulls captions and subtitles from YouTube videos, Shorts, playlists and whole channels. Each video comes back as one clean row with timestamped segments, the full plain text, optional SRT or WebVTT, and video metadata. No YouTube API key, no login, and you only pay for videos that actually have a transcript.

YouTube Transcript Scraper output in Apify: video ID, title, channel, publish date, views, language and full transcript text

Real output from a default run of YouTube Transcript Scraper in Apify Console.

What can it do?

  • Extract transcripts from any public video URL: watch?v= links, youtu.be short links, Shorts, /live/ and /embed/ URLs, mobile and music links, or bare 11-character video IDs.
  • Transcribe whole playlists and channels: paste a playlist URL, a channel URL or an @handle and set how many of the newest videos to take. Pick long-form videos, Shorts, live streams or any mix.
  • Choose the language: list preferred languages in order (["es", "en"]). Manual, creator-uploaded subtitles are preferred, and YouTube's auto-generated captions are the fallback. You can also restrict the run to manual-only or auto-only captions.
  • Fall back to the original language when none of your languages exist, or skip those videos. Your choice.
  • Request a translation: set translateTo and the actor first looks for a native subtitle track in that language, then tries YouTube's built-in auto-translate.
  • Export in the format you need: timestamped JSON segments (start, duration, text), one plain-text string, an SRT subtitle file and/or a WebVTT file, all inside the same row.
  • Add video metadata: title, channel name, ID and URL, publish date, category, views, likes, duration, description, tags, thumbnail and a Shorts flag.
  • Monitor channels for new videos: turn on onlyNewVideos, schedule the run, and each run returns transcripts only for videos it has not delivered before. Add publishedAfter (a date or a window such as "7 days") to skip older uploads.
  • Stay within budget: the run stops when it reaches your maximum charge. Videos without captions are listed separately and never billed.

Typical uses: feeding transcripts to ChatGPT, Claude or a RAG pipeline, summarising podcasts and lectures, SEO content research, subtitle export, quote mining, and brand or competitor monitoring.

What data do you get?

FieldDescription
videoId, url, titleVideo ID, canonical watch URL and title
channelName, channelId, channelUrlChannel of the video (metadata)
publishDate, categoryPublish date-time (ISO 8601 with offset) and YouTube category (metadata)
viewCount, likeCount, durationSecondsCounts at scrape time and video length (metadata)
isShort, isLiveContentShorts and live-stream flags (metadata)
description, keywords, thumbnailUrlDescription, tags and thumbnail (metadata)
language, languageCodeLanguage of the returned transcript
isAutoGeneratedtrue when the captions are YouTube's automatic speech recognition
matchedPreferredLanguagefalse when the fallback language was used
isTranslated, translatedFrom, translationErrorTranslation result, and the reason when a translation could not be applied
transcriptArray of { start, duration, text } segments, in seconds
textFull transcript as one plain-text string
srt, vttReady-to-save subtitle files (when selected)
segmentCount, wordCount, characterCountSize of the transcript
availableLanguagesEvery caption track the video offers
sourceType, sourceInput, scrapedAtWhich input produced the row, and when

Videos without a transcript go to the NO_TRANSCRIPT record in the key-value store. Failed videos, playlists and channels go to ERRORS, and a run summary goes to SUMMARY.

How much does it cost?

You pay $2.50 per 1,000 transcripts ($0.0025 per video saved to the dataset). Proxy traffic and compute are included. Videos with no captions, or none in the languages you allowed, are not charged. Neither are failed, private or deleted videos.

On paid Apify plans the per-result price drops automatically (Bronze and above get volume discounts); the Pricing tab shows your exact rate.

  • 100 lecture videos from a playlist, all with captions: 100 × $0.0025 = $0.25.
  • A 2,000-video channel where 1,800 videos have captions: 1,800 × $0.0025 = $4.50. The 200 videos without captions are free.

Set a maximum charge on the run and the actor stops cleanly before going over it. Check the Pricing tab for the current rate.

How to use YouTube Transcript Scraper

  1. Paste one or more YouTube URLs, video IDs, playlist URLs or channel URLs into YouTube URLs or video IDs.
  2. Set Preferred languages (default en) and, if you like, the Caption type and Translate to.
  3. Pick Output formats: segments, text, SRT, VTT.
  4. For playlists and channels, set Max videos per playlist or channel and the Channel content types. To get only new uploads on a schedule, turn on Only new videos (monitoring).
  5. Click Start. Download the dataset as JSON, CSV, Excel or HTML, or read it through the API.

Input example

{
"urls": [
"https://www.youtube.com/watch?v=iG9CE55wbtY",
"https://youtu.be/UF8uR6Z6KLc",
"https://www.youtube.com/shorts/abcdefghijk",
"https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxxx",
"@channelhandle"
],
"languages": ["en", "es"],
"captionType": "any",
"fallbackToAnyLanguage": true,
"outputFormats": ["segments", "text", "srt"],
"includeVideoMetadata": true,
"maxVideosPerSource": 50,
"channelContentTypes": ["videos", "shorts"]
}

Output example

The values below are illustrative.

{
"videoId": "abcDEF12345",
"url": "https://www.youtube.com/watch?v=abcDEF12345",
"title": "How Solar Panels Actually Work",
"channelName": "Example Science",
"channelId": "UCxxxxxxxxxxxxxxxxxxxxxx",
"channelUrl": "https://www.youtube.com/@examplescience",
"publishDate": "2024-03-14T09:00:05-07:00",
"category": "Education",
"viewCount": 1843201,
"likeCount": 52310,
"durationSeconds": 742,
"isShort": false,
"isLiveContent": false,
"language": "English",
"languageCode": "en",
"isAutoGenerated": false,
"matchedPreferredLanguage": true,
"isTranslated": false,
"translatedFrom": null,
"translationError": null,
"segmentCount": 3,
"wordCount": 24,
"characterCount": 131,
"text": "Sunlight is made of photons. When they hit a silicon cell they knock electrons loose. That flow of electrons is electricity.",
"transcript": [
{ "start": 0.48, "duration": 2.9, "text": "Sunlight is made of photons." },
{ "start": 3.38, "duration": 4.12, "text": "When they hit a silicon cell they knock electrons loose." },
{ "start": 7.5, "duration": 3.05, "text": "That flow of electrons is electricity." }
],
"srt": "1\n00:00:00,480 --> 00:00:03,380\nSunlight is made of photons.\n\n2\n...",
"availableLanguages": [
{ "languageCode": "en", "language": "English", "isAutoGenerated": false },
{ "languageCode": "en", "language": "English", "isAutoGenerated": true },
{ "languageCode": "de", "language": "German", "isAutoGenerated": false }
],
"description": "Why a slab of silicon turns light into power...",
"keywords": ["solar", "physics", "energy"],
"thumbnailUrl": "https://i.ytimg.com/vi/abcDEF12345/sddefault.jpg",
"sourceType": "video",
"sourceInput": "https://youtu.be/abcDEF12345",
"scrapedAt": "2026-10-26T12:00:00.000Z"
}

Monitor new videos on a schedule

Get the transcript of every new upload from a list of channels or playlists: podcast and news monitoring, competitor tracking, or a daily AI summary of what your favourite creators published.

  1. Put the channel URLs (or @handles) and playlist URLs in YouTube URLs or video IDs.
  2. Turn on Only new videos (monitoring) and give the monitor a State key, for example ai-podcasts. Runs that share a key share the list of videos already delivered, so use one key per monitor.
  3. Optional: set Published after to a date (2026-10-01) or a rolling window (7 days). The first run then skips the back catalogue. You can also keep Max videos per playlist or channel small (5 to 20).
  4. Save the input as a task, then open Schedules in Apify Console and run it hourly or daily.
  5. Add an integration to the task: a Slack or email notification, a webhook, or a Make / Zapier / n8n flow that sends each new transcript to an LLM for a summary.
{
"urls": ["https://www.youtube.com/@lexfridman", "https://www.youtube.com/@hubermanlab"],
"onlyNewVideos": true,
"stateKey": "ai-podcasts",
"publishedAfter": "7 days",
"maxVideosPerSource": 10,
"outputFormats": ["text"]
}

How it works:

  • The first run delivers the newest videos (up to Max videos per playlist or channel). Later runs skip every video already delivered, so you are charged only for new transcripts. A run with no new videos succeeds with an empty dataset.
  • A video counts as delivered once its transcript row is saved, or once YouTube confirms it has no captions. YouTube can take a few hours to add auto-generated captions to a fresh upload, so a new video without captions is re-checked on later runs for 24 hours (at no charge) before it is marked as done.
  • Videos that failed for other reasons (blocked request, live stream still running, max-charge limit reached) are not recorded and are retried on the next run.
  • State is kept in your own named key-value store youtube-transcript-monitor-<stateKey> (record SEEN_VIDEOS). Delete that record, or change the key, to start over.
  • Monitoring and Published after apply to channel and playlist inputs. Single video URLs are always fetched.
  • Each run's SUMMARY record reports how many videos were skipped as already seen, how many were newly recorded and how many are waiting for captions.
  • Check at least as often as Max videos per playlist or channel new uploads can appear. If a channel publishes 30 videos between two runs and the cap is 10, the 20 older ones are not listed.

Use with the API

Replace <YOUR_APIFY_TOKEN> with your token from Apify Console → Settings → Integrations.

cURL (run synchronously and get the dataset items back):

curl -X POST "https://api.apify.com/v2/acts/groupoject~youtube-transcript-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://www.youtube.com/watch?v=iG9CE55wbtY"], "outputFormats": ["text"]}'

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("groupoject/youtube-transcript-scraper").call(run_input={
"urls": ["https://www.youtube.com/watch?v=iG9CE55wbtY", "@channelhandle"],
"languages": ["en"],
"maxVideosPerSource": 25,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["videoId"], item["wordCount"], item["text"][:80])

JavaScript (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('groupoject/youtube-transcript-scraper').call({
urls: ['https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxxx'],
outputFormats: ['segments', 'vtt'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'transcripts');

Use with AI agents / MCP

Connect Claude, Cursor, ChatGPT or any other MCP client to the Apify MCP server with this actor enabled:

https://mcp.apify.com?tools=groupoject/youtube-transcript-scraper

Example prompt: "Get the transcript of https://youtu.be/UF8uR6Z6KLc and summarise the three main points in bullet form."

Integrations

Send transcripts wherever you need them with Apify integrations: Make, Zapier, n8n, Google Sheets, Slack, Airtable, or your own webhooks, which fire when a run finishes. Pair a scheduled run with a channel URL to keep a transcript archive up to date, then push new rows to a vector database or a spreadsheet.

FAQ

The actor reads only public caption data that YouTube shows to any visitor, with no login. Scraping public data is generally lawful, but how you use it matters. Respect copyright, YouTube's terms and privacy laws such as GDPR. If you are unsure about your use case, ask a lawyer.

Why did a video return no row?

That video has no captions on YouTube, has none in the languages you allowed (with fallback switched off), or is private, deleted, age-restricted or region-blocked. Check the NO_TRANSCRIPT and ERRORS records in the run's key-value store, which give the reason and the caption languages the video does offer. These videos are not charged.

Does it work for videos without any captions?

No. The actor returns YouTube's own captions, both creator-uploaded and auto-generated. It does not transcribe audio. Most spoken videos have auto-generated English captions. Music-only clips, ambient videos and some Shorts have none.

Why is my translation missing?

YouTube's auto-translate endpoint is heavily rate-limited for automated clients. The actor first uses a native subtitle track in your target language when the video has one. If it doesn't and YouTube refuses the translation, the row keeps the original-language transcript and translationError explains what happened. You still get the transcript.

Do I need proxies?

No setup is needed. YouTube often answers datacenter IPs with a bot check, so the actor tries the Apify datacenter proxy first and automatically retries through Apify residential proxy, with a fresh IP on every retry. That traffic is included in the price.

How fast is it, and are there limits?

In our tests, a run with two videos finishes in about 15 seconds, and 60 videos take one to two minutes at the default concurrency of 10. There is no fixed cap on URLs. Playlists and channels are limited by Max videos per playlist or channel (up to 5,000 per source), and the whole run is limited by your maximum charge.

Can I monitor a channel for new transcripts?

Yes. Turn on Only new videos (monitoring), set a State key, save the input as a task and schedule it hourly or daily. Each run returns only transcripts of videos that earlier runs have not delivered, and you pay only for those. See Monitor new videos on a schedule. If you only need new-upload alerts without transcripts, use YouTube Channel Monitor.

Which output format should I use for an LLM?

Use text for summarisation and embeddings. Add segments when you need timestamps for citations or chaptering. Choose srt or vtt when you want subtitle files for a video editor or player.