SKILLMERC tools

YouTube Transcript & Subtitles Scraper - Bulk & Channels

Get YouTube transcripts and subtitles as clean text with timestamps, from videos, Shorts, playlists or whole channels. Any language. $2 per 1,000, and videos without captions are never charged.

USD 2 per 1,000 results on Apify (pay per event)

Open in Apify StoreExample: YouTube Channel Transcripts to Plain Text


Turn YouTube videos into text. Paste video, Shorts, playlist or channel URLs and get back one JSON row per video with the full transcript, timestamped segments and video details. Works with any caption language, manual or auto-generated.

$2 per 1,000 transcripts. Videos that have no captions, or that fail, are never charged.

What you get

For each video:

Quick start

  1. Paste one or more YouTube links into Video URLs or IDs.
  2. Set Language to the caption language you want (for example en, es, de, pt, ko).
  3. Click Start. Download the results as JSON, CSV, Excel or HTML, or read them through the Apify API.

Input example

{
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "https://youtu.be/jNQXAC9IVRw",
    "https://www.youtube.com/shorts/VIDEO_ID",
    "https://www.youtube.com/playlist?list=PLAYLIST_ID",
    "https://www.youtube.com/@3blue1brown"
  ],
  "language": "en",
  "preferManual": true,
  "includeTimestamps": true,
  "plainText": true,
  "expandPlaylists": true,
  "maxItems": 200
}

Accepted links: watch?v=, youtu.be/, /shorts/, /embed/, /live/ and bare 11-character video IDs. Playlist links (?list=) and channel links (/@handle or /channel/UC...) are expanded into their videos when Expand Playlists is on.

Input options

Field Default What it does
videoUrls one sample video Video links or IDs. Playlist and channel links when expandPlaylists is on
language en Preferred caption language code
preferManual true Use human-written captions before auto-generated ones
includeTimestamps true Return the timestamped segments list
plainText true Return the whole transcript as one string in transcript_text
expandPlaylists false Expand playlist and channel links into individual videos
maxItems 100 Maximum number of videos per run (up to 10,000)

Output example

{
  "video_id": "dQw4w9WgXcQ",
  "video_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
  "channel": "Rick Astley",
  "channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw",
  "duration_seconds": 213,
  "view_count": 1815620592,
  "published_at": null,
  "language": "en",
  "is_auto_generated": false,
  "available_languages": ["en", "en (auto)", "de-DE"],
  "transcript_text": "[music] We're no strangers to love You know the rules and so do I ...",
  "segments": [
    { "start": 0.0, "duration": 2.4, "text": "[music]" },
    { "start": 18.88, "duration": 3.28, "text": "We're no strangers to love" }
  ],
  "word_count": 487,
  "route": "direct",
  "error": null
}

Output fields

Field Description
video_id, video_url The video
title, channel, channel_id Video and channel details
duration_seconds, view_count Length and views
is_live True for live streams and past live streams
language Language code of the transcript you received
is_auto_generated True if YouTube generated the captions automatically
available_languages Every caption track on the video, auto tracks marked (auto)
transcript_text Full transcript as one string (null if plainText is off)
segments List of {start, duration, text} (null if includeTimestamps is off)
word_count Number of words in the transcript
route Network route used for the video (direct, datacenter or residential)
published_at Always null. YouTube's mobile API does not return it
error Always null in the results. Failed videos go to a separate free list (see below)

Pricing

You pay $2.00 per 1,000 transcripts delivered, which is $0.002 per video. There is also a start fee of $0.00005 per GB of run memory, which is a fraction of a cent per run.

You are only charged for rows in the results dataset. Videos that can't be transcribed (no captions, private, deleted, age-restricted, or blocked by YouTube after every retry) are never written there. Instead they are listed with the reason in the run's OUTPUT record and in a separate failed-videos dataset, at no charge.

Use cases

How it works

Transcripts come from YouTube's own caption tracks through its mobile player API, not from scraping the web page. YouTube often blocks cloud servers, so when a request is refused the actor retries that video through fresh proxy IPs (datacenter first, then residential). Retries are included in the price.

In tests on 27 September 2026 it delivered 30 of 33 random videos across 7 languages. The 3 misses had no captions at all. A 3.5-hour podcast came back at 29,466 words, and transcripts matched YouTube's own transcript view at about 97%.

Limitations

Calling it from code or AI agents

Run it from the Apify API, the JavaScript or Python clients, Make, Zapier or n8n, or from AI agents through Apify's MCP server. Each run returns a dataset you can read as JSON or CSV.


Run it on Apify Apify's free plan includes monthly platform credit, so small runs cost little or nothing to try.