YouTube Transcript Scraper avatar

YouTube Transcript Scraper

Pricing

from $2.00 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper

YouTube Transcript Scraper

Get transcripts from YouTube videos, whole channels or playlists in one run. JSON with timestamps, SRT, VTT or plain text. 2 USD per 1,000 transcripts, and videos without captions are free.

Pricing

from $2.00 / 1,000 transcripts

Rating

0.0

(0)

Developer

Brahim Sliti

Brahim Sliti

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

11 days ago

Last modified

Categories

Share

Paste YouTube links, get the transcripts back. Videos, channels and playlists can be mixed in the same input list, and you get one dataset with one row per video.

You get the text with timestamps, plus the video title and channel. Pick JSON, SRT, VTT or plain text depending on whether it's going into an LLM, a subtitle editor or a spreadsheet.

What people use it for

  • Feeding videos to an LLM or a RAG pipeline. Every row has a text field with the full transcript as one string, ready to chunk and embed, and a transcript field with timed segments if you need to cite the exact moment.
  • Turning a channel into written content. Point it at a creator's channel and get their last 50 videos as text for blog posts, newsletters or show notes.
  • Research across many videos. Pull every talk from a conference playlist and search them like documents.
  • Subtitles. Ask for srt or vtt and drop the file into your editor.

How to use it

  1. Paste your links in YouTube URLs, one per line. Mix them freely:
    • videos: https://www.youtube.com/watch?v=dQw4w9WgXcQ, youtu.be/..., /shorts/..., or just the 11-character id
    • channels: @mkbhd or any channel URL
    • playlists: any URL with list=
  2. For channels and playlists, set Max videos per channel or playlist (default 10).
  3. Pick a format and, if you want a specific language, a Target language (fr, es, en-US...).
  4. Click Start. Export as JSON, CSV or Excel, or pull the results through the API.
{
"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "@mkbhd"],
"maxVideos": 20,
"format": "json"
}

What you get

{
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up",
"channelName": "Rick Astley",
"language": "en",
"originalLanguage": "en",
"isAutoGenerated": false,
"format": "json",
"transcript": [{ "start": 0.0, "dur": 1.6, "text": "We're no strangers to love" }],
"text": "We're no strangers to love...",
"wordCount": 231
}
  • transcript: timed segments in JSON, or one SRT / VTT / TXT string if you picked another format.
  • text: the whole transcript as plain text, always there whatever the format.
  • language and isAutoGenerated: which caption track you got. Without a target language you get the video's original language, never an auto-translated track.
  • Turn on List available languages to also get every caption track the video offers.

Pricing

2 USD per 1,000 transcripts. You pay only when a transcript comes back. A video with no captions, a private video or a bad link returns an error row, and error rows are free. No monthly fee, no charge for the Apify platform usage on top.

Example: the last 100 videos of 10 channels (1,000 videos) costs 2 USD at most, less if some of them have no captions.

Good to know

  • It reads the captions YouTube already has, manual or auto-generated. It does not run speech-to-text, so a video without any captions comes back as NO_TRANSCRIPT.
  • It does not translate. If the language you asked for isn't on the video you get LANGUAGE_NOT_AVAILABLE; turn on List available languages to see what exists.
  • Age-restricted and private videos can't be read without a signed-in account, so they come back as errors.
  • You don't need a proxy or a YouTube account. Blocking is our problem, not yours.

Use it from n8n, Make or an API

  • Small inputs: call run-sync-get-dataset-items and read the items back directly. Set Time budget (seconds) (default 240) to how long you are willing to wait: the actor stops starting new channel/playlist pages and transcript batches before that point and returns what it already has, so you never hit Apify's 300 second run-sync limit and lose the whole run. Anything left unfinished comes back as a TIME_BUDGET_EXCEEDED row instead of being silently dropped.
  • Big inputs: start the run with POST /v2/acts/vakitek~youtube-transcript/runs, poll GET /v2/actor-runs/<runId> (or add waitForFinish=60) until the status is SUCCEEDED, then read GET /v2/datasets/<datasetId>/items. Set Time budget (seconds) to 0 (no limit) for this pattern.

Errors

A bad link never crashes the run. It becomes a row with an error code, and you are not charged for it.

errorWhat happenedRetry?
NO_CAPTIONSThe video has no captions at allNo
LANGUAGE_NOT_AVAILABLENo caption track in the language you asked forNo
NOT_FOUNDThe video, channel or playlist was removed or never existedNo
AGE_RESTRICTEDNeeds a signed-in accountNo
PRIVATEThe video is privateNo
MEMBERS_ONLYMembers-only video, nobody can fetch it without a membership, not chargedNo
NO_RESULTSThe channel or playlist has no videosNo
INVALID_URLThe line isn't a YouTube video, channel or playlistNo
INVALID_INPUTAn option value is invalidNo
PARSE_ERRORYouTube changed its page and we could not read it; we fix these fast, open an issueNo
BLOCKEDYouTube refused us for now, even after trying every proxy tierYes
UPSTREAM_ERRORSomething went wrong on YouTube's side or oursYes
UPSTREAM_UNAVAILABLEOur API was unreachableYes
TIME_BUDGET_EXCEEDEDThe time budget ran out before this video, channel or playlist finishedYes

Some rows also carry a legacyError field with the old, pre-unification code name (for example NO_TRANSCRIPT, VIDEO_UNAVAILABLE, CHANNEL_NOT_FOUND, PLAYLIST_NOT_FOUND or LOGIN_REQUIRED) so a pipeline still matching on it keeps working while it migrates to error.

Reliability

Success rate, last 30 days: 97.3 % of 72 results across 36 runs (updated 2026-10-10). Failures counted: blocks, errors on our side, and runs that failed or timed out. Not counted: videos with no captions, private or deleted videos, bad links.

FAQ

Can I get every transcript from a channel? Yes. Put the channel in YouTube URLs and set Max videos per channel or playlist to how far back you want to go.

I already use another transcript actor. Do I have to change my code? Probably not much. We accept videoUrl and targetLanguage as input names too, and the segment format is {start, dur, text}.

Can I call it from my code or from an AI agent? Yes, like any Apify actor: REST API, the Python and JavaScript clients, or the Apify MCP server. The examples are in the API tab.

Can I use the transcripts to train a model? The captions belong to the creators, and YouTube's terms limit automated access. Check your use case against them and the copyright rules where you operate.

Something broke or a field is missing? Open an issue on this page. We read every one and usually answer within a day.