YouTube Transcript Scraper
Pricing
from $6.00 / 1,000 transcript delivereds
YouTube Transcript Scraper
Get timestamped transcripts and captions from YouTube videos and Shorts. Pick a language or the original audio track. Pay only for transcripts delivered: videos without captions and failed lookups are free.
Pricing
from $6.00 / 1,000 transcript delivereds
Rating
0.0
(0)
Developer
Datara
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Get the full transcript of any YouTube video or Short: timestamped segments, clean plain text, or both. Paste in one URL or thousands. You pay only for transcripts actually delivered.
Why this one
- Pay per transcript, nothing else. Videos with no captions, private or deleted videos, bad links and temporary errors are all free. They still appear in your results with a reason, so you know what happened.
- No surprise bills.
Maximum videosis a hard cap, and the actor checks your maximum cost per run before every request. It stops cleanly when the budget is used rather than going over. - Any language, including translations. Ask for a caption language (
en,es,pt-BR…). If the video doesn't have it, YouTube's automatic translation is returned where available and flagged withautoTranslated: true. Or ask for the original spoken language only, skipping auto-dubbed tracks. - AI-ready text. Optionally strip caption annotations such as
[music]and[applause]before the text reaches your LLM or RAG pipeline. - Every link format.
watch?v=,youtu.be, Shorts, live replays, embeds, mobile and YouTube Music links, or bare video IDs. Duplicates are removed before anything is fetched. - Fast. Fetches several videos in parallel, retries transient errors automatically, and serves recently fetched transcripts from cache.
Input
| Field | Description | Default |
|---|---|---|
videoUrls | Video or Shorts URLs, or video IDs | required |
language | Caption language code; empty means YouTube's default track | empty |
originalAudio | Return captions in the original spoken language only (overrides language) | false |
outputFormat | both, segments or text | both |
removeSoundTags | Strip [music], [applause] and similar annotations | false |
maxVideos | Hard cap on videos processed per run | 100 |
cacheMaxAge | Accept a cached transcript up to 1d, 3d, 7d, 14d, 30d, or none for always fresh | 7d |
includeFailures | Add a free row for each video without a transcript | true |
maxConcurrency | Parallel requests (1–20) | 5 |
Example:
{"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://youtu.be/jNQXAC9IVRw","https://www.youtube.com/shorts/abcdefghijk"],"language": "en","outputFormat": "both","maxVideos": 50}
Output
One row per video.
{"status": "ok","videoId": "jNQXAC9IVRw","url": "https://www.youtube.com/watch?v=jNQXAC9IVRw","type": "video","input": "https://youtu.be/jNQXAC9IVRw","language": "English","autoTranslated": false,"requestedLanguage": "en","segmentCount": 6,"wordCount": 42,"durationSeconds": 19,"text": "All right, so here we are in front of the ...","segments": [{ "startMs": 1200, "endMs": 4100, "startTime": "0:01", "text": "All right, so here we are" }],"scrapedAt": "2026-10-19T09:40:00.000Z"}
autoTranslated is true when you asked for a language the video doesn't have and YouTube's machine translation was returned instead. In that case language shows the code you requested.
Videos without a transcript come back like this (free):
{"status": "no_captions","videoId": "...","url": "...","errorMessage": "No transcript available. The video may have no captions, or may be private, deleted or unavailable.","charged": false}
status | Meaning | Charged |
|---|---|---|
ok | Transcript delivered | Yes |
no_captions | No transcript available: no captions, or the video is private, deleted or unavailable | No |
not_found | Video not found | No |
invalid_input | Not a YouTube video link or ID | No |
error | Temporary failure after retries; safe to re-run | No |
The Timestamped segments view in the Output tab gives one row per segment, ready to export as CSV for subtitles or analysis. A run summary is saved to the key-value store as SUMMARY.
Use cases
- Feed video content into LLMs, RAG pipelines and summarisers
- Repurpose videos into blogs, newsletters and social posts
- Search, quote and timestamp-link spoken content
- Research competitors, creators and topics at scale
- Build subtitle files and accessibility tooling
Pricing
Pay per event: you're charged once per transcript delivered (status: "ok"), plus Apify's small per-run start fee. Nothing else. Set Maximum cost per run in the run options and the actor will never exceed it.
Limits
- Only videos that have captions (manual or auto-generated) can return a transcript.
- Age-restricted, members-only and private videos usually have no accessible transcript; they are returned as free failures.
- Accepts individual videos. Channel and playlist URLs aren't expanded; pass video URLs instead.
Integrations
Works with the Apify API, Make, Zapier, n8n, LangChain and the Apify MCP server. Call it from your own code:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('datara/youtube-transcript-scraper').call({videoUrls: ['https://www.youtube.com/watch?v=dQw4w9WgXcQ'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();