YouTube Transcript Scraper API - Captions and Subtitles avatar

YouTube Transcript Scraper API - Captions and Subtitles

Pricing

$8.00 / 1,000 transcript returneds

Go to Apify Store
YouTube Transcript Scraper API - Captions and Subtitles

YouTube Transcript Scraper API - Captions and Subtitles

Extracts YouTube transcripts (manual captions and auto-generated). Tells you whether a video is private, has no captions, or was blocked - instead of returning a blank row - and charges only for transcripts that actually contain text.

Pricing

$8.00 / 1,000 transcript returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Share

Get the transcript of any public YouTube video — manual captions and auto-generated ones — as clean text, or as timestamped lines.

The difference is what happens when something goes wrong. Most transcript scrapers return an empty result whether the video has no captions, the video is private, or YouTube blocked the request. You cannot tell which, so you cannot fix it. This one tells you, in plain words, and only charges you for transcripts that actually contain text.

Measured, not claimed

A run of 15 videos on 2026-08-25, from the shipped build:

  • 14 returned a transcript. 83,647 characters total.
  • 1 did not — and it said why: "この動画は非公開です" (this video is private). Nobody can scrape that one. It was not silently dropped, and it was not charged.
  • 48.7 seconds for all 15.

What you get

FieldExample
oktrue / false — did this video produce a transcript
videoId / urlaircAruvnKk
title / authorBut what is a neural network? / 3Blue1Brown
lengthSeconds1132
languageen
isAutoGeneratedfalse — manual captions are preferred when both exist
availableLanguages["en","es","fr","ja", ...]
segmentCount286
textThe whole transcript as one string
segments[{ "start": 12.4, "duration": 3.1, "text": "..." }, ...]
reasonWhy it failed, when ok is false

Why transcripts come back empty elsewhere

The caption URL published on a YouTube watch page returns zero bytes for every format — measured on every video tried. Anything built on that path silently produces nothing. This Actor does not use it. It reads the same endpoint the official mobile apps use, which still serves captions, and it requests only the fields it needs, so a lookup transfers about 19 KB instead of 228 KB.

That is also why it is cheap to run at volume.

Honest failure reasons

When a video does not produce a transcript, you get one of these in reason — never a blank row:

  • この動画は非公開です — private video
  • メンバー限定の動画です — members-only
  • 年齢制限のある動画です — age-restricted
  • この地域では再生できない動画です — geo-blocked
  • この動画に字幕がありません — the video genuinely has no captions
  • ボット判定でブロック — YouTube rate-limited the request; retried automatically with a fresh IP first

A private video and a blocked request are not the same problem, and this Actor does not pretend they are.

Input

{
"videos": [
"https://www.youtube.com/watch?v=aircAruvnKk",
"https://youtu.be/dQw4w9WgXcQ",
"M7lc1UVf-VE"
],
"languages": ["en"],
"includeTimestamps": true,
"proxyMode": "auto"
}

Watch URLs, youtu.be links, Shorts URLs, embed URLs, and bare 11-character IDs all work.

FieldDefaultMeaning
videos(required)URLs or IDs
languages["en"]Preferred order. Manual captions win over auto-generated
includeTimestampstrueInclude per-line segments alongside the full text
proxyModeautoauto tries datacenter first (cheaper), falls back to residential when YouTube blocks
maxRetries3Retries with a fresh IP on a block or a network failure

Pricing

You are charged only when a transcript with actual text comes back. Private videos, videos without captions, and blocked requests cost you nothing.

That matters more than the headline number: a cheaper Actor that charges for empty rows costs more per usable transcript.

Typical uses

  • Feeding video content to an LLM for summaries, Q&A or RAG
  • Searching across a channel's back catalogue
  • Subtitling, translation and repurposing workflows
  • Research and content analysis at scale

FAQ

Does it work on auto-generated captions? Yes. Manual captions are preferred when both exist, and isAutoGenerated tells you which you got.

What about videos in other languages? Pass languages in your order of preference. availableLanguages lists everything the video has.

Why does it need a proxy? YouTube rate-limits repeated caption requests from one address. Requests are retried from a fresh IP automatically. Residential proxying is used only when it is actually needed.

Will I be charged for a video with no captions? No. Charging happens after a transcript with text is produced.

Other tools by NeverEmpty

Every NeverEmpty Actor follows the same rule: it never returns an empty result to mean two different things, and it only charges for rows that actually carry an answer.

  • github-repo-search - GitHub repository search through the official API, with activity columns
  • seo-site-audit - technical SEO audit: meta, canonical, robots, headings

Support

If a video that should work does not, open an issue on the Issues tab with the video ID. The reason field on the failed row tells me most of what I need.