YouTube Transcripts – Timed Captions and Full Text
Pricing
Pay per usage
YouTube Transcripts – Timed Captions and Full Text
Get the transcript of any YouTube video as timed segments and full text, in your language: manual captions first, auto-generated as fallback. No API key. A status row says why when a video has no captions.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Douglas Gouvea Manoel
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Security
Limited permissionsShare

Watch the demo: https://youtu.be/UtnMjzA6kbU
Part of Errand Code: https://errandcode.com/youtube-transcripts
Get the transcript of any YouTube video as clean dataset rows: timed segments (start, duration, text) and/or the full text, in the language you ask for. Manual captions are preferred over auto-generated ones. No login, no browser, no API key.
Videos with no captions, removed or private videos give you a free status row that says why.
Example, input {"videos": ["https://www.youtube.com/watch?v=5MuIMqhT8DM"], "language": "en"} returns (real run, 9 Nov 2026) the TED talk "Sleep Is Your Superpower" with lengthSeconds: 1158, language: en, isAutoGenerated: false, languageMatched: true and 327 segments, the first one {"start": 0.829, "duration": 1.5, "text": "Thank you very much."}.
Input
| Field | Default | Notes |
|---|---|---|
videos | one example | YouTube URLs (watch, youtu.be, shorts, embed, live) or 11-character ids. Up to 1000 per run. Duplicates are dropped. |
language | en | en, pt, pt-BR, es... pt also matches pt-BR. |
outputFormat | both | both, segments or text. |
proxyConfiguration | Residential (Apify Proxy) | Residential by default. See Why Residential proxy below. |
Language choice: exact code first, then same base language; manual before auto-generated. If the video has nothing in your language you get its original-language track (the auto-generated one, or the first manual one) and languageMatched is false, so you can tell.
Output
One row per video.
videoId,url,title,channel,channelId,lengthSecondslanguage,isAutoGenerated,languageMatched,requestedLanguagesegments:[{ "start": 18.64, "duration": 3.24, "text": "..." }](seconds)text: all segments joined with spacesstatus:ok, or one of the free statuses below, plusreasonscrapedAt(UTC)
Free status rows (status is not ok, reason explains):
| status | meaning |
|---|---|
no_captions | the video has no captions, manual or auto-generated |
video_unavailable | removed, private, members-only, region-locked, age-restricted... |
invalid_input | the entry is not a YouTube video URL or id |
source_unavailable | YouTube kept refusing after retries (check that the Residential proxy is on, or run again later) |
Why Residential proxy is the default
From datacenter IPs, YouTube stops answering normally: the player endpoint starts replying LOGIN_REQUIRED (bot check) after one or two videos and caption downloads get HTTP 429. So this Actor sends both the player request and the caption download through Apify Proxy, and uses a fresh IP on each retry.
Our test on 9 Nov 2026, the same 20 videos (16 with captions, 3 without, 1 that does not exist; English, Portuguese, Spanish and Korean; from 19 seconds to 2 h 26 min):
| Proxy | Videos with captions delivered |
|---|---|
| None (Apify datacenter IP) | 1 of 16 |
| Datacenter (Apify Proxy) | 4 of 16 |
| Residential (default) | 16 of 16, in 3 rounds out of 3 |
That is a small test (20 videos × 3 rounds), not a guarantee: we have not measured how YouTube reacts to hundreds of videos in one run. Residential traffic is part of your Apify platform usage (see Pricing). You can change the proxy in the input, but expect many source_unavailable rows without Residential.
Pricing
Early access: no Actor fee yet. You pay only standard Apify platform usage, including the Residential proxy. In our tests on 9 Nov 2026 (3 rounds of 20 videos on Residential) platform usage averaged about US$ 0.40 per 1,000 videos (range US$ 0.21–0.51). Pay-per-result pricing may be introduced later; Apify notifies users 14 days in advance.
Limits
- Live streams and premieres in progress usually have no captions yet.
- Translated captions (YouTube's auto-translate) are not returned, only tracks the video actually has.
- Captions are the video's own; this Actor does not transcribe audio.
- YouTube may change its clients without notice; the Actor may need an update when that happens.
- Scraping YouTube is subject to YouTube's terms: use reasonable volumes. Volume tested so far is small (20 videos per run).
- Not affiliated with YouTube or Google. Independent tool.
Run locally
python3.13 -m venv .venv && .venv/bin/pip install -r requirements.txt -r requirements-dev.txtecho '{"videos":["jNQXAC9IVRw"]}' | apify run --purge # no proxyConfiguration needed locally.venv/bin/python -m pytest -q.venv/bin/ruff check .
More from Errand Code
This Actor is built and maintained by Errand Code. See the other tools: an Americanas Product Scraper, a Buscapé Price Scraper, a Google Trends Scraper, a CNPJ Due Diligence Actor, an AI visibility check (GEO audit), a Google Sheets add-on and MCP servers for AI agents. Not affiliated with YouTube or Google.