YouTube Transcript & AI Summary Extractor
Pricing
Pay per usage
YouTube Transcript & AI Summary Extractor
Extract YouTube transcripts (timestamped, multi-language, SRT/VTT/CSV/TXT export), expand channels/playlists, and generate AI summaries with topic-based chapters. Proxy-aware with auto anti-block retries.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Rupesh
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
40 minutes ago
Last modified
Categories
Share
Turn any YouTube video, Short, channel, or playlist into structured, timestamped transcript text and AI-generated summaries — one clean dataset row per video.
What it does
- Resolves watch URLs, Shorts URLs, and bare video IDs.
- Timestamped transcripts — every segment carries a
startTime(HH:MM:SS) and text. - Multi-language — request a preferred language; falls back to auto-generated captions and reports
language+isAutoGenerated. - Export formats — choose
json(default),srt,vtt,csv, ortxt. SRT/VTT/CSV/TXT are generated in spec-correct format and attached to the row. - Channel / playlist input — pass a channel page (
@handle,/channel/...), or a playlist (?list=) URL; it auto-expands to the video list (capped bymaxVideos). - Proxy-aware + anti-block — detects YouTube IP-bans / 429-style blocks, rotates the proxy, and retries with exponential backoff (
maxRetries). - AI summary — optional bullet summary with selectable
summaryLength(short/medium/long) and an independentsummaryLanguage. - Chapter segmentation (stretch) — optional AI topic-based chapters with title + start/end times.
- One dataset row per processed video.
Inputs
| Field | Type | Default | Notes |
|---|---|---|---|
startUrls (required) | array[string] | — | Video, Short, video-ID, channel, or playlist URLs. Channels/playlists expand automatically. |
mode | enum | auto | auto tries direct then browser title; direct; browser. |
maxVideos | integer | 1 | Max videos to process across all URLs + expansions (1–200). |
preferredLanguage | string | en | Preferred transcript language code. Auto-generated captions used as fallback. |
languages (legacy) | array[string] | ["en","en-US","en-GB","a.en"] | Kept for backward compatibility; used only when preferredLanguage is omitted. |
languagesExtended | array[string] | = preferred | Extra fallback codes. |
includeRawTranscript | boolean | true | Include timestamped segments + full text. |
includeSummary | boolean | false | Generate an AI summary. Requires OPENAI_API_KEY + OPENAI_BASE_URL. |
summaryModel | string | gpt-4o-mini | Model for summary + chapters. |
summaryLength | enum | medium | short (3-5), medium (5-8), long (8-12) bullets. |
summaryLanguage | string | "" | Language for the summary, independent of transcript language. |
enableChapters | boolean | false | AI topic-based chapter segmentation (needs includeSummary). |
outputFormat | enum | json | json, srt, vtt, csv, txt. |
maxRetries | integer | 3 | Exponential-backoff retries on YouTube blocks/IP-bans (proxy rotates each retry). |
maxTranscriptLength | integer | 15000 | Truncate transcript after this many characters. |
proxyConfiguration | object | { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] } | Defaults to Apify RESIDENTIAL proxies. YouTube blocks datacenter IPs (the Apify run node and the BUYPROXIES group are both blocked), so residential proxies are required for reliable channel/playlist/bulk runs. Override with your own proxyUrl or a different group if you have proxy access. |
Backward compatibility: with no new inputs set, behavior matches the previous version (single video,
entranscript,jsonoutput, optional summary). The oldlanguagesinput is still honored whenpreferredLanguageis omitted.
Example 1 — single video, timestamped transcript (default)
{"startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"mode": "auto","maxVideos": 1,"preferredLanguage": "en","includeRawTranscript": true,"includeSummary": false,"outputFormat": "json"}
Example 2 — SRT export + AI summary (Spanish)
{"startUrls": ["https://www.youtube.com/watch?v=abc123"],"outputFormat": "srt","includeSummary": true,"summaryLength": "short","summaryLanguage": "es","maxTranscriptLength": 8000}
Example 3 — whole channel, auto-language fallback, chapters
{"startUrls": ["https://www.youtube.com/@someChannel"],"maxVideos": 20,"preferredLanguage": "en","includeSummary": true,"enableChapters": true,"summaryLength": "long"}
Example 4 — playlist with proxy + anti-block retries
{"startUrls": ["https://www.youtube.com/playlist?list=PLxxxxxxxxxxxx"],"maxVideos": 50,"proxyConfiguration": { "useApifyProxy": true, "groups": ["BUYPROXIES94952"] },"maxRetries": 5,"outputFormat": "vtt"}
Output schema (per video row)
| Field | Type | Description |
|---|---|---|
videoUrl | string | Source URL. |
videoId | string | 11-char YouTube video ID. |
title | string | Video title (when available). |
language | string | Resolved transcript language code. |
isAutoGenerated | boolean | true when auto-generated captions were used. |
transcriptSegments | array | [{ startTime: "HH:MM:SS", startSeconds, text }]. |
fullText | string | Full concatenated transcript (when includeRawTranscript). |
summary | object | { model, summary, error? } when includeSummary. |
exportFormat | string | The chosen export format. |
srt / vtt / csv / txt | string | Present only for the matching outputFormat. |
chapters | array | [{ title, startTime, endTime }] when enableChapters. |
warnings | array[string] | Non-fatal issues (e.g. transcript-empty-or-quota-limited). |
Example output row (outputFormat: json)
{"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","videoId": "dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up","language": "en","isAutoGenerated": false,"transcriptSegments": [{ "startTime": "00:00:01", "startSeconds": 1.36, "text": "[♪♪♪]" },{ "startTime": "00:00:18", "startSeconds": 18.64, "text": "♪ We're no strangers to love ♪" }],"fullText": "[♪♪♪] ♪ We're no strangers to love ♪ ...","summary": { "model": "gpt-4o-mini", "summary": "- Iconic 80s song\n- ..." },"exportFormat": "json","chapters": [{ "title": "Intro", "startTime": "00:00:00", "endTime": "00:01:00" }],"warnings": []}
AI summary / chapters — setup
Set these environment variables on the Actor (Apify Console → Actor → Environment):
OPENAI_API_KEY and OPENAI_BASE_URL (any OpenAI-compatible endpoint,
e.g. OpenRouter). When unset, includeSummary / enableChapters produce
an empty summary with an error field rather than failing the run.
Run costs
Pay-per-event pricing:
- per dataset row written
- per run
Actual cost depends on run + row counts. Check the Apify Console after a run.
Notes / limitations
- Proxy / IP bans: YouTube blocks datacenter IPs (including the Apify run node and the
BUYPROXIESgroup). The actor therefore defaults to Apify RESIDENTIAL proxies, which reliably bypass the block. Without a working residential proxy, channel/playlist/bulk runs will fail with "YouTube is blocking requests from your IP." If you have your own residential proxy, setproxyConfiguration.proxyUrl. - Channel/playlist expansion is best-effort and capped by
maxVideos. - Not all videos have captions; unavailable transcripts surface a
warningsentry. isAutoGeneratedreflects whether the served transcript was auto-generated.